From 263d085885df024dca9250cc03c807912b0a7662 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 24 Apr 2012 22:33:21 +0000
Subject: [PATCH] Reformat to comply with new Checkstyle rules.

---
 opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java | 1343 ++++++++++++++++++++++++++--------------------------------
 1 files changed, 599 insertions(+), 744 deletions(-)

diff --git a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java
index 4bc909a..7bf6a1b 100644
--- a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java
+++ b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java
@@ -6,17 +6,16 @@
  * (the "License").  You may not use this file except in compliance
  * with the License.
  *
- * You can obtain a copy of the license at
- * trunk/opendj3/legal-notices/CDDLv1_0.txt
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
  * or http://forgerock.org/license/CDDLv1.0.html.
  * See the License for the specific language governing permissions
  * and limitations under the License.
  *
  * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at
- * trunk/opendj3/legal-notices/CDDLv1_0.txt.  If applicable,
- * add the following below this CDDL HEADER, with the fields enclosed
- * by brackets "[]" replaced with your own identifying information:
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
  *      Portions Copyright [yyyy] [name of copyright owner]
  *
  * CDDL HEADER END
@@ -27,21 +26,22 @@
 
 package org.forgerock.opendj.ldap.schema;
 
-
-
 import static org.forgerock.opendj.ldap.CoreMessages.*;
 import static org.forgerock.opendj.ldap.schema.SchemaConstants.EXTENSIBLE_OBJECT_OBJECTCLASS_NAME;
 import static org.forgerock.opendj.ldap.schema.SchemaConstants.EXTENSIBLE_OBJECT_OBJECTCLASS_OID;
 import static org.forgerock.opendj.ldap.schema.SchemaConstants.TOP_OBJECTCLASS_NAME;
 
-import java.util.*;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.forgerock.i18n.LocalizableMessage;
 
 import com.forgerock.opendj.util.Validator;
 
-
-
 /**
  * This class defines a data structure for storing and interacting with an
  * objectclass, which contains a collection of attributes that must and/or may
@@ -51,780 +51,635 @@
  * provided, the ordering will be preserved when the associated fields are
  * accessed via their getters or via the {@link #toString()} methods.
  */
