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

Jean-Noël Rouvignac
08.53.2015 b5adf03b38b8a911bc557ff7a1e8fb135335a6d5
OPENDJ-1632 Migrate AttributeType in one shot

Ensure default attribute types are created with the provided syntax

AttributeType.java:
These changes allow the server to create custom AttributeTypes with a non strict schema.

Schema.java:
Consequence of the changes to AttributeType.
Added getAttributeType(String name, Syntax).
4 files modified
92 ■■■■ changed files
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/AttributeType.java 24 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java 50 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java 6 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTestCase.java 12 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/AttributeType.java
@@ -450,12 +450,14 @@
     * attribute will be the normalized attribute type name followed by the
     * suffix "-oid".
     *
     * @param schema
     *            The parent schema.
     * @param name
     *            The name of the place-holder attribute type.
     * @param syntax
     *            The syntax of the place-holder attribute type.
     * @param equalityMatchingRule
     *            The equality matching rule of the place-holder attribute type.
     */
    AttributeType(final Schema schema, final String name) {
    AttributeType(final String name, final Syntax syntax, final MatchingRule equalityMatchingRule) {
        final StringBuilder builder = new StringBuilder(name.length() + 4);
        StaticUtils.toLowerCase(name, builder);
        builder.append("-oid");
@@ -465,12 +467,12 @@
        this.isObsolete = false;
        this.superiorTypeOID = null;
        this.superiorType = null;
        this.equalityMatchingRule = schema.getDefaultMatchingRule();
        this.equalityMatchingRule = equalityMatchingRule;
        this.equalityMatchingRuleOID = equalityMatchingRule.getOID();
        this.orderingMatchingRuleOID = null;
        this.substringMatchingRuleOID = null;
        this.approximateMatchingRuleOID = null;
        this.syntax = schema.getDefaultSyntax();
        this.syntax = syntax;
        this.syntaxOID = syntax.getOID();
        this.isSingleValue = false;
        this.isCollective = false;
@@ -580,6 +582,18 @@
    }
    /**
     * Returns the normalized name or OID for this schema definition.
     * <p>
     * If it has one or more names, then the lower case primary name will be returned.
     * If it does not have any names, then the lower case OID will be returned.
     *
     * @return The normalized name or OID for this schema definition.
     */
    public String getNormalizedNameOrOID() {
        return normalizedName;
    }
    /**
     * Returns an unmodifiable list containing the user-defined names that may
     * be used to reference this schema definition.
     *
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java
@@ -88,6 +88,8 @@
        AttributeType getAttributeType(Schema schema, String name);
        AttributeType getAttributeType(String name, Syntax syntax);
        Collection<AttributeType> getAttributeTypes();
        List<AttributeType> getAttributeTypesWithName(String name);
@@ -202,8 +204,17 @@
        @Override
        public AttributeType getAttributeType(final Schema schema, final String name) {
            return getAttributeType0(name, schema.getDefaultSyntax(), schema.getDefaultMatchingRule());
        }
        @Override
        public AttributeType getAttributeType(final String name, final Syntax syntax) {
            return getAttributeType0(name, syntax, syntax.getEqualityMatchingRule());
        }
        private AttributeType getAttributeType0(String name, Syntax syntax, MatchingRule equalityMatchingRule) {
            final AttributeType type = strictImpl.getAttributeType0(name);
            return type != null ? type : new AttributeType(schema, name);
            return type != null ? type : new AttributeType(name, syntax, equalityMatchingRule);
        }
        @Override
@@ -511,6 +522,11 @@
        }
        @Override
        public AttributeType getAttributeType(String name, Syntax syntax) {
            return getAttributeType(null, name);
        }
        @Override
        public AttributeType getAttributeType(final Schema schema, final String name) {
            final AttributeType type = getAttributeType0(name);
            if (type != null) {
@@ -1139,6 +1155,30 @@
    }
    /**
     * Returns the attribute type with the specified name or numeric OID.
     * <p>
     * If the requested attribute type is not registered in this schema and this
     * schema is non-strict then a temporary "place-holder" attribute type will
     * be created and returned. Place holder attribute types have an OID which
     * is the normalized attribute name with the string {@code -oid} appended.
     * In addition, they will use the provided syntax and the default matching
     * rule associated with the syntax.
     *
     * @param name
     *            The name or OID of the attribute type to retrieve.
     * @param syntax
     *            The syntax to use when creating the temporary "place-holder" attribute type.
     * @return The requested attribute type.
     * @throws UnknownSchemaElementException
     *             If this is a strict schema and the requested attribute type
     *             was not found or if the provided name is ambiguous.
     * @see AttributeType#isPlaceHolder()
     */
    public AttributeType getAttributeType(final String name, final Syntax syntax) {
        return impl.getAttributeType(name, syntax);
    }
    /**
     * Returns an unmodifiable collection containing all of the attribute types
     * contained in this schema.
     *
@@ -2170,4 +2210,12 @@
        }
        return parentStructuralObjectClass;
    }
    @Override
    public String toString() {
        return "Schema " + getSchemaName()
                + " mr=" + getMatchingRules().size()
                + " syntaxes=" + getSyntaxes().size()
                + " at=" + getAttributeTypes().size();
    }
}
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
@@ -1854,7 +1854,7 @@
                    syntaxBuilder.addToSchema(overwrite);
                    buildMatchingRule(enumImpl.getOrderingMatchingRule())
                        .names(OMR_GENERIC_ENUM_NAME + oid)
                        .names(OMR_GENERIC_ENUM_NAME + "." + oid)
                        .syntaxOID(oid)
                        .extraProperties(CoreSchemaImpl.OPENDS_ORIGIN)
                        .implementation(new EnumOrderingMatchingRule(enumImpl))
@@ -2107,9 +2107,9 @@
        final String localSchemaName;
        if (schemaName != null) {
            localSchemaName = schemaName;
            localSchemaName = schemaName + "-" + NEXT_SCHEMA_ID.getAndIncrement();
        } else {
            localSchemaName = String.format("Schema#%d", NEXT_SCHEMA_ID.getAndIncrement());
            localSchemaName = "Schema#" + NEXT_SCHEMA_ID.getAndIncrement();
        }
        Syntax defaultSyntax = numericOID2Syntaxes.get(options.get(DEFAULT_SYNTAX_OID));
opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTestCase.java
@@ -21,7 +21,7 @@
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2012-2015 ForgeRock AS.
 *      Portions Copyright 2012-2016 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -35,6 +35,8 @@
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import java.util.ArrayList;
import org.forgerock.i18n.LocalizedIllegalArgumentException;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.Connection;
@@ -184,18 +186,16 @@
     */
    @Test
    public void testCopyOnWriteWithChanges() {
        final Schema baseSchema = Schema.getCoreSchema();
        final Schema schema =
                new SchemaBuilder(baseSchema).addAttributeType(
                        "( testtype-oid NAME 'testtype' SUP name )", false).toSchema();
        assertThat(schema).isNotSameAs(baseSchema);
        assertThat(schema.getObjectClasses().containsAll(baseSchema.getObjectClasses()));
        assertThat(schema.getObjectClasses().size())
                .isEqualTo(baseSchema.getObjectClasses().size());
        assertThat(new ArrayList<>(schema.getObjectClasses())).isEqualTo(
                new ArrayList<>(baseSchema.getObjectClasses()));
        assertThat(schema.getAttributeTypes().containsAll(baseSchema.getAttributeTypes()));
        assertThat(schema.getAttributeType("testtype")).isNotNull();
        assertThat(schema.getSchemaName()).isEqualTo(baseSchema.getSchemaName());
        assertThat(schema.getSchemaName()).startsWith(baseSchema.getSchemaName());
        assertThat(schema.getOption(ALLOW_MALFORMED_NAMES_AND_OPTIONS))
                .isEqualTo(baseSchema.getOption(ALLOW_MALFORMED_NAMES_AND_OPTIONS));
    }