From ec746ba5b05f116fbf8a4b674e9aebc7a5f72b07 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Thu, 07 Apr 2016 08:38:37 +0000
Subject: [PATCH] OPENDJSDK-97 Support enumerations in Syntax builder

---
 opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java         |   66 +------
 opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTestCase.java |  167 ++++++++++++++++++
 opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/EnumSyntaxImpl.java        |    2 
 opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Syntax.java                |   28 +-
 opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java        |  271 +++++++----------------------
 5 files changed, 261 insertions(+), 273 deletions(-)

diff --git a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/EnumSyntaxImpl.java b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/EnumSyntaxImpl.java
index 8035610..ab7807a 100644
--- a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/EnumSyntaxImpl.java
+++ b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/EnumSyntaxImpl.java
@@ -33,7 +33,6 @@
 import org.forgerock.i18n.LocalizableMessageBuilder;
 import org.forgerock.opendj.ldap.ByteSequence;
 import org.forgerock.opendj.ldap.ByteString;
-import org.forgerock.util.Reject;
 
 /**
  * This class provides an enumeration-based mechanism where a new syntax and its
@@ -46,7 +45,6 @@
     private final List<String> entries;
 
     EnumSyntaxImpl(final String oid, final List<String> entries) {
-        Reject.ifNull(oid, entries);
         this.oid = oid;
         final List<String> entryStrings = new ArrayList<>(entries.size());
 
diff --git a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
index 1a19fca..75de661 100644
--- a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
+++ b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
@@ -31,7 +31,6 @@
 import static com.forgerock.opendj.util.StaticUtils.*;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -615,33 +614,10 @@
     public SchemaBuilder addEnumerationSyntax(final String oid, final String description,
             final boolean overwrite, final String... enumerations) {
         Reject.ifNull((Object) enumerations);
-        lazyInitBuilder();
-
-        final List<String> enumEntries = Arrays.asList(enumerations);
-        final Syntax.Builder syntaxBuilder = buildSyntax(oid).description(description)
-            .extraProperties(Collections.singletonMap("X-ENUM", enumEntries));
-        addEnumerationSyntax0(syntaxBuilder, oid, enumEntries, overwrite);
-        return this;
-    }
-
-    private void addEnumerationSyntax0(final Syntax.Builder syntaxBuilder,
-            final String oid, final List<String> enumEntries, final boolean overwrite) {
-        final EnumSyntaxImpl enumImpl = new EnumSyntaxImpl(oid, enumEntries);
-
-        syntaxBuilder
-                .implementation(enumImpl)
+        return buildSyntax(oid)
+                .description(description)
+                .extraProperties("X-ENUM", enumerations)
                 .addToSchema(overwrite);
-
-        try {
-            buildMatchingRule(enumImpl.getOrderingMatchingRule())
-                    .names(OMR_GENERIC_ENUM_NAME + "." + oid)
-                    .syntaxOID(oid)
-                    .extraProperties(CoreSchemaImpl.OPENDS_ORIGIN)
-                    .implementation(new EnumOrderingMatchingRule(enumImpl))
-                    .addToSchemaOverwrite();
-        } catch (final ConflictingSchemaElementException e) {
-            removeSyntax(oid);
-        }
     }
 
     /**
@@ -1400,15 +1376,10 @@
     public SchemaBuilder addPatternSyntax(final String oid, final String description,
             final Pattern pattern, final boolean overwrite) {
         Reject.ifNull(pattern);
-
-        lazyInitBuilder();
-
-        final Syntax.Builder syntaxBuilder = buildSyntax(oid).description(description).extraProperties(
-                Collections.singletonMap("X-PATTERN", Collections.singletonList(pattern.toString())));
-
-        syntaxBuilder.addToSchema(overwrite);
-
-        return this;
+        return buildSyntax(oid)
+                .description(description)
+                .extraProperties("X-PATTERN", pattern.toString())
+                .addToSchema(overwrite);
     }
 
     /**
@@ -1726,15 +1697,10 @@
     public SchemaBuilder addSubstitutionSyntax(final String oid, final String description,
             final String substituteSyntax, final boolean overwrite) {
         Reject.ifNull(substituteSyntax);
-
-        lazyInitBuilder();
-
-        final Syntax.Builder syntaxBuilder = buildSyntax(oid).description(description).extraProperties(
-                Collections.singletonMap("X-SUBST", Collections.singletonList(substituteSyntax)));
-
-        syntaxBuilder.addToSchema(overwrite);
-
-        return this;
+        return buildSyntax(oid)
+                .description(description)
+                .extraProperties("X-SUBST", substituteSyntax)
+                .addToSchema(overwrite);
     }
 
     /**
@@ -1821,14 +1787,6 @@
                 }
             }
 
-            // See if it is a enum syntax
-            for (final Map.Entry<String, List<String>> property : syntaxBuilder.getExtraProperties().entrySet()) {
-                if ("x-enum".equalsIgnoreCase(property.getKey())) {
-                    addEnumerationSyntax0(syntaxBuilder, oid, property.getValue(), overwrite);
-                    return this;
-                }
-            }
-
             syntaxBuilder.addToSchema(overwrite);
         } catch (final DecodeException e) {
             final LocalizableMessage msg =
@@ -2557,7 +2515,7 @@
     private void removeSyntax(final Syntax syntax) {
         for (Map.Entry<String, List<String>> property : syntax.getExtraProperties().entrySet()) {
             if ("x-enum".equalsIgnoreCase(property.getKey())) {
-                removeMatchingRule(OMR_GENERIC_ENUM_NAME + "." + syntax.getOID());
+                removeMatchingRule(OMR_OID_GENERIC_ENUM + "." + syntax.getOID());
                 break;
             }
         }
diff --git a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Syntax.java b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Syntax.java
index cc706c4..473efde 100644
--- a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Syntax.java
+++ b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Syntax.java
@@ -72,7 +72,7 @@
          *             If there is an existing syntax with the same numeric OID.
          */
         public SchemaBuilder addToSchema() {
-            return getSchemaBuilder().addSyntax(new Syntax(this), false);
+            return addToSchema(false);
         }
 
         /**
@@ -81,19 +81,25 @@
          * @return The parent schema builder.
          */
         public SchemaBuilder addToSchemaOverwrite() {
-            return getSchemaBuilder().addSyntax(new Syntax(this), true);
+            return addToSchema(true);
         }
 
