From 570a8fc9d5996cd19861e23363d2adb2b59dfbfd Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 03 Jun 2016 11:52:19 +0000
Subject: [PATCH] OPENDJ-3037 Remove Schema.getSubTypes()

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java       |   11 -
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java |   52 ++----
 opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java                       |  224 +++++++++++--------------------
 opendj-server-legacy/src/main/java/org/opends/server/types/Schema.java                      |  113 ----------------
 4 files changed, 101 insertions(+), 299 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
index c2bd410..cac8f8a 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
@@ -45,6 +45,9 @@
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.opendj.config.server.ConfigChangeResult;
 import org.forgerock.opendj.config.server.ConfigException;
+import org.forgerock.opendj.config.server.ConfigurationAddListener;
+import org.forgerock.opendj.config.server.ConfigurationChangeListener;
+import org.forgerock.opendj.config.server.ConfigurationDeleteListener;
 import org.forgerock.opendj.ldap.ByteSequence;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
@@ -53,14 +56,11 @@
 import org.forgerock.opendj.ldap.SearchScope;
 import org.forgerock.opendj.ldap.SortKey;
 import org.forgerock.opendj.ldap.schema.AttributeType;
-import org.forgerock.util.Pair;
-import org.opends.messages.CoreMessages;
-import org.forgerock.opendj.config.server.ConfigurationAddListener;
-import org.forgerock.opendj.config.server.ConfigurationChangeListener;
-import org.forgerock.opendj.config.server.ConfigurationDeleteListener;
 import org.forgerock.opendj.server.config.server.BackendIndexCfg;
 import org.forgerock.opendj.server.config.server.BackendVLVIndexCfg;
 import org.forgerock.opendj.server.config.server.PluggableBackendCfg;
+import org.forgerock.util.Pair;
+import org.opends.messages.CoreMessages;
 import org.opends.server.api.ClientConnection;
 import org.opends.server.api.EntryCache;
 import org.opends.server.api.VirtualAttributeProvider;
@@ -89,11 +89,11 @@
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.SearchOperation;
 import org.opends.server.core.ServerContext;
+import org.opends.server.crypto.CryptoSuite;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.Attributes;
 import org.opends.server.types.CanceledOperationException;
 import org.opends.server.types.Control;
-import org.opends.server.crypto.CryptoSuite;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
 import org.opends.server.types.Modification;
@@ -2229,8 +2229,7 @@
     // Process in index configuration order.
     for (AttributeIndex index : attrIndexMap.values())
     {
-      // Check whether any modifications apply to this indexed attribute.
-      if (isAttributeModified(index, mods))
+      if (isAttributeModified(index.getAttributeType(), mods))
       {
         index.modifyEntry(buffer, entryID, oldEntry, newEntry);
       }
@@ -2486,31 +2485,6 @@
     return null;
   }
 
-  /**
-   * Checks if any modifications apply to this indexed attribute.
-   * @param index the indexed attributes.
-   * @param mods the modifications to check for.
-   * @return true if any apply, false otherwise.
-   */
-  private static boolean isAttributeModified(AttributeIndex index, List<Modification> mods)
-  {
-    AttributeType indexAttributeType = index.getAttributeType();
-    List<AttributeType> subTypes =
-            DirectoryServer.getSchema().getSubTypes(indexAttributeType);
-
-    for (Modification mod : mods)
-    {
-      Attribute modAttr = mod.getAttribute();
-      AttributeType modAttrType = modAttr.getAttributeDescription().getAttributeType();
-      if (modAttrType.equals(indexAttributeType)
-          || subTypes.contains(modAttrType))
-      {
-        return true;
-      }
-    }
-    return false;
-  }
-
   boolean isConfidentialityEnabled()
   {
     return config.isConfidentialityEnabled();
@@ -2740,4 +2714,16 @@
   public String toString() {
     return treePrefix;
   }
+
+  static boolean isAttributeModified(AttributeType attrType, List<Modification> mods)
+  {
+    for (Modification mod : mods)
+    {
+      if (attrType.isSuperTypeOf(mod.getAttribute().getAttributeDescription().getAttributeType()))
+      {
+        return true;
+      }
+    }
+    return false;
+  }
 }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
