From 7f4b4a50edd0b884ab8549ddd0338200811f81aa Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Mon, 06 Jun 2016 18:40:37 +0000
Subject: [PATCH] OPENDJ-3037 SchemaConfigManager.java: Use the LDIFEntryReader

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java   |   36 +++++++++++
 opendj-server-legacy/src/main/java/org/opends/server/core/SchemaConfigManager.java |  130 ++++++++++++------------------------------
 2 files changed, 72 insertions(+), 94 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java
index f80407b..0fced9d 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java
@@ -757,9 +757,9 @@
             throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM,
                 ERR_SCHEMA_INVALID_MODIFICATION_TYPE.get(m.getModificationType()));
           }
-          else  if (SchemaConfigManager.isSchemaAttribute(a))
+          else  if (isSchemaAttribute(a))
           {
-          logger.error(ERR_SCHEMA_INVALID_REPLACE_MODIFICATION, a.getAttributeDescription());
+            logger.error(ERR_SCHEMA_INVALID_REPLACE_MODIFICATION, a.getAttributeDescription());
           }
           else
           {
@@ -957,6 +957,38 @@
   }
 
   /**
+   * This method checks if a given attribute is an attribute that is used by the definition of the
+   * schema.
+   *
+   * @param attribute
+   *          The attribute to be checked.
+   * @return true if the attribute is part of the schema definition, false if the attribute is not
+   *         part of the schema definition.
+   */
+  private static boolean isSchemaAttribute(Attribute attribute)
+  {
+    String attributeOid = attribute.getAttributeDescription().getAttributeType().getOID();
+    return attributeOid.equals("2.5.21.1") ||
+        attributeOid.equals("2.5.21.2") ||
+        attributeOid.equals("2.5.21.4") ||
+        attributeOid.equals("2.5.21.5") ||
+        attributeOid.equals("2.5.21.6") ||
+        attributeOid.equals("2.5.21.7") ||
+        attributeOid.equals("2.5.21.8") ||
+        attributeOid.equals("2.5.4.3") ||
+        attributeOid.equals("1.3.6.1.4.1.1466.101.120.16") ||
+        attributeOid.equals("cn-oid") ||
+        attributeOid.equals("attributetypes-oid") ||
+        attributeOid.equals("objectclasses-oid") ||
+        attributeOid.equals("matchingrules-oid") ||
+        attributeOid.equals("matchingruleuse-oid") ||
+        attributeOid.equals("nameformdescription-oid") ||
+        attributeOid.equals("ditcontentrules-oid") ||
+        attributeOid.equals("ditstructurerules-oid") ||
+        attributeOid.equals("ldapsyntaxes-oid");
+  }
+
+  /**
    * Re-write all schema files using the provided new Schema and list of
    * modified files.
    *
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/core/SchemaConfigManager.java b/opendj-server-legacy/src/main/java/org/opends/server/core/SchemaConfigManager.java
index fb2c6fd..d08a010 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/core/SchemaConfigManager.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/core/SchemaConfigManager.java
@@ -17,7 +17,10 @@
 package org.opends.server.core;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FilenameFilter;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -27,22 +30,22 @@
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.opendj.adapter.server3x.Converters;
 import org.forgerock.opendj.config.server.ConfigException;
+import org.forgerock.opendj.ldap.Attribute;
+import org.forgerock.opendj.ldap.AttributeDescription;
+import org.forgerock.opendj.ldap.Entry;
 import org.forgerock.opendj.ldap.ModificationType;
 import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.schema.AttributeType;
 import org.forgerock.opendj.ldap.schema.CoreSchema;
 import org.forgerock.opendj.ldap.schema.SchemaBuilder;
-import org.opends.server.types.Attribute;
+import org.forgerock.opendj.ldif.LDIFEntryReader;
 import org.opends.server.types.DirectoryException;
-import org.opends.server.types.Entry;
 import org.opends.server.types.InitializationException;
-import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.Modification;
 import org.opends.server.types.Schema;
 import org.opends.server.types.Schema.SchemaUpdater;
-import org.opends.server.util.LDIFReader;
-import org.opends.server.util.StaticUtils;
 
+import static org.forgerock.opendj.ldap.schema.SchemaValidationPolicy.*;
 import static org.opends.messages.ConfigMessages.*;
 import static org.opends.server.util.StaticUtils.*;
 
@@ -371,10 +374,9 @@
     return entry;
   }
 
-  private static void updateSchemaWithEntry(Schema schema, String schemaFile, boolean failOnError, final Entry entry)
-      throws ConfigException
+  private static void updateSchemaWithEntry(Schema schema, String schemaFile, boolean failOnError,
+      final Entry schemaEntry) throws ConfigException
   {
-    final org.forgerock.opendj.ldap.Entry schemaEntry = Converters.from(entry);
     try
     {
       updateSchema(schema, schemaEntry, false);
@@ -411,17 +413,30 @@
     // Create an LDIF reader to use when reading the files.
     String schemaDirPath = getSchemaDirectoryPath();
     File f = new File(schemaDirPath, schemaFile);
-    LDIFReader reader;
-    try
+    try (final FileInputStream in = new FileInputStream(f);
+        final LDIFEntryReader reader = new LDIFEntryReader(in))
     {
-      reader = new LDIFReader(new LDIFImportConfig(f.getAbsolutePath()));
+      reader.setSchemaValidationPolicy(ignoreAll());
+
+      if (!reader.hasNext())
+      {
+        // The file was empty -- skip it.
+        return null;
+      }
+      final Entry entry = reader.readEntry();
+      if (reader.hasNext())
+      {
+        // If there are any more entries in the file, then print a warning message.
+        logger.warn(WARN_CONFIG_SCHEMA_MULTIPLE_ENTRIES_IN_FILE, schemaFile, schemaDirPath);
+      }
+      return entry;
     }
-    catch (Exception e)
+    catch (FileNotFoundException e)
     {
       logger.traceException(e);
 
-      LocalizableMessage message = WARN_CONFIG_SCHEMA_CANNOT_OPEN_FILE.get(
-              schemaFile, schemaDirPath, getExceptionMessage(e));
+      LocalizableMessage message =
+          WARN_CONFIG_SCHEMA_CANNOT_OPEN_FILE.get(schemaFile, schemaDirPath, getExceptionMessage(e));
 
       if (failOnError)
       {
@@ -430,60 +445,24 @@
       logger.error(message);
       return null;
     }
-
-    // Read the LDIF entry from the file and close the file.
-    final Entry entry;
-    try
-    {
-      entry = reader.readEntry(false);
-
-      if (entry == null)
-      {
-        // The file was empty -- skip it.
-        reader.close();
-        return null;
-      }
-    }
-    catch (Exception e)
+    catch (IOException e)
     {
       logger.traceException(e);
 
-      LocalizableMessage message = WARN_CONFIG_SCHEMA_CANNOT_READ_LDIF_ENTRY.get(
-              schemaFile, schemaDirPath, getExceptionMessage(e));
+      LocalizableMessage message =
+          WARN_CONFIG_SCHEMA_CANNOT_READ_LDIF_ENTRY.get(schemaFile, schemaDirPath, getExceptionMessage(e));
 
       if (failOnError)
       {
         throw new InitializationException(message, e);
       }
       logger.error(message);
-      StaticUtils.close(reader);
       return null;
     }
-
-    // If there are any more entries in the file, then print a warning message.
-    try
-    {
-      Entry e = reader.readEntry(false);
-      if (e != null)
-      {
-        logger.warn(WARN_CONFIG_SCHEMA_MULTIPLE_ENTRIES_IN_FILE, schemaFile, schemaDirPath);
-      }
-    }
-    catch (Exception e)
-    {
-      logger.traceException(e);
-
-      logger.warn(WARN_CONFIG_SCHEMA_UNPARSEABLE_EXTRA_DATA_IN_FILE, schemaFile, schemaDirPath, getExceptionMessage(e));
-    }
-    finally
-    {
-      StaticUtils.close(reader);
-    }
-    return entry;
   }
 
-  private static void updateSchema(Schema schema, final org.forgerock.opendj.ldap.Entry schemaEntry,
-      final boolean overwrite) throws DirectoryException
+  private static void updateSchema(Schema schema, final Entry schemaEntry, final boolean overwrite)
+      throws DirectoryException
   {
     schema.updateSchema(new SchemaUpdater()
     {
@@ -495,15 +474,14 @@
     });
   }
 
-  private static List<Modification> createAddModifications(Entry entry,  AttributeType... attrTypes)
+  private static List<Modification> createAddModifications(Entry entry, AttributeType... attrTypes)
   {
-    int nbMods = entry.getUserAttributes().size() + entry.getOperationalAttributes().size();
-    List<Modification> mods = new ArrayList<>(nbMods);
+    List<Modification> mods = new ArrayList<>(entry.getAttributeCount());
     for (AttributeType attrType : attrTypes)
     {
-      for (Attribute a : entry.getAttribute(attrType))
+      for (Attribute a : entry.getAllAttributes(AttributeDescription.create(attrType)))
       {
-        mods.add(new Modification(ModificationType.ADD, a));
+        mods.add(new Modification(ModificationType.ADD, Converters.toAttribute(a)));
       }
     }
     return mods;
@@ -518,36 +496,4 @@
     }
     logger.error(message);
   }
-
-  /**
-   * This method checks if a given attribute is an attribute that
-   * is used by the definition of the schema.
-   *
-   * @param attribute   The attribute to be checked.
-   * @return            true if the attribute is part of the schema definition,
-   *                    false if the attribute is not part of the schema
-   *                    definition.
-   */
-  public static boolean isSchemaAttribute(Attribute attribute)
-  {
-    String attributeOid = attribute.getAttributeDescription().getAttributeType().getOID();
-    return attributeOid.equals("2.5.21.1") ||
-        attributeOid.equals("2.5.21.2") ||
-        attributeOid.equals("2.5.21.4") ||
-        attributeOid.equals("2.5.21.5") ||
-        attributeOid.equals("2.5.21.6") ||
-        attributeOid.equals("2.5.21.7") ||
-        attributeOid.equals("2.5.21.8") ||
-        attributeOid.equals("2.5.4.3") ||
-        attributeOid.equals("1.3.6.1.4.1.1466.101.120.16") ||
-        attributeOid.equals("cn-oid") ||
-        attributeOid.equals("attributetypes-oid") ||
-        attributeOid.equals("objectclasses-oid") ||
-        attributeOid.equals("matchingrules-oid") ||
-        attributeOid.equals("matchingruleuse-oid") ||
-        attributeOid.equals("nameformdescription-oid") ||
-        attributeOid.equals("ditcontentrules-oid") ||
-        attributeOid.equals("ditstructurerules-oid") ||
-        attributeOid.equals("ldapsyntaxes-oid");
-  }
 }

--
Gitblit v1.10.0