-        /**
-         * Adds this syntax to the schema - overwriting any existing syntax with the same numeric OID
-         * if the overwrite parameter is set to {@code true}.
-         *
-         * @param overwrite
-         *            {@code true} if any syntax with the same OID should be overwritten.
-         * @return The parent schema builder.
-         */
         SchemaBuilder addToSchema(final boolean overwrite) {
-            return overwrite ? addToSchemaOverwrite() : addToSchema();
+            // Enumeration syntaxes will need their associated matching rule registered now as well.
+            for (final Map.Entry<String, List<String>> property : getExtraProperties().entrySet()) {
+                if ("x-enum".equalsIgnoreCase(property.getKey())) {
+                    final EnumSyntaxImpl enumSyntaxImpl = new EnumSyntaxImpl(oid, property.getValue());
+                    implementation(enumSyntaxImpl);
+                    return getSchemaBuilder().addSyntax(new Syntax(this), overwrite)
+                                             .buildMatchingRule(enumSyntaxImpl.getOrderingMatchingRule())
+                                             .description(getDescription() + " enumeration ordering matching rule")
+                                             .syntaxOID(oid)
+                                             .extraProperties(CoreSchemaImpl.OPENDS_ORIGIN)
+                                             .implementation(new EnumOrderingMatchingRule(enumSyntaxImpl))
+                                             .addToSchemaOverwrite();
+                }
+            }
+            return getSchemaBuilder().addSyntax(new Syntax(this), overwrite);
         }
 
         @Override
diff --git a/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTestCase.java b/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTestCase.java
index af5cf03..f097bf2 100644
--- a/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTestCase.java
+++ b/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTestCase.java
@@ -26,6 +26,7 @@
 import static org.mockito.Mockito.*;
 
 import java.util.ArrayList;
+import java.util.regex.Pattern;
 
 import org.forgerock.i18n.LocalizableMessageBuilder;
 import org.forgerock.i18n.LocalizedIllegalArgumentException;
@@ -40,6 +41,7 @@
 import org.forgerock.opendj.ldap.requests.SearchRequest;
 import org.forgerock.opendj.ldap.responses.Responses;
 import org.forgerock.opendj.ldap.responses.SearchResultEntry;
+import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 /** Test SchemaBuilder. */
@@ -2158,4 +2160,169 @@
                 .as("Value should have been valid, but it is not: " + invalidReason.toString())
                 .isTrue();
     }
