From 1afeb00abfb007ef9322d2060896353aeb3efdc4 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Mon, 30 May 2016 10:43:11 +0000
Subject: [PATCH] OPENDJ-2987 Fix all classes that need to use ObjectClass placeholder instead of null

---
 opendj-server-legacy/src/main/java/org/opends/server/plugins/SambaPasswordPlugin.java                              |   37 +++++--
 opendj-server-legacy/src/main/java/org/opends/server/schema/DITContentRuleSyntax.java                              |   28 +----
 opendj-server-legacy/src/main/java/org/opends/server/schema/NameFormSyntax.java                                    |   14 --
 opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/DITContentRule.java                                     |    4 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java                                        |    2 
 opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java                                   |   10 +-
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java               |   15 +-
 opendj-server-legacy/src/main/java/org/opends/server/plugins/LDAPADListPlugin.java                                 |    2 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/Entries.java                                                   |    4 
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java                |    3 
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BrowseEntriesPanel.java                     |    9 -
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/SchemaLoader.java                         |    4 
 opendj-server-legacy/src/main/java/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java |    2 
 opendj-server-legacy/src/main/java/org/opends/server/core/SubentryPasswordPolicy.java                              |   11 +-
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/TableViewEntryPanel.java                    |    6 
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java                         |   12 +-
 opendj-server-legacy/src/main/java/org/opends/server/backends/NullBackend.java                                     |   10 -
 opendj-server-legacy/src/test/java/org/opends/server/backends/SchemaBackendTestCase.java                           |   28 ++---
 opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/FractionalReplicationTest.java             |    2 
 opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/ModifyConflictTest.java                    |    6 
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SchemaElementPanel.java                     |   13 +-
 opendj-server-legacy/src/test/java/org/opends/server/types/TestEntry.java                                          |    8 -
 opendj-server-legacy/src/main/java/org/opends/server/loggers/CommonAudit.java                                      |    8 
 opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java                                              |   25 +---
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/components/SuperiorObjectClassesEditor.java |    2 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/AttributeFilter.java                                           |    2 
 opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/LDAPReplicationDomain.java                 |   16 +-
 opendj-server-legacy/src/main/java/org/opends/server/types/SubtreeSpecification.java                               |    2 
 opendj-server-legacy/src/test/java/org/opends/server/core/SubtreeSpecificationTestCase.java                        |    4 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java                                             |    2 
 30 files changed, 123 insertions(+), 168 deletions(-)

diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/AttributeFilter.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/AttributeFilter.java
index 12a2f8b..c207ed8 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/AttributeFilter.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/AttributeFilter.java
@@ -336,7 +336,7 @@
         } else if (attributeDescription.startsWith("@") && attributeDescription.length() > 1) {
             final String objectClassName = attributeDescription.substring(1);
             final ObjectClass objectClass = schema.getObjectClass(objectClassName);
-            if (objectClass != null) {
+            if (!objectClass.isPlaceHolder()) {
                 allocatedRequestedAttributes();
                 for (final AttributeType at : objectClass.getRequiredAttributes()) {
                     final AttributeDescription ad = AttributeDescription.create(at);
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/Entries.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/Entries.java
index d216898..21596a0 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/Entries.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/Entries.java
@@ -697,7 +697,7 @@
                 final String objectClassName = v.toString();
                 final ObjectClass objectClass;
                 try {
-                    objectClass = schema.getObjectClass(objectClassName);
+                    objectClass = schema.asStrictSchema().getObjectClass(objectClassName);
                     objectClasses.add(objectClass);
                 } catch (final UnknownSchemaElementException e) {
                     // Ignore.
@@ -812,7 +812,7 @@
             final String objectClassName = v.toString();
             final ObjectClass objectClass;
             try {
-                objectClass = schema.getObjectClass(objectClassName);
+                objectClass = schema.asStrictSchema().getObjectClass(objectClassName);
             } catch (final UnknownSchemaElementException e) {
                 // Ignore.
                 continue;
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/DITContentRule.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/DITContentRule.java
index 714ad4f..529d85a 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/DITContentRule.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/DITContentRule.java
@@ -770,7 +770,7 @@
         // or is not structural, then fail.
         if (structuralClassOID != null) {
             try {
-                structuralClass = schema.getObjectClass(structuralClassOID);
+                structuralClass = schema.asStrictSchema().getObjectClass(structuralClassOID);
             } catch (final UnknownSchemaElementException e) {
                 final LocalizableMessage message =
                         ERR_ATTR_SYNTAX_DCR_UNKNOWN_STRUCTURAL_CLASS1.get(getNameOrOID(),
@@ -791,7 +791,7 @@
             ObjectClass objectClass;
             for (final String oid : auxiliaryClassOIDs) {
                 try {
-                    objectClass = schema.getObjectClass(oid);
+                    objectClass = schema.asStrictSchema().getObjectClass(oid);
                 } catch (final UnknownSchemaElementException e) {
                     // This isn't good because it is an unknown auxiliary class.
                     final LocalizableMessage message =
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java
index 93c2d57..f7779dc 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java
@@ -849,7 +849,7 @@
             ObjectClass superiorClass;
             for (final String superClassOid : superiorClassOIDs) {
                 try {
-                    superiorClass = schema.getObjectClass(superClassOid);
+                    superiorClass = schema.asStrictSchema().getObjectClass(superClassOid);
                 } catch (final UnknownSchemaElementException e) {
                     final LocalizableMessage message =
                             WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_SUPERIOR_CLASS1.get(
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java
index 11b2fc0..8506b74 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java
@@ -1768,7 +1768,7 @@
                 final String objectClassName = v.toString();
                 final ObjectClass objectClass;
                 try {
-                    objectClass = getObjectClass(objectClassName);
+                    objectClass = asStrictSchema().getObjectClass(objectClassName);
                     objectClasses.add(objectClass);
                 } catch (final UnknownSchemaElementException e) {
                     if (policy.checkAttributesAndObjectClasses().needsChecking()) {
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 e495683..31d6ce8 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
@@ -581,7 +581,7 @@
     for (ObjectClass oc1 : ocs1)
     {
       ObjectClass oc2 = schema2.getObjectClass(oc1.getNameOrOID());
-      if (oc2 == null || !areObjectClassesEqual(oc1, oc2))
+      if (oc2.isPlaceHolder() || !areObjectClassesEqual(oc1, oc2))
       {
         return false;
       }
@@ -633,7 +633,6 @@
   private static boolean areObjectClassesEqual(ObjectClass oc1, ObjectClass oc2)
   {
     return oc1.getOID().equals(oc2.getOID())
-        && oc1.isExtensibleObject() == oc2.isExtensibleObject()
         && areEqual(getDefinitionWithFileName(oc1), getDefinitionWithFileName(oc2))
         && areEqual(oc1.getDescription(), oc2.getDescription())
         && areEqual(oc1.getObjectClassType(), oc2.getObjectClassType())
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BrowseEntriesPanel.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BrowseEntriesPanel.java
index d6049a6..e7cefd9 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BrowseEntriesPanel.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BrowseEntriesPanel.java
@@ -65,6 +65,7 @@
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.opendj.ldap.DN;
 import org.forgerock.opendj.ldap.schema.AttributeType;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.guitools.controlpanel.browser.NodeRefresher;
 import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
 import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
@@ -79,7 +80,6 @@
 import org.opends.guitools.controlpanel.ui.nodes.DndBrowserNodes;
 import org.opends.guitools.controlpanel.util.LDAPEntryReader;
 import org.opends.guitools.controlpanel.util.Utilities;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.types.Schema;
 import org.opends.server.util.ServerConstants;
 
@@ -458,13 +458,12 @@
     Schema schema = getInfo().getServerDescriptor().getSchema();
     if (ocs != null && schema != null)
     {
-      AttributeType attr = schema.getAttributeType(
-          ServerConstants.ATTR_USER_PASSWORD);
+      AttributeType attr = schema.getAttributeType(ServerConstants.ATTR_USER_PASSWORD);
       for (String oc : ocs)
       {
         ObjectClass objectClass = schema.getObjectClass(oc);
-        if (objectClass != null
-            && attr != null
+        if (!attr.isPlaceHolder()
+            && !objectClass.isPlaceHolder()
             && objectClass.isRequiredOrOptional(attr))
         {
           return true;
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SchemaElementPanel.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SchemaElementPanel.java
index 34215f5..c887f22 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SchemaElementPanel.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SchemaElementPanel.java
@@ -110,16 +110,13 @@
   protected void objectClassSelected(JList<?> list)
   {
     String o = (String)list.getSelectedValue();
-    if (o != null)
+    Schema schema = getInfo().getServerDescriptor().getSchema();
+    if (o != null && schema != null)
     {
-      Schema schema = getInfo().getServerDescriptor().getSchema();
-      if (schema != null)
+      ObjectClass oc = schema.getObjectClass(o.toLowerCase());
+      if (!oc.isPlaceHolder())
       {
-        ObjectClass oc = schema.getObjectClass(o.toLowerCase());
-        if (oc != null)
-        {
-          notifySchemaSelectionListeners(oc);
-        }
+        notifySchemaSelectionListeners(oc);
       }
     }
   }
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java
index 646082f..d0246f2 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java
@@ -76,6 +76,7 @@
 import org.forgerock.opendj.ldap.DN;
 import org.forgerock.opendj.ldap.RDN;
 import org.forgerock.opendj.ldap.schema.AttributeType;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.forgerock.opendj.ldap.schema.Syntax;
 import org.opends.guitools.controlpanel.datamodel.BinaryValue;
 import org.opends.guitools.controlpanel.datamodel.CheckEntrySyntaxException;
@@ -91,7 +92,6 @@
 import org.opends.server.schema.SchemaConstants;
 import org.opends.server.types.Entry;
 import org.opends.server.types.LDIFImportConfig;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.types.OpenDsException;
 import org.opends.server.types.Schema;
 import org.opends.server.util.Base64;
@@ -720,7 +720,7 @@
         {
           String oc = (String)o;
           ObjectClass objectClass = schema.getObjectClass(oc.toLowerCase());
-          if (objectClass != null)
+          if (!objectClass.isPlaceHolder())
           {
             for (AttributeType attr : objectClass.getRequiredAttributes())
             {
@@ -1153,11 +1153,10 @@
       if (!attrType.isPlaceHolder())
       {
         List<Object> ocs = sr.getAttributeValues(ServerConstants.OBJECTCLASS_ATTRIBUTE_TYPE_NAME);
-        for (Object o : ocs)
+        for (Object oc : ocs)
         {
-          String oc = (String) o;
-          ObjectClass objectClass = schema.getObjectClass(oc.toLowerCase());
-          if (objectClass != null && objectClass.isRequired(attrType))
+          ObjectClass objectClass = schema.getObjectClass(((String) oc).toLowerCase());
+          if (!objectClass.isPlaceHolder() && objectClass.isRequired(attrType))
           {
             return true;
           }
@@ -1636,7 +1635,7 @@
       for (String oc : ocs)
       {
         ObjectClass objectClass = schema.getObjectClass(oc);
-        if (objectClass != null)
+        if (!objectClass.isPlaceHolder())
         {
           for (AttributeType attr : objectClass.getRequiredAttributes())
           {
@@ -1825,7 +1824,7 @@
         if (schema != null && structural != null)
         {
           ObjectClass oc = schema.getObjectClass(structural.toLowerCase());
-          if (oc != null)
+          if (!oc.isPlaceHolder())
           {
             values.addAll(getObjectClassSuperiorValues(oc));
           }
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/TableViewEntryPanel.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/TableViewEntryPanel.java
index 76d61e0..8fb27a4 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/TableViewEntryPanel.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/TableViewEntryPanel.java
@@ -51,6 +51,7 @@
 import org.forgerock.opendj.ldap.DN;
 import org.forgerock.opendj.ldap.RDN;
 import org.forgerock.opendj.ldap.schema.AttributeType;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.guitools.controlpanel.datamodel.BinaryValue;
 import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
 import org.opends.guitools.controlpanel.datamodel.ObjectClassValue;
@@ -61,7 +62,6 @@
 import org.opends.guitools.controlpanel.util.Utilities;
 import org.opends.server.types.Entry;
 import org.opends.server.types.LDIFImportConfig;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.types.OpenDsException;
 import org.opends.server.types.Schema;
 import org.opends.server.util.LDIFReader;
@@ -619,7 +619,7 @@
         {
           String oc = (String)o;
           ObjectClass objectClass = schema.getObjectClass(oc.toLowerCase());
-          if (objectClass != null)
+          if (!objectClass.isPlaceHolder())
           {
             for (AttributeType attr : objectClass.getRequiredAttributes())
             {
@@ -747,7 +747,7 @@
         for (String oc : ocs)
         {
           ObjectClass objectClass = schema.getObjectClass(oc);
-          if (objectClass != null)
+          if (!objectClass.isPlaceHolder())
           {
             for (AttributeType attr : objectClass.getRequiredAttributes())
             {
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java
index 2d0eeb4..191913a 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java
@@ -38,6 +38,7 @@
 import org.forgerock.opendj.ldap.AttributeDescription;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.schema.AttributeType;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.forgerock.opendj.ldap.schema.ObjectClassType;
 import org.opends.guitools.controlpanel.datamodel.BinaryValue;
 import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
@@ -50,7 +51,6 @@
 import org.opends.server.schema.SchemaConstants;
 import org.opends.server.types.Attributes;
 import org.opends.server.types.Entry;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.types.OpenDsException;
 import org.opends.server.types.Schema;
 import org.opends.server.util.Base64;
@@ -246,9 +246,8 @@
     SortedSet<String> auxiliaryClasses = new TreeSet<>();
     for (Object o : ocValues)
     {
-      ObjectClass objectClass =
-        schema.getObjectClass(((String)o).toLowerCase());
-      if (objectClass != null)
+      ObjectClass objectClass = schema.getObjectClass(((String) o).toLowerCase());
+      if (!objectClass.isPlaceHolder())
       {
         if (objectClass.getObjectClassType() == ObjectClassType.STRUCTURAL)
         {
@@ -361,9 +360,8 @@
         Schema schema = getInfo().getServerDescriptor().getSchema();
         if (schema != null)
         {
-          ObjectClass oc =
-            schema.getObjectClass(ocValue.getStructural().toLowerCase());
-          if (oc != null)
+          ObjectClass oc = schema.getObjectClass(ocValue.getStructural().toLowerCase());
+          if (!oc.isPlaceHolder())
           {
             Set<String> names = getObjectClassSuperiorValues(oc);
             for (String name : names)
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 eeb425f..e1e0503 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
@@ -233,7 +233,7 @@
     }
 
     ObjectClass oc = (ObjectClass)singleSuperior.getSelectedItem();
-    if (oc != null)
+    if (oc != null && !oc.isPlaceHolder())
     {
       return Collections.singleton(oc);
     }
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/SchemaLoader.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/SchemaLoader.java
index 2c3a161..71dfc43 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/SchemaLoader.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/SchemaLoader.java
@@ -30,6 +30,7 @@
 import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.schema.AttributeType;
 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.server.config.ConfigConstants;
@@ -38,7 +39,6 @@
 import org.opends.server.schema.SchemaConstants;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.InitializationException;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.types.Schema;
 
 import com.forgerock.opendj.util.OperatingSystem;
@@ -70,7 +70,7 @@
     for (String name : OBJECTCLASS_TO_KEEP)
     {
       ObjectClass oc = sc.getObjectClass(name.toLowerCase());
-      if (oc != null)
+      if (!oc.isPlaceHolder())
       {
         objectclassesToKeep.add(oc);
       }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/NullBackend.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/NullBackend.java
index 53f7255..bcbc0de 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/NullBackend.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/NullBackend.java
@@ -143,13 +143,7 @@
     // Initialize null entry object classes.
     objectClasses = new HashMap<>();
 
-    String topOCName = "top";
-    ObjectClass topOC = DirectoryServer.getObjectClass(topOCName);
-    if (topOC == null) {
-      throw new InitializationException(LocalizableMessage.raw("Unable to locate " + topOCName +
-        " objectclass in the current server schema"));
-    }
-    objectClasses.put(topOC, topOCName);
+    objectClasses.put(DirectoryServer.getTopObjectClass(), "top");
 
     String nulOCName = "nullbackendobject";
     ObjectClass nulOC = DirectoryServer.getObjectClass2(nulOCName);
@@ -163,7 +157,7 @@
 
     String extOCName = "extensibleobject";
     ObjectClass extOC = DirectoryServer.getObjectClass(extOCName);
-    if (extOC == null) {
+    if (extOC.isPlaceHolder()) {
       throw new InitializationException(LocalizableMessage.raw("Unable to locate " + extOCName +
         " objectclass in the current server schema"));
     }
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 4073a3c..49e0230 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
@@ -1467,8 +1467,8 @@
     ObjectClass existingClass = schema.getObjectClass(objectClass.getOID());
     for (String name : objectClass.getNames())
     {
-      ObjectClass oc = schema.getObjectClass(toLowerCase(name));
-      if (oc == null)
+      ObjectClass oc = schema.getObjectClass(name);
+      if (oc.isPlaceHolder())
       {
         continue;
       }
@@ -1543,7 +1543,7 @@
 
     // If there is no existing class, then we're adding a new objectclass.
     // Otherwise, we're replacing an existing one.
-    if (existingClass == null)
+    if (existingClass.isPlaceHolder())
     {
       schema.registerObjectClass(objectClass, false);
       addNewSchemaElement(modifiedSchemaFiles, objectClass);
@@ -1592,7 +1592,7 @@
     // See if the specified objectclass is actually defined in the server
     // schema.  If not, then fail.
     ObjectClass removeClass = schema.getObjectClass(objectClass.getOID());
-    if (removeClass == null || !removeClass.equals(objectClass))
+    if (removeClass.isPlaceHolder() || !removeClass.equals(objectClass))
     {
       LocalizableMessage message = ERR_SCHEMA_MODIFY_REMOVE_NO_SUCH_OBJECTCLASS.get(
           objectClass.getNameOrOID());
@@ -3468,7 +3468,7 @@
           // Register this ObjectClass in the new schema
           // unless it is already defined with the same syntax.
           ObjectClass oldObjectClass = schema.getObjectClass(newObjectClass.getOID());
-          if (oldObjectClass == null || !oldObjectClass.toString().equals(newObjectClass.toString()))
+          if (oldObjectClass.isPlaceHolder() || !oldObjectClass.toString().equals(newObjectClass.toString()))
           {
             newSchema.registerObjectClass(newObjectClass, true);
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/core/SubentryPasswordPolicy.java b/opendj-server-legacy/src/main/java/org/opends/server/core/SubentryPasswordPolicy.java
index 9e2382b..258f6ca 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/core/SubentryPasswordPolicy.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/core/SubentryPasswordPolicy.java
@@ -32,8 +32,10 @@
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.opendj.config.server.ConfigException;
 import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.DN;
 import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.schema.AttributeType;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.forgerock.opendj.server.config.meta.PasswordPolicyCfgDefn.StateUpdateFailurePolicy;
 import org.forgerock.opendj.server.config.server.PasswordValidatorCfg;
 import org.opends.server.api.AccountStatusNotificationHandler;
@@ -41,11 +43,9 @@
 import org.opends.server.api.PasswordStorageScheme;
 import org.opends.server.api.PasswordValidator;
 import org.opends.server.types.Attribute;
-import org.forgerock.opendj.ldap.DN;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
 import org.opends.server.types.InitializationException;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.types.Operation;
 import org.opends.server.types.SubEntry;
 import org.opends.server.util.SchemaUtils;
@@ -143,7 +143,7 @@
     ObjectClass pwdPolicyOC = DirectoryServer.getObjectClass(PWD_OC_POLICY);
     Entry entry = subentry.getEntry();
     Map<ObjectClass, String> objectClasses = entry.getObjectClasses();
-    if (pwdPolicyOC == null)
+    if (pwdPolicyOC.isPlaceHolder())
     {
       // This should not happen -- The server doesn't
       // have a pwdPolicy objectclass defined.
@@ -245,9 +245,8 @@
 
     // Now check for the pwdValidatorPolicy OC and its attribute.
     // Determine if this is a password validator policy object class.
-    ObjectClass pwdValidatorPolicyOC =
-        DirectoryServer.getObjectClass(PWD_OC_VALIDATORPOLICY);
-    if (pwdValidatorPolicyOC != null &&
+    ObjectClass pwdValidatorPolicyOC = DirectoryServer.getObjectClass(PWD_OC_VALIDATORPOLICY);
+    if (!pwdValidatorPolicyOC.isPlaceHolder() &&
         objectClasses.containsKey(pwdValidatorPolicyOC))
     {
       AttributeType pwdAttrType =
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/loggers/CommonAudit.java b/opendj-server-legacy/src/main/java/org/opends/server/loggers/CommonAudit.java
index 582bad1..23659b4 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/loggers/CommonAudit.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/loggers/CommonAudit.java
@@ -62,6 +62,8 @@
 import org.forgerock.json.resource.RequestHandler;
 import org.forgerock.opendj.config.ConfigurationFramework;
 import org.forgerock.opendj.config.server.ConfigException;
+import org.forgerock.opendj.ldap.DN;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.forgerock.opendj.server.config.server.CsvFileAccessLogPublisherCfg;
 import org.forgerock.opendj.server.config.server.CsvFileHTTPAccessLogPublisherCfg;
 import org.forgerock.opendj.server.config.server.ExternalAccessLogPublisherCfg;
@@ -75,11 +77,9 @@
 import org.forgerock.opendj.server.config.server.SizeLimitLogRetentionPolicyCfg;
 import org.forgerock.opendj.server.config.server.SizeLimitLogRotationPolicyCfg;
 import org.forgerock.opendj.server.config.server.TimeLimitLogRotationPolicyCfg;
-import org.opends.server.types.Entry;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.core.DirectoryServer;
-import org.forgerock.opendj.ldap.DN;
 import org.opends.server.core.ServerContext;
+import org.opends.server.types.Entry;
 import org.opends.server.util.StaticUtils;
 
 /**
@@ -738,7 +738,7 @@
     private boolean hasObjectClass(ServerContext serverContext, Entry entry, String objectClassName)
     {
       ObjectClass objectClass = serverContext.getSchema().getObjectClass(objectClassName);
-      return objectClass != null && entry.hasObjectClass(objectClass);
+      return !objectClass.isPlaceHolder() && entry.hasObjectClass(objectClass);
     }
 
     DN getDn()
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/plugins/LDAPADListPlugin.java b/opendj-server-legacy/src/main/java/org/opends/server/plugins/LDAPADListPlugin.java
index ee2e75c..74049f1 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/plugins/LDAPADListPlugin.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/plugins/LDAPADListPlugin.java
@@ -91,7 +91,7 @@
         {
           final String lowerName = toLowerCase(attrName.substring(1));
           final ObjectClass oc = getObjectClass(lowerName);
-          if (oc == null)
+          if (oc.isPlaceHolder())
           {
             logger.trace("Cannot replace unknown objectclass %s", lowerName);
           }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/plugins/SambaPasswordPlugin.java b/opendj-server-legacy/src/main/java/org/opends/server/plugins/SambaPasswordPlugin.java
index 1581b56..f3422cb 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/plugins/SambaPasswordPlugin.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/plugins/SambaPasswordPlugin.java
@@ -21,35 +21,52 @@
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.security.NoSuchProviderException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.SortedSet;
 
-import javax.crypto.*;
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
 
 import org.forgerock.i18n.LocalizableMessage;
 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.ConfigurationChangeListener;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.DN;
 import org.forgerock.opendj.ldap.ModificationType;
-import org.forgerock.opendj.config.server.ConfigurationChangeListener;
+import org.forgerock.opendj.ldap.ResultCode;
+import org.forgerock.opendj.ldap.schema.AttributeType;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.forgerock.opendj.server.config.meta.PluginCfgDefn;
 import org.forgerock.opendj.server.config.meta.SambaPasswordPluginCfgDefn.PwdSyncPolicy;
 import org.forgerock.opendj.server.config.server.SambaPasswordPluginCfg;
 import org.opends.server.api.plugin.DirectoryServerPlugin;
 import org.opends.server.api.plugin.PluginResult;
 import org.opends.server.api.plugin.PluginType;
-import org.forgerock.opendj.config.server.ConfigChangeResult;
-import org.forgerock.opendj.config.server.ConfigException;
 import org.opends.server.controls.LDAPAssertionRequestControl;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.extensions.PasswordModifyExtendedOperation;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.ldap.LDAPFilter;
-import org.forgerock.opendj.ldap.schema.AttributeType;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
-import org.opends.server.types.*;
-import org.forgerock.opendj.ldap.ResultCode;
+import org.opends.server.types.Attribute;
+import org.opends.server.types.Attributes;
+import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.Entry;
+import org.opends.server.types.InitializationException;
+import org.opends.server.types.Modification;
+import org.opends.server.types.RawFilter;
+import org.opends.server.types.Schema;
 import org.opends.server.types.operation.PostOperationExtendedOperation;
 import org.opends.server.types.operation.PreOperationModifyOperation;
 
@@ -954,7 +971,7 @@
     final Schema schema = DirectoryServer.getSchema();
     final ObjectClass sambaOc = schema
         .getObjectClass(toLowerCase(SAMBA_SAM_ACCOUNT_OC_NAME));
-    return sambaOc != null && entry.hasObjectClass(sambaOc);
+    return !sambaOc.isPlaceHolder() && entry.hasObjectClass(sambaOc);
   }
 
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/LDAPReplicationDomain.java b/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/LDAPReplicationDomain.java
index 4d9e106..1d533d7 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/LDAPReplicationDomain.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/LDAPReplicationDomain.java
@@ -73,6 +73,7 @@
 import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.SearchScope;
 import org.forgerock.opendj.ldap.schema.AttributeType;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.forgerock.opendj.server.config.meta.ReplicationDomainCfgDefn.IsolationPolicy;
 import org.forgerock.opendj.server.config.server.ExternalChangelogDomainCfg;
 import org.forgerock.opendj.server.config.server.ReplicationDomainCfg;
@@ -138,7 +139,6 @@
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.Modification;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.types.Operation;
 import org.opends.server.types.OperationType;
 import org.opends.server.types.RawModification;
@@ -971,9 +971,8 @@
     for (String className : newFractionalSpecificClassesAttributes.keySet())
     {
       // Does the class exist ?
-      ObjectClass fractionalClass = schema.getObjectClass(
-        className.toLowerCase());
-      if (fractionalClass == null)
+      ObjectClass fractionalClass = schema.getObjectClass(className.toLowerCase());
+      if (fractionalClass.isPlaceHolder())
       {
         throw new ConfigException(
           NOTE_ERR_FRACTIONAL_CONFIG_UNKNOWN_OBJECT_CLASS.get(className));
@@ -4439,9 +4438,8 @@
       if (name.startsWith("@"))
       {
         String ocName = name.substring(1);
-        ObjectClass objectClass =
-            DirectoryServer.getObjectClass(toLowerCase(ocName));
-        if (objectClass != null)
+        ObjectClass objectClass = DirectoryServer.getObjectClass(toLowerCase(ocName));
+        if (!objectClass.isPlaceHolder())
         {
           for (AttributeType at : objectClass.getRequiredAttributes())
           {
@@ -4842,7 +4840,7 @@
       {
         // Get class from specificClassesAttributes1
         ObjectClass objectClass1 = schema.getObjectClass(className1);
-        if (objectClass1 == null)
+        if (objectClass1.isPlaceHolder())
         {
           throw new ConfigException(
             NOTE_ERR_FRACTIONAL_CONFIG_UNKNOWN_OBJECT_CLASS.get(className1));
@@ -4853,7 +4851,7 @@
         for (String className2 : specificClassesAttrs2.keySet())
         {
           ObjectClass objectClass2 = schema.getObjectClass(className2);
-          if (objectClass2 == null)
+          if (objectClass2.isPlaceHolder())
           {
             throw new ConfigException(
               NOTE_ERR_FRACTIONAL_CONFIG_UNKNOWN_OBJECT_CLASS.get(className2));
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/schema/DITContentRuleSyntax.java b/opendj-server-legacy/src/main/java/org/opends/server/schema/DITContentRuleSyntax.java
index 1be1030..0901afe 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/schema/DITContentRuleSyntax.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/schema/DITContentRuleSyntax.java
@@ -30,6 +30,7 @@
 import org.forgerock.opendj.ldap.ByteSequence;
 import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.schema.AttributeType;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.forgerock.opendj.ldap.schema.ObjectClassType;
 import org.forgerock.opendj.ldap.schema.Syntax;
 import org.forgerock.opendj.server.config.server.AttributeSyntaxCfg;
@@ -37,7 +38,6 @@
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.DITContentRule;
 import org.opends.server.types.DirectoryException;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.types.Schema;
 
 /**
@@ -235,13 +235,9 @@
     // Get the objectclass with the specified OID.  If it does not exist or is
     // not structural, then fail.
     ObjectClass structuralClass = schema.getObjectClass(oid);
-    if (structuralClass == null)
+    if (structuralClass.isPlaceHolder())
     {
-      if (allowUnknownElements)
-      {
-        structuralClass = DirectoryServer.getDefaultObjectClass(oid);
-      }
-      else
+      if (!allowUnknownElements)
       {
         LocalizableMessage message =
             ERR_ATTR_SYNTAX_DCR_UNKNOWN_STRUCTURAL_CLASS.get(valueStr, oid);
@@ -394,15 +390,10 @@
             pos = readWOID(lowerStr, woidBuffer, pos);
 
             ObjectClass oc = schema.getObjectClass(woidBuffer.toString());
-            if (oc == null)
+            if (oc.isPlaceHolder())
             {
               // This isn't good because it is an unknown auxiliary class.
-              if (allowUnknownElements)
-              {
-                oc = DirectoryServer.getDefaultAuxiliaryObjectClass(
-                                          woidBuffer.toString());
-              }
-              else
+              if (!allowUnknownElements)
               {
                 throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
                     ERR_ATTR_SYNTAX_DCR_UNKNOWN_AUXILIARY_CLASS.get(
@@ -444,15 +435,10 @@
           pos = readWOID(lowerStr, woidBuffer, pos-1);
 
           ObjectClass oc = schema.getObjectClass(woidBuffer.toString());
-          if (oc == null)
+          if (oc.isPlaceHolder())
           {
             // This isn't good because it is an unknown auxiliary class.
-            if (allowUnknownElements)
-            {
-              oc = DirectoryServer.getDefaultAuxiliaryObjectClass(
-                                        woidBuffer.toString());
-            }
-            else
+            if (!allowUnknownElements)
             {
               throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
                   ERR_ATTR_SYNTAX_DCR_UNKNOWN_AUXILIARY_CLASS.get(valueStr, woidBuffer));
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/schema/NameFormSyntax.java b/opendj-server-legacy/src/main/java/org/opends/server/schema/NameFormSyntax.java
index de9448b..5b5faf0 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/schema/NameFormSyntax.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/schema/NameFormSyntax.java
@@ -30,6 +30,7 @@
 import org.forgerock.opendj.ldap.ByteSequence;
 import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.schema.AttributeType;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.forgerock.opendj.ldap.schema.ObjectClassType;
 import org.forgerock.opendj.ldap.schema.Syntax;
 import org.forgerock.opendj.server.config.server.AttributeSyntaxCfg;
@@ -37,7 +38,6 @@
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.NameForm;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.types.Schema;
 
 /**
@@ -370,16 +370,10 @@
         StringBuilder woidBuffer = new StringBuilder();
         pos = readWOID(lowerStr, woidBuffer, pos);
         structuralClass = schema.getObjectClass(woidBuffer.toString());
-        if (structuralClass == null)
+        if (!structuralClass.isPlaceHolder())
         {
-          // This is bad because we don't know what the structural objectclass
-          // is.
-          if (allowUnknownElements)
-          {
-            structuralClass = DirectoryServer.getDefaultObjectClass(
-                                                   woidBuffer.toString());
-          }
-          else
+          // This is bad because we don't know what the structural objectclass is.
+          if (!allowUnknownElements)
           {
             LocalizableMessage message =
                 ERR_ATTR_SYNTAX_NAME_FORM_UNKNOWN_STRUCTURAL_CLASS.get(oid, woidBuffer);
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 9e8193cc..a869b51 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
@@ -1699,7 +1699,7 @@
     // all attributes required by the object classes are present.
     for (ObjectClass o : objectClasses.keySet())
     {
-      if (DirectoryServer.getObjectClass(o.getOID()) == null)
+      if (DirectoryServer.getObjectClass(o.getOID()).isPlaceHolder())
       {
         LocalizableMessage message = ERR_ENTRY_SCHEMA_UNKNOWN_OC.get(dn, o.getNameOrOID());
         invalidReason.append(message);
@@ -2463,16 +2463,11 @@
       String attrTypeName)
   {
     ObjectClass oc = DirectoryServer.getObjectClass(objectClassName);
-    if (oc == null)
+    if (oc.isPlaceHolder())
     {
       // This should not happen
       // The server doesn't have this objectclass defined.
-      if (logger.isTraceEnabled())
-      {
-        logger.trace(
-            "No %s objectclass is defined in the server schema.",
-            objectClassName);
-      }
+      logger.trace("No %s objectclass is defined in the server schema.", objectClassName);
       return containsObjectClassByName(objectClassName);
     }
     if (!objectClasses.containsKey(oc))
@@ -2486,10 +2481,7 @@
     {
       // This should not happen
       // The server doesn't have this attribute type defined.
-      if (logger.isTraceEnabled())
-      {
-        logger.trace("No %s attribute type is defined in the server schema.", attrTypeName);
-      }
+      logger.trace("No %s attribute type is defined in the server schema.", attrTypeName);
       return false;
     }
     return userAttributes.containsKey(attrType)
@@ -2647,16 +2639,11 @@
   private boolean hasObjectClass(String objectClassLowerCase)
   {
     ObjectClass oc = DirectoryServer.getObjectClass(objectClassLowerCase);
-    if (oc == null)
+    if (oc.isPlaceHolder())
     {
       // This should not happen
       // The server doesn't have this object class defined.
-      if (logger.isTraceEnabled())
-      {
-        logger.trace(
-            "No %s objectclass is defined in the server schema.",
-            objectClassLowerCase);
-      }
+      logger.trace("No %s objectclass is defined in the server schema.", objectClassLowerCase);
       return containsObjectClassByName(objectClassLowerCase);
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/types/SubtreeSpecification.java b/opendj-server-legacy/src/main/java/org/opends/server/types/SubtreeSpecification.java
index b95a596..5b4c9ce 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/types/SubtreeSpecification.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/types/SubtreeSpecification.java
@@ -272,7 +272,7 @@
     public boolean matches(final Entry entry)
     {
       final ObjectClass oc = DirectoryServer.getObjectClass(normalizedObjectClass);
-      return oc != null && entry.hasObjectClass(oc);
+      return !oc.isPlaceHolder() && entry.hasObjectClass(oc);
     }
 
     @Override
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java b/opendj-server-legacy/src/main/java/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java
index bc17c89..930831d 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java
@@ -1257,7 +1257,7 @@
       }
 
       ObjectClass oc = DirectoryServer.getObjectClass(lowerName);
-      if (oc == null)
+      if (oc.isPlaceHolder())
       {
         throw newDirectoryException(currentEntry,
             ResultCode.OBJECTCLASS_VIOLATION,
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/backends/SchemaBackendTestCase.java b/opendj-server-legacy/src/test/java/org/opends/server/backends/SchemaBackendTestCase.java
index fa9ab35..7b63784 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/backends/SchemaBackendTestCase.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/backends/SchemaBackendTestCase.java
@@ -41,6 +41,7 @@
 import org.forgerock.opendj.ldap.schema.AttributeType;
 import org.forgerock.opendj.ldap.schema.MatchingRule;
 import org.forgerock.opendj.ldap.schema.MatchingRuleUse;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.forgerock.opendj.ldap.schema.Schema;
 import org.forgerock.opendj.ldap.schema.SchemaBuilder;
 import org.forgerock.util.Utils;
@@ -63,7 +64,6 @@
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.LDIFImportResult;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.util.CollectionUtils;
 import org.opends.server.util.ServerConstants;
@@ -2381,7 +2381,7 @@
     runModify(argsNotPermissive(), ldif, System.err, SUCCESS);
 
     ObjectClass oc = DirectoryServer.getSchema().getObjectClass(ocName);
-    assertNotNull(oc);
+    assertFalse(oc.isPlaceHolder());
 
     DITContentRule dcr = DirectoryServer.getSchema().getDITContentRule(oc);
     assertNotNull(dcr);
@@ -2424,7 +2424,7 @@
     runModify(argsPermissive(), ldif, System.err, SUCCESS);
 
     ObjectClass oc = DirectoryServer.getSchema().getObjectClass(ocName);
-    assertNotNull(oc);
+    assertFalse(oc.isPlaceHolder());
 
     DITContentRule dcr = DirectoryServer.getSchema().getDITContentRule(oc);
     assertNotNull(dcr);
@@ -2466,7 +2466,7 @@
     runModify(argsNotPermissive(), ldif, System.err, SUCCESS);
 
     ObjectClass oc = DirectoryServer.getSchema().getObjectClass(ocName);
-    assertNotNull(oc);
+    assertFalse(oc.isPlaceHolder());
 
     DITContentRule dcr = DirectoryServer.getSchema().getDITContentRule(oc);
     assertNotNull(dcr);
@@ -2516,7 +2516,7 @@
     runModify(argsNotPermissive(), ldif, System.err, SUCCESS);
 
     ObjectClass oc = DirectoryServer.getSchema().getObjectClass(ocName);
-    assertNotNull(oc);
+    assertFalse(oc.isPlaceHolder());
 
     DITContentRule dcr = DirectoryServer.getSchema().getDITContentRule(oc);
     assertNotNull(dcr);
@@ -3116,7 +3116,7 @@
     runModify(argsNotPermissive(), ldif, System.err, SUCCESS);
 
     ObjectClass oc = DirectoryServer.getSchema().getObjectClass(ocName);
-    assertNotNull(oc);
+    assertFalse(oc.isPlaceHolder());
 
     DITContentRule dcr = DirectoryServer.getSchema().getDITContentRule(oc);
     assertNull(dcr);
@@ -4120,7 +4120,7 @@
               "X-ORIGIN 'SchemaBackendTestCase' )");
 
     String objectClassName = "testditcontentrulesmatchingruleoc";
-    assertNull(DirectoryServer.getSchema().getObjectClass(objectClassName));
+    assertTrue(DirectoryServer.getSchema().getObjectClass(objectClassName).isPlaceHolder());
 
     runModify(argsNotPermissive(), ldif, System.err, ATTRIBUTE_OR_VALUE_EXISTS);
   }
@@ -4186,7 +4186,7 @@
               "X-ORIGIN 'SchemaBackendTestCase' )");
 
     String objectClassName = "testditcontentrulesmatchingruleoc1";
-    assertNull(DirectoryServer.getSchema().getObjectClass(objectClassName));
+    assertTrue(DirectoryServer.getSchema().getObjectClass(objectClassName).isPlaceHolder());
 
     runModify(argsNotPermissive(), ldif, System.err, ATTRIBUTE_OR_VALUE_EXISTS);
   }
@@ -4363,10 +4363,8 @@
       "  MAY ( street $ c) X-ORIGIN 'user defined' )");
     assertEquals(resultCode, 0);
 
-    assertNotNull(DirectoryServer.getObjectClass(
-                       "testaddanddeletedefinitionwithextraspaces"));
-    assertNotNull(DirectoryServer.getObjectClass(
-                       "testaddanddeletedefinitionwithextraspaces-oid"));
+    assertFalse(getObjectClass("testaddanddeletedefinitionwithextraspaces").isPlaceHolder());
+    assertFalse(getObjectClass("testaddanddeletedefinitionwithextraspaces-oid").isPlaceHolder());
 
     resultCode = TestCaseUtils.applyModifications(false,
       "dn: cn=schema",
@@ -4377,10 +4375,8 @@
       "  MAY ( street $ c) X-ORIGIN 'user defined' )");
     assertEquals(resultCode, 0);
 
-    assertNull(DirectoryServer.getObjectClass(
-                    "testaddanddeletedefinitionwithextraspaces"));
-    assertNull(DirectoryServer.getObjectClass(
-                    "testaddanddeletedefinitionwithextraspaces-oid"));
+    assertTrue(getObjectClass("testaddanddeletedefinitionwithextraspaces").isPlaceHolder());
+    assertTrue(getObjectClass("testaddanddeletedefinitionwithextraspaces-oid").isPlaceHolder());
   }
 
   /**
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/core/SubtreeSpecificationTestCase.java b/opendj-server-legacy/src/test/java/org/opends/server/core/SubtreeSpecificationTestCase.java
index 71cf455..fb388e4 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/core/SubtreeSpecificationTestCase.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/core/SubtreeSpecificationTestCase.java
@@ -71,13 +71,13 @@
     objectClasses = new HashSet<>();
 
     ObjectClass oc = DirectoryServer.getObjectClass("top");
-    if (oc == null) {
+    if (oc.isPlaceHolder()) {
       throw new RuntimeException("Unable to resolve object class top");
     }
     objectClasses.add(oc);
 
     oc = DirectoryServer.getObjectClass("person");
-    if (oc == null) {
+    if (oc.isPlaceHolder()) {
       throw new RuntimeException("Unable to resolve object class person");
     }
     objectClasses.add(oc);
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/FractionalReplicationTest.java b/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/FractionalReplicationTest.java
index 81ec56a..a770270 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/FractionalReplicationTest.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/FractionalReplicationTest.java
@@ -656,7 +656,6 @@
       if (!objectClassStr.equals("*"))
       {
         ObjectClass objectClass = DirectoryServer.getObjectClass(objectClassStr.toLowerCase());
-
         assertTrue(newEntry.hasObjectClass(objectClass));
       }
 
@@ -710,7 +709,6 @@
       if (!objectClassStr.equals("*"))
       {
         ObjectClass objectClass = DirectoryServer.getObjectClass(objectClassStr.toLowerCase());
-
         assertTrue(entry.hasObjectClass(objectClass));
       }
 
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/ModifyConflictTest.java b/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/ModifyConflictTest.java
index f3b160d..974e27b 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/ModifyConflictTest.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/ModifyConflictTest.java
@@ -27,7 +27,7 @@
 import org.forgerock.opendj.ldap.DN;
 import org.forgerock.opendj.ldap.ModificationType;
 import org.forgerock.opendj.ldap.schema.AttributeType;
-import org.opends.server.core.DirectoryServer;
+import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.core.ModifyOperationBasis;
 import org.opends.server.replication.ReplicationTestCase;
 import org.opends.server.replication.common.CSN;
@@ -40,7 +40,6 @@
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
 import org.opends.server.types.Modification;
-import org.forgerock.opendj.ldap.schema.ObjectClass;
 import org.opends.server.workflowelement.localbackend.LocalBackendModifyOperation;
 import org.testng.annotations.Test;
 
@@ -1066,8 +1065,7 @@
      */
     DN dn = DN.valueOf(TEST_ROOT_DN_STRING);
     Map<ObjectClass, String> objectClasses = new HashMap<>();
-    ObjectClass org = DirectoryServer.getObjectClass(ORGANIZATION);
-    objectClasses.put(org, ORGANIZATION);
+    objectClasses.put(getObjectClass(ORGANIZATION), ORGANIZATION);
 
     // start with a new entry with an empty attribute
     Entry entry = new Entry(dn, objectClasses, null, null);
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/types/TestEntry.java b/opendj-server-legacy/src/test/java/org/opends/server/types/TestEntry.java
index e22434d..40baa9b 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/types/TestEntry.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/types/TestEntry.java
@@ -75,13 +75,9 @@
     DN entryDN = DN.valueOf("dc=example, dc=com");
 
     // Get default object classes.
-    ObjectClass top = DirectoryServer.getObjectClass("top");
-    if (top == null) {
-      throw new RuntimeException("Unable to resolve object class top");
-    }
-
+    ObjectClass top = DirectoryServer.getTopObjectClass();
     ObjectClass extensible = DirectoryServer.getObjectClass("extensibleobject");
-    if (extensible == null) {
+    if (extensible.isPlaceHolder()) {
       throw new RuntimeException(
           "Unable to resolve object class extensibleObject");
     }

--
Gitblit v1.10.0