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

Violette Roche-Montane
13.46.2014 0a4fd773fbc9485ca6c9035a229f563589f9b30a
CR-2816 OPENDJ-1230 SDK Builder for syntaxes
1 files added
21 files modified
1349 ■■■■ changed files
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CoreSchemaImpl.java 179 ●●●● patch | view | raw | blame | history
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java 124 ●●●● patch | view | raw | blame | history
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Syntax.java 162 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/AbstractSyntaxTestCase.java 86 ●●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/AttributeTypeSyntaxTest.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/BitStringSyntaxTest.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/CountryStringSyntaxTest.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/DITContentRuleSyntaxTest.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/EnumSyntaxTestCase.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/GeneralizedTimeSyntaxTest.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/GuideSyntaxTest.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/IA5StringSyntaxTest.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/LDAPSyntaxTest.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleSyntaxTest.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleUseSyntaxTest.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/OtherMailboxSyntaxTest.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/RegexSyntaxTestCase.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SubstitutionSyntaxTestCase.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java 746 ●●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/TelexSyntaxTest.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/UTCTimeSyntaxTest.java 4 ●●●● patch | view | raw | blame | history
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/UUIDSyntaxTest.java 3 ●●●● patch | view | raw | blame | history
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CoreSchemaImpl.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2009-2010 Sun Microsystems, Inc.
 *      Portions copyright 2013 ForgeRock AS.
 *      Portions copyright 2013-2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -106,8 +106,8 @@
    }
    private static void addRFC3112(final SchemaBuilder builder) {
        builder.addSyntax(SYNTAX_AUTH_PASSWORD_OID, SYNTAX_AUTH_PASSWORD_DESCRIPTION,
                RFC3112_ORIGIN, new AuthPasswordSyntaxImpl(), false);
        builder.buildSyntax(SYNTAX_AUTH_PASSWORD_OID).description(SYNTAX_AUTH_PASSWORD_DESCRIPTION)
                .extraProperties(RFC3112_ORIGIN).implementation(new AuthPasswordSyntaxImpl()).addToSchema();
        builder.buildMatchingRule(EMR_AUTH_PASSWORD_EXACT_OID)
                .names(EMR_AUTH_PASSWORD_EXACT_NAME)
                .description(EMR_AUTH_PASSWORD_EXACT_DESCRIPTION).syntaxOID(SYNTAX_AUTH_PASSWORD_OID)
@@ -551,7 +551,8 @@
    }
    private static void addRFC4530(final SchemaBuilder builder) {
        builder.addSyntax(SYNTAX_UUID_OID, SYNTAX_UUID_DESCRIPTION, RFC4530_ORIGIN, new UUIDSyntaxImpl(), false);
        builder.buildSyntax(SYNTAX_UUID_OID).description(SYNTAX_UUID_DESCRIPTION).extraProperties(RFC4530_ORIGIN)
                .implementation(new UUIDSyntaxImpl()).addToSchema();
        builder.buildMatchingRule(EMR_UUID_OID).names(EMR_UUID_NAME).syntaxOID(SYNTAX_UUID_OID)
                .extraProperties(RFC4530_ORIGIN).implementation(new UUIDEqualityMatchingRuleImpl())
                .addToSchema();
@@ -572,8 +573,8 @@
    }
    private static void addSunProprietary(final SchemaBuilder builder) {
        builder.addSyntax(SYNTAX_USER_PASSWORD_OID, SYNTAX_USER_PASSWORD_DESCRIPTION,
                OPENDJ_ORIGIN, new UserPasswordSyntaxImpl(), false);
        builder.buildSyntax(SYNTAX_USER_PASSWORD_OID).description(SYNTAX_USER_PASSWORD_DESCRIPTION)
                .extraProperties(OPENDJ_ORIGIN).implementation(new UserPasswordSyntaxImpl()).addToSchema();
        builder.buildMatchingRule(EMR_USER_PASSWORD_EXACT_OID)
                .names(Collections.singletonList(EMR_USER_PASSWORD_EXACT_NAME))
                .description(EMR_USER_PASSWORD_EXACT_DESCRIPTION).syntaxOID(SYNTAX_USER_PASSWORD_OID)
@@ -845,91 +846,91 @@
    private static void defaultSyntaxes(final SchemaBuilder builder) {
        // All RFC 4512 / 4517
        builder.addSyntax(SYNTAX_ATTRIBUTE_TYPE_OID, SYNTAX_ATTRIBUTE_TYPE_DESCRIPTION,
                RFC4512_ORIGIN, new AttributeTypeSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_BINARY_OID, SYNTAX_BINARY_DESCRIPTION, RFC4512_ORIGIN,
                new BinarySyntaxImpl(), false);
        builder.addSyntax(SYNTAX_BIT_STRING_OID, SYNTAX_BIT_STRING_DESCRIPTION, RFC4512_ORIGIN,
                new BitStringSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_BOOLEAN_OID, SYNTAX_BOOLEAN_DESCRIPTION, RFC4512_ORIGIN,
                new BooleanSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_CERTLIST_OID, SYNTAX_CERTLIST_DESCRIPTION, RFC4512_ORIGIN,
                new CertificateListSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_CERTPAIR_OID, SYNTAX_CERTPAIR_DESCRIPTION, RFC4512_ORIGIN,
                new CertificatePairSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_CERTIFICATE_OID, SYNTAX_CERTIFICATE_DESCRIPTION, RFC4512_ORIGIN,
                new CertificateSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_COUNTRY_STRING_OID, SYNTAX_COUNTRY_STRING_DESCRIPTION,
                RFC4512_ORIGIN, new CountryStringSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_DELIVERY_METHOD_OID, SYNTAX_DELIVERY_METHOD_DESCRIPTION,
                RFC4512_ORIGIN, new DeliveryMethodSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_DIRECTORY_STRING_OID, SYNTAX_DIRECTORY_STRING_DESCRIPTION,
                RFC4512_ORIGIN, new DirectoryStringSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_DIT_CONTENT_RULE_OID, SYNTAX_DIT_CONTENT_RULE_DESCRIPTION,
                RFC4512_ORIGIN, new DITContentRuleSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_DIT_STRUCTURE_RULE_OID, SYNTAX_DIT_STRUCTURE_RULE_DESCRIPTION,
                RFC4512_ORIGIN, new DITStructureRuleSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_DN_OID, SYNTAX_DN_DESCRIPTION, RFC4512_ORIGIN,
                new DistinguishedNameSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_ENHANCED_GUIDE_OID, SYNTAX_ENHANCED_GUIDE_DESCRIPTION,
                RFC4512_ORIGIN, new EnhancedGuideSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_FAXNUMBER_OID, SYNTAX_FAXNUMBER_DESCRIPTION, RFC4512_ORIGIN,
                new FacsimileNumberSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_FAX_OID, SYNTAX_FAX_DESCRIPTION, RFC4512_ORIGIN,
                new FaxSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_GENERALIZED_TIME_OID, SYNTAX_GENERALIZED_TIME_DESCRIPTION,
                RFC4512_ORIGIN, new GeneralizedTimeSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_GUIDE_OID, SYNTAX_GUIDE_DESCRIPTION, RFC4512_ORIGIN,
                new GuideSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_IA5_STRING_OID, SYNTAX_IA5_STRING_DESCRIPTION, RFC4512_ORIGIN,
                new IA5StringSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_INTEGER_OID, SYNTAX_INTEGER_DESCRIPTION, RFC4512_ORIGIN,
                new IntegerSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_JPEG_OID, SYNTAX_JPEG_DESCRIPTION, RFC4512_ORIGIN,
                new JPEGSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_MATCHING_RULE_OID, SYNTAX_MATCHING_RULE_DESCRIPTION,
                RFC4512_ORIGIN, new MatchingRuleSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_MATCHING_RULE_USE_OID, SYNTAX_MATCHING_RULE_USE_DESCRIPTION,
                RFC4512_ORIGIN, new MatchingRuleUseSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_LDAP_SYNTAX_OID, SYNTAX_LDAP_SYNTAX_DESCRIPTION, RFC4512_ORIGIN,
                new LDAPSyntaxDescriptionSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_NAME_AND_OPTIONAL_UID_OID,
                SYNTAX_NAME_AND_OPTIONAL_UID_DESCRIPTION, RFC4517_ORIGIN,
                new NameAndOptionalUIDSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_NAME_FORM_OID, SYNTAX_NAME_FORM_DESCRIPTION, RFC4512_ORIGIN,
                new NameFormSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_NUMERIC_STRING_OID, SYNTAX_NUMERIC_STRING_DESCRIPTION,
                RFC4512_ORIGIN, new NumericStringSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_OBJECTCLASS_OID, SYNTAX_OBJECTCLASS_DESCRIPTION, RFC4512_ORIGIN,
                new ObjectClassSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_OCTET_STRING_OID, SYNTAX_OCTET_STRING_DESCRIPTION, RFC4512_ORIGIN,
                new OctetStringSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_OID_OID, SYNTAX_OID_DESCRIPTION, RFC4512_ORIGIN,
                new OIDSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_OTHER_MAILBOX_OID, SYNTAX_OTHER_MAILBOX_DESCRIPTION,
                RFC4512_ORIGIN, new OtherMailboxSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_POSTAL_ADDRESS_OID, SYNTAX_POSTAL_ADDRESS_DESCRIPTION,
                RFC4512_ORIGIN, new PostalAddressSyntaxImpl(), false);
        builder.buildSyntax(SYNTAX_ATTRIBUTE_TYPE_OID).description(SYNTAX_ATTRIBUTE_TYPE_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new AttributeTypeSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_BINARY_OID).description(SYNTAX_BINARY_DESCRIPTION).extraProperties(RFC4512_ORIGIN)
                .implementation(new BinarySyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_BIT_STRING_OID).description(SYNTAX_BIT_STRING_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new BitStringSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_BOOLEAN_OID).description(SYNTAX_BOOLEAN_DESCRIPTION).extraProperties(RFC4512_ORIGIN)
                .implementation(new BooleanSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_CERTLIST_OID).description(SYNTAX_CERTLIST_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new CertificateListSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_CERTPAIR_OID).description(SYNTAX_CERTPAIR_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new CertificatePairSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_CERTIFICATE_OID).description(SYNTAX_CERTIFICATE_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new CertificateSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_COUNTRY_STRING_OID).description(SYNTAX_COUNTRY_STRING_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new CountryStringSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_DELIVERY_METHOD_OID).description(SYNTAX_DELIVERY_METHOD_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new DeliveryMethodSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_DIRECTORY_STRING_OID).description(SYNTAX_DIRECTORY_STRING_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new DirectoryStringSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_DIT_CONTENT_RULE_OID).description(SYNTAX_DIT_CONTENT_RULE_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new DITContentRuleSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_DIT_STRUCTURE_RULE_OID).description(SYNTAX_DIT_STRUCTURE_RULE_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new DITStructureRuleSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_DN_OID).description(SYNTAX_DN_DESCRIPTION).extraProperties(RFC4512_ORIGIN)
                .implementation(new DistinguishedNameSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_ENHANCED_GUIDE_OID).description(SYNTAX_ENHANCED_GUIDE_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new EnhancedGuideSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_FAXNUMBER_OID).description(SYNTAX_FAXNUMBER_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new FacsimileNumberSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_FAX_OID).description(SYNTAX_FAX_DESCRIPTION).extraProperties(RFC4512_ORIGIN)
                .implementation(new FaxSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_GENERALIZED_TIME_OID).description(SYNTAX_GENERALIZED_TIME_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new GeneralizedTimeSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_GUIDE_OID).description(SYNTAX_GUIDE_DESCRIPTION).extraProperties(RFC4512_ORIGIN)
                .implementation(new GuideSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_IA5_STRING_OID).description(SYNTAX_IA5_STRING_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new IA5StringSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_INTEGER_OID).description(SYNTAX_INTEGER_DESCRIPTION).extraProperties(RFC4512_ORIGIN)
                .implementation(new IntegerSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_JPEG_OID).description(SYNTAX_JPEG_DESCRIPTION).extraProperties(RFC4512_ORIGIN)
                .implementation(new JPEGSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_MATCHING_RULE_OID).description(SYNTAX_MATCHING_RULE_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new MatchingRuleSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_MATCHING_RULE_USE_OID).description(SYNTAX_MATCHING_RULE_USE_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new MatchingRuleUseSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_LDAP_SYNTAX_OID).description(SYNTAX_LDAP_SYNTAX_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new LDAPSyntaxDescriptionSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_NAME_AND_OPTIONAL_UID_OID).description(SYNTAX_NAME_AND_OPTIONAL_UID_DESCRIPTION)
                .extraProperties(RFC4517_ORIGIN).implementation(new NameAndOptionalUIDSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_NAME_FORM_OID).description(SYNTAX_NAME_FORM_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new NameFormSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_NUMERIC_STRING_OID).description(SYNTAX_NUMERIC_STRING_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new NumericStringSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_OBJECTCLASS_OID).description(SYNTAX_OBJECTCLASS_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new ObjectClassSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_OCTET_STRING_OID).description(SYNTAX_OCTET_STRING_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new OctetStringSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_OID_OID).description(SYNTAX_OID_DESCRIPTION).extraProperties(RFC4512_ORIGIN)
                .implementation(new OIDSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_OTHER_MAILBOX_OID).description(SYNTAX_OTHER_MAILBOX_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new OtherMailboxSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_POSTAL_ADDRESS_OID).description(SYNTAX_POSTAL_ADDRESS_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new PostalAddressSyntaxImpl()).addToSchema();
        // Depreciated in RFC 4512
        builder.addSyntax(SYNTAX_PRESENTATION_ADDRESS_OID, SYNTAX_PRESENTATION_ADDRESS_DESCRIPTION,
                RFC2252_ORIGIN, new PresentationAddressSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_PRINTABLE_STRING_OID, SYNTAX_PRINTABLE_STRING_DESCRIPTION,
                RFC4512_ORIGIN, new PrintableStringSyntaxImpl(), false);
        builder.buildSyntax(SYNTAX_PRESENTATION_ADDRESS_OID).description(SYNTAX_PRESENTATION_ADDRESS_DESCRIPTION)
                .extraProperties(RFC2252_ORIGIN).implementation(new PresentationAddressSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_PRINTABLE_STRING_OID).description(SYNTAX_PRINTABLE_STRING_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new PrintableStringSyntaxImpl()).addToSchema();
        // Depreciated in RFC 4512
        builder.addSyntax(SYNTAX_PROTOCOL_INFORMATION_OID, SYNTAX_PROTOCOL_INFORMATION_DESCRIPTION,
                RFC2252_ORIGIN, new ProtocolInformationSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_SUBSTRING_ASSERTION_OID, SYNTAX_SUBSTRING_ASSERTION_DESCRIPTION,
                RFC4512_ORIGIN, new SubstringAssertionSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_SUPPORTED_ALGORITHM_OID, SYNTAX_SUPPORTED_ALGORITHM_DESCRIPTION,
                RFC4512_ORIGIN, new SupportedAlgorithmSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_TELEPHONE_OID, SYNTAX_TELEPHONE_DESCRIPTION, RFC4512_ORIGIN,
                new TelephoneNumberSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_TELETEX_TERM_ID_OID, SYNTAX_TELETEX_TERM_ID_DESCRIPTION,
                RFC4512_ORIGIN, new TeletexTerminalIdentifierSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_TELEX_OID, SYNTAX_TELEX_DESCRIPTION, RFC4512_ORIGIN,
                new TelexNumberSyntaxImpl(), false);
        builder.addSyntax(SYNTAX_UTC_TIME_OID, SYNTAX_UTC_TIME_DESCRIPTION, RFC4512_ORIGIN,
                new UTCTimeSyntaxImpl(), false);
        builder.buildSyntax(SYNTAX_PROTOCOL_INFORMATION_OID).description(SYNTAX_PROTOCOL_INFORMATION_DESCRIPTION)
                .extraProperties(RFC2252_ORIGIN).implementation(new ProtocolInformationSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_SUBSTRING_ASSERTION_OID).description(SYNTAX_SUBSTRING_ASSERTION_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new SubstringAssertionSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_SUPPORTED_ALGORITHM_OID).description(SYNTAX_SUPPORTED_ALGORITHM_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new SupportedAlgorithmSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_TELEPHONE_OID).description(SYNTAX_TELEPHONE_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new TelephoneNumberSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_TELETEX_TERM_ID_OID).description(SYNTAX_TELETEX_TERM_ID_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new TeletexTerminalIdentifierSyntaxImpl())
                .addToSchema();
        builder.buildSyntax(SYNTAX_TELEX_OID).description(SYNTAX_TELEX_DESCRIPTION).extraProperties(RFC4512_ORIGIN)
                .implementation(new TelexNumberSyntaxImpl()).addToSchema();
        builder.buildSyntax(SYNTAX_UTC_TIME_OID).description(SYNTAX_UTC_TIME_DESCRIPTION)
                .extraProperties(RFC4512_ORIGIN).implementation(new UTCTimeSyntaxImpl()).addToSchema();
    }
    private CoreSchemaImpl() {
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2009-2010 Sun Microsystems, Inc.
 *      Portions copyright 2011-2013 ForgeRock AS
 *      Portions copyright 2011-2014 ForgeRock AS
 */
package org.forgerock.opendj.ldap.schema;
@@ -897,11 +897,13 @@
        lazyInitBuilder();
        final EnumSyntaxImpl enumImpl = new EnumSyntaxImpl(oid, Arrays.asList(enumerations));
        final Syntax enumSyntax =
                new Syntax(oid, description, Collections.singletonMap("X-ENUM", Arrays
                        .asList(enumerations)), null, enumImpl);
        addSyntax(enumSyntax, overwrite);
        final Syntax.Builder syntaxBuilder = buildSyntax(oid).description(description)
                .extraProperties(Collections.singletonMap("X-ENUM", Arrays.asList(enumerations)))
                .implementation(enumImpl);
        syntaxBuilder.addToSchema(overwrite);
        try {
            buildMatchingRule(enumImpl.getOrderingMatchingRule())
                    .names(OMR_GENERIC_ENUM_NAME + oid)
@@ -1379,6 +1381,24 @@
    }
    /**
     * Returns a builder which can be used for incrementally constructing a new
     * syntax before adding it to the schema. Example usage:
     *
     * <pre>
     * SchemaBuilder builder = ...;
     * builder.buildSyntax("1.2.3.4").addToSchema();
     * </pre>
     *
     * @param oid
     *            The OID of the syntax definition.
     * @return A builder to continue building the syntax.
     */
    public Syntax.Builder buildSyntax(final String oid) {
        lazyInitBuilder();
        return new Syntax.Builder(oid, this);
    }
    /**
     * Sets the default syntax which will be used when parsing unrecognized
     * attributes.
     * <p>
@@ -1471,6 +1491,18 @@
    }
    /**
     * Duplicates the syntax.
     *
     * @param syntax
     *            The syntax to duplicate.
     * @return A syntax builder.
     */
    public Syntax.Builder buildSyntax(final Syntax syntax) {
        lazyInitBuilder();
        return new Syntax.Builder(syntax, this);
    }
    /**
     * Adds the provided object class definition to this schema builder.
     *
     * @param definition
@@ -1700,8 +1732,11 @@
        lazyInitBuilder();
        addSyntax(new Syntax(oid, description, Collections.singletonMap("X-PATTERN", Collections
                .singletonList(pattern.toString())), null, null), overwrite);
        final Syntax.Builder syntaxBuilder = buildSyntax(oid).description(description).extraProperties(
                Collections.singletonMap("X-PATTERN", Collections.singletonList(pattern.toString())));
        syntaxBuilder.addToSchema(overwrite);
        return this;
    }
@@ -2052,8 +2087,11 @@
        lazyInitBuilder();
        addSyntax(new Syntax(oid, description, Collections.singletonMap("X-SUBST", Collections
                .singletonList(substituteSyntax)), null, null), overwrite);
        final Syntax.Builder syntaxBuilder = buildSyntax(oid).description(description).extraProperties(
                Collections.singletonMap("X-SUBST", Collections.singletonList(substituteSyntax)));
        syntaxBuilder.addToSchema(overwrite);
        return this;
    }
@@ -2110,9 +2148,7 @@
            // The next set of characters must be the OID.
            final String oid = SchemaUtils.readOID(reader, allowMalformedNamesAndOptions);
            String description = "".intern();
            Map<String, List<String>> extraProperties = Collections.emptyMap();
            final Syntax.Builder syntaxBuilder = new Syntax.Builder(oid, this).definition(definition);
            // At this point, we should have a pretty specific syntax that
            // describes what may come next, but some of the components are
@@ -2131,17 +2167,15 @@
                } else if (tokenName.equalsIgnoreCase("desc")) {
                    // This specifies the description for the syntax. It is an
                    // arbitrary string of characters enclosed in single quotes.
                    description = SchemaUtils.readQuotedString(reader);
                    syntaxBuilder.description(SchemaUtils.readQuotedString(reader));
                } else if (tokenName.matches("^X-[A-Za-z_-]+$")) {
                    // This must be a non-standard property and it must be
                    // followed by either a single definition in single quotes
                    // or an open parenthesis followed by one or more values in
                    // single quotes separated by spaces followed by a close
                    // parenthesis.
                    if (extraProperties.isEmpty()) {
                        extraProperties = new HashMap<String, List<String>>();
                    }
                    extraProperties.put(tokenName, SchemaUtils.readExtensions(reader));
                    final List<String> extensions = SchemaUtils.readExtensions(reader);
                    syntaxBuilder.extraProperties(tokenName, extensions.toArray(new String[extensions.size()]));
                } else {
                    final LocalizableMessage message =
                            ERR_ATTR_SYNTAX_ATTRSYNTAX_ILLEGAL_TOKEN1.get(definition, tokenName);
@@ -2149,17 +2183,13 @@
                }
            }
            if (!extraProperties.isEmpty()) {
                extraProperties = Collections.unmodifiableMap(extraProperties);
            }
            // See if it is a enum syntax
            for (final Map.Entry<String, List<String>> property : extraProperties.entrySet()) {
            for (final Map.Entry<String, List<String>> property : syntaxBuilder.getExtraProperties().entrySet()) {
                if (property.getKey().equalsIgnoreCase("x-enum")) {
                    final EnumSyntaxImpl enumImpl = new EnumSyntaxImpl(oid, property.getValue());
                    final Syntax enumSyntax =
                            new Syntax(oid, description, extraProperties, definition, enumImpl);
                    addSyntax(enumSyntax, overwrite);
                    syntaxBuilder.implementation(enumImpl);
                    syntaxBuilder.addToSchema(overwrite);
                    buildMatchingRule(enumImpl.getOrderingMatchingRule())
                        .names(OMR_GENERIC_ENUM_NAME + oid)
@@ -2171,7 +2201,7 @@
                }
            }
            addSyntax(new Syntax(oid, description, extraProperties, definition, null), overwrite);
            syntaxBuilder.addToSchema(overwrite);
        } catch (final DecodeException e) {
            final LocalizableMessage msg =
                    ERR_ATTR_SYNTAX_ATTRSYNTAX_INVALID1.get(definition, e.getMessageObject());
@@ -2181,38 +2211,6 @@
    }
    /**
     * Adds the provided syntax definition to this schema builder.
     *
     * @param oid
     *            The OID of the syntax definition.
     * @param description
     *            The description of the syntax definition.
     * @param extraProperties
     *            A map containing additional properties associated with the
     *            syntax definition.
     * @param implementation
     *            The implementation of the syntax.
     * @param overwrite
     *            {@code true} if any existing syntax with the same OID should
     *            be overwritten.
     * @return A reference to this schema builder.
     * @throws ConflictingSchemaElementException
     *             If {@code overwrite} was {@code false} and a conflicting
     *             schema element was found.
     * @throws NullPointerException
     *             If {@code definition} was {@code null}.
     */
    SchemaBuilder addSyntax(final String oid, final String description,
            final Map<String, List<String>> extraProperties, final SyntaxImpl implementation,
            final boolean overwrite) {
        lazyInitBuilder();
        addSyntax(new Syntax(oid, description, unmodifiableCopyOfExtraProperties(extraProperties),
                null, implementation), overwrite);
        return this;
    }
    /**
     * Specifies whether or not the schema should allow certain illegal
     * characters in OIDs and attribute options. When this compatibility option
     * is set to {@code true} the following illegal characters will be permitted
@@ -2755,7 +2753,7 @@
        // unlikely, may be different in the new schema.
        for (final Syntax syntax : schema.getSyntaxes()) {
            addSyntax(syntax.duplicate(), overwrite);
            addSyntax(syntax, overwrite);
        }
        for (final MatchingRule matchingRule : schema.getMatchingRules()) {
@@ -2787,19 +2785,19 @@
        }
    }
    private void addSyntax(final Syntax syntax, final boolean overwrite) {
    SchemaBuilder addSyntax(final Syntax syntax, final boolean overwrite) {
        Syntax conflictingSyntax;
        if (numericOID2Syntaxes.containsKey(syntax.getOID())) {
            conflictingSyntax = numericOID2Syntaxes.get(syntax.getOID());
            if (!overwrite) {
                final LocalizableMessage message =
                        ERR_SCHEMA_CONFLICTING_SYNTAX_OID.get(syntax.toString(), syntax.getOID(),
                                conflictingSyntax.getOID());
                final LocalizableMessage message = ERR_SCHEMA_CONFLICTING_SYNTAX_OID.get(syntax.toString(),
                        syntax.getOID(), conflictingSyntax.getOID());
                throw new ConflictingSchemaElementException(message);
            }
            removeSyntax(conflictingSyntax);
        }
        numericOID2Syntaxes.put(syntax.getOID(), syntax);
        return this;
    }
    private void lazyInitBuilder() {
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Syntax.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2013 ForgeRock AS.
 *      Portions copyright 2013-2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -38,7 +38,6 @@
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.LocalizableMessageBuilder;
import org.forgerock.opendj.ldap.ByteSequence;
import org.forgerock.util.Reject;
/**
@@ -55,6 +54,117 @@
 * or via the {@link #toString()} methods.
 */
public final class Syntax extends SchemaElement {
    /**
     * A fluent API for incrementally constructing syntaxes.
     */
    public final static class Builder extends SchemaElementBuilder<Builder> {
        private String oid;
        private SyntaxImpl impl;
        Builder(final Syntax syntax, final SchemaBuilder builder) {
            super(builder, syntax);
            this.oid = syntax.oid;
            this.impl = syntax.impl;
        }
        Builder(final String oid, final SchemaBuilder builder) {
            super(builder);
            this.oid(oid);
        }
        /**
         * Adds this syntax to the schema overwriting any existing syntax with the same numeric OID.
         *
         * @return The parent schema builder.
         */
        public SchemaBuilder addToSchemaOverwrite() {
            return this.getSchemaBuilder().addSyntax(new Syntax(this), true);
        }
        /**
         * Adds this syntax to the schema, throwing an {@code  ConflictingSchemaElementException}
         * if there is an existing syntax with the same numeric OID.
         *
         * @return The parent schema builder.
         * @throws ConflictingSchemaElementException
         *             If there is an existing syntax with the same numeric OID.
         */
        public SchemaBuilder addToSchema() {
            return this.getSchemaBuilder().addSyntax(new Syntax(this), false);
        }
        /**
         * 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) {
            if (overwrite) {
                return this.addToSchemaOverwrite();
            }
            return this.addToSchema();
        }
        @Override
        public Builder description(final String description) {
            return description0(description);
        }
        @Override
        public Builder extraProperties(final Map<String, List<String>> extraProperties) {
            return extraProperties0(extraProperties);
        }
        @Override
        public Builder extraProperties(final String extensionName, final String... extensionValues) {
            return extraProperties0(extensionName, extensionValues);
        }
        /**
         * Sets the numeric OID which uniquely identifies this syntax.
         *
         * @param oid
         *            The numeric OID.
         * @return This builder.
         */
        public Builder oid(final String oid) {
            this.oid = oid;
            return this;
        }
        @Override
        public Builder removeAllExtraProperties() {
            return removeAllExtraProperties0();
        }
        @Override
        public Builder removeExtraProperty(final String extensionName, final String... extensionValues) {
            return removeExtraProperty0(extensionName, extensionValues);
        }
        /**
         * Sets the syntax implementation.
         *
         * @param implementation
         *            The syntax implementation.
         * @return This builder.
         */
        public Builder implementation(final SyntaxImpl implementation) {
            this.impl = implementation;
            return this;
        }
        @Override
        Builder getThis() {
            return this;
        }
    }
    private final String oid;
    private MatchingRule equalityMatchingRule;
    private MatchingRule orderingMatchingRule;
@@ -63,6 +173,18 @@
    private Schema schema;
    private SyntaxImpl impl;
    private Syntax(final Builder builder) {
        super(builder);
        // Checks for required attributes.
        if (builder.oid == null || builder.oid.isEmpty()) {
            throw new IllegalArgumentException("An OID must be specified.");
        }
        oid = builder.oid;
        impl = builder.impl;
    }
    /**
     * Creates a syntax representing an unrecognized syntax and whose
     * implementation is substituted by the schema's default syntax.
@@ -73,8 +195,7 @@
     *            The numeric OID of the unrecognized syntax.
     */
    Syntax(final Schema schema, final String oid) {
        super("", Collections.singletonMap("X-SUBST",
                Collections.singletonList(schema.getDefaultSyntax().getOID())),
        super("", Collections.singletonMap("X-SUBST", Collections.singletonList(schema.getDefaultSyntax().getOID())),
                null);
        Reject.ifNull(oid);
@@ -83,16 +204,6 @@
        this.impl = schema.getDefaultSyntax().impl;
    }
    Syntax(final String oid, final String description,
            final Map<String, List<String>> extraProperties, final String definition,
            final SyntaxImpl implementation) {
        super(description, extraProperties, definition);
        Reject.ifNull(oid);
        this.oid = oid;
        this.impl = implementation;
    }
    /**
     * Returns {@code true} if the provided object is an attribute syntax having
     * the same numeric OID as this attribute syntax.
@@ -225,10 +336,6 @@
        return impl.valueIsAcceptable(schema, value, invalidReason);
    }
    Syntax duplicate() {
        return new Syntax(oid, getDescription(), getExtraProperties(), toString(), impl);
    }
    @Override
    void toStringContent(final StringBuilder buffer) {
        buffer.append(oid);
@@ -252,14 +359,10 @@
                    if (values.hasNext()) {
                        final String value = values.next();
                        if (value.equals(oid)) {
                            final LocalizableMessage message =
                                    ERR_ATTR_SYNTAX_CYCLIC_SUB_SYNTAX.get(oid);
                            throw new SchemaException(message);
                            throw new SchemaException(ERR_ATTR_SYNTAX_CYCLIC_SUB_SYNTAX.get(oid));
                        }
                        if (!schema.hasSyntax(value)) {
                            final LocalizableMessage message =
                                    ERR_ATTR_SYNTAX_UNKNOWN_SUB_SYNTAX.get(oid, value);
                            throw new SchemaException(message);
                            throw new SchemaException(ERR_ATTR_SYNTAX_UNKNOWN_SUB_SYNTAX.get(oid, value));
                        }
                        final Syntax subSyntax = schema.getSyntax(value);
                        if (subSyntax.impl == null) {
@@ -276,10 +379,8 @@
                            final Pattern pattern = Pattern.compile(value);
                            impl = new RegexSyntaxImpl(pattern);
                        } catch (final Exception e) {
                            final LocalizableMessage message =
                                    WARN_ATTR_SYNTAX_LDAPSYNTAX_REGEX_INVALID_PATTERN.get(oid,
                                            value);
                            throw new SchemaException(message);
                            throw new SchemaException(
                                    WARN_ATTR_SYNTAX_LDAPSYNTAX_REGEX_INVALID_PATTERN.get(oid, value));
                        }
                    }
                }
@@ -300,9 +401,8 @@
                    defaultSyntax.validate(schema, warnings);
                }
                impl = defaultSyntax.impl;
                final LocalizableMessage message = WARN_ATTR_SYNTAX_NOT_IMPLEMENTED1
                        .get(getDescription(), oid, schema.getDefaultSyntax()
                                .getOID());
                final LocalizableMessage message = WARN_ATTR_SYNTAX_NOT_IMPLEMENTED1.get(getDescription(), oid, schema
                        .getDefaultSyntax().getOID());
                warnings.add(message);
            }
        }
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/AbstractSyntaxTestCase.java
New file
@@ -0,0 +1,86 @@
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at legal-notices/CDDLv1_0.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
import static org.testng.Assert.fail;
import org.forgerock.i18n.LocalizableMessageBuilder;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.DecodeException;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
 * Syntax tests.
 */
@SuppressWarnings("javadoc")
public abstract class AbstractSyntaxTestCase extends SchemaTestCase {
    /**
     * Create data for the testAcceptableValues test. This should be a table of
     * tables with 2 elements. The first one should be the value to test, the
     * second the expected result of the test.
     *
     * @return a table containing data for the testAcceptableValues Test.
     */
    @DataProvider(name = "acceptableValues")
    public abstract Object[][] createAcceptableValues();
    /**
     * Test the normalization and the approximate comparison.
     */
    @Test(dataProvider = "acceptableValues")
    public void testAcceptableValues(final String value, final Boolean result) throws Exception {
        // Make sure that the specified class can be instantiated as a task.
        final Syntax syntax = getRule();
        final LocalizableMessageBuilder reason = new LocalizableMessageBuilder();
        // test the valueIsAcceptable method
        final Boolean liveResult = syntax.valueIsAcceptable(ByteString.valueOf(value), reason);
        if (!liveResult.equals(result)) {
            fail(syntax + ".valueIsAcceptable gave bad result for " + value + "reason : " + reason);
        }
        // call the getters
        syntax.getApproximateMatchingRule();
        syntax.getDescription();
        syntax.getEqualityMatchingRule();
        syntax.getOID();
        syntax.getOrderingMatchingRule();
        syntax.getSubstringMatchingRule();
        syntax.hashCode();
        syntax.isHumanReadable();
        syntax.toString();
    }
    /**
     * Get an instance of the attribute syntax that muste be tested.
     *
     * @return An instance of the attribute syntax that muste be tested.
     */
    protected abstract Syntax getRule() throws SchemaException, DecodeException;
}
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/AttributeTypeSyntaxTest.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -32,7 +33,7 @@
/**
 * Attribute type syntax tests.
 */
public class AttributeTypeSyntaxTest extends SyntaxTestCase {
public class AttributeTypeSyntaxTest extends AbstractSyntaxTestCase {
    /**
     * {@inheritDoc}
     */
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/BitStringSyntaxTest.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -32,7 +33,7 @@
/**
 * Bit string syntax tests.
 */
public class BitStringSyntaxTest extends SyntaxTestCase {
public class BitStringSyntaxTest extends AbstractSyntaxTestCase {
    /**
     * {@inheritDoc}
     */
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/CountryStringSyntaxTest.java
@@ -23,6 +23,7 @@
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions Copyright 2012 Manuel Gaupp
 *      Portions copyright 2014 ForgeRock AS.
 *
 */
package org.forgerock.opendj.ldap.schema;
@@ -34,7 +35,7 @@
/**
 * Country String syntax tests.
 */
public class CountryStringSyntaxTest extends SyntaxTestCase {
public class CountryStringSyntaxTest extends AbstractSyntaxTestCase {
    @Override
    @DataProvider(name = "acceptableValues")
    public Object[][] createAcceptableValues() {
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/DITContentRuleSyntaxTest.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -32,7 +33,7 @@
/**
 * DIT content rule syntax tests.
 */
public class DITContentRuleSyntaxTest extends SyntaxTestCase {
public class DITContentRuleSyntaxTest extends AbstractSyntaxTestCase {
    @Override
    @DataProvider(name = "acceptableValues")
    public Object[][] createAcceptableValues() {
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/EnumSyntaxTestCase.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -38,7 +39,7 @@
 * Enum syntax tests.
 */
@SuppressWarnings("javadoc")
public class EnumSyntaxTestCase extends SyntaxTestCase {
public class EnumSyntaxTestCase extends AbstractSyntaxTestCase {
    /**
     * {@inheritDoc}
     */
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/GeneralizedTimeSyntaxTest.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -32,7 +33,7 @@
/**
 * Generalized time syntax tests.
 */
public class GeneralizedTimeSyntaxTest extends SyntaxTestCase {
public class GeneralizedTimeSyntaxTest extends AbstractSyntaxTestCase {
    @Override
    @DataProvider(name = "acceptableValues")
    public Object[][] createAcceptableValues() {
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/GuideSyntaxTest.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -32,7 +33,7 @@
/**
 * Guide syntax tests.
 */
public class GuideSyntaxTest extends SyntaxTestCase {
public class GuideSyntaxTest extends AbstractSyntaxTestCase {
    /**
     * {@inheritDoc}
     */
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/IA5StringSyntaxTest.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -32,7 +33,7 @@
/**
 * IA5 string syntax tests.
 */
public class IA5StringSyntaxTest extends SyntaxTestCase {
public class IA5StringSyntaxTest extends AbstractSyntaxTestCase {
    /**
     * {@inheritDoc}
     */
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/LDAPSyntaxTest.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -32,7 +33,7 @@
/**
 * LDAP syntax tests.
 */
public class LDAPSyntaxTest extends SyntaxTestCase {
public class LDAPSyntaxTest extends AbstractSyntaxTestCase {
    /**
     * {@inheritDoc}
     */
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleSyntaxTest.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -32,7 +33,7 @@
/**
 * Matching rule syntax tests.
 */
public class MatchingRuleSyntaxTest extends SyntaxTestCase {
public class MatchingRuleSyntaxTest extends AbstractSyntaxTestCase {
    /**
     * {@inheritDoc}
     */
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleUseSyntaxTest.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -32,7 +33,7 @@
/**
 * Matching rule use syntax tests.
 */
public class MatchingRuleUseSyntaxTest extends SyntaxTestCase {
public class MatchingRuleUseSyntaxTest extends AbstractSyntaxTestCase {
    /**
     * {@inheritDoc}
     */
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/OtherMailboxSyntaxTest.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -32,7 +33,7 @@
/**
 * Other mailbox syntax tests.
 */
public class OtherMailboxSyntaxTest extends SyntaxTestCase {
public class OtherMailboxSyntaxTest extends AbstractSyntaxTestCase {
    /**
     * {@inheritDoc}
     */
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/RegexSyntaxTestCase.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -35,7 +36,7 @@
 * Regex syntax tests.
 */
@SuppressWarnings("javadoc")
public class RegexSyntaxTestCase extends SyntaxTestCase {
public class RegexSyntaxTestCase extends AbstractSyntaxTestCase {
    /**
     * {@inheritDoc}
     */
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SubstitutionSyntaxTestCase.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -35,7 +36,7 @@
 * Substitution syntax tests.
 */
@SuppressWarnings("javadoc")
public class SubstitutionSyntaxTestCase extends SyntaxTestCase {
public class SubstitutionSyntaxTestCase extends AbstractSyntaxTestCase {
    /**
     * {@inheritDoc}
     */
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java
@@ -21,65 +21,719 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
import static org.testng.Assert.fail;
import static org.fest.assertions.Assertions.assertThat;
import org.forgerock.i18n.LocalizableMessageBuilder;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.DecodeException;
import org.testng.annotations.DataProvider;
import org.forgerock.opendj.ldap.schema.Syntax.Builder;
import org.testng.annotations.Test;
/**
 * Syntax tests.
 * This class tests the Syntax class.
 */
@SuppressWarnings("javadoc")
public abstract class SyntaxTestCase extends SchemaTestCase {
    /**
     * Create data for the testAcceptableValues test. This should be a table of
     * tables with 2 elements. The first one should be the value to test, the
     * second the expected result of the test.
     *
     * @return a table containing data for the testAcceptableValues Test.
     */
    @DataProvider(name = "acceptableValues")
    public abstract Object[][] createAcceptableValues();
public class SyntaxTestCase extends SchemaTestCase {
    /**
     * Test the normalization and the approximate comparison.
     */
    @Test(dataProvider = "acceptableValues")
    public void testAcceptableValues(final String value, final Boolean result) throws Exception {
        // Make sure that the specified class can be instantiated as a task.
        final Syntax syntax = getRule();
    @Test()
    public final void testCreatesANewSyntax() {
        final LocalizableMessageBuilder reason = new LocalizableMessageBuilder();
        // test the valueIsAcceptable method
        final Boolean liveResult = syntax.valueIsAcceptable(ByteString.valueOf(value), reason);
        if (!liveResult.equals(result)) {
            fail(syntax + ".valueIsAcceptable gave bad result for " + value + "reason : " + reason);
        }
        // call the getters
        syntax.getApproximateMatchingRule();
        syntax.getDescription();
        syntax.getEqualityMatchingRule();
        syntax.getOID();
        syntax.getOrderingMatchingRule();
        syntax.getSubstringMatchingRule();
        syntax.hashCode();
        syntax.isHumanReadable();
        syntax.toString();
        // @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()
            .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.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.isHumanReadable()).isTrue();
        assertThat(syntax.isBEREncodingRequired()).isFalse();
    }
    /**
     * Get an instance of the attribute syntax that muste be tested.
     *
     * @return An instance of the attribute syntax that muste be tested.
     * Creates an empty syntax.
     */
    protected abstract Syntax getRule() throws SchemaException, DecodeException;
    @Test()
    public final void testCreatesEmptySyntax() {
        final SchemaBuilder sb = new SchemaBuilder();
        sb.addSchema(Schema.getCoreSchema(), false);
        sb.addSyntax(new Syntax(Schema.getEmptySchema(), "1.2.3.4.5"), false);
        final Schema schema = sb.toSchema();
        assertThat(schema.getWarnings()).isEmpty();
        final Syntax syntax = schema.getSyntax("1.2.3.4.5");
        assertThat(syntax).isNotNull();
        assertThat(syntax.getDescription()).isEmpty();
        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.getSubstringMatchingRule()).isNull();
    }
    /**
     * The builder requires an OID or throw an exception.
     */
    @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
    }
    /**
     * The builder requires an OID or throw an exception.
     */
    @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
    }
    /**
     * When syntax is missing, the default one is set. Actual default is OctetString.(case match)
     */
    @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
        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' ) )");
    }
    /**
     * When syntax is missing, the default one is set. Actual default is OctetString.(case match)
     */
    @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
        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' ) )");
    }
    /**
     * When syntax is missing, the default one is set. Actual default is set to directory string
     * (1.3.6.1.4.1.1466.115.121.1.15) - matchingRules of caseIgnoreMatch and caseIgnoreSubstringsMatch.
     */
    @Test()
    public final void testBuilderAllowsNoSyntaxCaseWhereDefaultSyntaxIsChanged() {
        // @formatter:off
        final Schema schema = new SchemaBuilder(Schema.getCoreSchema())
            .defaultSyntax("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
        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' ) )");
    }
    /**
     * The builder allows a missing description.
     */
    @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
        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);
    }
    /**
     * The builder allows a missing description.
     */
    @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
        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);
    }
    /**
     * The builder allows a missing description.
     */
    @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
        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);
    }
    /**
     * Extra properties is not a mandatory field.
     */
    @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
        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);
    }
    /**
     * Extra properties set to null is not allowed.
     */
    @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
    }
    /**
     * Removes all the extra properties.
     */
    @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
        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);
    }
    /**
     * Removes specified extra properties.
     */
    @Test()
    public final void testBuilderRemoveSpecifiedExtraProperties() {
        // @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.
     */
    @Test()
    public final void testAddingBERSyntaxDefinition() {
        final SchemaBuilder sb = new SchemaBuilder();
        sb.addSchema(Schema.getCoreSchema(), false);
        final String definition = "( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'X.509 Certificate' )";
        sb.addSyntax(definition, true);
        final Schema schema = sb.toSchema();
        assertThat(schema.getWarnings()).isEmpty();
        final Syntax syntax = schema.getSyntax("1.3.6.1.4.1.1466.115.121.1.8");
        assertThat(syntax).isNotNull();
        assertThat(syntax.getDescription()).isEqualTo("X.509 Certificate");
        assertThat(syntax.getExtraProperties().isEmpty()).isTrue();
        assertThat(syntax.getApproximateMatchingRule()).isNull();
        assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
        assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
        assertThat(syntax.getSubstringMatchingRule()).isNull();
        assertThat(syntax.isBEREncodingRequired()).isTrue();
        assertThat(syntax.isHumanReadable()).isFalse();
    }
    /**
     * Sets a syntax using a string definition.
     */
    @Test()
    public final void testAddingASyntaxDefinitionStringOverride() {
        final SchemaBuilder sb = new SchemaBuilder();
        sb.addSchema(Schema.getCoreSchema(), false);
        final String definition = "( 1.3.6.1.4.1.4203.1.1.2 DESC 'Authentication Password Syntaxe'"
                + " X-ORIGIN 'RFC 4512' )";
        sb.addSyntax(definition, true);
        final Schema schema = sb.toSchema();
        assertThat(schema.getWarnings()).isEmpty();
        final Syntax syntax = schema.getSyntax("1.3.6.1.4.1.4203.1.1.2");
        assertThat(syntax).isNotNull();
        assertThat(syntax.getDescription()).isEqualTo("Authentication Password Syntaxe");
        assertThat(syntax.getExtraProperties().isEmpty()).isFalse();
        assertThat(syntax.getExtraProperties().get("X-ORIGIN").get(0)).isEqualTo("RFC 4512");
        assertThat(syntax.getApproximateMatchingRule()).isNull();
        assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("authPasswordExactMatch");
        assertThat(syntax.getOrderingMatchingRule()).isNull();
        assertThat(syntax.getSubstringMatchingRule()).isNull();
    }
    /**
     * Sets a syntax using a string definition.
     */
    @Test()
    public final void testAddingUnknownSyntaxDefinitionString() {
        final SchemaBuilder sb = new SchemaBuilder();
        sb.addSchema(Schema.getCoreSchema(), false);
        final String definition = "( 1.3.6.1.4.1.4203.1.1.9999 DESC 'Custom Authentication Password'"
                + " X-ORIGIN 'None' )";
        sb.addSyntax(definition, false);
        final Schema schema = sb.toSchema();
        assertThat(schema.getWarnings()).isNotEmpty();
        final Syntax syntax = schema.getSyntax("1.3.6.1.4.1.4203.1.1.9999");
        assertThat(syntax).isNotNull();
        assertThat(syntax.getDescription()).isEqualTo("Custom Authentication Password");
        assertThat(syntax.getExtraProperties().isEmpty()).isFalse();
        assertThat(syntax.getExtraProperties().get("X-ORIGIN").get(0)).isEqualTo("None");
        assertThat(syntax.getApproximateMatchingRule()).isNull();
        assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
        assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
        assertThat(syntax.getSubstringMatchingRule()).isNull();
    }
    /**
     * Duplicates a syntax.
     */
    @Test()
    public final void testBuilderDuplicatesExistingSyntax() {
        final SchemaBuilder sb = new SchemaBuilder();
        sb.addSchema(Schema.getCoreSchema(), false);
        // @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
        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);
        // @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' ) )");
    }
    /**
     * Another duplicated syntax example.
     */
    @Test()
    public final void testBuilderDuplicatesSyntax() {
        final SchemaBuilder sb = new SchemaBuilder();
        sb.addSchema(Schema.getCoreSchema(), false);
        // @formatter:off
        final Builder nfb = new Builder("1.2.3.4.5.9999", sb);
        nfb.description("Description of the new syntax")
            .extraProperties("X-ORIGIN", "SyntaxCheckingTestCase")
            .addToSchema();
        Schema schema = sb.toSchema();
        assertThat(schema.getSyntaxes()).isNotEmpty();
        final Syntax syntax = schema.getSyntax("1.2.3.4.5.9999");
        assertThat(syntax.getDescription()).isEqualTo("Description of the new syntax");
        sb.buildSyntax(syntax)
            .oid("1.2.3.4.5.99996")
            .extraProperties("X-ORIGIN", "Unknown")
            .addToSchema();
        schema = sb.toSchema();
        assertThat(schema.getSyntaxes()).isNotEmpty();
        // The duplicated syntax.
        final Syntax dolly = schema.getSyntax("1.2.3.4.5.99996");
        assertThat(dolly.getDescription()).isEqualTo("Description of the new syntax");
        assertThat(dolly.getExtraProperties().size()).isEqualTo(1);
        assertThat(dolly.getExtraProperties().get("X-ORIGIN").get(0)).isEqualTo("SyntaxCheckingTestCase");
        assertThat(dolly.getExtraProperties().get("X-ORIGIN").get(1)).isEqualTo("Unknown");
        assertThat(dolly.getExtraProperties().get("X-ORIGIN").size()).isEqualTo(2);
        // The original hasn't changed.
        final Syntax originalSyntax = schema.getSyntax("1.2.3.4.5.9999");
        assertThat(originalSyntax.getDescription()).isEqualTo("Description of the new syntax");
        assertThat(originalSyntax.getExtraProperties().get("X-ORIGIN").size()).isEqualTo(1);
    }
    /**
     * Equality between syntaxes.
     */
    @Test()
    public final void testBuilderSyntaxesEqualsTrue() {
        // @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()
                .toSchema();
        // @formatter:on
        final Syntax syntax1 = schema.getSyntax("1.9.1.2.3");
        // @formatter:off
        final Schema schema2 = new SchemaBuilder(Schema.getCoreSchema())
                .buildSyntax("1.9.1.2.3")
                    .description("Security Label")
                    .extraProperties("X-ENUM", "top-secret", "secret", "confidential")
                    .implementation(new DirectoryStringSyntaxImpl())
                    .addToSchema()
                .toSchema();
        // @formatter:on
        final Syntax syntax2 = schema2.getSyntax("1.9.1.2.3");
        assertThat(syntax1).isEqualTo(syntax2);
    }
    /**
     * Equality between syntaxes.
     */
    @Test()
    public final void testBuilderSyntaxesEqualsFalse() {
        // @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()
                .toSchema();
        // @formatter:on
        final Syntax syntax1 = schema.getSyntax("1.9.1.2.3");
        // @formatter:off
        final Schema schema2 = new SchemaBuilder(Schema.getCoreSchema())
                .buildSyntax("1.9.1.2.4")
                    .description("Security Label")
                    .extraProperties("X-ENUM", "top-secret", "secret", "confidential")
                    .implementation(new DirectoryStringSyntaxImpl())
                    .addToSchema()
                .toSchema();
        // @formatter:on
        final Syntax syntax2 = schema2.getSyntax("1.9.1.2.4");
        assertThat(syntax1).isNotEqualTo(syntax2);
    }
    /**
     * Equality between builder and definition.
     */
    @Test()
    public final void testBuilderEqualityReturnsTrueBetweenBuilderAndDefinition() {
        // @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()
            .toSchema();
        // @formatter:on
        assertThat(schema.getWarnings()).isEmpty();
        final Syntax syntax1 = schema.getSyntax("1.9.1.2.3");
        final SchemaBuilder sb2 = new SchemaBuilder();
        sb2.addSchema(Schema.getCoreSchema(), false);
        final String definition =
                "( 1.9.1.2.3 DESC 'Security Label' X-ENUM ( 'top-secret' 'secret' 'confidential' ) )";
        sb2.addSyntax(definition, false);
        final Syntax syntax2 = sb2.toSchema().getSyntax("1.9.1.2.3");
        assertThat(syntax1).isEqualTo(syntax2);
    }
    /**
     * Equality between builder and definition fails.
     */
    @Test()
    public final void testBuilderEqualityReturnsFalseBetweenBuilderAndDefinition() {
        // @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()
            .toSchema();
        // @formatter:on
        assertThat(schema.getWarnings()).isEmpty();
        final Syntax syntax1 = schema.getSyntax("1.9.1.2.3");
        final SchemaBuilder sb2 = new SchemaBuilder();
        sb2.addSchema(Schema.getCoreSchema(), false);
        final String definition =
                "( 1.9.1.2.4 DESC 'Security Label II' X-ENUM ( 'top-secret' 'secret' 'confidential' ) )";
        sb2.addSyntax(definition, false);
        final Syntax syntax2 = sb2.toSchema().getSyntax("1.9.1.2.4");
        assertThat(syntax1).isNotEqualTo(syntax2);
    }
    /**
     * The builder allows to create chained syntaxes.
     */
    @Test()
    public final void testBuilderCreatesSyntaxesUsingChainingMethods() {
        // @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()
            .buildSyntax("1.9.1.2.4")
            .description("Security Label II")
            .extraProperties("X-ENUM", "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()
            .buildSyntax("1.3.6.1.4.1.4203.1.1.2")
            .description("Authentication Password Syntax")
            .extraProperties("X-ORIGIN", "RFC 4512")
            .implementation(new OctetStringSyntaxImpl())
            .addToSchemaOverwrite()
            .toSchema();
        // @formatter:on
        // Warning should be found as the syntax implementation for s2 is not specified.
        assertThat(schema.getWarnings()).isNotEmpty();
        assertThat(schema.getDefaultSyntax().getOID()).isEqualTo("1.3.6.1.4.1.1466.115.121.1.40"); // OctetString OID.
        // First
        final Syntax s1 = schema.getSyntax("1.9.1.2.3");
        assertThat(s1.getDescription()).isEqualTo("Security Label");
        assertThat(s1.getApproximateMatchingRule().getNameOrOID()).isEqualTo("ds-mr-double-metaphone-approx");
        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);
        // 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.getApproximateMatchingRule()).isEqualTo(null);
        assertThat(s2.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
        assertThat(s2.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
        assertThat(s2.getSubstringMatchingRule()).isEqualTo(null);
        // Third
        final Syntax s3 = schema.getSyntax("non-implemented-syntax-oid");
        assertThat(s3.getDescription()).isEqualTo("Not Implemented in OpenDJ");
        assertThat(s3.getExtraProperties().get("X-SUBST").size()).isEqualTo(1);
        // The default syntax is substitute as directory string.
        assertThat(s1.getApproximateMatchingRule().getNameOrOID()).isEqualTo("ds-mr-double-metaphone-approx");
        assertThat(s1.getEqualityMatchingRule().getNameOrOID()).isEqualTo("caseIgnoreMatch");
        assertThat(s1.getOrderingMatchingRule().getNameOrOID()).isEqualTo("caseIgnoreOrderingMatch");
        assertThat(s1.getSubstringMatchingRule().getNameOrOID()).isEqualTo("caseIgnoreSubstringsMatch");
        // Last
        final Syntax s4 = schema.getSyntax("1.3.6.1.4.1.4203.1.1.2");
        assertThat(s4.getDescription()).isEqualTo("Authentication Password Syntax");
        assertThat(s4.getApproximateMatchingRule()).isEqualTo(null);
        assertThat(s4.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
        assertThat(s4.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
        assertThat(s4.getSubstringMatchingRule()).isEqualTo(null);
        assertThat(s4.getExtraProperties().get("X-ORIGIN").size()).isEqualTo(1);
    }
}
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/TelexSyntaxTest.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -32,7 +33,7 @@
/**
 * Telex syntax tests.
 */
public class TelexSyntaxTest extends SyntaxTestCase {
public class TelexSyntaxTest extends AbstractSyntaxTestCase {
    /**
     * {@inheritDoc}
     */
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/UTCTimeSyntaxTest.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2012 ForgeRock AS
 *      Portions copyright 2012-2014 ForgeRock AS
 *
 */
package org.forgerock.opendj.ldap.schema;
@@ -41,7 +41,7 @@
/**
 * UTC time syntax tests.
 */
public class UTCTimeSyntaxTest extends SyntaxTestCase {
public class UTCTimeSyntaxTest extends AbstractSyntaxTestCase {
    @Override
    @DataProvider(name = "acceptableValues")
    public Object[][] createAcceptableValues() {
opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/UUIDSyntaxTest.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.schema;
@@ -32,7 +33,7 @@
/**
 * UUID syntax tests.
 */
public class UUIDSyntaxTest extends SyntaxTestCase {
public class UUIDSyntaxTest extends AbstractSyntaxTestCase {
    /**
     * {@inheritDoc}
     */