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

Jean-Noël Rouvignac
10.51.2016 cffe1147ee676e86de422418b60408475fa06f41
OPENDJ-3008 Copying Schema using SchemaBuilder loses optional attributes of ObjectClasses

ObjectClass.java:
In Builder constructor, actually copy the optional attributes from the original ObjectClass
2 files modified
53 ■■■■ changed files
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java 2 ●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/ObjectClassBuilderTestCase.java 51 ●●●● patch | view | raw | blame | history
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java
@@ -67,7 +67,7 @@
            this.type = oc.objectClassType;
            this.superiorClasses.addAll(oc.superiorClassOIDs);
            this.requiredAttributes.addAll(oc.requiredAttributeOIDs);
            this.optionalAttributes.addAll(optionalAttributes);
            this.optionalAttributes.addAll(oc.optionalAttributeOIDs);
        }
        Builder(final String oid, final SchemaBuilder builder) {
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/ObjectClassBuilderTestCase.java
@@ -29,6 +29,7 @@
import static org.forgerock.opendj.ldap.schema.Schema.*;
import static org.forgerock.opendj.ldap.schema.SchemaConstants.*;
@SuppressWarnings("javadoc")
public class ObjectClassBuilderTestCase extends AbstractSchemaTestCase {
    @DataProvider
@@ -39,20 +40,20 @@
        return new Object[][] {
            // Basic object class
            { "1.2.3.4", false, singletonList("MyObjectClass"), emptySet(), singleton("cn"),
                singleton(TOP_OBJECTCLASS_NAME), STRUCTURAL, "MyObjectClass description.", "New extra property",
                "New extra value", false },
                singleton(TOP_OBJECTCLASS_NAME), STRUCTURAL, "MyObjectClass description.",
                "X-New-extra-property", "New extra value", false },
            // Allowed overrides existing core schema object class groupOfNames
            { "2.5.6.9", false, singletonList("groupOfFirstNames"), emptySet(), singleton("cn"),
                singleton(TOP_OBJECTCLASS_NAME), AUXILIARY, "MyObjectClass description.", "New extra property",
                "New extra value", true },
                singleton(TOP_OBJECTCLASS_NAME), AUXILIARY, "MyObjectClass description.",
                "X-New-extra-property", "New extra value", true },
            // No name provided, should be validated
            { "1.2.3.4", false, emptyList(), singleton("name"), singleton("cn"),
                singleton(TOP_OBJECTCLASS_NAME), STRUCTURAL, "MyObjectClass description.", "New extra property",
                "New extra value", false },
                singleton(TOP_OBJECTCLASS_NAME), STRUCTURAL, "MyObjectClass description.",
                "X-New-extra-property", "New extra value", false },
            // Empty description, should be validated
            { "1.2.3.4", false, emptyList(), singleton("name"), singleton("cn"),
                singleton(TOP_OBJECTCLASS_NAME), STRUCTURAL, "", "New extra property",
                "New extra value", false },
                singleton(TOP_OBJECTCLASS_NAME), STRUCTURAL, "",
                "X-New-extra-property", "New extra value", false },
        };
    }
@@ -78,6 +79,40 @@
        assertThat(schema.getWarnings()).isEmpty();
        final ObjectClass oc = schema.getObjectClass(oid);
        validate(oc,
            oid,
            isObsolete,
            names,
            optionalAttributeOIDs,
            requiredAttributesOIDs,
            superiorClassOIDs,
            type,
            description,
            extraPropertyName,
            extraPropertyValue);
        final ObjectClass copiedOC = new SchemaBuilder(schema)
            .buildObjectClass(oid + "-oid") // triggers a lazy copy of the original schema
            .addToSchema()
            .toSchema()
            .getObjectClass(oid);
        validate(copiedOC,
            oid,
            isObsolete,
            names,
            optionalAttributeOIDs,
            requiredAttributesOIDs,
            superiorClassOIDs,
            type,
            description,
            extraPropertyName,
            extraPropertyValue);
    }
    private void validate(final ObjectClass oc, final String oid, final boolean isObsolete, final List<String> names,
            final Set<String> optionalAttributeOIDs, final Set<String> requiredAttributesOIDs,
            final Set<String> superiorClassOIDs, final ObjectClassType type, final String description,
            final String extraPropertyName, final String extraPropertyValue) throws Exception {
        assertThat(oc).isNotNull();
        assertThat(oc.getOID()).isEqualTo(oid);
        assertThat(oc.getDescription()).isEqualTo(description);