+
+    @DataProvider
+    private Object[][] schemasWithEnumerationSyntaxes() {
+        final Schema coreSchema = Schema.getCoreSchema();
+
+        final Schema usingAddEnumerationSyntax = new SchemaBuilder("usingAddEnumerationSyntax")
+                .addSchema(coreSchema, true)
+                .addEnumerationSyntax("3.3.3", "Primary colors", true, "red", "green", "blue")
+                .toSchema();
+
+        final Schema usingAddSyntaxString = new SchemaBuilder("usingAddSyntaxString")
+                .addSchema(coreSchema, true)
+                .addSyntax("( 3.3.3  DESC 'Primary colors' X-ENUM ( 'red' 'green' 'blue' ))", true)
+                .toSchema();
+
+        final Schema usingBuildSyntaxCopy = new SchemaBuilder("usingBuildSyntaxCopy")
+                .addSchema(coreSchema, true)
+                .buildSyntax(usingAddEnumerationSyntax.getSyntax("3.3.3")).addToSchema()
+                .toSchema();
+
+        final Schema usingBuildSyntaxIncremental = new SchemaBuilder("usingBuildSyntaxIncremental")
+                .addSchema(coreSchema, true)
+                .buildSyntax("3.3.3")
+                .description("Primary colors")
+                .extraProperties("X-ENUM", "red", "green", "blue")
+                .addToSchema()
+                .toSchema();
+
+        final Schema usingCopyOfSchema = new SchemaBuilder("usingCopyOfSchema")
+                .addSchema(usingAddEnumerationSyntax, true)
+                .toSchema();
+
+        return new Object[][] {
+            { usingAddEnumerationSyntax },
+            { usingAddSyntaxString },
+            { usingBuildSyntaxCopy },
+            { usingBuildSyntaxIncremental },
+            { usingCopyOfSchema }
+        };
+    }
+
+    @Test(dataProvider = "schemasWithEnumerationSyntaxes")
+    public void enumerationSyntaxesCanBeCreatedUsingDifferentApproaches(Schema schema) {
+        assertThat(schema.getWarnings()).isEmpty();
+        assertThat(schema.getMatchingRules())
+                .as("Expected an enum ordering matching rule to be added for the enum syntax")
+                .hasSize(Schema.getCoreSchema().getMatchingRules().size() + 1);
+
+        LocalizableMessageBuilder msgBuilder = new LocalizableMessageBuilder();
+        Syntax primaryColors = schema.getSyntax("3.3.3");
+        assertThat(primaryColors.valueIsAcceptable(ByteString.valueOfUtf8("red"), msgBuilder)).isTrue();
+        assertThat(primaryColors.valueIsAcceptable(ByteString.valueOfUtf8("yellow"), msgBuilder)).isFalse();
+
+        MatchingRule matchingRule = schema.getMatchingRule(OMR_OID_GENERIC_ENUM + "." + "3.3.3");
+        assertThat(matchingRule).isNotNull();
+        assertThat(matchingRule).isSameAs(primaryColors.getOrderingMatchingRule());
+    }
+
+    @DataProvider
+    private Object[][] schemasWithSubstitutionSyntaxes() {
+        final Schema coreSchema = Schema.getCoreSchema();
+
+        final Schema usingAddSubstitutionSyntax = new SchemaBuilder("usingAddSubstitutionSyntax")
+                .addSchema(coreSchema, true)
+                .addSubstitutionSyntax("3.3.3", "Long Integer", "1.3.6.1.4.1.1466.115.121.1.27", true)
+                .toSchema();
+
+        final Schema usingAddSyntaxString = new SchemaBuilder("usingAddSyntaxString")
+                .addSchema(coreSchema, true)
+                .addSyntax("( 3.3.3  DESC 'Long Integer' X-SUBST '1.3.6.1.4.1.1466.115.121.1.27' )", true)
+                .toSchema();
+
+        final Schema usingBuildSyntaxCopy = new SchemaBuilder("usingBuildSyntaxCopy")
+                .addSchema(coreSchema, true)
+                .buildSyntax(usingAddSubstitutionSyntax.getSyntax("3.3.3")).addToSchema()
+                .toSchema();
+
+        final Schema usingBuildSyntaxIncremental = new SchemaBuilder("usingBuildSyntaxIncremental")
+                .addSchema(coreSchema, true)
+                .buildSyntax("3.3.3")
+                .description("Long Integer")
+                .extraProperties("X-SUBST", "1.3.6.1.4.1.1466.115.121.1.27")
+                .addToSchema()
+                .toSchema();
+
+        final Schema usingCopyOfSchema = new SchemaBuilder("usingCopyOfSchema")
+                .addSchema(usingAddSubstitutionSyntax, true)
+                .toSchema();
+
+        return new Object[][] {
+            { usingAddSubstitutionSyntax },
+            { usingAddSyntaxString },
+            { usingBuildSyntaxCopy },
+            { usingBuildSyntaxIncremental },
+            { usingCopyOfSchema }
+        };
+    }
+
+    @Test(dataProvider = "schemasWithSubstitutionSyntaxes")
+    public void substitutionSyntaxesCanBeCreatedUsingDifferentApproaches(Schema schema) {
+        assertThat(schema.getWarnings()).isEmpty();
+
+        LocalizableMessageBuilder msgBuilder = new LocalizableMessageBuilder();
+        Syntax longInteger = schema.getSyntax("3.3.3");
+        assertThat(longInteger.valueIsAcceptable(ByteString.valueOfUtf8("12345"), msgBuilder)).isTrue();
+        assertThat(longInteger.valueIsAcceptable(ByteString.valueOfUtf8("NaN"), msgBuilder)).isFalse();
+
+        MatchingRule matchingRule = schema.getMatchingRule("integerOrderingMatch");
+        assertThat(matchingRule).isNotNull();
+        assertThat(matchingRule).isSameAs(longInteger.getOrderingMatchingRule());
+    }
+
+    @DataProvider
+    private Object[][] schemasWithPatternSyntaxes() {
+        final Schema coreSchema = Schema.getCoreSchema();
+
+        final Schema usingAddPatternSyntax = new SchemaBuilder("usingAddSubstitutionSyntax")
+                .addSchema(coreSchema, true)
+                .addPatternSyntax("3.3.3", "Host and Port", Pattern.compile("[^:]+:\\d+"), true)
+                .toSchema();
+
+        final Schema usingAddSyntaxString = new SchemaBuilder("usingAddSyntaxString")
+                .addSchema(coreSchema, true)
+                .addSyntax("( 3.3.3  DESC 'Host and Port' X-PATTERN '[^:]+:\\d+' )", true)
+                .toSchema();
+
+        final Schema usingBuildSyntaxCopy = new SchemaBuilder("usingBuildSyntaxCopy")
+                .addSchema(coreSchema, true)
+                .buildSyntax(usingAddPatternSyntax.getSyntax("3.3.3")).addToSchema()
+                .toSchema();
+
+        final Schema usingBuildSyntaxIncremental = new SchemaBuilder("usingBuildSyntaxIncremental")
+                .addSchema(coreSchema, true)
+                .buildSyntax("3.3.3")
+                .description("Host and Port")
+                .extraProperties("X-PATTERN", "[^:]+:\\d+")
+                .addToSchema()
+                .toSchema();
+
+        final Schema usingCopyOfSchema = new SchemaBuilder("usingCopyOfSchema")
+                .addSchema(usingAddPatternSyntax, true)
+                .toSchema();
+
+        return new Object[][] {
+            { usingAddPatternSyntax },
+            { usingAddSyntaxString },
+            { usingBuildSyntaxCopy },
+            { usingBuildSyntaxIncremental },
+            { usingCopyOfSchema }
+        };
+    }
+
+    @Test(dataProvider = "schemasWithPatternSyntaxes")
+    public void patternSyntaxesCanBeCreatedUsingDifferentApproaches(Schema schema) {
+        assertThat(schema.getWarnings()).isEmpty();
+
+        LocalizableMessageBuilder msgBuilder = new LocalizableMessageBuilder();
+        Syntax longInteger = schema.getSyntax("3.3.3");
+        assertThat(longInteger.valueIsAcceptable(ByteString.valueOfUtf8("localhost:389"), msgBuilder)).isTrue();
+        assertThat(longInteger.valueIsAcceptable(ByteString.valueOfUtf8("bad"), msgBuilder)).isFalse();
+
+        MatchingRule matchingRule = schema.getMatchingRule("caseIgnoreOrderingMatch");
+        assertThat(matchingRule).isNotNull();
+        assertThat(matchingRule).isSameAs(longInteger.getOrderingMatchingRule());
+    }
 }