-public final class ObjectClass extends SchemaElement
-{
-  // The OID that may be used to reference this definition.
-  private final String oid;
+public final class ObjectClass extends SchemaElement {
+    // The OID that may be used to reference this definition.
+    private final String oid;
 
-  // The set of user defined names for this definition.
-  private final List<String> names;
+    // The set of user defined names for this definition.
+    private final List<String> names;
 
-  // Indicates whether this definition is declared "obsolete".
-  private final boolean isObsolete;
+    // Indicates whether this definition is declared "obsolete".
+    private final boolean isObsolete;
 
-  // The reference to the superior objectclasses.
-  private final Set<String> superiorClassOIDs;
+    // The reference to the superior objectclasses.
+    private final Set<String> superiorClassOIDs;
 
-  // The objectclass type for this objectclass.
-  private final ObjectClassType objectClassType;
+    // The objectclass type for this objectclass.
+    private final ObjectClassType objectClassType;
 
-  // The set of required attribute types for this objectclass.
-  private final Set<String> requiredAttributeOIDs;
+    // The set of required attribute types for this objectclass.
+    private final Set<String> requiredAttributeOIDs;
 
-  // The set of optional attribute types for this objectclass.
-  private final Set<String> optionalAttributeOIDs;
+    // The set of optional attribute types for this objectclass.
+    private final Set<String> optionalAttributeOIDs;
 
-  // The definition string used to create this objectclass.
-  private final String definition;
+    // The definition string used to create this objectclass.
+    private final String definition;
 
-  private Set<ObjectClass> superiorClasses = Collections.emptySet();
-  private Set<AttributeType> declaredRequiredAttributes = Collections
-      .emptySet();
-  private Set<AttributeType> requiredAttributes = Collections.emptySet();
-  private Set<AttributeType> declaredOptionalAttributes = Collections
-      .emptySet();
-  private Set<AttributeType> optionalAttributes = Collections.emptySet();
+    private Set<ObjectClass> superiorClasses = Collections.emptySet();
+    private Set<AttributeType> declaredRequiredAttributes = Collections.emptySet();
+    private Set<AttributeType> requiredAttributes = Collections.emptySet();
+    private Set<AttributeType> declaredOptionalAttributes = Collections.emptySet();
+    private Set<AttributeType> optionalAttributes = Collections.emptySet();
 
-  // Indicates whether or not validation has been performed.
-  private boolean needsValidating = true;
+    // Indicates whether or not validation has been performed.
+    private boolean needsValidating = true;
 
-  // The indicates whether or not validation failed.
-  private boolean isValid = false;
+    // The indicates whether or not validation failed.
+    private boolean isValid = false;
 
+    ObjectClass(final String oid, final List<String> names, final String description,
+            final boolean obsolete, final Set<String> superiorClassOIDs,
+            final Set<String> requiredAttributeOIDs, final Set<String> optionalAttributeOIDs,
+            final ObjectClassType objectClassType, final Map<String, List<String>> extraProperties,
+            final String definition) {
+        super(description, extraProperties);
 
+        Validator.ensureNotNull(oid, names);
+        Validator.ensureNotNull(superiorClassOIDs, requiredAttributeOIDs, optionalAttributeOIDs,
+                objectClassType);
+        this.oid = oid;
+        this.names = names;
+        this.isObsolete = obsolete;
+        this.superiorClassOIDs = superiorClassOIDs;
+        this.objectClassType = objectClassType;
+        this.requiredAttributeOIDs = requiredAttributeOIDs;
+        this.optionalAttributeOIDs = optionalAttributeOIDs;
 
-  ObjectClass(final String oid, final List<String> names,
-      final String description, final boolean obsolete,
-      final Set<String> superiorClassOIDs,
-      final Set<String> requiredAttributeOIDs,
-      final Set<String> optionalAttributeOIDs,
-      final ObjectClassType objectClassType,
-      final Map<String, List<String>> extraProperties, final String definition)
-  {
-    super(description, extraProperties);
-
-    Validator.ensureNotNull(oid, names);
-    Validator.ensureNotNull(superiorClassOIDs, requiredAttributeOIDs,
-        optionalAttributeOIDs, objectClassType);
-    this.oid = oid;
-    this.names = names;
-    this.isObsolete = obsolete;
-    this.superiorClassOIDs = superiorClassOIDs;
-    this.objectClassType = objectClassType;
-    this.requiredAttributeOIDs = requiredAttributeOIDs;
-    this.optionalAttributeOIDs = optionalAttributeOIDs;
-
-    if (definition != null)
-    {
-      this.definition = definition;
-    }
-    else
-    {
-      this.definition = buildDefinition();
-    }
-  }
-
-
-
-  /**
-   * Construct a extensibleObject object class where the set of allowed
-   * attribute types of this object class is implicitly the set of all attribute
-   * types of userApplications usage.
-   *
-   * @param description
-   *          The description for this schema definition
-   * @param extraProperties
-   *          The map of "extra" properties for this schema definition
-   */
-  ObjectClass(final String description,
-      final Map<String, List<String>> extraProperties)
-  {
-    super(description, extraProperties);
-    this.oid = EXTENSIBLE_OBJECT_OBJECTCLASS_OID;
-    this.names = Collections.singletonList(EXTENSIBLE_OBJECT_OBJECTCLASS_NAME);
-    this.isObsolete = false;
-    this.superiorClassOIDs = Collections.singleton(TOP_OBJECTCLASS_NAME);
-    this.objectClassType = ObjectClassType.AUXILIARY;
-    this.requiredAttributeOIDs = Collections.emptySet();
-    this.optionalAttributeOIDs = Collections.emptySet();
-
-    this.definition = buildDefinition();
-  }
-
-
-
-  @Override
-  public boolean equals(final Object o)
-  {
-    if (this == o)
-    {
-      return true;
+        if (definition != null) {
+            this.definition = definition;
+        } else {
+            this.definition = buildDefinition();
+        }
     }
 
-    if (o instanceof ObjectClass)
-    {
-      final ObjectClass other = (ObjectClass) o;
-      return oid.equals(other.oid);
+    /**
+     * Construct a extensibleObject object class where the set of allowed
+     * attribute types of this object class is implicitly the set of all
+     * attribute types of userApplications usage.
+     *
+     * @param description
+     *            The description for this schema definition
+     * @param extraProperties
+     *            The map of "extra" properties for this schema definition
+     */
+    ObjectClass(final String description, final Map<String, List<String>> extraProperties) {
+        super(description, extraProperties);
+        this.oid = EXTENSIBLE_OBJECT_OBJECTCLASS_OID;
+        this.names = Collections.singletonList(EXTENSIBLE_OBJECT_OBJECTCLASS_NAME);
+        this.isObsolete = false;
+        this.superiorClassOIDs = Collections.singleton(TOP_OBJECTCLASS_NAME);
+        this.objectClassType = ObjectClassType.AUXILIARY;
+        this.requiredAttributeOIDs = Collections.emptySet();
+        this.optionalAttributeOIDs = Collections.emptySet();
+
+        this.definition = buildDefinition();
     }
 
-    return false;
-  }
-
-
-
-  /**
-   * Returns an unmodifiable set containing the optional attributes for this
-   * object class. Note that this set will not automatically include any
-   * optional attributes for superior object classes.
-   *
-   * @return An unmodifiable set containing the optional attributes for this
-   *         object class.
-   */
-  public Set<AttributeType> getDeclaredOptionalAttributes()
-  {
-    return declaredOptionalAttributes;
-  }
-
-
-
-  /**
-   * Returns an unmodifiable set containing the required attributes for this
-   * object class. Note that this set will not automatically include any
-   * required attributes for superior object classes.
-   *
-   * @return An unmodifiable set containing the required attributes for this
-   *         object class.
-   */
-  public Set<AttributeType> getDeclaredRequiredAttributes()
-  {
-    return declaredRequiredAttributes;
-  }
-
-
-
-  /**
-   * Returns the name or OID for this schema definition. If it has one or more
-   * names, then the primary name will be returned. If it does not have any
-   * names, then the OID will be returned.
-   *
-   * @return The name or OID for this schema definition.
-   */
-  public String getNameOrOID()
-  {
-    if (names.isEmpty())
-    {
-      return oid;
-    }
-    return names.get(0);
-  }
-
-
-
-  /**
-   * Returns an unmodifiable list containing the user-defined names that may be
-   * used to reference this schema definition.
-   *
-   * @return Returns an unmodifiable list containing the user-defined names that
-   *         may be used to reference this schema definition.
-   */
-  public List<String> getNames()
-  {
-    return names;
-  }
-
-
-
-  /**
-   * Returns the objectclass type for this objectclass.
-   *
-   * @return The objectclass type for this objectclass.
-   */
-  public ObjectClassType getObjectClassType()
-  {
-
-    return objectClassType;
-  }
-
-
-
-  /**
-   * Returns the OID for this schema definition.
-   *
-   * @return The OID for this schema definition.
-   */
-  public String getOID()
-  {
-
-    return oid;
-  }
-
-
-
-  /**
-   * Returns an unmodifiable set containing the optional attributes for this
-   * object class and any superior object classes that it might have.
-   *
-   * @return An unmodifiable set containing the optional attributes for this
-   *         object class and any superior object classes that it might have.
-   */
-  public Set<AttributeType> getOptionalAttributes()
-  {
-    return optionalAttributes;
-  }
-
-
-
-  /**
-   * Returns an unmodifiable set containing the required attributes for this
-   * object class and any superior object classes that it might have.
-   *
-   * @return An unmodifiable set containing the required attributes for this
-   *         object class and any superior object classes that it might have.
-   */
-  public Set<AttributeType> getRequiredAttributes()
-  {
-    return requiredAttributes;
-  }
-
-
-
-  /**
-   * Returns an unmodifiable set containing the superior classes for this object
-   * class.
-   *
-   * @return An unmodifiable set containing the superior classes for this object
-   *         class.
-   */
-  public Set<ObjectClass> getSuperiorClasses()
-  {
-    return superiorClasses;
-  }
-
-
-
-  @Override
-  public int hashCode()
-  {
-    return oid.hashCode();
-  }
-
-
-
-  /**
-   * Indicates whether this schema definition has the specified name.
-   *
-   * @param name
-   *          The name for which to make the determination.
-   * @return <code>true</code> if the specified name is assigned to this schema
-   *         definition, or <code>false</code> if not.
-   */
-  public boolean hasName(final String name)
-  {
-    for (final String n : names)
-    {
-      if (n.equalsIgnoreCase(name))
-      {
-        return true;
-      }
-    }
-    return false;
-  }
-
-
-
-  /**
-   * Indicates whether this schema definition has the specified name or OID.
-   *
-   * @param value
-   *          The value for which to make the determination.
-   * @return <code>true</code> if the provided value matches the OID or one of
-   *         the names assigned to this schema definition, or <code>false</code>
-   *         if not.
-   */
-  public boolean hasNameOrOID(final String value)
-  {
-    return hasName(value) || getOID().equals(value);
-  }
-
-
-
-  /**
-   * Indicates whether this objectclass is a descendant of the provided class.
-   *
-   * @param objectClass
-   *          The objectClass for which to make the determination.
-   * @return <code>true</code> if this objectclass is a descendant of the
-   *         provided class, or <code>false</code> if not.
-   */
-  public boolean isDescendantOf(final ObjectClass objectClass)
-  {
-    for (final ObjectClass sup : superiorClasses)
-    {
-      if (sup.equals(objectClass) || sup.isDescendantOf(objectClass))
-      {
-        return true;
-      }
-    }
-    return false;
-  }
-
-
-
-  /**
-   * Indicates whether this schema definition is declared "obsolete".
-   *
-   * @return <code>true</code> if this schema definition is declared "obsolete",
-   *         or <code>false</code> if not.
-   */
-  public boolean isObsolete()
-  {
-    return isObsolete;
-  }
-
-
-
-  /**
-   * Indicates whether the provided attribute type is included in the optional
-   * attribute list for this or any of its superior objectclasses.
-   *
-   * @param attributeType
-   *          The attribute type for which to make the determination.
-   * @return <code>true</code> if the provided attribute type is optional for
-   *         this objectclass or any of its superior classes, or
-   *         <code>false</code> if not.
-   */
-  public boolean isOptional(final AttributeType attributeType)
-  {
-    return optionalAttributes.contains(attributeType);
-  }
-
-
-
-  /**
-   * Indicates whether the provided attribute type is included in the required
-   * attribute list for this or any of its superior objectclasses.
-   *
-   * @param attributeType
-   *          The attribute type for which to make the determination.
-   * @return <code>true</code> if the provided attribute type is required by
-   *         this objectclass or any of its superior classes, or
-   *         <code>false</code> if not.
-   */
-  public boolean isRequired(final AttributeType attributeType)
-  {
-    return requiredAttributes.contains(attributeType);
-  }
-
-
-
-  /**
-   * Indicates whether the provided attribute type is in the list of required or
-   * optional attributes for this objectclass or any of its superior classes.
-   *
-   * @param attributeType
-   *          The attribute type for which to make the determination.
-   * @return <code>true</code> if the provided attribute type is required or
-   *         allowed for this objectclass or any of its superior classes, or
-   *         <code>false</code> if it is not.
-   */
-  public boolean isRequiredOrOptional(final AttributeType attributeType)
-  {
-    return isRequired(attributeType) || isOptional(attributeType);
-  }
-
-
-
-  /**
-   * Returns the string representation of this schema definition in the form
-   * specified in RFC 2252.
-   *
-   * @return The string representation of this schema definition in the form
-   *         specified in RFC 2252.
-   */
-  @Override
-  public String toString()
-  {
-    return definition;
-  }
-
-
-
-  ObjectClass duplicate()
-  {
-    return new ObjectClass(oid, names, description, isObsolete,
-        superiorClassOIDs, requiredAttributeOIDs, optionalAttributeOIDs,
-        objectClassType, extraProperties, definition);
-  }
-
-
-
-  @Override
-  void toStringContent(final StringBuilder buffer)
-  {
-    buffer.append(oid);
-
-    if (!names.isEmpty())
-    {
-      final Iterator<String> iterator = names.iterator();
-
-      final String firstName = iterator.next();
-      if (iterator.hasNext())
-      {
-        buffer.append(" NAME ( '");
-        buffer.append(firstName);
-
-        while (iterator.hasNext())
-        {
-          buffer.append("' '");
-          buffer.append(iterator.next());
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
         }
 
-        buffer.append("' )");
-      }
-      else
-      {
-        buffer.append(" NAME '");
-        buffer.append(firstName);
-        buffer.append("'");
-      }
-    }
-
-    if (description != null && description.length() > 0)
-    {
-      buffer.append(" DESC '");
-      buffer.append(description);
-      buffer.append("'");
-    }
-
-    if (isObsolete)
-    {
-      buffer.append(" OBSOLETE");
-    }
-
-    if (!superiorClassOIDs.isEmpty())
-    {
-      final Iterator<String> iterator = superiorClassOIDs.iterator();
-
-      final String firstName = iterator.next();
-      if (iterator.hasNext())
-      {
-        buffer.append(" SUP ( ");
-        buffer.append(firstName);
-
-        while (iterator.hasNext())
-        {
-          buffer.append(" $ ");
-          buffer.append(iterator.next());
+        if (o instanceof ObjectClass) {
+            final ObjectClass other = (ObjectClass) o;
+            return oid.equals(other.oid);
         }
 
-        buffer.append(" )");
-      }
-      else
-      {
-        buffer.append(" SUP ");
-        buffer.append(firstName);
-      }
+        return false;
     }
 
-    if (objectClassType != null)
-    {
-      buffer.append(" ");
-      buffer.append(objectClassType.toString());
+    /**
+     * Returns an unmodifiable set containing the optional attributes for this
+     * object class. Note that this set will not automatically include any
+     * optional attributes for superior object classes.
+     *
+     * @return An unmodifiable set containing the optional attributes for this
+     *         object class.
+     */
+    public Set<AttributeType> getDeclaredOptionalAttributes() {
+        return declaredOptionalAttributes;
     }
 
-    if (!requiredAttributeOIDs.isEmpty())
-    {
-      final Iterator<String> iterator = requiredAttributeOIDs.iterator();
+    /**
+     * Returns an unmodifiable set containing the required attributes for this
+     * object class. Note that this set will not automatically include any
+     * required attributes for superior object classes.
+     *
+     * @return An unmodifiable set containing the required attributes for this
+     *         object class.
+     */
+    public Set<AttributeType> getDeclaredRequiredAttributes() {
+        return declaredRequiredAttributes;
+    }
 
-      final String firstName = iterator.next();
-      if (iterator.hasNext())
-      {
-        buffer.append(" MUST ( ");
-        buffer.append(firstName);
+    /**
+     * Returns the name or OID for this schema definition. If it has one or more
+     * names, then the primary name will be returned. If it does not have any
+     * names, then the OID will be returned.
+     *
+     * @return The name or OID for this schema definition.
+     */
+    public String getNameOrOID() {
+        if (names.isEmpty()) {
+            return oid;
+        }
+        return names.get(0);
+    }
 
-        while (iterator.hasNext())
-        {
-          buffer.append(" $ ");
-          buffer.append(iterator.next());
+    /**
+     * Returns an unmodifiable list containing the user-defined names that may
+     * be used to reference this schema definition.
+     *
+     * @return Returns an unmodifiable list containing the user-defined names
+     *         that may be used to reference this schema definition.
+     */
+    public List<String> getNames() {
+        return names;
+    }
+
+    /**
+     * Returns the objectclass type for this objectclass.
+     *
+     * @return The objectclass type for this objectclass.
+     */
+    public ObjectClassType getObjectClassType() {
+
+        return objectClassType;
+    }
+
+    /**
+     * Returns the OID for this schema definition.
+     *
+     * @return The OID for this schema definition.
+     */
+    public String getOID() {
+
+        return oid;
+    }
+
+    /**
+     * Returns an unmodifiable set containing the optional attributes for this
+     * object class and any superior object classes that it might have.
+     *
+     * @return An unmodifiable set containing the optional attributes for this
+     *         object class and any superior object classes that it might have.
+     */
+    public Set<AttributeType> getOptionalAttributes() {
+        return optionalAttributes;
+    }
+
+    /**
+     * Returns an unmodifiable set containing the required attributes for this
+     * object class and any superior object classes that it might have.
+     *
+     * @return An unmodifiable set containing the required attributes for this
+     *         object class and any superior object classes that it might have.
+     */
+    public Set<AttributeType> getRequiredAttributes() {
+        return requiredAttributes;
+    }
+
+    /**
+     * Returns an unmodifiable set containing the superior classes for this
+     * object class.
+     *
+     * @return An unmodifiable set containing the superior classes for this
+     *         object class.
+     */
+    public Set<ObjectClass> getSuperiorClasses() {
+        return superiorClasses;
+    }
+
+    @Override
+    public int hashCode() {
+        return oid.hashCode();
+    }
+
+    /**
+     * Indicates whether this schema definition has the specified name.
+     *
+     * @param name
+     *            The name for which to make the determination.
+     * @return <code>true</code> if the specified name is assigned to this
+     *         schema definition, or <code>false</code> if not.
+     */
+    public boolean hasName(final String name) {
+        for (final String n : names) {
+            if (n.equalsIgnoreCase(name)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Indicates whether this schema definition has the specified name or OID.
+     *
+     * @param value
+     *            The value for which to make the determination.
+     * @return <code>true</code> if the provided value matches the OID or one of
+     *         the names assigned to this schema definition, or
+     *         <code>false</code> if not.
+     */
+    public boolean hasNameOrOID(final String value) {
+        return hasName(value) || getOID().equals(value);
+    }
+
+    /**
+     * Indicates whether this objectclass is a descendant of the provided class.
+     *
+     * @param objectClass
+     *            The objectClass for which to make the determination.
+     * @return <code>true</code> if this objectclass is a descendant of the
+     *         provided class, or <code>false</code> if not.
+     */
+    public boolean isDescendantOf(final ObjectClass objectClass) {
+        for (final ObjectClass sup : superiorClasses) {
+            if (sup.equals(objectClass) || sup.isDescendantOf(objectClass)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Indicates whether this schema definition is declared "obsolete".
+     *
+     * @return <code>true</code> if this schema definition is declared
+     *         "obsolete", or <code>false</code> if not.
+     */
+    public boolean isObsolete() {
+        return isObsolete;
+    }
+
+    /**
+     * Indicates whether the provided attribute type is included in the optional
+     * attribute list for this or any of its superior objectclasses.
+     *
+     * @param attributeType
+     *            The attribute type for which to make the determination.
+     * @return <code>true</code> if the provided attribute type is optional for
+     *         this objectclass or any of its superior classes, or
+     *         <code>false</code> if not.
+     */
+    public boolean isOptional(final AttributeType attributeType) {
+        return optionalAttributes.contains(attributeType);
+    }
+
+    /**
+     * Indicates whether the provided attribute type is included in the required
+     * attribute list for this or any of its superior objectclasses.
+     *
+     * @param attributeType
+     *            The attribute type for which to make the determination.
+     * @return <code>true</code> if the provided attribute type is required by
+     *         this objectclass or any of its superior classes, or
+     *         <code>false</code> if not.
+     */
+    public boolean isRequired(final AttributeType attributeType) {
+        return requiredAttributes.contains(attributeType);
+    }
+
+    /**
+     * Indicates whether the provided attribute type is in the list of required
+     * or optional attributes for this objectclass or any of its superior
+     * classes.
+     *
+     * @param attributeType
+     *            The attribute type for which to make the determination.
+     * @return <code>true</code> if the provided attribute type is required or
+     *         allowed for this objectclass or any of its superior classes, or
+     *         <code>false</code> if it is not.
+     */
+    public boolean isRequiredOrOptional(final AttributeType attributeType) {
+        return isRequired(attributeType) || isOptional(attributeType);
+    }
+
+    /**
+     * Returns the string representation of this schema definition in the form
+     * specified in RFC 2252.
+     *
+     * @return The string representation of this schema definition in the form
+     *         specified in RFC 2252.
+     */
+    @Override
+    public String toString() {
+        return definition;
+    }
+
+    ObjectClass duplicate() {
+        return new ObjectClass(oid, names, description, isObsolete, superiorClassOIDs,
+                requiredAttributeOIDs, optionalAttributeOIDs, objectClassType, extraProperties,
+                definition);
+    }
+
+    @Override
+    void toStringContent(final StringBuilder buffer) {
+        buffer.append(oid);
+
+        if (!names.isEmpty()) {
+            final Iterator<String> iterator = names.iterator();
+
+            final String firstName = iterator.next();
+            if (iterator.hasNext()) {
+                buffer.append(" NAME ( '");
+                buffer.append(firstName);
+
+                while (iterator.hasNext()) {
+                    buffer.append("' '");
+                    buffer.append(iterator.next());
+                }
+
+                buffer.append("' )");
+            } else {
+                buffer.append(" NAME '");
+                buffer.append(firstName);
+                buffer.append("'");
+            }
         }
 
-        buffer.append(" )");
-      }
-      else
-      {
-        buffer.append(" MUST ");
-        buffer.append(firstName);
-      }
-    }
-
-    if (!optionalAttributeOIDs.isEmpty())
-    {
-      final Iterator<String> iterator = optionalAttributeOIDs.iterator();
-
-      final String firstName = iterator.next();
-      if (iterator.hasNext())
-      {
-        buffer.append(" MAY ( ");
-        buffer.append(firstName);
-
-        while (iterator.hasNext())
-        {
-          buffer.append(" $ ");
-          buffer.append(iterator.next());
+        if (description != null && description.length() > 0) {
+            buffer.append(" DESC '");
+            buffer.append(description);
+            buffer.append("'");
         }
 
-        buffer.append(" )");
-      }
-      else
-      {
-        buffer.append(" MAY ");
-        buffer.append(firstName);
-      }
-    }
-  }
-
-
-
-  boolean validate(final Schema schema,
-      final List<ObjectClass> invalidSchemaElements,
-      final List<LocalizableMessage> warnings)
-  {
-    // Avoid validating this schema element more than once. This may occur if
-    // multiple object classes specify the same superior.
-    if (!needsValidating)
-    {
-      return isValid;
-    }
-
-    // Prevent re-validation.
-    needsValidating = false;
-
-    // Init a flag to check to inheritance from top (only needed for
-    // structural object classes) per RFC 4512
-    boolean derivesTop = objectClassType != ObjectClassType.STRUCTURAL;
-
-    if (!superiorClassOIDs.isEmpty())
-    {
-      superiorClasses = new HashSet<ObjectClass>(superiorClassOIDs.size());
-      ObjectClass superiorClass;
-      for (final String superClassOid : superiorClassOIDs)
-      {
-        try
-        {
-          superiorClass = schema.getObjectClass(superClassOid);
-        }
-        catch (final UnknownSchemaElementException e)
-        {
-          final LocalizableMessage message = WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_SUPERIOR_CLASS1
-              .get(getNameOrOID(), superClassOid);
-          failValidation(invalidSchemaElements, warnings, message);
-          return false;
+        if (isObsolete) {
+            buffer.append(" OBSOLETE");
         }
 
-        // Make sure that the inheritance configuration is acceptable.
-        final ObjectClassType superiorType = superiorClass.getObjectClassType();
-        switch (objectClassType)
-        {
-        case ABSTRACT:
-          // Abstract classes may only inherit from other abstract
-          // classes.
-          if (superiorType != ObjectClassType.ABSTRACT)
-          {
-            final LocalizableMessage message = WARN_ATTR_SYNTAX_OBJECTCLASS_INVALID_SUPERIOR_TYPE1
-                .get(getNameOrOID(), objectClassType.toString(), superiorType.toString(),
-                    superiorClass.getNameOrOID());
+        if (!superiorClassOIDs.isEmpty()) {
+            final Iterator<String> iterator = superiorClassOIDs.iterator();
+
+            final String firstName = iterator.next();
+            if (iterator.hasNext()) {
+                buffer.append(" SUP ( ");
+                buffer.append(firstName);
+
+                while (iterator.hasNext()) {
+                    buffer.append(" $ ");
+                    buffer.append(iterator.next());
+                }
+
+                buffer.append(" )");
+            } else {
+                buffer.append(" SUP ");
+                buffer.append(firstName);
+            }
+        }
+
+        if (objectClassType != null) {
+            buffer.append(" ");
+            buffer.append(objectClassType.toString());
+        }
+
+        if (!requiredAttributeOIDs.isEmpty()) {
+            final Iterator<String> iterator = requiredAttributeOIDs.iterator();
+
+            final String firstName = iterator.next();
+            if (iterator.hasNext()) {
+                buffer.append(" MUST ( ");
+                buffer.append(firstName);
+
+                while (iterator.hasNext()) {
+                    buffer.append(" $ ");
+                    buffer.append(iterator.next());
+                }
+
+                buffer.append(" )");
+            } else {
+                buffer.append(" MUST ");
+                buffer.append(firstName);
+            }
+        }
+
+        if (!optionalAttributeOIDs.isEmpty()) {
+            final Iterator<String> iterator = optionalAttributeOIDs.iterator();
+
+            final String firstName = iterator.next();
+            if (iterator.hasNext()) {
+                buffer.append(" MAY ( ");
+                buffer.append(firstName);
+
+                while (iterator.hasNext()) {
+                    buffer.append(" $ ");
+                    buffer.append(iterator.next());
+                }
+
+                buffer.append(" )");
+            } else {
+                buffer.append(" MAY ");
+                buffer.append(firstName);
+            }
+        }
+    }
+
+    boolean validate(final Schema schema, final List<ObjectClass> invalidSchemaElements,
+            final List<LocalizableMessage> warnings) {
+        // Avoid validating this schema element more than once. This may occur
+        // if
+        // multiple object classes specify the same superior.
+        if (!needsValidating) {
+            return isValid;
+        }
+
+        // Prevent re-validation.
+        needsValidating = false;
+
+        // Init a flag to check to inheritance from top (only needed for
+        // structural object classes) per RFC 4512
+        boolean derivesTop = objectClassType != ObjectClassType.STRUCTURAL;
+
+        if (!superiorClassOIDs.isEmpty()) {
+            superiorClasses = new HashSet<ObjectClass>(superiorClassOIDs.size());
+            ObjectClass superiorClass;
+            for (final String superClassOid : superiorClassOIDs) {
+                try {
+                    superiorClass = schema.getObjectClass(superClassOid);
+                } catch (final UnknownSchemaElementException e) {
+                    final LocalizableMessage message =
+                            WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_SUPERIOR_CLASS1.get(
+                                    getNameOrOID(), superClassOid);
+                    failValidation(invalidSchemaElements, warnings, message);
+                    return false;
+                }
+
+                // Make sure that the inheritance configuration is acceptable.
+                final ObjectClassType superiorType = superiorClass.getObjectClassType();
+                switch (objectClassType) {
+                case ABSTRACT:
+                    // Abstract classes may only inherit from other abstract
+                    // classes.
+                    if (superiorType != ObjectClassType.ABSTRACT) {
+                        final LocalizableMessage message =
+                                WARN_ATTR_SYNTAX_OBJECTCLASS_INVALID_SUPERIOR_TYPE1.get(
+                                        getNameOrOID(), objectClassType.toString(), superiorType
+                                                .toString(), superiorClass.getNameOrOID());
+                        failValidation(invalidSchemaElements, warnings, message);
+                        return false;
+                    }
+                    break;
+
+                case AUXILIARY:
+                    // Auxiliary classes may only inherit from abstract classes
+                    // or
+                    // other auxiliary classes.
+                    if (superiorType != ObjectClassType.ABSTRACT
+                            && superiorType != ObjectClassType.AUXILIARY) {
+                        final LocalizableMessage message =
+                                WARN_ATTR_SYNTAX_OBJECTCLASS_INVALID_SUPERIOR_TYPE1.get(
+                                        getNameOrOID(), objectClassType.toString(), superiorType
+                                                .toString(), superiorClass.getNameOrOID());
+                        failValidation(invalidSchemaElements, warnings, message);
+                        return false;
+                    }
+                    break;
+
+                case STRUCTURAL:
+                    // Structural classes may only inherit from abstract classes
+                    // or other structural classes.
+                    if (superiorType != ObjectClassType.ABSTRACT
+                            && superiorType != ObjectClassType.STRUCTURAL) {
+                        final LocalizableMessage message =
+                                WARN_ATTR_SYNTAX_OBJECTCLASS_INVALID_SUPERIOR_TYPE1.get(
+                                        getNameOrOID(), objectClassType.toString(), superiorType
+                                                .toString(), superiorClass.getNameOrOID());
+                        failValidation(invalidSchemaElements, warnings, message);
+                        return false;
+                    }
+                    break;
+                }
+
+                // All existing structural object classes defined in this schema
+                // are implicitly guaranteed to inherit from top
+                if (!derivesTop && superiorType == ObjectClassType.STRUCTURAL) {
+                    derivesTop = true;
+                }
+
+                // First ensure that the superior has been validated and fail if
+                // it is
+                // invalid.
+                if (!superiorClass.validate(schema, invalidSchemaElements, warnings)) {
+                    final LocalizableMessage message =
+                            WARN_ATTR_SYNTAX_OBJECTCLASS_INVALID_SUPERIOR_CLASS.get(getNameOrOID(),
+                                    superClassOid);
+                    failValidation(invalidSchemaElements, warnings, message);
+                    return false;
+                }
+
+                // Inherit all required attributes from superior class.
+                Iterator<AttributeType> i = superiorClass.getRequiredAttributes().iterator();
+                if (i.hasNext() && requiredAttributes == Collections.EMPTY_SET) {
+                    requiredAttributes = new HashSet<AttributeType>();
+                }
+                while (i.hasNext()) {
+                    requiredAttributes.add(i.next());
+                }
+
+                // Inherit all optional attributes from superior class.
+                i = superiorClass.getRequiredAttributes().iterator();
+                if (i.hasNext() && requiredAttributes == Collections.EMPTY_SET) {
+                    requiredAttributes = new HashSet<AttributeType>();
+                }
+                while (i.hasNext()) {
+                    requiredAttributes.add(i.next());
+                }
+
+                superiorClasses.add(superiorClass);
+            }
+        }
+
+        if (!derivesTop) {
+            derivesTop = isDescendantOf(schema.getObjectClass("2.5.6.0"));
+        }
+
+        // Structural classes must have the "top" objectclass somewhere
+        // in the superior chain.
+        if (!derivesTop) {
+            final LocalizableMessage message =
+                    WARN_ATTR_SYNTAX_OBJECTCLASS_STRUCTURAL_SUPERIOR_NOT_TOP1.get(getNameOrOID());
             failValidation(invalidSchemaElements, warnings, message);
             return false;
-          }
-          break;
-
-        case AUXILIARY:
-          // Auxiliary classes may only inherit from abstract classes or
-          // other auxiliary classes.
-          if (superiorType != ObjectClassType.ABSTRACT
-              && superiorType != ObjectClassType.AUXILIARY)
-          {
-            final LocalizableMessage message = WARN_ATTR_SYNTAX_OBJECTCLASS_INVALID_SUPERIOR_TYPE1
-                .get(getNameOrOID(), objectClassType.toString(), superiorType.toString(),
-                    superiorClass.getNameOrOID());
-            failValidation(invalidSchemaElements, warnings, message);
-            return false;
-          }
-          break;
-
-        case STRUCTURAL:
-          // Structural classes may only inherit from abstract classes
-          // or other structural classes.
-          if (superiorType != ObjectClassType.ABSTRACT
-              && superiorType != ObjectClassType.STRUCTURAL)
-          {
-            final LocalizableMessage message = WARN_ATTR_SYNTAX_OBJECTCLASS_INVALID_SUPERIOR_TYPE1
-                .get(getNameOrOID(), objectClassType.toString(), superiorType.toString(),
-                    superiorClass.getNameOrOID());
-            failValidation(invalidSchemaElements, warnings, message);
-            return false;
-          }
-          break;
         }
 
-        // All existing structural object classes defined in this schema
-        // are implicitly guaranteed to inherit from top
-        if (!derivesTop && superiorType == ObjectClassType.STRUCTURAL)
-        {
-          derivesTop = true;
+        if (oid.equals(EXTENSIBLE_OBJECT_OBJECTCLASS_OID)) {
+            declaredOptionalAttributes = new HashSet<AttributeType>(requiredAttributeOIDs.size());
+            for (final AttributeType attributeType : schema.getAttributeTypes()) {
+                if (attributeType.getUsage() == AttributeUsage.USER_APPLICATIONS) {
+                    declaredOptionalAttributes.add(attributeType);
+                }
+            }
+            optionalAttributes = declaredRequiredAttributes;
+        } else {
+            if (!requiredAttributeOIDs.isEmpty()) {
+                declaredRequiredAttributes =
+                        new HashSet<AttributeType>(requiredAttributeOIDs.size());
+                AttributeType attributeType;
+                for (final String requiredAttribute : requiredAttributeOIDs) {
+                    try {
+                        attributeType = schema.getAttributeType(requiredAttribute);
+                    } catch (final UnknownSchemaElementException e) {
+                        // This isn't good because it means that the objectclass
+                        // requires an attribute type that we don't know
+                        // anything
+                        // about.
+                        final LocalizableMessage message =
+                                WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_REQUIRED_ATTR1.get(
+                                        getNameOrOID(), requiredAttribute);
+                        failValidation(invalidSchemaElements, warnings, message);
+                        return false;
+                    }
+                    declaredRequiredAttributes.add(attributeType);
+                }
+                if (requiredAttributes == Collections.EMPTY_SET) {
+                    requiredAttributes = declaredRequiredAttributes;
+                } else {
+                    requiredAttributes.addAll(declaredRequiredAttributes);
+                }
+            }
+
+            if (!optionalAttributeOIDs.isEmpty()) {
+                declaredOptionalAttributes =
+                        new HashSet<AttributeType>(optionalAttributeOIDs.size());
+                AttributeType attributeType;
+                for (final String optionalAttribute : optionalAttributeOIDs) {
+                    try {
+                        attributeType = schema.getAttributeType(optionalAttribute);
+                    } catch (final UnknownSchemaElementException e) {
+                        // This isn't good because it means that the objectclass
+                        // requires an attribute type that we don't know
+                        // anything
+                        // about.
+                        final LocalizableMessage message =
+                                WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_OPTIONAL_ATTR1.get(
+                                        getNameOrOID(), optionalAttribute);
+                        failValidation(invalidSchemaElements, warnings, message);
+                        return false;
+                    }
+                    declaredOptionalAttributes.add(attributeType);
+                }
+                if (optionalAttributes == Collections.EMPTY_SET) {
+                    optionalAttributes = declaredOptionalAttributes;
+                } else {
+                    optionalAttributes.addAll(declaredOptionalAttributes);
+                }
+            }
         }
 
-        // First ensure that the superior has been validated and fail if it is
-        // invalid.
-        if (!superiorClass.validate(schema, invalidSchemaElements, warnings))
-        {
-          final LocalizableMessage message = WARN_ATTR_SYNTAX_OBJECTCLASS_INVALID_SUPERIOR_CLASS
-              .get(getNameOrOID(), superClassOid);
-          failValidation(invalidSchemaElements, warnings, message);
-          return false;
-        }
+        declaredOptionalAttributes = Collections.unmodifiableSet(declaredOptionalAttributes);
+        declaredRequiredAttributes = Collections.unmodifiableSet(declaredRequiredAttributes);
+        optionalAttributes = Collections.unmodifiableSet(optionalAttributes);
+        requiredAttributes = Collections.unmodifiableSet(requiredAttributes);
+        superiorClasses = Collections.unmodifiableSet(superiorClasses);
 
-        // Inherit all required attributes from superior class.
-        Iterator<AttributeType> i = superiorClass.getRequiredAttributes()
-            .iterator();
-        if (i.hasNext() && requiredAttributes == Collections.EMPTY_SET)
-        {
-          requiredAttributes = new HashSet<AttributeType>();
-        }
-        while (i.hasNext())
-        {
-          requiredAttributes.add(i.next());
-        }
-
-        // Inherit all optional attributes from superior class.
-        i = superiorClass.getRequiredAttributes().iterator();
-        if (i.hasNext() && requiredAttributes == Collections.EMPTY_SET)
-        {
-          requiredAttributes = new HashSet<AttributeType>();
-        }
-        while (i.hasNext())
-        {
-          requiredAttributes.add(i.next());
-        }
-
-        superiorClasses.add(superiorClass);
-      }
+        return (isValid = true);
     }
 
-    if (!derivesTop)
-    {
-      derivesTop = isDescendantOf(schema.getObjectClass("2.5.6.0"));
+    private void failValidation(final List<ObjectClass> invalidSchemaElements,
+            final List<LocalizableMessage> warnings, final LocalizableMessage message) {
+        invalidSchemaElements.add(this);
+        warnings.add(ERR_OC_VALIDATION_FAIL.get(toString(), message));
     }
-
-    // Structural classes must have the "top" objectclass somewhere
-    // in the superior chain.
-    if (!derivesTop)
-    {
-      final LocalizableMessage message = WARN_ATTR_SYNTAX_OBJECTCLASS_STRUCTURAL_SUPERIOR_NOT_TOP1
-          .get(getNameOrOID());
-      failValidation(invalidSchemaElements, warnings, message);
-      return false;
-    }
-
-    if (oid.equals(EXTENSIBLE_OBJECT_OBJECTCLASS_OID))
-    {
-      declaredOptionalAttributes = new HashSet<AttributeType>(
-          requiredAttributeOIDs.size());
-      for (final AttributeType attributeType : schema.getAttributeTypes())
-      {
-        if (attributeType.getUsage() == AttributeUsage.USER_APPLICATIONS)
-        {
-          declaredOptionalAttributes.add(attributeType);
-        }
-      }
-      optionalAttributes = declaredRequiredAttributes;
-    }
-    else
-    {
-      if (!requiredAttributeOIDs.isEmpty())
-      {
-        declaredRequiredAttributes = new HashSet<AttributeType>(
-            requiredAttributeOIDs.size());
-        AttributeType attributeType;
-        for (final String requiredAttribute : requiredAttributeOIDs)
-        {
-          try
-          {
-            attributeType = schema.getAttributeType(requiredAttribute);
-          }
-          catch (final UnknownSchemaElementException e)
-          {
-            // This isn't good because it means that the objectclass
-            // requires an attribute type that we don't know anything
-            // about.
-            final LocalizableMessage message = WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_REQUIRED_ATTR1
-                .get(getNameOrOID(), requiredAttribute);
-            failValidation(invalidSchemaElements, warnings, message);
-            return false;
-          }
-          declaredRequiredAttributes.add(attributeType);
-        }
-        if (requiredAttributes == Collections.EMPTY_SET)
-        {
-          requiredAttributes = declaredRequiredAttributes;
-        }
-        else
-        {
-          requiredAttributes.addAll(declaredRequiredAttributes);
-        }
-      }
-
-      if (!optionalAttributeOIDs.isEmpty())
-      {
-        declaredOptionalAttributes = new HashSet<AttributeType>(
-            optionalAttributeOIDs.size());
-        AttributeType attributeType;
-        for (final String optionalAttribute : optionalAttributeOIDs)
-        {
-          try
-          {
-            attributeType = schema.getAttributeType(optionalAttribute);
-          }
-          catch (final UnknownSchemaElementException e)
-          {
-            // This isn't good because it means that the objectclass
-            // requires an attribute type that we don't know anything
-            // about.
-            final LocalizableMessage message = WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_OPTIONAL_ATTR1
-                .get(getNameOrOID(), optionalAttribute);
-            failValidation(invalidSchemaElements, warnings, message);
-            return false;
-          }
-          declaredOptionalAttributes.add(attributeType);
-        }
-        if (optionalAttributes == Collections.EMPTY_SET)
-        {
-          optionalAttributes = declaredOptionalAttributes;
-        }
-        else
-        {
-          optionalAttributes.addAll(declaredOptionalAttributes);
-        }
-      }
-    }
-
-    declaredOptionalAttributes = Collections
-        .unmodifiableSet(declaredOptionalAttributes);
-    declaredRequiredAttributes = Collections
-        .unmodifiableSet(declaredRequiredAttributes);
-    optionalAttributes = Collections.unmodifiableSet(optionalAttributes);
-    requiredAttributes = Collections.unmodifiableSet(requiredAttributes);
-    superiorClasses = Collections.unmodifiableSet(superiorClasses);
-
-    return (isValid = true);
-  }
-
-
-
-  private void failValidation(final List<ObjectClass> invalidSchemaElements,
-      final List<LocalizableMessage> warnings, final LocalizableMessage message)
-  {
-    invalidSchemaElements.add(this);
-    warnings.add(ERR_OC_VALIDATION_FAIL.get(toString(), message));
-  }
 }

--
Gitblit v1.10.0