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

Nicolas Capponi
19.50.2016 e5fa1d9b9f1f3ea5e7066089cabf52d1c6395adb
OPENDJ-2987 Add placeholder feature to ObjectClass

For non-strict schemas, a placeholder object class is returned when querying
for an unknown object class
2 files modified
66 ■■■■■ changed files
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java 47 ●●●●● patch | view | raw | blame | history
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java 19 ●●●● patch | view | raw | blame | history
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java
@@ -14,7 +14,6 @@
 * Copyright 2009 Sun Microsystems, Inc.
 * Portions copyright 2015-2016 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
import java.util.Collection;
@@ -29,6 +28,8 @@
import org.forgerock.i18n.LocalizableMessage;
import com.forgerock.opendj.util.StaticUtils;
import static java.util.Arrays.*;
import static java.util.Collections.*;
@@ -400,6 +401,8 @@
    /** Indicates whether validation failed. */
    private boolean isValid;
    private boolean isPlaceHolder;
    /** Indicates whether this object class is the extensibleObject class. */
    private final boolean isExtensibleObject;
@@ -439,6 +442,34 @@
        this.requiredAttributeOIDs = unmodifiableCopyOfSet(builder.requiredAttributes);
        this.optionalAttributeOIDs = unmodifiableCopyOfSet(builder.optionalAttributes);
        this.isExtensibleObject = oid.equals(EXTENSIBLE_OBJECT_OBJECTCLASS_OID);
        this.isPlaceHolder = false;
    }
    /**
     * Creates a new place-holder object class having the specified name.
     * The OID of the place-holder object class will be the normalized object class name
     * followed by the suffix "-oid".
     *
     * @param name
     *            The name of the place-holder object class.
     */
    ObjectClass(final String name) {
        this.oid = toOID(name);
        this.names = Collections.singletonList(name);
        this.isObsolete = false;
        this.superiorClassOIDs = Collections.singleton(TOP_OBJECTCLASS_NAME);
        this.objectClassType = ObjectClassType.ABSTRACT;
        this.requiredAttributeOIDs = Collections.emptySet();
        this.optionalAttributeOIDs = Collections.emptySet();
        this.isExtensibleObject = oid.equals(EXTENSIBLE_OBJECT_OBJECTCLASS_OID);
        this.isPlaceHolder = true;
    }
    private static String toOID(final String name) {
        final StringBuilder builder = new StringBuilder(name.length() + 4);
        StaticUtils.toLowerCase(name, builder);
        builder.append("-oid");
        return builder.toString();
    }
    /**
@@ -645,6 +676,20 @@
    }
    /**
     * Returns whether this object class is a placeholder,
     * i.e. a dummy object class that does not exist in the schema.
     *
     * @return {@code true} if this object class is a placeholder,
     *         {@code false} otherwise
     * @deprecated This method may be removed at any time
     * @since OPENDJ-2987 Migrate ObjectClass
     */
    @Deprecated
    public boolean isPlaceHolder() {
        return isPlaceHolder;
    }
    /**
     * Indicates whether the provided attribute type is included in the optional
     * attribute list for this or any of its superior objectclasses.
     *
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java
@@ -316,7 +316,8 @@
        @Override
        public ObjectClass getObjectClass(final String nameOrOid) {
            return strictImpl.getObjectClass(nameOrOid);
            ObjectClass result = strictImpl.getObjectClass0(nameOrOid);
            return result != null ? result : new ObjectClass(nameOrOid);
        }
        @Override
@@ -736,6 +737,14 @@
        @Override
        public ObjectClass getObjectClass(final String nameOrOid) {
            ObjectClass result = getObjectClass0(nameOrOid);
            if (result != null) {
                return result;
            }
            throw new UnknownSchemaElementException(WARN_OBJECTCLASS_UNKNOWN.get(nameOrOid));
        }
        private ObjectClass getObjectClass0(final String nameOrOid) {
            final ObjectClass oc = numericOID2ObjectClasses.get(nameOrOid);
            if (oc != null) {
                return oc;
@@ -747,7 +756,7 @@
                }
                throw new UnknownSchemaElementException(WARN_OBJECTCLASS_AMBIGUOUS.get(nameOrOid));
            }
            throw new UnknownSchemaElementException(WARN_OBJECTCLASS_UNKNOWN.get(nameOrOid));
            return null;
        }
        @Override
@@ -1456,6 +1465,11 @@
    /**
     * Returns the object class with the specified name or numeric OID.
     * <p>
     * If the requested object class is not registered in this schema and this
     * schema is non-strict then a temporary "place-holder" object class will
     * be created and returned. Place holder object classes have an OID which
     * is the normalized name with the string {@code -oid} appended.
     *
     * @param nameOrOid
     *            The name or OID of the object class to retrieve.
@@ -1463,6 +1477,7 @@
     * @throws UnknownSchemaElementException
     *             If this is a strict schema and the requested object class was
     *             not found or if the provided name is ambiguous.
     * @see ObjectClass#isPlaceHolder()
     */
    public ObjectClass getObjectClass(final String nameOrOid) {
        return impl.getObjectClass(nameOrOid);