index a099e46..270caa1 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
@@ -417,16 +417,9 @@
     for (final SortKey sortKey : sortKeys)
     {
       final AttributeDescription attrDesc = AttributeDescription.valueOf(sortKey.getAttributeDescription());
-      final AttributeType attributeType = attrDesc.getAttributeType();
-      final List<AttributeType> subTypes = DirectoryServer.getSchema().getSubTypes(attributeType);
-      for (final Modification mod : mods)
+      if (EntryContainer.isAttributeModified(attrDesc.getAttributeType(), mods))
       {
-        final AttributeType modAttrType = mod.getAttribute().getAttributeDescription().getAttributeType();
-        if (modAttrType.equals(attributeType)
-            || subTypes.contains(modAttrType))
-        {
-          return true;
-        }
+        return true;
       }
     }
     return false;
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java b/opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java
index 48f4055..387944d 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java
@@ -124,11 +124,6 @@
    */
   private transient Object attachment;
 
-  /** The schema used to govern this entry. */
-  private final Schema schema;
-
-
-
   /**
    * Creates a new entry with the provided information.
    *
@@ -151,8 +146,6 @@
                Map<AttributeType,List<Attribute>> userAttributes,
                Map<AttributeType,List<Attribute>> operationalAttributes)
   {
-    schema = DirectoryServer.getSchema();
-
     setDN(dn);
 
     this.objectClasses = newMapIfNull(objectClasses);
@@ -453,8 +446,6 @@
   public boolean hasAttribute(AttributeDescription attributeDescription, boolean includeSubordinates)
   {
     AttributeType attributeType = attributeDescription.getAttributeType();
-
-    // Handle object class.
     if (attributeType.isObjectClass())
     {
       return !objectClasses.isEmpty() && !attributeDescription.hasOptions();
@@ -468,40 +459,8 @@
       return attribute != null && !attribute.isEmpty();
     }
 
-    // Check all matching attributes.
-    List<Attribute> attributes = getAttributes(attributeType);
-    if (attributes != null)
-    {
-      for (Attribute attribute : attributes)
-      {
-        // It's possible that there could be an attribute without any
-        // values, which we should treat as not having the requested attribute.
-        if (!attribute.isEmpty() && attribute.getAttributeDescription().isSubTypeOf(attributeDescription))
-        {
-          return true;
-        }
-      }
-    }
-
-    // Check sub-types.
-    for (AttributeType subType : schema.getSubTypes(attributeType))
-    {
-      attributes = getAttributes(subType);
-      if (attributes != null)
-      {
-        for (Attribute attribute : attributes)
-        {
-          // It's possible that there could be an attribute without any values,
-          // which we should treat as not having the requested attribute.
-          if (!attribute.isEmpty() && attribute.getAttributeDescription().isSubTypeOf(attributeDescription))
-          {
-            return true;
-          }
-        }
-      }
-    }
-
-    return false;
+    return hasAttributeOrSubType(attributeDescription, userAttributes)
+        || hasAttributeOrSubType(attributeDescription, operationalAttributes);
   }
 
   /**
@@ -600,15 +559,8 @@
     if (includeSubordinates && !attributeType.isObjectClass())
     {
       List<Attribute> attributes = new LinkedList<>();
-      addAllIfNotNull(attributes, userAttributes.get(attributeType));
-      addAllIfNotNull(attributes, operationalAttributes.get(attributeType));
-
-      for (AttributeType at : schema.getSubTypes(attributeType))
-      {
-        addAllIfNotNull(attributes, userAttributes.get(at));
-        addAllIfNotNull(attributes, operationalAttributes.get(at));
-      }
-
+      addAttributeTypeOrSubTypeValue(attributes, attributeType, userAttributes);
+      addAttributeTypeOrSubTypeValue(attributes, attributeType, operationalAttributes);
       return attributes;
     }
 
@@ -629,23 +581,59 @@
     return Collections.emptyList();
   }
 
-  /**
-   * Add to the destination all the elements from a non null source .
-   *
-   * @param dest
-   *          the destination where to add
-   * @param source
-   *          the source with the elements to be added
-   */
-  private void addAllIfNotNull(List<Attribute> dest, List<Attribute> source)
+  private void addAttributeTypeOrSubTypeValue(Collection<Attribute> results, AttributeType attrType,
+      Map<AttributeType, List<Attribute>> attrsMap)
   {
-    if (source != null)
+    for (Map.Entry<AttributeType, List<Attribute>> mapEntry : attrsMap.entrySet())
     {
-      dest.addAll(source);
+      if (attrType.isSuperTypeOf(mapEntry.getKey()))
+      {
+        results.addAll(mapEntry.getValue());
+      }
     }
   }
 
