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

Nicolas Capponi
19.23.2016 dc1a95c709158ba2ae660cd940baf81709857a9f
OPENDJ-2987 Update server Schema class to rely on SDK schema for object classes

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