From dc1a95c709158ba2ae660cd940baf81709857a9f Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Mon, 30 May 2016 10:43:10 +0000
Subject: [PATCH] OPENDJ-2987 Update server Schema class to rely on SDK schema for object classes

---
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BrowseSchemaPanel.java                      |    8 +-
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java             |    4 
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/CustomObjectClassPanel.java                 |    2 
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/StandardAttributePanel.java                 |    6 +-
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java                |   10 +--
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SelectObjectClassesPanel.java               |    7 +-
 opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java                                   |   13 +--
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/components/SuperiorObjectClassesEditor.java |    5 -
 opendj-server-legacy/src/main/java/org/opends/server/types/Schema.java                                             |  102 ++++++++++------------------------
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/CustomAttributePanel.java                   |    8 +-
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/ObjectClassEditorPanel.java                 |    8 +-
 11 files changed, 62 insertions(+), 111 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java
index 9d49019..e495683 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java
@@ -24,7 +24,6 @@
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 import org.forgerock.opendj.ldap.DN;
@@ -573,16 +572,15 @@
 
   private static boolean areObjectClassesEqual(Schema schema1, Schema schema2)
   {
-    final Map<String, ObjectClass> ocs1 = schema1.getObjectClasses();
-    final Map<String, ObjectClass> ocs2 = schema2.getObjectClasses();
+    final Collection<ObjectClass> ocs1 = schema1.getObjectClasses();
+    final Collection<ObjectClass> ocs2 = schema2.getObjectClasses();
     if (ocs1.size() != ocs2.size())
     {
       return false;
     }
-    for (String name : ocs1.keySet())
+    for (ObjectClass oc1 : ocs1)
     {
-      ObjectClass oc1 = ocs1.get(name);
-      ObjectClass oc2 = ocs2.get(name);
+      ObjectClass oc2 = schema2.getObjectClass(oc1.getNameOrOID());
       if (oc2 == null || !areObjectClassesEqual(oc1, oc2))
       {
         return false;
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java
index 5fafcf9..d2b183b 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java
@@ -638,7 +638,7 @@
     ArrayList<ObjectClass> dependentClasses = new ArrayList<>();
     for (AttributeType attr : attrsToDelete)
     {
-      for (ObjectClass oc : schema.getObjectClasses().values())
+      for (ObjectClass oc : schema.getObjectClasses())
       {
         if (oc.getRequiredAttributes().contains(attr)
             || oc.getOptionalAttributes().contains(attr))
@@ -691,7 +691,7 @@
       ObjectClass objectClass, Schema schema)
   {
     LinkedHashSet<ObjectClass> children = new LinkedHashSet<>();
-    for (ObjectClass oc : schema.getObjectClasses().values())
+    for (ObjectClass oc : schema.getObjectClasses())
     {
       if (oc.getSuperiorClasses().contains(objectClass))
       {
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BrowseSchemaPanel.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BrowseSchemaPanel.java
index 90e0ebf..6523126 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BrowseSchemaPanel.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BrowseSchemaPanel.java
@@ -665,7 +665,7 @@
     Map<String, ConfigurationObjectClassTreeNode> hmConfigurationOcs = new HashMap<>();
     Set<String> customOcNames = new TreeSet<>(lowerCaseComparator);
     Map<String, CustomObjectClassTreeNode> hmCustomOcs = new HashMap<>();
-    for (ObjectClass oc : lastSchema.getObjectClasses().values())
+    for (ObjectClass oc : lastSchema.getObjectClasses())
     {
       if (mustAdd(oc))
       {
@@ -1279,7 +1279,7 @@
 
   private boolean mustAddAnyObjectClassName(ObjectClass oc, String f)
   {
-    for (ObjectClass o : lastSchema.getObjectClasses().values())
+    for (ObjectClass o : lastSchema.getObjectClasses())
     {
       if (isDescendant(oc, o) && mustAddObjectClassName(o, f))
       {
@@ -1584,7 +1584,7 @@
     // Analyze objectClasses
     for (ObjectClass objectClass : ocsToDelete)
     {
-      for (ObjectClass o : schema.getObjectClasses().values())
+      for (ObjectClass o : schema.getObjectClasses())
       {
         if (o.getSuperiorClasses().contains(objectClass))
         {
@@ -1608,7 +1608,7 @@
       }
       childAttributes.removeAll(attrsToDelete);
 
-      for (ObjectClass o : schema.getObjectClasses().values())
+      for (ObjectClass o : schema.getObjectClasses())
       {
         if (o.getRequiredAttributes().contains(attribute))
         {
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/CustomAttributePanel.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/CustomAttributePanel.java
index 52b4133..c4faebe 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/CustomAttributePanel.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/CustomAttributePanel.java
@@ -67,6 +67,7 @@
 import org.forgerock.opendj.ldap.schema.AttributeType;
 import org.forgerock.opendj.ldap.schema.AttributeUsage;
 import org.forgerock.opendj.ldap.schema.MatchingRule;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.forgerock.opendj.ldap.schema.SchemaBuilder;
 import org.forgerock.opendj.ldap.schema.Syntax;
 import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
@@ -83,7 +84,6 @@
 import org.opends.guitools.controlpanel.util.LowerCaseComparator;
 import org.opends.guitools.controlpanel.util.Utilities;
 import org.opends.server.schema.SomeSchemaElement;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.types.Schema;
 import org.opends.server.util.ServerConstants;
 import org.opends.server.util.StaticUtils;
@@ -560,7 +560,7 @@
 
     Comparator<String> lowerCaseComparator = new LowerCaseComparator();
     SortedSet<String> requiredByOcs = new TreeSet<>(lowerCaseComparator);
-    for (ObjectClass oc : schema.getObjectClasses().values())
+    for (ObjectClass oc : schema.getObjectClasses())
     {
       if (oc.getRequiredAttributes().contains(attr))
       {
@@ -576,7 +576,7 @@
     }
 
     SortedSet<String> optionalByOcs = new TreeSet<>(lowerCaseComparator);
-    for (ObjectClass oc : schema.getObjectClasses().values())
+    for (ObjectClass oc : schema.getObjectClasses())
     {
       if (oc.getOptionalAttributes().contains(attr))
       {
@@ -735,7 +735,7 @@
         }
       }
 
-      for (ObjectClass o : schema.getObjectClasses().values())
+      for (ObjectClass o : schema.getObjectClasses())
       {
         if (o.getRequiredAttributes().contains(attribute))
         {
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/CustomObjectClassPanel.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/CustomObjectClassPanel.java
index 2f33e7e..32c78fa 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/CustomObjectClassPanel.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/CustomObjectClassPanel.java
@@ -641,7 +641,7 @@
     ArrayList<String> childClasses = new ArrayList<>();
     if (schema != null)
     {
-      for (ObjectClass o : schema.getObjectClasses().values())
+      for (ObjectClass o : schema.getObjectClasses())
       {
         for (ObjectClass superior : o.getSuperiorClasses())
         {
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/ObjectClassEditorPanel.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/ObjectClassEditorPanel.java
index b1730f0..5948beb 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/ObjectClassEditorPanel.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/ObjectClassEditorPanel.java
@@ -29,14 +29,14 @@
 import javax.swing.JLabel;
 import javax.swing.SwingUtilities;
 
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
+import org.forgerock.opendj.ldap.schema.ObjectClassType;
 import org.opends.guitools.controlpanel.datamodel.ObjectClassValue;
 import org.opends.guitools.controlpanel.datamodel.SortableListModel;
 import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
 import org.opends.guitools.controlpanel.ui.components.AddRemovePanel;
 import org.opends.guitools.controlpanel.util.Utilities;
-import org.forgerock.i18n.LocalizableMessage;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
-import org.forgerock.opendj.ldap.schema.ObjectClassType;
 import org.opends.server.types.Schema;
 
 /**
@@ -160,7 +160,7 @@
     {
       final SortedSet<String> auxiliaryOcs = new TreeSet<>();
       final SortedSet<String> structuralOcs = new TreeSet<>();
-      for (ObjectClass oc : schema.getObjectClasses().values())
+      for (ObjectClass oc : schema.getObjectClasses())
       {
         if (oc.getObjectClassType() == ObjectClassType.AUXILIARY)
         {
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SelectObjectClassesPanel.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SelectObjectClassesPanel.java
index f9d766b..0e87ff1 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SelectObjectClassesPanel.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SelectObjectClassesPanel.java
@@ -28,13 +28,13 @@
 
 import javax.swing.JEditorPane;
 
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
 import org.opends.guitools.controlpanel.ui.components.AddRemovePanel;
 import org.opends.guitools.controlpanel.ui.renderer.
  SchemaElementComboBoxCellRenderer;
 import org.opends.guitools.controlpanel.util.Utilities;
-import org.forgerock.i18n.LocalizableMessage;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.types.Schema;
 
 /**
@@ -219,9 +219,8 @@
   private void updateWithSchema(Schema schema)
   {
     ArrayList<ObjectClass> allOcs = new ArrayList<>();
-    for (String key : schema.getObjectClasses().keySet())
+    for (ObjectClass oc : schema.getObjectClasses())
     {
-      ObjectClass oc = schema.getObjectClass(key);
       if (!toExclude.contains(oc))
       {
         allOcs.add(oc);
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/StandardAttributePanel.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/StandardAttributePanel.java
index abd3194..57eb288 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/StandardAttributePanel.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/StandardAttributePanel.java
@@ -39,12 +39,12 @@
 import org.forgerock.i18n.LocalizableMessageBuilder;
 import org.forgerock.opendj.ldap.schema.AttributeType;
 import org.forgerock.opendj.ldap.schema.MatchingRule;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
 import org.opends.guitools.controlpanel.ui.components.TitlePanel;
 import org.opends.guitools.controlpanel.util.LowerCaseComparator;
 import org.opends.guitools.controlpanel.util.Utilities;
 import org.opends.server.schema.SomeSchemaElement;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.types.Schema;
 
 /** The panel that displays a standard attribute definition. */
@@ -278,7 +278,7 @@
 
     Comparator<String> lowerCaseComparator = new LowerCaseComparator();
     SortedSet<String> requiredByOcs = new TreeSet<>(lowerCaseComparator);
-    for (ObjectClass oc : schema.getObjectClasses().values())
+    for (ObjectClass oc : schema.getObjectClasses())
     {
       if (oc.getRequiredAttributes().contains(attr))
       {
@@ -294,7 +294,7 @@
     }
 
     SortedSet<String> optionalByOcs = new TreeSet<>(lowerCaseComparator);
-    for (ObjectClass oc : schema.getObjectClasses().values())
+    for (ObjectClass oc : schema.getObjectClasses())
     {
       if (oc.getOptionalAttributes().contains(attr))
       {
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/components/SuperiorObjectClassesEditor.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/components/SuperiorObjectClassesEditor.java
index 50677ba..eeb425f 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/components/SuperiorObjectClassesEditor.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/components/SuperiorObjectClassesEditor.java
@@ -40,6 +40,7 @@
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.guitools.controlpanel.event.SuperiorObjectClassesChangedEvent;
 import org.opends.guitools.controlpanel.event.SuperiorObjectClassesChangedListener;
 import org.opends.guitools.controlpanel.ui.GenericDialog;
@@ -47,7 +48,6 @@
 import org.opends.guitools.controlpanel.ui.renderer.SchemaElementComboBoxCellRenderer;
 import org.opends.guitools.controlpanel.util.LowerCaseComparator;
 import org.opends.guitools.controlpanel.util.Utilities;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.types.Schema;
 
 /** A panel that can be used to select one (or several) object classes. */
@@ -257,9 +257,8 @@
   private void updateWithSchema(Schema schema)
   {
     HashMap<String, ObjectClass> objectClassNameMap = new HashMap<>();
-    for (String key : schema.getObjectClasses().keySet())
+    for (ObjectClass oc : schema.getObjectClasses())
     {
-      ObjectClass oc = schema.getObjectClass(key);
       if (!toExclude.contains(oc))
       {
         objectClassNameMap.put(oc.getNameOrOID(), oc);
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 03e8fef..2c35c6a 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
@@ -46,7 +46,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
-import java.util.concurrent.ConcurrentHashMap;
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
@@ -566,7 +565,7 @@
         operationalAttrs, attributeTypesType, includeSchemaFile,
         AttributeTypeSyntax.isStripSyntaxMinimumUpperBound(),
         ignoreShowAllOption);
-    buildSchemaAttribute(schema.getObjectClasses().values(), userAttrs,
+    buildSchemaAttribute(schema.getObjectClasses(), userAttrs,
         operationalAttrs, objectClassesType, includeSchemaFile, false,
         ignoreShowAllOption);
     buildSchemaAttribute(schema.getMatchingRules(), userAttrs,
@@ -1379,7 +1378,7 @@
 
     // Make sure that the attribute type isn't used as a required or optional
     // attribute type in any objectclass.
-    for (ObjectClass oc : schema.getObjectClasses().values())
+    for (ObjectClass oc : schema.getObjectClasses())
     {
       if (oc.getDeclaredRequiredAttributes().contains(removeType) ||
           oc.getDeclaredOptionalAttributes().contains(removeType))
@@ -1643,7 +1642,7 @@
 
     // Make sure that the objectclass isn't used as the superior class for any
     // other objectclass.
-    for (ObjectClass oc : schema.getObjectClasses().values())
+    for (ObjectClass oc : schema.getObjectClasses())
     {
       for(ObjectClass superiorClass : oc.getSuperiorClasses())
       {
@@ -2693,7 +2692,7 @@
     // same file are written before the subordinate classes.
     Set<ObjectClass> addedClasses = new HashSet<>();
     values = new LinkedHashSet<>();
-    for (ObjectClass oc : schema.getObjectClasses().values())
+    for (ObjectClass oc : schema.getObjectClasses())
     {
       if (schemaFile.equals(getSchemaFile(oc)))
       {
@@ -3489,9 +3488,7 @@
 
     // loop on all the object classes in the current schema and delete
     // them from the new schema if they are not in the imported schema entry.
-    ConcurrentHashMap<String, ObjectClass> currentObjectClasses = newSchema.getObjectClasses();
-
-    for (ObjectClass removeClass : currentObjectClasses.values())
+    for (ObjectClass removeClass : newSchema.getObjectClasses())
     {
       String schemaFile = getSchemaFile(removeClass);
       if (CONFIG_SCHEMA_ELEMENTS_FILE.equals(schemaFile))
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 5dcd8cd..a52445f 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
@@ -115,12 +115,6 @@
   private Map<AttributeType, List<AttributeType>> subordinateTypes;
 
   /**
-   * The set of objectclass definitions for this schema, mapped between the
-   * lowercase names and OID for the definition and the objectclass itself.
-   */
-  private ConcurrentHashMap<String,ObjectClass> objectClasses;
-
-  /**
    * The set of DIT content rules for this schema, mapped between the structural
    * objectclass for the definition and the DIT content rule itself.
    */
@@ -199,7 +193,6 @@
   {
     switchSchema(schemaNG);
 
-    objectClasses = new ConcurrentHashMap<String,ObjectClass>();
     ditContentRules = new ConcurrentHashMap<ObjectClass,DITContentRule>();
     ditStructureRulesByID = new ConcurrentHashMap<Integer,DITStructureRule>();
     ditStructureRulesByNameForm = new ConcurrentHashMap<NameForm,DITStructureRule>();
@@ -660,9 +653,9 @@
    *
    * @return  The objectclass definitions for this schema.
    */
-  public ConcurrentHashMap<String,ObjectClass> getObjectClasses()
+  public Collection<ObjectClass> getObjectClasses()
   {
-    return objectClasses;
+    return schemaNG.getObjectClasses();
   }
 
 
@@ -680,7 +673,7 @@
    */
   public boolean hasObjectClass(String lowerName)
   {
-    return objectClasses.containsKey(lowerName);
+    return getSchemaNG().hasObjectClass(lowerName);
   }
 
 
@@ -698,7 +691,7 @@
    */
   public ObjectClass getObjectClass(String lowerName)
   {
-    return objectClasses.get(lowerName);
+    return getSchemaNG().getObjectClass(lowerName);
   }
 
 
@@ -724,48 +717,22 @@
     exclusiveLock.lock();
     try
     {
-      if (! overwriteExisting)
+      SchemaBuilder builder = new SchemaBuilder(schemaNG);
+      ObjectClass.Builder b = builder.buildObjectClass(objectClass);
+      String schemaFile = getSchemaFileName(objectClass);
+      if (schemaFile != null)
       {
-        String oid = toLowerCase(objectClass.getOID());
-        if (objectClasses.containsKey(oid))
-        {
-          ObjectClass conflictingClass = objectClasses.get(oid);
-
-          LocalizableMessage message = ERR_SCHEMA_CONFLICTING_OBJECTCLASS_OID.
-              get(objectClass.getNameOrOID(), oid,
-                  conflictingClass.getNameOrOID());
-          throw new DirectoryException(
-                       ResultCode.CONSTRAINT_VIOLATION, message);
-        }
-
-        for (String name : objectClass.getNormalizedNames())
-        {
-          if (objectClasses.containsKey(name))
-          {
-            ObjectClass conflictingClass = objectClasses.get(name);
-
-            LocalizableMessage message = ERR_SCHEMA_CONFLICTING_OBJECTCLASS_NAME.
-                get(objectClass.getNameOrOID(), name,
-                    conflictingClass.getNameOrOID());
-            throw new DirectoryException(
-                           ResultCode.CONSTRAINT_VIOLATION, message);
-          }
-        }
+        b.removeExtraProperty(SCHEMA_PROPERTY_FILENAME).extraProperties(SCHEMA_PROPERTY_FILENAME, schemaFile);
       }
-
-      ObjectClass old = objectClasses.put(toLowerCase(objectClass.getOID()),
-          objectClass);
-      if (old != null && old != objectClass)
+      if (overwriteExisting)
       {
-        // Mark the old object class as stale so that caches (such as compressed
-        // schema) can detect changes.
-        old.setDirty();
+        b.addToSchemaOverwrite();
       }
-
-      for (String name : objectClass.getNormalizedNames())
+      else
       {
-        objectClasses.put(name, objectClass);
+        b.addToSchema();
       }
+      switchSchema(builder.toSchema());
     }
     finally
     {
@@ -773,29 +740,27 @@
     }
   }
 
-
-
   /**
    * Deregisters the provided objectclass definition with this schema.
    *
-   * @param  objectClass  The objectclass to deregister with this
-   *                      schema.
+   * @param  objectClass  The objectclass to deregister with this schema.
+   * @throws DirectoryException
+   *           If the object class is referenced by another schema element.
    */
-  public void deregisterObjectClass(ObjectClass objectClass)
+  public void deregisterObjectClass(ObjectClass objectClass) throws DirectoryException
   {
-    synchronized (objectClasses)
+    exclusiveLock.lock();
+    try
     {
-      if (objectClasses.remove(toLowerCase(objectClass.getOID()), objectClass))
+      SchemaBuilder builder = new SchemaBuilder(schemaNG);
+      if (builder.removeObjectClass(objectClass.getNameOrOID()))
       {
-        // Mark the old object class as stale so that caches (such as
-        // compressed schema) can detect changes.
-        objectClass.setDirty();
+        switchSchema(builder.toSchema());
       }
-
-      for (String name : objectClass.getNormalizedNames())
-      {
-        objectClasses.remove(name, objectClass);
-      }
+    }
+    finally
+    {
+      exclusiveLock.unlock();
     }
   }
 
@@ -1926,7 +1891,7 @@
 
     for (AttributeType at : schemaNG.getAttributeTypes())
     {
-      if ((at.getSuperiorType() != null) && at.getSuperiorType().equals(type))
+      if (type.equals(at.getSuperiorType()))
       {
         deregisterAttributeType(at);
         registerAttributeType(at.toString(), getSchemaFileName(at), true);
@@ -1934,7 +1899,7 @@
       }
     }
 
-    for (ObjectClass oc : objectClasses.values())
+    for (ObjectClass oc : schemaNG.getObjectClasses())
     {
       if (oc.getDeclaredRequiredAttributes().contains(type) || oc.getDeclaredOptionalAttributes().contains(type))
       {
@@ -1983,7 +1948,7 @@
   private void rebuildDependentElements(ObjectClass c, int depth) throws DirectoryException
   {
     circularityCheck(depth, c);
-    for (ObjectClass oc : objectClasses.values())
+    for (ObjectClass oc : getObjectClasses())
     {
       if (oc.getSuperiorClasses().contains(c))
       {
@@ -2112,7 +2077,6 @@
     }
 
     dupSchema.subordinateTypes.putAll(subordinateTypes);
-    dupSchema.objectClasses.putAll(objectClasses);
     dupSchema.ditContentRules.putAll(ditContentRules);
     dupSchema.ditStructureRulesByID.putAll(ditStructureRulesByID);
     dupSchema.ditStructureRulesByNameForm.putAll(ditStructureRulesByNameForm);
@@ -2576,12 +2540,6 @@
       nameFormsByOC = null;
     }
 
-    if (objectClasses != null)
-    {
-      objectClasses.clear();
-      objectClasses = null;
-    }
-
     if (subordinateTypes != null)
     {
       subordinateTypes.clear();

--
Gitblit v1.10.0