mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Nicolas Capponi
19.03.2016 1afeb00abfb007ef9322d2060896353aeb3efdc4
OPENDJ-2987 Fix all classes that need to use ObjectClass placeholder instead of null
30 files modified
291 ■■■■■ changed files
opendj-core/src/main/java/org/forgerock/opendj/ldap/AttributeFilter.java 2 ●●● patch | view | raw | blame | history
opendj-core/src/main/java/org/forgerock/opendj/ldap/Entries.java 4 ●●●● patch | view | raw | blame | history
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/DITContentRule.java 4 ●●●● patch | view | raw | blame | history
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java 2 ●●● patch | view | raw | blame | history
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java 2 ●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java 3 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BrowseEntriesPanel.java 9 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SchemaElementPanel.java 13 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java 15 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/TableViewEntryPanel.java 6 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java 12 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/components/SuperiorObjectClassesEditor.java 2 ●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/SchemaLoader.java 4 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/NullBackend.java 10 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java 10 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/core/SubentryPasswordPolicy.java 11 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/loggers/CommonAudit.java 8 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/plugins/LDAPADListPlugin.java 2 ●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/plugins/SambaPasswordPlugin.java 37 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/LDAPReplicationDomain.java 16 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/schema/DITContentRuleSyntax.java 28 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/schema/NameFormSyntax.java 14 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java 25 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/types/SubtreeSpecification.java 2 ●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java 2 ●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/backends/SchemaBackendTestCase.java 28 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/core/SubtreeSpecificationTestCase.java 4 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/FractionalReplicationTest.java 2 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/ModifyConflictTest.java 6 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/types/TestEntry.java 8 ●●●● patch | view | raw | blame | history
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);
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;
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 =
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(
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()) {
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())
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;
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);
      }
    }
  }
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));
          }
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())
            {
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)
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);
    }
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);
      }
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"));
    }
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);
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 =
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()
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);
          }
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);
  }
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));
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));
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);
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);
    }
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
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,
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());
  }
  /**
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);
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));
      }
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);
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");
    }