From cffe1147ee676e86de422418b60408475fa06f41 Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 10 May 2016 12:54:09 +0000
Subject: [PATCH] OPENDJ-3008 Copying Schema using SchemaBuilder loses optional attributes of ObjectClasses

---
 opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/ObjectClassBuilderTestCase.java |   51 +++++++++++++++++++++++++++++++++++++++++++--------
 opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java                |    2 +-
 2 files changed, 44 insertions(+), 9 deletions(-)

diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java
index d5bf022..350ba45 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/ObjectClass.java
+++ b/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) {
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/ObjectClassBuilderTestCase.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/ObjectClassBuilderTestCase.java
index 8229015..d31b293 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/ObjectClassBuilderTestCase.java
+++ b/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);

--
Gitblit v1.10.0