diff --git a/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java b/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java
index 6c6f83d..f402050 100644
--- a/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java
+++ b/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java
@@ -11,7 +11,7 @@
  * Header, with the fields enclosed by brackets [] replaced by your own identifying
  * information: "Portions Copyright [year] [name of copyright owner]".
  *
- * Copyright 2014 ForgeRock AS.
+ * Copyright 2014-2016 ForgeRock AS.
  * Portions Copyright 2014 Manuel Gaupp
  */
 
@@ -30,34 +30,32 @@
 public class SyntaxTestCase extends AbstractSchemaTestCase {
 
     @Test
-    public final void testCreatesANewSyntax() {
+    public final void testBuilderCreatesCustomSyntax() {
         // @formatter:off
         final Schema schema = new SchemaBuilder(Schema.getCoreSchema())
             .buildSyntax("1.9.1.2.3")
-            .description("Security Label")
-            .extraProperties("X-ENUM", "top-secret", "secret", "confidential")
-            .implementation(new DirectoryStringSyntaxImpl())
-            .addToSchema()
+                .description("Security Label")
+                .extraProperties("X-TEST", "1", "2", "3")
+                .implementation(new DirectoryStringSyntaxImpl())
+                .addToSchema()
             .toSchema();
         // @formatter:on
         assertThat(schema.getWarnings()).isEmpty();
         final Syntax syntax = schema.getSyntax("1.9.1.2.3");
         assertThat(syntax).isNotNull();
         assertThat(syntax.getDescription()).isEqualTo("Security Label");
-        assertThat(syntax.getExtraProperties().get("X-ENUM").size()).isEqualTo(3);
+        assertThat(syntax.getExtraProperties().get("X-TEST")).hasSize(3);
         assertThat(syntax.getApproximateMatchingRule().getNameOrOID()).isEqualTo("ds-mr-double-metaphone-approx");
         assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("caseIgnoreMatch");
         assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("caseIgnoreOrderingMatch");
         assertThat(syntax.getSubstringMatchingRule().getNameOrOID()).isEqualTo("caseIgnoreSubstringsMatch");
-        assertThat(syntax.toString()).isEqualTo(
-                "( 1.9.1.2.3 DESC 'Security Label' X-ENUM ( 'top-secret' 'secret' 'confidential' ) )");
+        assertThat(syntax.toString()).isEqualTo("( 1.9.1.2.3 DESC 'Security Label' X-TEST ( '1' '2' '3' ) )");
         assertThat(syntax.isHumanReadable()).isTrue();
         assertThat(syntax.isBEREncodingRequired()).isFalse();
     }
 
     /**
-     * Tests that unrecognized syntaxes are automatically substituted with the
-     * default syntax during building.
+     * Tests that unrecognized syntaxes are automatically substituted with the default syntax during building.
      */
     @Test
     public final void testBuilderSubstitutesUnknownSyntaxWithDefaultSyntax() {
@@ -70,14 +68,12 @@
         assertThat(syntax.getDescription()).isEmpty();
         assertThat(syntax.getApproximateMatchingRule()).isNull();
         assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
-        assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo(
-                "octetStringOrderingMatch");
+        assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
         assertThat(syntax.getSubstringMatchingRule()).isNull();
     }
 
     /**
-     * Tests that unrecognized syntaxes are automatically substituted with the
-     * default syntax and matching rule.
+     * Tests that unrecognized syntaxes are automatically substituted with the default syntax and matching rule.
      */
     @Test
     public final void testDefaultSyntaxSubstitution() {
@@ -85,12 +81,10 @@
         assertThat(syntax).isNotNull();
         assertThat(syntax.getDescription()).isEmpty();
         // Dynamically created syntaxes include the X-SUBST extension.
-        assertThat(syntax.getExtraProperties().get("X-SUBST").get(0)).isEqualTo(
-                "1.3.6.1.4.1.1466.115.121.1.40");
+        assertThat(syntax.getExtraProperties().get("X-SUBST").get(0)).isEqualTo("1.3.6.1.4.1.1466.115.121.1.40");
         assertThat(syntax.getApproximateMatchingRule()).isNull();
         assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
-        assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo(
-                "octetStringOrderingMatch");
+        assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
         assertThat(syntax.getSubstringMatchingRule()).isNull();
     }
 
@@ -99,14 +93,7 @@
      */
     @Test(expectedExceptions = IllegalArgumentException.class)
     public final void testBuilderDoesNotAllowEmptyOid() {
-        // @formatter:off
-        new SchemaBuilder(Schema.getCoreSchema())
-            .buildSyntax("")
-            .description("Security Label")
-            .extraProperties("X-ENUM", "top-secret", "secret", "confidential")
-            .implementation(new DirectoryStringSyntaxImpl())
-            .addToSchema();
-        // @formatter:on
+        new SchemaBuilder(Schema.getCoreSchema()).buildSyntax("").addToSchema();
     }
 
     /**
@@ -114,14 +101,7 @@
      */
     @Test(expectedExceptions = IllegalArgumentException.class)
     public final void testBuilderDoesNotAllowNullOid() {
-        // @formatter:off
-        new SchemaBuilder(Schema.getCoreSchema())
-            .buildSyntax((String) null)
-            .description("Security Label")
-            .extraProperties("X-ENUM", "top-secret", "secret", "confidential")
-            .implementation(new DirectoryStringSyntaxImpl())
-            .addToSchema();
-        // @formatter:on
+        new SchemaBuilder(Schema.getCoreSchema()).buildSyntax((String) null).addToSchema();
     }
 
     /**
@@ -129,28 +109,19 @@
      */
     @Test
     public final void testBuilderAllowsNullSyntax() {
-        // @formatter:off
         final Schema schema = new SchemaBuilder(Schema.getCoreSchema())
-            .buildSyntax("1.9.1.2.3")
-                .description("Security Label")
-                .extraProperties("X-ENUM", "top-secret", "secret", "confidential")
-                .implementation(null)
-                .addToSchema()
-            .toSchema();
-        // @formatter:on
+                .buildSyntax("1.9.1.2.3").implementation(null).addToSchema()
+                .toSchema();
 
         assertThat(schema.getWarnings()).isNotEmpty();
         assertThat(schema.getWarnings().toString()).contains("It will be substituted by the default syntax");
         final Syntax syntax = schema.getSyntax("1.9.1.2.3");
         assertThat(syntax).isNotNull();
-        assertThat(syntax.getDescription()).isEqualTo("Security Label");
-        assertThat(syntax.getExtraProperties().get("X-ENUM").size()).isEqualTo(3);
         assertThat(syntax.getApproximateMatchingRule()).isEqualTo(null);
         assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
         assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
         assertThat(syntax.getSubstringMatchingRule()).isEqualTo(null);
-        assertThat(syntax.toString()).isEqualTo(
-                "( 1.9.1.2.3 DESC 'Security Label' X-ENUM ( 'top-secret' 'secret' 'confidential' ) )");
+        assertThat(syntax.toString()).isEqualTo("( 1.9.1.2.3 )");
     }
 
     /**
@@ -158,27 +129,19 @@
      */
     @Test
     public final void testBuilderAllowsNoSyntax() {
-        // @formatter:off
         final Schema schema = new SchemaBuilder(Schema.getCoreSchema())
-            .buildSyntax("1.9.1.2.3")
-                .description("Security Label")
-                .extraProperties("X-ENUM", "top-secret", "secret", "confidential")
-                .addToSchema()
-            .toSchema();
-        // @formatter:on
+                .buildSyntax("1.9.1.2.3").addToSchema()
+                .toSchema();
 
         assertThat(schema.getWarnings()).isNotEmpty();
         assertThat(schema.getWarnings().toString()).contains("It will be substituted by the default syntax");
         final Syntax syntax = schema.getSyntax("1.9.1.2.3");
         assertThat(syntax).isNotNull();
-        assertThat(syntax.getDescription()).isEqualTo("Security Label");
-        assertThat(syntax.getExtraProperties().get("X-ENUM").size()).isEqualTo(3);
         assertThat(syntax.getApproximateMatchingRule()).isEqualTo(null);
         assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
         assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
         assertThat(syntax.getSubstringMatchingRule()).isEqualTo(null);
-        assertThat(syntax.toString()).isEqualTo(
-                "( 1.9.1.2.3 DESC 'Security Label' X-ENUM ( 'top-secret' 'secret' 'confidential' ) )");
+        assertThat(syntax.toString()).isEqualTo("( 1.9.1.2.3 )");
     }
 
     /**
@@ -187,28 +150,20 @@
      */
     @Test
     public final void testBuilderAllowsNoSyntaxCaseWhereDefaultSyntaxIsChanged() {
-        // @formatter:off
         final Schema schema = new SchemaBuilder(Schema.getCoreSchema())
-            .setOption(DEFAULT_SYNTAX_OID, "1.3.6.1.4.1.1466.115.121.1.15")
-            .buildSyntax("1.9.1.2.3")
-                .description("Security Label")
-                .extraProperties("X-ENUM", "top-secret", "secret", "confidential")
-                .addToSchema()
-            .toSchema();
-        // @formatter:on
+                .setOption(DEFAULT_SYNTAX_OID, "1.3.6.1.4.1.1466.115.121.1.15")
+                .buildSyntax("1.9.1.2.3").addToSchema()
+                .toSchema();
 
         assertThat(schema.getWarnings()).isNotEmpty();
         assertThat(schema.getWarnings().toString()).contains("It will be substituted by the default syntax");
         final Syntax syntax = schema.getSyntax("1.9.1.2.3");
         assertThat(syntax).isNotNull();
-        assertThat(syntax.getDescription()).isEqualTo("Security Label");
-        assertThat(syntax.getExtraProperties().get("X-ENUM").size()).isEqualTo(3);
         assertThat(syntax.getApproximateMatchingRule().getNameOrOID()).isEqualTo("ds-mr-double-metaphone-approx");
         assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("caseIgnoreMatch");
         assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("caseIgnoreOrderingMatch");
         assertThat(syntax.getSubstringMatchingRule().getNameOrOID()).isEqualTo("caseIgnoreSubstringsMatch");
-        assertThat(syntax.toString()).isEqualTo(
-                "( 1.9.1.2.3 DESC 'Security Label' X-ENUM ( 'top-secret' 'secret' 'confidential' ) )");
+        assertThat(syntax.toString()).isEqualTo("( 1.9.1.2.3 )");
     }
 
     /**
@@ -216,24 +171,13 @@
      */
     @Test
     public final void testBuilderAllowsNoDescription() {
-        // @formatter:off
         final Schema schema = new SchemaBuilder(Schema.getCoreSchema())
-            .buildSyntax("1.9.1.2.3")
-            .extraProperties("X-ENUM", "top-secret", "secret", "confidential")
-            .implementation(new OctetStringSyntaxImpl())
-            .addToSchema()
-            .toSchema();
-        // @formatter:on
+                .buildSyntax("1.9.1.2.3").addToSchema()
+                .toSchema();
 
-        assertThat(schema.getWarnings()).isEmpty();
         final Syntax syntax = schema.getSyntax("1.9.1.2.3");
         assertThat(syntax).isNotNull();
         assertThat(syntax.getDescription()).isEqualTo("");
-        assertThat(syntax.getExtraProperties().get("X-ENUM").size()).isEqualTo(3);
-        assertThat(syntax.getApproximateMatchingRule()).isEqualTo(null);
-        assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
-        assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
-        assertThat(syntax.getSubstringMatchingRule()).isEqualTo(null);
     }
 
     /**
@@ -241,25 +185,13 @@
      */
     @Test
     public final void testBuilderAllowsNullDescription() {
-        // @formatter:off
         final Schema schema = new SchemaBuilder(Schema.getCoreSchema())
-            .buildSyntax("1.9.1.2.3")
-            .description(null)
-            .extraProperties("X-ENUM", "top-secret", "secret", "confidential")
-            .implementation(new OctetStringSyntaxImpl())
-            .addToSchema()
-            .toSchema();
-        // @formatter:on
+                .buildSyntax("1.9.1.2.3").description(null).addToSchema()
+                .toSchema();
 
-        assertThat(schema.getWarnings()).isEmpty();
         final Syntax syntax = schema.getSyntax("1.9.1.2.3");
         assertThat(syntax).isNotNull();
         assertThat(syntax.getDescription()).isEqualTo("");
-        assertThat(syntax.getExtraProperties().get("X-ENUM").size()).isEqualTo(3);
-        assertThat(syntax.getApproximateMatchingRule()).isEqualTo(null);
-        assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
-        assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
-        assertThat(syntax.getSubstringMatchingRule()).isEqualTo(null);
     }
 
     /**
@@ -267,25 +199,13 @@
      */
     @Test
     public final void testBuilderAllowsEmptyDescription() {
-        // @formatter:off
         final Schema schema = new SchemaBuilder(Schema.getCoreSchema())
-            .buildSyntax("1.9.1.2.3")
-            .description("")
-            .extraProperties("X-ENUM", "top-secret", "secret", "confidential")
-            .implementation(new OctetStringSyntaxImpl())
-            .addToSchema()
-            .toSchema();
-        // @formatter:on
+                .buildSyntax("1.9.1.2.3").description("").addToSchema()
+                .toSchema();
 
-        assertThat(schema.getWarnings()).isEmpty();
         final Syntax syntax = schema.getSyntax("1.9.1.2.3");
         assertThat(syntax).isNotNull();
         assertThat(syntax.getDescription()).isEqualTo("");
-        assertThat(syntax.getExtraProperties().get("X-ENUM").size()).isEqualTo(3);
-        assertThat(syntax.getApproximateMatchingRule()).isEqualTo(null);
-        assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
-        assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
-        assertThat(syntax.getSubstringMatchingRule()).isEqualTo(null);
     }
 
     /**
@@ -293,24 +213,13 @@
      */
     @Test
     public final void testBuilderAllowsNoExtraProperties() {
-        // @formatter:off
         final Schema schema = new SchemaBuilder(Schema.getCoreSchema())
-            .buildSyntax("1.9.1.2.3")
-                .description("Security Label")
-                .implementation(new OctetStringSyntaxImpl())
-                .addToSchema()
-            .toSchema();
-        // @formatter:on
+                .buildSyntax("1.9.1.2.3").addToSchema()
+                .toSchema();
 
-        assertThat(schema.getWarnings()).isEmpty();
         final Syntax syntax = schema.getSyntax("1.9.1.2.3");
         assertThat(syntax).isNotNull();
-        assertThat(syntax.getDescription()).isEqualTo("Security Label");
         assertThat(syntax.getExtraProperties().isEmpty()).isTrue();
-        assertThat(syntax.getApproximateMatchingRule()).isEqualTo(null);
-        assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
-        assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
-        assertThat(syntax.getSubstringMatchingRule()).isEqualTo(null);
     }
 
     /**
@@ -318,15 +227,7 @@
      */
     @Test(expectedExceptions = NullPointerException.class)
     public final void testBuilderDoesNotAllowNullExtraProperties() {
-        // @formatter:off
-        new SchemaBuilder(Schema.getCoreSchema())
-                .buildSyntax("1.9.1.2.3")
-                .description("Security Label")
-                .extraProperties(null)
-                .implementation(new OctetStringSyntaxImpl())
-                .addToSchema()
-            .toSchema();
-        // @formatter:on
+        new SchemaBuilder(Schema.getCoreSchema()).buildSyntax("1.9.1.2.3").extraProperties(null);
     }
 
     /**
@@ -334,26 +235,14 @@
      */
     @Test
     public final void testBuilderRemoveExtraProperties() {
-        // @formatter:off
         final Schema schema = new SchemaBuilder(Schema.getCoreSchema())
-            .buildSyntax("1.9.1.2.3")
-                .description("Security Label")
-                .extraProperties("X-ENUM", "top-secret", "secret", "confidential")
-                .implementation(new OctetStringSyntaxImpl())
-                .removeAllExtraProperties()
-                .addToSchema()
-            .toSchema();
-        // @formatter:on
+                .buildSyntax("1.9.1.2.3")
+                .extraProperties("X-ENUM", "1", "2", "3").removeAllExtraProperties().addToSchema()
+                .toSchema();
 
-        assertThat(schema.getWarnings()).isEmpty();
         final Syntax syntax = schema.getSyntax("1.9.1.2.3");
         assertThat(syntax).isNotNull();
-        assertThat(syntax.getDescription()).isEqualTo("Security Label");
         assertThat(syntax.getExtraProperties().isEmpty()).isTrue();
-        assertThat(syntax.getApproximateMatchingRule()).isEqualTo(null);
-        assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
-        assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
-        assertThat(syntax.getSubstringMatchingRule()).isEqualTo(null);
     }
 
     /**
@@ -364,29 +253,20 @@
         // @formatter:off
         final Schema schema = new SchemaBuilder(Schema.getCoreSchema())
             .buildSyntax("1.9.1.2.3")
-                .description("Security Label")
                 .extraProperties("X-ENUM", "top-secret", "secret", "confidential")
                 .extraProperties("X-ORIGIN", "Sam Carter")
-                .implementation(new OctetStringSyntaxImpl())
                 .removeExtraProperty("X-ENUM", "top-secret")
                 .addToSchema()
             .toSchema();
         // @formatter:on
 
-        assertThat(schema.getWarnings()).isEmpty();
         final Syntax syntax = schema.getSyntax("1.9.1.2.3");
         assertThat(syntax).isNotNull();
-        assertThat(syntax.getDescription()).isEqualTo("Security Label");
         assertThat(syntax.getExtraProperties().isEmpty()).isFalse();
         assertThat(syntax.getExtraProperties().get("X-ENUM").size()).isEqualTo(2);
         assertThat(syntax.getExtraProperties().get("X-ORIGIN").size()).isEqualTo(1);
-        assertThat(syntax.getApproximateMatchingRule()).isEqualTo(null);
-        assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
-        assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
-        assertThat(syntax.getSubstringMatchingRule()).isEqualTo(null);
     }
 
-
     /**
      * Sets a syntax using a string definition.
      */
@@ -470,41 +350,20 @@
      */
     @Test
     public final void testBuilderDuplicatesExistingSyntax() {
-        final SchemaBuilder sb = new SchemaBuilder();
-        sb.addSchema(Schema.getCoreSchema(), false);
+        final Schema schema1 = new SchemaBuilder(Schema.getCoreSchema())
+                .buildSyntax("1.2.3.4.5.6").description("v1").addToSchema()
+                .toSchema();
 
-        // @formatter:off
-        final Syntax.Builder syntaxBuilder = new Syntax.Builder("1.9.1.2.3", sb);
-        syntaxBuilder.description("Security Label")
-            .extraProperties("X-ENUM", "top-secret", "secret", "confidential")
-            .implementation(new DirectoryStringSyntaxImpl())
-            .addToSchema();
-        // @formatter:on
+        final Syntax syntax1 = schema1.getSyntax("1.2.3.4.5.6");
+        assertThat(syntax1.getDescription()).isEqualTo("v1");
 
-        Schema schema = sb.toSchema();
-        assertThat(schema.getWarnings()).isEmpty();
-        final Syntax syntax = schema.getSyntax("1.9.1.2.3");
-        assertThat(syntax.getDescription()).isEqualTo("Security Label");
-        assertThat(syntax.getExtraProperties().get("X-ENUM").size()).isEqualTo(3);
+        final Schema schema2 = new SchemaBuilder(Schema.getCoreSchema())
+                .buildSyntax(syntax1).description("v2").addToSchema()
+                .toSchema();
 
-        // @formatter:off
-        sb.buildSyntax(syntax)
-            .description("Security Label II")
-            .extraProperties("X-ENUM", "private")
-            .addToSchemaOverwrite();
-        // @formatter:on
-
-        schema = sb.toSchema();
-        assertThat(schema.getWarnings()).isEmpty();
-        final Syntax dolly = schema.getSyntax("1.9.1.2.3");
-        assertThat(dolly.getDescription()).isEqualTo("Security Label II");
-        assertThat(dolly.getExtraProperties().get("X-ENUM").size()).isEqualTo(4);
-        assertThat(dolly.getApproximateMatchingRule().getNameOrOID()).isEqualTo("ds-mr-double-metaphone-approx");
-        assertThat(dolly.getEqualityMatchingRule().getNameOrOID()).isEqualTo("caseIgnoreMatch");
-        assertThat(dolly.getOrderingMatchingRule().getNameOrOID()).isEqualTo("caseIgnoreOrderingMatch");
-        assertThat(dolly.getSubstringMatchingRule().getNameOrOID()).isEqualTo("caseIgnoreSubstringsMatch");
-        assertThat(dolly.toString()).isEqualTo(
-                "( 1.9.1.2.3 DESC 'Security Label II' X-ENUM ( 'top-secret' 'secret' 'confidential' 'private' ) )");
+        final Syntax syntax2 = schema2.getSyntax("1.2.3.4.5.6");
+        assertThat(syntax2.getDescription()).isEqualTo("v2");
+        assertThat(syntax2.toString()).isEqualTo("( 1.2.3.4.5.6 DESC 'v2' )");
     }
 
     /**
@@ -673,24 +532,24 @@
         // @formatter:off
         final Schema schema = new SchemaBuilder(Schema.getCoreSchema())
             .buildSyntax("1.9.1.2.3")
-            .description("Security Label")
-            .extraProperties("X-ENUM", "top-secret", "secret", "confidential")
-            .implementation(new DirectoryStringSyntaxImpl())
-            .addToSchema()
+                .description("Security Label")
+                .extraProperties("X-TEST", "1", "2", "3")
+                .implementation(new DirectoryStringSyntaxImpl())
+                .addToSchema()
             .buildSyntax("1.9.1.2.4")
-            .description("Security Label II")
-            .extraProperties("X-ENUM", "private")
-            .addToSchema()
+                .description("Security Label II")
+                .extraProperties("X-TEST", "private")
+                .addToSchema()
             .buildSyntax("non-implemented-syntax-oid")
-            .description("Not Implemented in OpenDJ")
-            .extraProperties("X-SUBST", "1.3.6.1.4.1.1466.115.121.1.15")
-            .implementation(null)
-            .addToSchema()
+                .description("Not Implemented in OpenDJ")
+                .extraProperties("X-SUBST", "1.3.6.1.4.1.1466.115.121.1.15")
+                .implementation(null)
+                .addToSchema()
             .buildSyntax("1.3.6.1.4.1.4203.1.1.2")
-            .description("Authentication Password Syntax")
-            .extraProperties("X-ORIGIN", "RFC 4512")
-            .implementation(new OctetStringSyntaxImpl())
-            .addToSchemaOverwrite()
+                .description("Authentication Password Syntax")
+                .extraProperties("X-ORIGIN", "RFC 4512")
+                .implementation(new OctetStringSyntaxImpl())
+                .addToSchemaOverwrite()
             .toSchema();
         // @formatter:on
 
@@ -706,12 +565,12 @@
         assertThat(s1.getEqualityMatchingRule().getNameOrOID()).isEqualTo("caseIgnoreMatch");
         assertThat(s1.getOrderingMatchingRule().getNameOrOID()).isEqualTo("caseIgnoreOrderingMatch");
         assertThat(s1.getSubstringMatchingRule().getNameOrOID()).isEqualTo("caseIgnoreSubstringsMatch");
-        assertThat(s1.getExtraProperties().get("X-ENUM").size()).isEqualTo(3);
+        assertThat(s1.getExtraProperties().get("X-TEST")).hasSize(3);
 
         // Second
         final Syntax s2 = schema.getSyntax("1.9.1.2.4");
         assertThat(s2.getDescription()).isEqualTo("Security Label II");
-        assertThat(s2.getExtraProperties().get("X-ENUM").size()).isEqualTo(1);
+        assertThat(s2.getExtraProperties().get("X-TEST")).hasSize(1);
         assertThat(s2.getApproximateMatchingRule()).isEqualTo(null);
         assertThat(s2.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
         assertThat(s2.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");

--
Gitblit v1.10.0