+  private void addAttributeTypeOrSubTypeValue(Collection<Attribute> results, AttributeDescription attrDesc,
+      Map<AttributeType, List<Attribute>> attrsMap)
+  {
+    for (Map.Entry<AttributeType, List<Attribute>> mapEntry : attrsMap.entrySet())
+    {
+      if (!attrDesc.getAttributeType().isSuperTypeOf(mapEntry.getKey()))
+      {
+        continue;
+      }
 
+      for (Attribute attribute : mapEntry.getValue())
+      {
+        if (attrDesc.isSuperTypeOf(attribute.getAttributeDescription()))
+        {
+          results.add(attribute);
+        }
+      }
+    }
+  }
+
+  private boolean hasAttributeOrSubType(AttributeDescription attrDesc, Map<AttributeType, List<Attribute>> attrsMap)
+  {
+    for (Map.Entry<AttributeType, List<Attribute>> mapEntry : attrsMap.entrySet())
+    {
+      if (!attrDesc.getAttributeType().isSuperTypeOf(mapEntry.getKey()))
+      {
+        continue;
+      }
+
+      for (Attribute attribute : mapEntry.getValue())
+      {
+        // It's possible that there could be an attribute without any values,
+        // which we should treat as not having the requested attribute.
+        if (!attribute.isEmpty() && attrDesc.isSuperTypeOf(attribute.getAttributeDescription()))
+        {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
 
   /**
    * Retrieves the requested attribute element(s) for the attribute
@@ -674,7 +662,7 @@
     {
       if (attr.hasNameOrOID(lowerName))
       {
-        return getAttribute(attr, true);
+        return getAttribute(attr);
       }
     }
 
@@ -682,7 +670,7 @@
     {
       if (attr.hasNameOrOID(lowerName))
       {
-        return getAttribute(attr, true);
+        return getAttribute(attr);
       }
     }
 
@@ -710,38 +698,32 @@
   public List<Attribute> getAttribute(AttributeDescription attributeDescription)
   {
     AttributeType attributeType = attributeDescription.getAttributeType();
-    List<Attribute> attributes = new LinkedList<>();
+
+    final List<Attribute> attributes = new LinkedList<>();
     if (!attributeType.isObjectClass())
     {
-      addAllIfNotNull(attributes, userAttributes.get(attributeType));
-      addAllIfNotNull(attributes, operationalAttributes.get(attributeType));
-
-      for (AttributeType at : schema.getSubTypes(attributeType))
-      {
-        addAllIfNotNull(attributes, userAttributes.get(at));
-        addAllIfNotNull(attributes, operationalAttributes.get(at));
-      }
+      addAttributeTypeOrSubTypeValue(attributes, attributeDescription, userAttributes);
+      addAttributeTypeOrSubTypeValue(attributes, attributeDescription, operationalAttributes);
+      return attributes;
     }
-    else
+
+    List<Attribute> attrs = userAttributes.get(attributeType);
+    if (attrs == null)
     {
-      List<Attribute> attrs = userAttributes.get(attributeType);
+      attrs = operationalAttributes.get(attributeType);
       if (attrs == null)
       {
-        attrs = operationalAttributes.get(attributeType);
-        if (attrs == null)
+        if (attributeType.isObjectClass()
+            && !objectClasses.isEmpty()
+            && !attributeDescription.hasOptions())
         {
-          if (attributeType.isObjectClass()
-              && !objectClasses.isEmpty()
-              && !attributeDescription.hasOptions())
-          {
-            attributes.add(getObjectClassAttribute());
-            return attributes;
-          }
-          return Collections.emptyList();
+          attributes.add(getObjectClassAttribute());
+          return attributes;
         }
+        return Collections.emptyList();
       }
-      attributes.addAll(attrs);
     }
+    attributes.addAll(attrs);
 
     onlyKeepAttributesWithAllOptions(attributes, attributeDescription);
 
@@ -805,55 +787,20 @@
     return getAttribute(attributeType, userAttributes);
   }
 
-  /**
-   * Returns the List of attributes for a given attribute type.
-   *
-   * @param attributeType
-   *          the attribute type to be looked for
-   * @param attrs
-   *          the attributes Map where to find the attributes
-   * @return the List of attributes
-   */
   private List<Attribute> getAttribute(AttributeType attributeType,
       Map<AttributeType, List<Attribute>> attrs)
   {
-    List<Attribute> attributes = new LinkedList<>();
-    addAllIfNotNull(attributes, attrs.get(attributeType));
-    for (AttributeType at : schema.getSubTypes(attributeType))
-    {
-      addAllIfNotNull(attributes, attrs.get(at));
-    }
-    return attributes;
+    List<Attribute> results = new LinkedList<>();
+    addAttributeTypeOrSubTypeValue(results, attributeType, attrs);
+    return results;
   }
 
-
-
-  /**
-   * Returns the List of attributes for a given attribute type having all the
-   * required options.
-   *
-   * @param attributeType
-   *          the attribute type to be looked for
-   * @param options
-   *          the options that must all be present
-   * @param attrs
-   *          the attributes Map where to find the attributes
-   * @return the filtered List of attributes
-   */
   private List<Attribute> getAttribute(AttributeDescription attributeDescription,
       Map<AttributeType, List<Attribute>> attrs)
   {
-    AttributeType attributeType = attributeDescription.getAttributeType();
-    List<Attribute> attributes = new LinkedList<>();
-    addAllIfNotNull(attributes, attrs.get(attributeType));
-
-    for (AttributeType at : schema.getSubTypes(attributeType))
-    {
-      addAllIfNotNull(attributes, attrs.get(at));
-    }
-
-    onlyKeepAttributesWithAllOptions(attributes, attributeDescription);
-    return attributes;
+    List<Attribute> results = new LinkedList<>();
+    addAttributeTypeOrSubTypeValue(results, attributeDescription, attrs);
+    return results;
   }
 
   /**
@@ -894,19 +841,13 @@
 
   private boolean hasAttribute(Map<AttributeType, List<Attribute>> attributes, AttributeType attributeType)
   {
-    if (attributes.containsKey(attributeType))
+    for (AttributeType key : attributes.keySet())
     {
-      return true;
-    }
-
-    for (AttributeType at : schema.getSubTypes(attributeType))
-    {
-      if (attributes.containsKey(at))
+      if (attributeType.isSuperTypeOf(key))
       {
         return true;
       }
     }
-
     return false;
   }
 
@@ -1708,8 +1649,7 @@
     {
       if (DirectoryServer.getObjectClass(o.getOID()).isPlaceHolder())
       {
-        LocalizableMessage message = ERR_ENTRY_SCHEMA_UNKNOWN_OC.get(dn, o.getNameOrOID());
-        invalidReason.append(message);
+        invalidReason.append(ERR_ENTRY_SCHEMA_UNKNOWN_OC.get(dn, o.getNameOrOID()));
         return false;
       }
 
@@ -2150,9 +2090,7 @@
       {
         if (parentStructuralClass == null)
         {
-          LocalizableMessage message = ERR_ENTRY_SCHEMA_DSR_NO_PARENT_OC.get(
-              dn, parentEntry.getName());
-
+          LocalizableMessage message = ERR_ENTRY_SCHEMA_DSR_NO_PARENT_OC.get(dn, parentEntry.getName());
           if (structuralPolicy == AcceptRejectWarn.REJECT)
           {
             invalidReason.append(message);
@@ -2464,8 +2402,7 @@
    * @return true if the current entry has the object class or the attribute,
    *         false otherwise
    */
-  private boolean hasObjectClassOrAttribute(String objectClassName,
-      String attrTypeName)
+  private boolean hasObjectClassOrAttribute(String objectClassName, String attrTypeName)
   {
     ObjectClass oc = DirectoryServer.getObjectClass(objectClassName);
     if (oc.isPlaceHolder())
@@ -2480,7 +2417,6 @@
       return false;
     }
 
-
     AttributeType attrType = DirectoryServer.getAttributeType(attrTypeName);
     if (attrType.isPlaceHolder())
     {
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/types/Schema.java b/opendj-server-legacy/src/main/java/org/opends/server/types/Schema.java
index 29ea57b..bfbad7a 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/types/Schema.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/types/Schema.java
@@ -22,7 +22,6 @@
 import static org.opends.messages.CoreMessages.*;
 import static org.opends.messages.SchemaMessages.*;
 import static org.opends.server.config.ConfigConstants.*;
-import static org.opends.server.util.CollectionUtils.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.opends.server.util.StaticUtils.*;
 
@@ -100,12 +99,6 @@
   private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
 
   /**
-   * Provides for each attribute type having at least one subordinate type the complete list of
-   * its descendants.
-   */
-  private Map<AttributeType, List<AttributeType>> subordinateTypes;
-
-  /**
    * The set of ldap syntax descriptions for this schema, mapped the OID and the
    * ldap syntax description itself.
    */
@@ -114,7 +107,6 @@
 
   /** The oldest modification timestamp for any schema configuration file. */
   private long oldestModificationTime;
-
   /** The youngest modification timestamp for any schema configuration file. */
   private long youngestModificationTime;
 
@@ -155,7 +147,6 @@
     switchSchema(newSchemaNG);
 
     ldapSyntaxDescriptions = new ConcurrentHashMap<String,LDAPSyntaxDescription>();
-    subordinateTypes = new ConcurrentHashMap<AttributeType,List<AttributeType>>();
 
     oldestModificationTime    = System.currentTimeMillis();
     youngestModificationTime  = oldestModificationTime;
@@ -448,11 +439,6 @@
         builder.addAttributeType(defWithFile, overwrite);
       }
       switchSchema(builder.toSchema());
-
-      for (String definition : definitions)
-      {
-        updateSubordinateTypes(schemaNG.getAttributeType(parseAttributeTypeOID(definition)));
-      }
     }
     catch (ConflictingSchemaElementException | UnknownSchemaElementException e)
     {
@@ -511,8 +497,6 @@
       SchemaBuilder builder = new SchemaBuilder(schemaNG);
       registerAttributeType0(builder, attributeType, schemaFile, overwriteExisting);
       switchSchema(builder.toSchema());
-
-      updateSubordinateTypes(attributeType);
     }
     catch (LocalizedIllegalArgumentException e)
     {
@@ -564,13 +548,6 @@
       builder.removeAttributeType(existingAttributeType.getNameOrOID());
       registerAttributeType0(builder, newAttributeType, schemaFile, false);
       switchSchema(builder.toSchema());
-
-      AttributeType superiorType = existingAttributeType.getSuperiorType();
-      if (superiorType != null)
-      {
-        deregisterSubordinateType(existingAttributeType, superiorType);
-      }
-      updateSubordinateTypes(newAttributeType);
     }
     finally
     {
@@ -669,11 +646,6 @@
       SchemaBuilder builder = new SchemaBuilder(schemaNG);
       if (builder.removeAttributeType(attributeType.getNameOrOID()))
       {
-        AttributeType superiorType = attributeType.getSuperiorType();
-        if (superiorType != null)
-        {
-          deregisterSubordinateType(attributeType, superiorType);
-        }
         switchSchema(builder.toSchema());
       }
     }
@@ -683,84 +655,6 @@
     }
   }
 
-  private void updateSubordinateTypes(AttributeType attributeType)
-  {
-    AttributeType superiorType = attributeType.getSuperiorType();
-    if (superiorType != null)
-    {
-      registerSubordinateType(attributeType, superiorType);
-    }
-  }
-
-  /**
-   * Registers the provided attribute type as a subtype of the given
-   * superior attribute type, recursively following any additional
-   * elements in the superior chain.
-   *
-   * @param  attributeType  The attribute type to be registered as a
-   *                        subtype for the given superior type.
-   * @param  superiorType   The superior type for which to register
-   *                        the given attribute type as a subtype.
-   */
-  private void registerSubordinateType(AttributeType attributeType, AttributeType superiorType)
-  {
-    List<AttributeType> subTypes = subordinateTypes.get(superiorType);
-    if (subTypes == null)
-    {
-      subordinateTypes.put(superiorType, newLinkedList(attributeType));
-    }
-    else if (!subTypes.contains(attributeType))
-    {
-      subTypes.add(attributeType);
-
-      AttributeType higherSuperior = superiorType.getSuperiorType();
-      if (higherSuperior != null)
-      {
-        registerSubordinateType(attributeType, higherSuperior);
-      }
-    }
-  }
-
-  /**
-   * Deregisters the provided attribute type as a subtype of the given
-   * superior attribute type, recursively following any additional
-   * elements in the superior chain.
-   *
-   * @param  attributeType  The attribute type to be deregistered as a
-   *                        subtype for the given superior type.
-   * @param  superiorType   The superior type for which to deregister
-   *                        the given attribute type as a subtype.
-   */
-  private void deregisterSubordinateType(AttributeType attributeType, AttributeType superiorType)
-  {
-    List<AttributeType> subTypes = subordinateTypes.get(superiorType);
-    if (subTypes != null && subTypes.remove(attributeType))
-    {
-      AttributeType higherSuperior = superiorType.getSuperiorType();
-      if (higherSuperior != null)
-      {
-        deregisterSubordinateType(attributeType, higherSuperior);
-      }
-    }
-  }
-
-  /**
-   * Retrieves the set of subtypes registered for the given attribute
-   * type.
-   *
-   * @param  attributeType  The attribute type for which to retrieve
-   *                        the set of registered subtypes.
-   *
-   * @return  The set of subtypes registered for the given attribute
-   *          type, or an empty set if there are no subtypes
-   *          registered for the attribute type.
-   */
-  public List<AttributeType> getSubTypes(AttributeType attributeType)
-  {
-    List<AttributeType> subTypes = subordinateTypes.get(attributeType);
-    return subTypes != null ? subTypes : Collections.<AttributeType> emptyList();
-  }
-
   /**
    * Retrieves the objectclass definitions for this schema.
    *
@@ -1936,7 +1830,6 @@
       throw new RuntimeException(unexpected);
     }
 
-    dupSchema.subordinateTypes.putAll(subordinateTypes);
     dupSchema.ldapSyntaxDescriptions.putAll(ldapSyntaxDescriptions);
     dupSchema.oldestModificationTime   = oldestModificationTime;
     dupSchema.youngestModificationTime = youngestModificationTime;
@@ -2365,12 +2258,6 @@
       schemaNG = null;
     }
 
-    if (subordinateTypes != null)
-    {
-      subordinateTypes.clear();
-      subordinateTypes = null;
-    }
-
     if (extraAttributes != null)
     {
       extraAttributes.clear();

--
Gitblit v1.10.0