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

Nicolas Capponi
02.33.2014 e114a899bbc0df59f5135f195d24797bf6c1b778
Checkpoint commit for OPENDJ-1235 : Migrate configuration framework

Refactor ClassPropertyDefinition and AttributeTypePropertyDefinition classes to
replace static setup methods by dynamic setup through new argument in methods

* Introduce new class PropertyDefinitionsOptions to hold options
** Provide an immutable version with no validation as constant of the class as it is
needed in tests and some classes.

* Pass PropertyDefinitionsOptions as argument to PropertyDefinition#decodeValue
and PropertyDefinition#validateValue methods

* Update all classes using PropertyDefinition#decodeValue and
PropertyDefinition#validateValue methods
** For server classes, inject PropertyDefinitionsOptions to ServerManagementContext
and propagate to classes needing options
** For client classes, inject PropertyDefinitionsOptions to LDAPManagementContext
and LDAPDriver classes and propagate to classes needing options
** Exception for three classes - use an immutable PropertyDefinitionsOptions object
with no validation, as primary purpose is not validation of value :
*** Class DefaultManagedObject : call decodeValue to copy value
*** Class Reference : call decodeValue to normalize value
*** Class ContainsCondition : call decode value to compare value

* Update all test classes to use dynamic setup through PropertyDefinitionsOptions
when needed instead of static call in setup method
54 files modified
1 files added
1249 ■■■■■ changed files
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/ACIPropertyDefinition.java 4 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/AggregationPropertyDefinition.java 6 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/AttributeTypePropertyDefinition.java 37 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/BooleanPropertyDefinition.java 4 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/ClassPropertyDefinition.java 61 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/DNPropertyDefinition.java 7 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/DefaultManagedObject.java 3 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/DurationPropertyDefinition.java 6 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/EnumPropertyDefinition.java 4 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/IPAddressMaskPropertyDefinition.java 4 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/IPAddressPropertyDefinition.java 4 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/IntegerPropertyDefinition.java 6 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/PropertyDefinition.java 12 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/PropertyDefinitionsOptions.java 137 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/Reference.java 3 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/SizePropertyDefinition.java 6 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/StringPropertyDefinition.java 6 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/IllegalManagedObjectNameException.java 16 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/ldap/LDAPDriver.java 39 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/ldap/LDAPManagedObject.java 3 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/ldap/LDAPManagementContext.java 42 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/spi/AbstractManagedObject.java 19 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/spi/Driver.java 16 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/spi/PropertySet.java 8 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/condition/ContainsCondition.java 3 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/doc/ConfigGuideGeneration.java 4 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagementContext.java 40 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/forgerock/opendj/config/ConfigTestCase.java 10 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/forgerock/opendj/config/ConfigurationMock.java 9 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/forgerock/opendj/config/ConfigurationMockTest.java 14 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/AbstractManagedObjectDefinitionTest.java 1 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/AdminTestCase.java 4 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/AggregationPropertyDefinitionTest.java 1 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/AttributeTypePropertyDefinitionTest.java 25 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/BooleanPropertyDefinitionTest.java 9 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/ClassPropertyDefinitionTest.java 6 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/DNPropertyDefinitionTest.java 14 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/DurationPropertyDefinitionTest.java 21 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/EnumPropertyDefinitionTest.java 7 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/IntegerPropertyDefinitionTest.java 16 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/LDAPProfileTest.java 6 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/ManagedObjectDefinitionI18NResourceTest.java 1 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/ManagedObjectPathTest.java 6 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/RelativeInheritedDefaultBehaviorProviderTest.java 1 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/SizePropertyDefinitionTest.java 16 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/StringPropertyDefinitionTest.java 17 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/TestTopCfgDefnTest.java 6 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/ValidateConfigDefinitionsTest.java 1 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/client/ldap/AggregationClientTest.java 21 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/client/ldap/LDAPClientTest.java 178 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/server/AggregationServerTest.java 127 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/server/ConstraintTest.java 89 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/server/DNBuilderTest.java 1 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/server/DefaultBehaviorTest.java 67 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/server/ListenerTest.java 75 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/ACIPropertyDefinition.java
@@ -86,7 +86,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(Aci value) {
    public void validateValue(Aci value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        // No additional validation required.
@@ -96,7 +96,7 @@
     * {@inheritDoc}
     */
    @Override
    public Aci decodeValue(String value) {
    public Aci decodeValue(String value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        try {
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/AggregationPropertyDefinition.java
@@ -811,11 +811,11 @@
     * {@inheritDoc}
     */
    @Override
    public String decodeValue(String value) {
    public String decodeValue(String value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        try {
            validateValue(value);
            validateValue(value, options);
            return value;
        } catch (IllegalPropertyValueException e) {
            throw new IllegalPropertyValueStringException(this, value);
@@ -979,7 +979,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(String value) {
    public void validateValue(String value, PropertyDefinitionsOptions options) {
        try {
            Reference.parseName(parentPath, relationDefinition, value);
        } catch (IllegalArgumentException e) {
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/AttributeTypePropertyDefinition.java
@@ -60,10 +60,6 @@
        }
    }
    // Flag indicating whether or not attribute type names should be
    // validated against the schema.
    private static boolean isCheckSchema = true;
    /**
     * Create a attribute type property definition builder.
     *
@@ -78,31 +74,6 @@
        return new Builder(d, propertyName);
    }
    /**
     * Determines whether or not attribute type names should be validated
     * against the schema.
     *
     * @return Returns <code>true</code> if attribute type names should be
     *         validated against the schema.
     */
    public static boolean isCheckSchema() {
        return isCheckSchema;
    }
    /**
     * Specify whether or not attribute type names should be validated against
     * the schema.
     * <p>
     * By default validation is switched on.
     *
     * @param value
     *            <code>true</code> if attribute type names should be validated
     *            against the schema.
     */
    public static void setCheckSchema(boolean value) {
        isCheckSchema = value;
    }
    // Private constructor.
    private AttributeTypePropertyDefinition(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
        EnumSet<PropertyOption> options, AdministratorAction adminAction,
@@ -138,17 +109,17 @@
     * {@inheritDoc}
     */
    @Override
    public AttributeType decodeValue(String value) {
    public AttributeType decodeValue(String value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        String name = value.trim().toLowerCase();
        AttributeType type = DirectoryServer.getAttributeType(name, !isCheckSchema);
        AttributeType type = DirectoryServer.getAttributeType(name, !options.checkSchemaForAttributes());
        if (type == null) {
            throw new IllegalPropertyValueStringException(this, value);
        } else {
            try {
                validateValue(type);
                validateValue(type, options);
                return type;
            } catch (IllegalPropertyValueException e) {
                throw new IllegalPropertyValueStringException(this, value);
@@ -168,7 +139,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(AttributeType value) {
    public void validateValue(AttributeType value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        // No implementation required.
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/BooleanPropertyDefinition.java
@@ -97,7 +97,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(Boolean value) {
    public void validateValue(Boolean value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        // No additional validation required.
@@ -107,7 +107,7 @@
     * {@inheritDoc}
     */
    @Override
    public Boolean decodeValue(String value) {
    public Boolean decodeValue(String value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        String nvalue = value.trim().toLowerCase();
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/ClassPropertyDefinition.java
@@ -44,8 +44,8 @@
 * Note that in a client/server environment, the client is probably not capable
 * of validating the Java class (e.g. it will not be able to load it nor have
 * access to the interfaces it is supposed to implement). For this reason, it is
 * possible to switch off validation in the client by calling the static method
 * {@link #setAllowClassValidation(boolean)}.
 * possible to switch off validation in the client by using the appropriate
 * {@link PropertyDefinitionsOptions}.
 */
public final class ClassPropertyDefinition extends PropertyDefinition<String> {
@@ -82,23 +82,6 @@
                throw new IllegalArgumentException("\"" + value + "\" is not a valid Java class name");
            }
            /*
             * If possible try and load the class in order to perform additional
             * validation.
             */
            if (isAllowClassValidation()) {
                /*
                 * Check that the class can be loaded so that validation can be
                 * performed.
                 */
                try {
                    loadClass(value, true);
                } catch (ClassNotFoundException e) {
                    // TODO: can we do something better here?
                    throw new RuntimeException(e);
                }
            }
            instanceOfInterfaces.add(value);
        }
@@ -118,11 +101,6 @@
    // Regular expression for validating class names.
    private static final String CLASS_RE = "^([A-Za-z][A-Za-z0-9_]*\\.)*[A-Za-z][A-Za-z0-9_]*(\\$[A-Za-z0-9_]+)*$";
    /*
     * Flag indicating whether class property values should be validated.
     */
    private static boolean allowClassValidation = true;
    /**
     * Create a class property definition builder.
     *
@@ -137,33 +115,6 @@
        return new Builder(d, propertyName);
    }
    /**
     * Determine whether or not class property definitions should validate class
     * name property values. Validation involves checking that the class exists
     * and that it implements the required interfaces.
     *
     * @return Returns <code>true</code> if class property definitions should
     *         validate class name property values.
     */
    public static boolean isAllowClassValidation() {
        return allowClassValidation;
    }
    /**
     * Specify whether or not class property definitions should validate class
     * name property values. Validation involves checking that the class exists
     * and that it implements the required interfaces.
     * <p>
     * By default validation is switched on.
     *
     * @param value
     *            <code>true</code> if class property definitions should
     *            validate class name property values.
     */
    public static void setAllowClassValidation(boolean value) {
        allowClassValidation = value;
    }
    // Load a named class.
    private static Class<?> loadClass(String className, boolean initialize) throws ClassNotFoundException {
        return Class.forName(className, initialize, ClassLoaderProvider.getInstance().getClassLoader());
@@ -201,11 +152,11 @@
     * {@inheritDoc}
     */
    @Override
    public String decodeValue(String value) {
    public String decodeValue(String value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        try {
            validateValue(value);
            validateValue(value, options);
        } catch (IllegalPropertyValueException e) {
            throw new IllegalPropertyValueStringException(this, value, e.getCause());
        }
@@ -268,7 +219,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(String value) {
    public void validateValue(String value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        // Always make sure the name is a valid class name.
@@ -278,7 +229,7 @@
         * If additional validation is enabled then attempt to load the class
         * and check the interfaces that it implements/extends.
         */
        if (allowClassValidation) {
        if (options.allowClassValidation()) {
            validateClassInterfaces(value, false);
        }
    }
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/DNPropertyDefinition.java
@@ -134,7 +134,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(DN value) {
    public void validateValue(DN value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        if (baseDN != null) {
@@ -154,13 +154,12 @@
     * {@inheritDoc}
     */
    @Override
    public DN decodeValue(String value) {
    public DN decodeValue(String value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        try {
            // TODO: is it correct to replace server DN.decode by SDK valueOf ?
            DN dn = DN.valueOf(value);
            validateValue(dn);
            validateValue(dn, options);
            return dn;
        } catch (IllegalPropertyValueException e) {
            throw new IllegalPropertyValueStringException(this, value);
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/DefaultManagedObject.java
@@ -146,7 +146,8 @@
        List<String> stringValues = propertyStringValues.get(pd.getName());
        if (stringValues != null) {
            for (String stringValue : stringValues) {
                values.add(pd.decodeValue(stringValue));
                // TODO : is it correct to have no validation ?
                values.add(pd.decodeValue(stringValue, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS));
            }
        }
        return values;
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/DurationPropertyDefinition.java
@@ -392,7 +392,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(Long value) {
    public void validateValue(Long value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        long nvalue = baseUnit.toMilliSeconds(value);
@@ -436,7 +436,7 @@
     * {@inheritDoc}
     */
    @Override
    public Long decodeValue(String value) {
    public Long decodeValue(String value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        // First check for the special "unlimited" value when necessary.
@@ -463,7 +463,7 @@
        // Convert the value a long in the property's required unit.
        Long i = (long) baseUnit.fromMilliSeconds(ms);
        try {
            validateValue(i);
            validateValue(i, options);
        } catch (IllegalPropertyValueException e) {
            throw new IllegalPropertyValueStringException(this, value);
        }
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/EnumPropertyDefinition.java
@@ -150,7 +150,7 @@
     * {@inheritDoc}
     */
    @Override
    public E decodeValue(String value) {
    public E decodeValue(String value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        String nvalue = value.trim().toLowerCase();
@@ -219,7 +219,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(E value) {
    public void validateValue(E value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        // No additional validation required.
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/IPAddressMaskPropertyDefinition.java
@@ -86,7 +86,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(AddressMask value) {
    public void validateValue(AddressMask value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        // No additional validation required.
@@ -96,7 +96,7 @@
     * {@inheritDoc}
     */
    @Override
    public AddressMask decodeValue(String value) {
    public AddressMask decodeValue(String value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        try {
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/IPAddressPropertyDefinition.java
@@ -85,7 +85,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(InetAddress value) {
    public void validateValue(InetAddress value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        // No additional validation required.
@@ -95,7 +95,7 @@
     * {@inheritDoc}
     */
    @Override
    public InetAddress decodeValue(String value) {
    public InetAddress decodeValue(String value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        try {
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/IntegerPropertyDefinition.java
@@ -229,7 +229,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(Integer value) {
    public void validateValue(Integer value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        if (!allowUnlimited && value < lowerLimit) {
@@ -266,7 +266,7 @@
     * {@inheritDoc}
     */
    @Override
    public Integer decodeValue(String value) {
    public Integer decodeValue(String value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        if (allowUnlimited) {
@@ -283,7 +283,7 @@
        }
        try {
            validateValue(i);
            validateValue(i, options);
        } catch (IllegalPropertyValueException e) {
            throw new IllegalPropertyValueStringException(this, value);
        }
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/PropertyDefinition.java
@@ -244,7 +244,7 @@
     * <p>
     * This method only casts the object to the required type; it does not
     * validate the value once it has been cast. Subsequent validation should be
     * performed using the method {@link #validateValue(Object)}.
     * performed using the method {@link #validateValue(Object, PropertyDefinitionsOptions)}.
     * <p>
     * This method guarantees the following expression is always
     * <code>true</code>:
@@ -318,11 +318,13 @@
     *
     * @param value
     *            The property string value (must not be <code>null</code>).
     * @param options
     *            Options to use when decoding value.
     * @return Returns the decoded property value.
     * @throws IllegalPropertyValueStringException
     *             If the property value string is invalid.
     */
    public abstract T decodeValue(String value);
    public abstract T decodeValue(String value, PropertyDefinitionsOptions options);
    /**
     * Encode the provided property value into its string representation.
@@ -508,7 +510,7 @@
     * This method may throw an exception if the provided value is invalid.
     * However, applications should not assume that implementations of this
     * method will always validate a value. This task is the responsibility of
     * {@link #validateValue(Object)}.
     * {@link #validateValue(Object, PropertyDefinitionsOptions)}.
     * <p>
     * This default implementation simply returns the string representation of
     * the provided value. Sub-classes might want to override this method if
@@ -562,10 +564,12 @@
     *
     * @param value
     *            The property value (must not be <code>null</code>).
     * @param options
     *            Options to use when decoding value.
     * @throws IllegalPropertyValueException
     *             If the property value is invalid.
     */
    public abstract void validateValue(T value);
    public abstract void validateValue(T value, PropertyDefinitionsOptions options);
    /**
     * Performs any run-time initialization required by this property
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/PropertyDefinitionsOptions.java
New file
@@ -0,0 +1,137 @@
/*
 * 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 2013 ForgeRock AS.
 */
package org.opends.server.admin;
/**
 * Provides options for {@code PropertyDefinition property definitions}.
 * <p>
 * These options are used by some {@code PropertyDefinition} methods to define
 * strategy used when processing value(s) of a property definition.
 */
public final class PropertyDefinitionsOptions {
    /** Immutable options with no validation of java classes or LDAP attributes. */
    public static final PropertyDefinitionsOptions NO_VALIDATION_OPTIONS = new PropertyDefinitionsOptions().
        setAllowClassValidation(false).
        setCheckSchemaForAttributes(false).
        freeze();
    /** By default, class validation is enabled. */
    private boolean allowClassValidation = true;
    /** By default, attributes validation against the schema is enabled. */
    private boolean checkSchemaForAttributes = true;
    /**
     * If true, then the instance is frozen so state can't be changed (object is
     * immutable).
     */
    private boolean isFrozen = false;
    /**
     * Creates a new set of properties options with default settings. By
     * default, class validation and attributes checking are enabled.
     */
    public PropertyDefinitionsOptions() {
        // empty implementation
    }
    /**
     * Determine whether or not class property definitions should validate class
     * name property values. Validation involves checking that the class exists
     * and that it implements the required interfaces.
     *
     * @return Returns <code>true</code> if class property definitions should
     *         validate class name property values.
     */
    public boolean allowClassValidation() {
        return allowClassValidation;
    }
    /**
     * Specify whether or not class property definitions should validate class
     * name property values. Validation involves checking that the class exists
     * and that it implements the required interfaces.
     * <p>
     * By default validation is switched on.
     *
     * @param value
     *            <code>true</code> if class property definitions should
     *            validate class name property values.
     * @return A reference to this definitions options.
     */
    public PropertyDefinitionsOptions setAllowClassValidation(boolean value) {
        if (isFrozen) {
            throw new IllegalStateException("This object is frozen, it can't be changed");
        }
        allowClassValidation = value;
        return this;
    }
    /**
     * Determines whether or not attribute type names should be validated
     * against the schema.
     *
     * @return Returns <code>true</code> if attribute type names should be
     *         validated against the schema.
     */
    public boolean checkSchemaForAttributes() {
        return checkSchemaForAttributes;
    }
    /**
     * Specify whether or not attribute type names should be validated against
     * the schema.
     * <p>
     * By default validation is switched on.
     *
     * @param value
     *            <code>true</code> if attribute type names should be validated
     *            against the schema.
     * @return A reference to this definitions options.
     */
    public PropertyDefinitionsOptions setCheckSchemaForAttributes(boolean value) {
        if (isFrozen) {
            throw new IllegalStateException("This object is frozen, it can't be changed");
        }
        checkSchemaForAttributes = value;
        return this;
    }
    /**
     * Freeze this object, making it effectively immutable.
     * <p>
     * Once this method is called, all {@code set} methods will throw
     * an IllegalStateException if called.
     *
     * @return A reference to this definitions options.
     */
    public PropertyDefinitionsOptions freeze() {
        isFrozen = true;
        return this;
    }
}
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/Reference.java
@@ -189,7 +189,8 @@
    private <T> String normalizeName(PropertyDefinition<T> pd) {
        if (pd != null) {
            try {
                T tvalue = pd.decodeValue(name);
                // TODO : is it correct to have no validation ?
                T tvalue = pd.decodeValue(name, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
                return pd.normalizeValue(tvalue);
            } catch (IllegalPropertyValueStringException e) {
                // Fall through to default normalization.
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/SizePropertyDefinition.java
@@ -230,7 +230,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(Long value) {
    public void validateValue(Long value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        if (!allowUnlimited && value < lowerLimit) {
@@ -276,7 +276,7 @@
     * {@inheritDoc}
     */
    @Override
    public Long decodeValue(String value) {
    public Long decodeValue(String value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        // First check for the special "unlimited" value when necessary.
@@ -295,7 +295,7 @@
        }
        try {
            validateValue(i);
            validateValue(i, options);
        } catch (IllegalPropertyValueException e) {
            throw new IllegalPropertyValueStringException(this, value);
        }
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/StringPropertyDefinition.java
@@ -170,11 +170,11 @@
     * {@inheritDoc}
     */
    @Override
    public String decodeValue(String value) {
    public String decodeValue(String value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        try {
            validateValue(value);
            validateValue(value, options);
        } catch (IllegalPropertyValueException e) {
            throw new IllegalPropertyValueStringException(this, value);
        }
@@ -269,7 +269,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(String value) {
    public void validateValue(String value, PropertyDefinitionsOptions options) {
        Reject.ifNull(value);
        if (pattern != null) {
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/IllegalManagedObjectNameException.java
@@ -32,6 +32,7 @@
import org.opends.server.admin.OperationsException;
import org.opends.server.admin.PropertyDefinition;
import org.opends.server.admin.PropertyDefinitionUsageBuilder;
import org.opends.server.admin.PropertyDefinitionsOptions;
/**
 * Thrown when an attempt is made to create a new managed object with an illegal
@@ -50,15 +51,15 @@
    private static final long serialVersionUID = 7491748228684293291L;
    /** Create the message. */
    // @Checkstyle:ignore
    private static LocalizableMessage createMessage(String illegalName, PropertyDefinition<?> namingPropertyDefinition) {
    private static LocalizableMessage createMessage(String illegalName, PropertyDefinition<?> namingPropertyDefinition,
        PropertyDefinitionsOptions options) {
        if (illegalName.length() == 0) {
            return ERR_ILLEGAL_MANAGED_OBJECT_NAME_EXCEPTION_EMPTY.get();
        } else if (illegalName.trim().length() == 0) {
            return ERR_ILLEGAL_MANAGED_OBJECT_NAME_EXCEPTION_BLANK.get();
        } else if (namingPropertyDefinition != null) {
            try {
                namingPropertyDefinition.decodeValue(illegalName);
                namingPropertyDefinition.decodeValue(illegalName, options);
            } catch (IllegalPropertyValueStringException e) {
                PropertyDefinitionUsageBuilder builder = new PropertyDefinitionUsageBuilder(true);
                return ERR_ILLEGAL_MANAGED_OBJECT_NAME_EXCEPTION_SYNTAX.get(illegalName,
@@ -82,7 +83,7 @@
     *            The illegal managed object name.
     */
    public IllegalManagedObjectNameException(String illegalName) {
        this(illegalName, null);
        this(illegalName, null, null);
    }
    /**
@@ -92,9 +93,12 @@
     *            The illegal managed object name.
     * @param namingPropertyDefinition
     *            The naming property definition.
     * @param options
     *            Options to decode property definition values.
     */
    public IllegalManagedObjectNameException(String illegalName, PropertyDefinition<?> namingPropertyDefinition) {
        super(createMessage(illegalName, namingPropertyDefinition));
    public IllegalManagedObjectNameException(String illegalName, PropertyDefinition<?> namingPropertyDefinition,
        PropertyDefinitionsOptions options) {
        super(createMessage(illegalName, namingPropertyDefinition, options));
        this.illegalName = illegalName;
        this.namingPropertyDefinition = namingPropertyDefinition;
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/ldap/LDAPDriver.java
@@ -60,6 +60,7 @@
import org.opends.server.admin.ManagedObjectPath;
import org.opends.server.admin.PropertyDefinition;
import org.opends.server.admin.PropertyDefinitionVisitor;
import org.opends.server.admin.PropertyDefinitionsOptions;
import org.opends.server.admin.PropertyException;
import org.opends.server.admin.PropertyIsMandatoryException;
import org.opends.server.admin.PropertyIsSingleValuedException;
@@ -85,6 +86,8 @@
     */
    private static final class ValueDecoder extends PropertyDefinitionVisitor<Object, String> {
        private final PropertyDefinitionsOptions options;
        /**
         * Decodes the provided property LDAP value.
         *
@@ -94,19 +97,21 @@
         *            The property definition.
         * @param value
         *            The LDAP string representation.
         * @param options
         *            Decoding options for property definitions.
         * @return Returns the decoded LDAP value.
         * @throws IllegalPropertyValueStringException
         *             If the property value could not be decoded because it was
         *             invalid.
         */
        public static <P> P decode(PropertyDefinition<P> pd, Object value) {
        public static <P> P decode(PropertyDefinition<P> pd, Object value, PropertyDefinitionsOptions options) {
            String s = String.valueOf(value);
            return pd.castValue(pd.accept(new ValueDecoder(), s));
            return pd.castValue(pd.accept(new ValueDecoder(options), s));
        }
        // Prevent instantiation.
        private ValueDecoder() {
            // No implementation required.
        private ValueDecoder(PropertyDefinitionsOptions options) {
            this.options = options;
        }
        /**
@@ -131,16 +136,14 @@
        @Override
        public <T> Object visitUnknown(PropertyDefinition<T> d, String p) {
            // By default the property definition's decoder will do.
            return d.decodeValue(p);
            return d.decodeValue(p, options);
        }
    }
    // The LDAP connection.
    private LDAPManagementContext context;
    private final LDAPConnection connection;
    // The LDAP management context.
    private final LDAPManagementContext context;
    // The LDAP profile which should be used to construct LDAP
    // requests and decode LDAP responses.
    private final LDAPProfile profile;
@@ -149,19 +152,23 @@
     * Creates a new LDAP driver using the specified LDAP connection and
     * profile.
     *
     * @param context
     *            The LDAP management context.
     * @param connection
     *            The LDAP connection.
     * @param profile
     *            The LDAP profile.
     * @param propertyDefOptions
     *            Options used to validate property definitions values
     */
    public LDAPDriver(LDAPManagementContext context, LDAPConnection connection, LDAPProfile profile) {
        this.context = context;
    public LDAPDriver(LDAPConnection connection, LDAPProfile profile, PropertyDefinitionsOptions propertyDefOptions) {
        super(propertyDefOptions);
        this.connection = connection;
        this.profile = profile;
    }
    void setManagementContext(LDAPManagementContext context) {
        this.context = context;
    }
    /**
     * {@inheritDoc}
     */
@@ -261,9 +268,10 @@
            // Decode the values.
            SortedSet<P> values = new TreeSet<P>(propertyDef);
            PropertyDefinitionsOptions options = context.getPropertyDefOptions();
            if (attribute != null) {
                for (ByteString byteValue : attribute) {
                    P value = ValueDecoder.decode(propertyDef, byteValue);
                    P value = ValueDecoder.decode(propertyDef, byteValue, options);
                    values.add(value);
                }
            }
@@ -485,9 +493,10 @@
        // Get the property's active values.
        SortedSet<P> activeValues = new TreeSet<P>(propertyDef);
        PropertyDefinitionsOptions options = context.getPropertyDefOptions();
        if (attribute != null) {
            for (ByteString byteValue : attribute) {
                P value = ValueDecoder.decode(propertyDef, byteValue);
                P value = ValueDecoder.decode(propertyDef, byteValue, options);
                activeValues.add(value);
            }
        }
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/ldap/LDAPManagedObject.java
@@ -126,7 +126,8 @@
    LDAPManagedObject(LDAPDriver driver, ManagedObjectDefinition<T, ? extends Configuration> d,
            ManagedObjectPath<T, ? extends Configuration> path, PropertySet properties, boolean existsOnServer,
            PropertyDefinition<?> namingPropertyDefinition) {
        super(d, path, properties, existsOnServer, namingPropertyDefinition);
        super(d, path, properties, existsOnServer, namingPropertyDefinition,
            driver.getManagementContext().getPropertyDefOptions());
        this.driver = driver;
    }
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/ldap/LDAPManagementContext.java
@@ -27,9 +27,9 @@
package org.opends.server.admin.client.ldap;
import org.opends.server.admin.LDAPProfile;
import org.opends.server.admin.PropertyDefinitionsOptions;
import org.opends.server.admin.client.ManagementContext;
import org.opends.server.admin.client.spi.Driver;
import org.forgerock.util.Reject;
/**
@@ -42,26 +42,46 @@
     *
     * @param connection
     *            The LDAP connection.
     * @param profile
     *            The LDAP profile.
     * @param options
     *            Options to decode values of property definitions.
     * @return Returns the new management context.
     */
    public static ManagementContext createFromContext(LDAPConnection connection) {
        Reject.ifNull(connection);
        return new LDAPManagementContext(connection, LDAPProfile.getInstance());
    public static ManagementContext createFromContext(LDAPConnection connection, LDAPProfile profile,
        PropertyDefinitionsOptions options) {
        Reject.ifNull(connection, profile, options);
        LDAPDriver driver = new LDAPDriver(connection, profile, options);
        LDAPManagementContext context = new LDAPManagementContext(driver, options);
        driver.setManagementContext(context);
        return context;
    }
    // The LDAP management context driver.
    /** The LDAP management context driver. */
    private final LDAPDriver driver;
    // Private constructor.
    private LDAPManagementContext(LDAPConnection connection, LDAPProfile profile) {
        this.driver = new LDAPDriver(this, connection, profile);
    /** Options to validate and decode values of property definitions. */
    private final PropertyDefinitionsOptions options;
    /** Private constructor. */
    private LDAPManagementContext(LDAPDriver driver, PropertyDefinitionsOptions options) {
        this.driver = driver;
        this.options = options;
    }
    /**
     * {@inheritDoc}
     */
    /** {@inheritDoc} */
    @Override
    protected Driver getDriver() {
        return driver;
    }
    /**
     * Returns the property definitions options.
     *
     * @return the options to validate and decode values of property
     *         definitions.
     */
    protected PropertyDefinitionsOptions getPropertyDefOptions() {
        return options;
    }
}
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/spi/AbstractManagedObject.java
@@ -50,6 +50,7 @@
import org.opends.server.admin.ManagedObjectPath;
import org.opends.server.admin.OptionalRelationDefinition;
import org.opends.server.admin.PropertyDefinition;
import org.opends.server.admin.PropertyDefinitionsOptions;
import org.opends.server.admin.PropertyIsMandatoryException;
import org.opends.server.admin.PropertyIsReadOnlyException;
import org.opends.server.admin.PropertyOption;
@@ -228,6 +229,9 @@
    // The managed object's properties.
    private final PropertySet properties;
    /** Decoding options for property definitions values. */
    private final PropertyDefinitionsOptions propertyDefOptions;
    /**
     * Creates a new abstract managed object.
     *
@@ -243,15 +247,17 @@
     *            committed).
     * @param namingPropertyDefinition
     *            Optional naming property definition.
     * @param propertyDefOptions TODO
     */
    protected AbstractManagedObject(ManagedObjectDefinition<T, ? extends Configuration> d,
        ManagedObjectPath<T, ? extends Configuration> path, PropertySet properties, boolean existsOnServer,
        PropertyDefinition<?> namingPropertyDefinition) {
        PropertyDefinition<?> namingPropertyDefinition, PropertyDefinitionsOptions propertyDefOptions) {
        this.definition = d;
        this.path = path;
        this.properties = properties;
        this.existsOnServer = existsOnServer;
        this.namingPropertyDefinition = namingPropertyDefinition;
        this.propertyDefOptions = propertyDefOptions;
    }
    /**
@@ -346,9 +352,9 @@
        PropertyDefinition<?> pd = r.getNamingPropertyDefinition();
        if (pd != null) {
            try {
                pd.decodeValue(name);
                pd.decodeValue(name, propertyDefOptions);
            } catch (IllegalPropertyValueStringException e) {
                throw new IllegalManagedObjectNameException(name, pd);
                throw new IllegalManagedObjectNameException(name, pd, propertyDefOptions);
            }
        }
@@ -664,7 +670,7 @@
            throw new PropertyIsReadOnlyException(pd);
        }
        properties.setPropertyValues(pd, values);
        properties.setPropertyValues(pd, values, propertyDefOptions);
        // If this is a naming property then update the name.
        if (pd.equals(namingPropertyDefinition)) {
@@ -809,8 +815,9 @@
        // Set the naming property if there is one.
        if (namingPropertyDefinition != null) {
            P value = namingPropertyDefinition.decodeValue(name);
            childProperties.setPropertyValues(namingPropertyDefinition, Collections.singleton(value));
            P value = namingPropertyDefinition.decodeValue(name, propertyDefOptions);
            childProperties.setPropertyValues(namingPropertyDefinition, Collections.singleton(value),
                propertyDefOptions);
        }
        return newInstance(d, p, childProperties, false, namingPropertyDefinition);
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/spi/Driver.java
@@ -51,6 +51,7 @@
import org.opends.server.admin.ManagedObjectPath;
import org.opends.server.admin.OptionalRelationDefinition;
import org.opends.server.admin.PropertyDefinition;
import org.opends.server.admin.PropertyDefinitionsOptions;
import org.opends.server.admin.PropertyException;
import org.opends.server.admin.PropertyIsSingleValuedException;
import org.opends.server.admin.PropertyNotFoundException;
@@ -136,7 +137,7 @@
            for (String stringValue : stringValues) {
                try {
                    values.add(nextProperty.decodeValue(stringValue));
                    values.add(nextProperty.decodeValue(stringValue, propertyDefOptions));
                } catch (IllegalPropertyValueStringException e) {
                    exception = new DefaultBehaviorException(nextProperty, e);
                    break;
@@ -226,7 +227,7 @@
                    Collection<T> tmp = find(target, pd2);
                    Collection<T> values = new ArrayList<T>(tmp.size());
                    for (T value : tmp) {
                        pd1.validateValue(value);
                        pd1.validateValue(value, propertyDefOptions);
                        values.add(value);
                    }
                    return values;
@@ -254,11 +255,16 @@
        }
    };
    private final PropertyDefinitionsOptions propertyDefOptions;
    /**
     * Creates a new abstract management context.
     * Creates a new abstract driver.
     *
     * @param propertyDefOptions
     *            Decoding options for property definitions values.
     */
    protected Driver() {
        // No implementation required.
    protected Driver(PropertyDefinitionsOptions propertyDefOptions) {
        this.propertyDefOptions = propertyDefOptions;
    }
    /**
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/spi/PropertySet.java
@@ -35,6 +35,7 @@
import org.opends.server.admin.IllegalPropertyValueException;
import org.opends.server.admin.PropertyDefinition;
import org.opends.server.admin.PropertyDefinitionsOptions;
import org.opends.server.admin.PropertyIsMandatoryException;
import org.opends.server.admin.PropertyIsSingleValuedException;
import org.opends.server.admin.PropertyOption;
@@ -282,6 +283,8 @@
     *            property (an empty set indicates that the property should be
     *            reset to its default behavior). The set will not be referenced
     *            by this managed object.
     * @param options
     *            Options to validate property definitions values.
     * @throws IllegalPropertyValueException
     *             If a new pending value is deemed to be invalid according to
     *             the property definition.
@@ -294,7 +297,8 @@
     *             If the specified property definition is not associated with
     *             this managed object.
     */
    <T> void setPropertyValues(PropertyDefinition<T> d, Collection<T> values) {
    <T> void setPropertyValues(PropertyDefinition<T> d, Collection<T> values,
        PropertyDefinitionsOptions options) {
        MyProperty<T> property = (MyProperty<T>) getProperty(d);
        if (values.size() > 1 && !d.hasOption(PropertyOption.MULTI_VALUED)) {
@@ -314,7 +318,7 @@
                throw new NullPointerException();
            }
            d.validateValue(e);
            d.validateValue(e, options);
        }
        // Update the property.
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/condition/ContainsCondition.java
@@ -31,6 +31,7 @@
import org.forgerock.util.Reject;
import org.opends.server.admin.AbstractManagedObjectDefinition;
import org.opends.server.admin.PropertyDefinition;
import org.opends.server.admin.PropertyDefinitionsOptions;
import org.opends.server.admin.client.ManagedObject;
import org.opends.server.admin.client.ManagementContext;
import org.opends.server.admin.server.ServerManagedObject;
@@ -150,7 +151,7 @@
    // Creates the new private implementation.
    private <T> void buildImpl(PropertyDefinition<T> pd) {
        T value = pd.decodeValue(propertyStringValue);
        T value = pd.decodeValue(propertyStringValue, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        this.impl = new Impl<T>(pd, value);
    }
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/doc/ConfigGuideGeneration.java
@@ -203,10 +203,6 @@
            e.printStackTrace();
            System.exit(1);
        }
        // Switch off class name validation in client.
        ClassPropertyDefinition.setAllowClassValidation(false);
        // Switch off attribute type name validation in client.
        AttributeTypePropertyDefinition.setCheckSchema(false);
        // Build a sorted list of top managed objects
        TopCfgDefn topCfg = TopCfgDefn.getInstance();
opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagementContext.java
@@ -59,6 +59,7 @@
import org.opends.server.admin.ManagedObjectPath;
import org.opends.server.admin.PropertyDefinition;
import org.opends.server.admin.PropertyDefinitionVisitor;
import org.opends.server.admin.PropertyDefinitionsOptions;
import org.opends.server.admin.PropertyException;
import org.opends.server.admin.PropertyIsMandatoryException;
import org.opends.server.admin.PropertyIsSingleValuedException;
@@ -146,7 +147,7 @@
            for (String stringValue : stringValues) {
                try {
                    values.add(nextProperty.decodeValue(stringValue));
                    values.add(nextProperty.decodeValue(stringValue, propertyDefOptions));
                } catch (IllegalPropertyValueStringException e) {
                    exception = new DefaultBehaviorException(nextProperty, e);
                    break;
@@ -237,7 +238,7 @@
                if (attributeValues.size() > 0) {
                    Collection<T> pvalues = new ArrayList<T>();
                    for (String value : attributeValues) {
                        pvalues.add(ValueDecoder.decode(propDef1, value));
                        pvalues.add(ValueDecoder.decode(propDef1, value, propertyDefOptions));
                    }
                    return pvalues;
                } else {
@@ -245,7 +246,7 @@
                    Collection<T> tmp = find(target, propDef2);
                    Collection<T> pvalues = new ArrayList<T>(tmp.size());
                    for (T value : tmp) {
                        propDef1.validateValue(value);
                        propDef1.validateValue(value, propertyDefOptions);
                        pvalues.add(value);
                    }
                    return pvalues;
@@ -300,6 +301,8 @@
     */
    private static final class ValueDecoder extends PropertyDefinitionVisitor<Object, String> {
        private final PropertyDefinitionsOptions options;
        /**
         * Decodes the provided property LDAP value.
         *
@@ -309,18 +312,21 @@
         *            The property definition.
         * @param value
         *            The LDAP string representation.
         * @param options
         *            Options to decode property definitions values.
         * @return Returns the decoded LDAP value.
         * @throws IllegalPropertyValueStringException
         *             If the property value could not be decoded because it was
         *             invalid.
         */
        public static <P> P decode(PropertyDefinition<P> propertyDef, String value) {
            return propertyDef.castValue(propertyDef.accept(new ValueDecoder(), value));
        public static <P> P decode(PropertyDefinition<P> propertyDef, String value,
            PropertyDefinitionsOptions options) {
            return propertyDef.castValue(propertyDef.accept(new ValueDecoder(options), value));
        }
        // Prevent instantiation.
        private ValueDecoder() {
            // No implementation required.
        private ValueDecoder(PropertyDefinitionsOptions options) {
            this.options = options;
        }
        /**
@@ -345,7 +351,7 @@
        @Override
        public <T> Object visitUnknown(PropertyDefinition<T> d, String p) {
            // By default the property definition's decoder will do.
            return d.decodeValue(p);
            return d.decodeValue(p, options);
        }
    }
@@ -360,13 +366,23 @@
    private final ConfigurationRepository configRepository;
    /**
     * Options to use when decoding and validating values of property
     * definitions.
     */
    private final PropertyDefinitionsOptions propertyDefOptions;
    /**
     * Creates a context from the provided configuration repository.
     *
     * @param repository
     *          The repository of configuration entries.
     * @param propertyDefOptions
     *          Options to use when decoding and validating values
     *          of property definitions.
     */
    ServerManagementContext(ConfigurationRepository repository) {
    ServerManagementContext(ConfigurationRepository repository, PropertyDefinitionsOptions propertyDefOptions) {
        configRepository = repository;
        this.propertyDefOptions = propertyDefOptions;
    }
    /**
@@ -530,8 +546,8 @@
     * @return the root configuration server managed object
     */
    public ServerManagedObject<RootCfg> getRootConfigurationManagedObject() {
        // Use lazy initialisation because it needs a reference to this server
        // context.
        // Use lazy initialisation
        // because it needs a reference to this server context.
        ServerManagedObject<RootCfg> rootObject = root;
        if (rootObject == null) {
            synchronized (this) {
@@ -711,7 +727,7 @@
            // The property has values defined for it.
            for (String value : attributeValues) {
                try {
                    pvalues.add(ValueDecoder.decode(propertyDef, value));
                    pvalues.add(ValueDecoder.decode(propertyDef, value, propertyDefOptions));
                } catch (IllegalPropertyValueStringException e) {
                    exception = e;
                }
opendj-sdk/opendj-admin/src/test/java/org/forgerock/opendj/config/ConfigTestCase.java
@@ -26,7 +26,6 @@
package org.forgerock.opendj.config;
import org.forgerock.opendj.ldap.SdkTestCase;
import org.opends.server.admin.ClassPropertyDefinition;
import org.testng.annotations.Test;
/**
@@ -34,12 +33,5 @@
 */
@Test(groups = { "precommit", "config" })
public abstract class ConfigTestCase extends SdkTestCase {
    protected void disableClassValidationForProperties() {
        ClassPropertyDefinition.setAllowClassValidation(false);
    }
    protected void enableClassValidationForProperties() {
        ClassPropertyDefinition.setAllowClassValidation(true);
    }
   // no implementation
}
opendj-sdk/opendj-admin/src/test/java/org/forgerock/opendj/config/ConfigurationMock.java
@@ -42,6 +42,7 @@
import org.opends.server.admin.DefinedDefaultBehaviorProvider;
import org.opends.server.admin.ManagedObjectDefinition;
import org.opends.server.admin.PropertyDefinition;
import org.opends.server.admin.PropertyDefinitionsOptions;
import org.opends.server.admin.PropertyOption;
import org.opends.server.admin.RelativeInheritedDefaultBehaviorProvider;
import org.opends.server.admin.UndefinedDefaultBehaviorProvider;
@@ -56,11 +57,8 @@
 * Example:
 *
 * <pre>
 * {
 *     &#064;code
 *     LDAPConnectionHandlerCfg mockCfg = mockCfg(LDAPConnectionHandlerCfg.class);
 *     assertThat(mockCfg.getMaxRequestSize()).isEqualTo(5 * 1000 * 1000);
 * }
 * </pre>
 */
public final class ConfigurationMock {
@@ -146,7 +144,8 @@
         */
        @SuppressWarnings("unchecked")
        private <T> Object getDefaultValue(ManagedObjectDefinition<?, ?> definition,
                Method getPropertyDefMethod, Class<T> propertyReturnClass) throws Exception {
                Method getPropertyDefMethod, @SuppressWarnings("unused") Class<T> propertyReturnClass)
                throws Exception {
            PropertyDefinition<T> propertyDefinition = (PropertyDefinition<T>) getPropertyDefMethod.invoke(definition);
            DefaultBehaviorProvider<T> defaultBehaviorProvider = (DefaultBehaviorProvider<T>) propertyDefinition
                    .getClass().getMethod("getDefaultBehaviorProvider").invoke(propertyDefinition);
@@ -194,7 +193,7 @@
        public Collection<T> visitDefined(DefinedDefaultBehaviorProvider<T> provider, Void p) {
            SortedSet<T> values = new TreeSet<T>();
            for (String stringValue : provider.getDefaultValues()) {
                values.add(propertyDef.decodeValue(stringValue));
                values.add(propertyDef.decodeValue(stringValue, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS));
            }
            return values;
        }
opendj-sdk/opendj-admin/src/test/java/org/forgerock/opendj/config/ConfigurationMockTest.java
@@ -34,9 +34,6 @@
import org.forgerock.opendj.admin.server.GoverningStructureRuleVirtualAttributeCfg;
import org.forgerock.opendj.admin.server.LDAPConnectionHandlerCfg;
import org.forgerock.opendj.ldap.schema.Schema;
import org.opends.server.admin.AttributeTypePropertyDefinition;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
/**
@@ -45,16 +42,6 @@
@SuppressWarnings("javadoc")
public class ConfigurationMockTest extends ConfigTestCase {
    @BeforeClass
    void setup() {
        disableClassValidationForProperties();
    }
    @AfterClass
    void cleanup() {
        enableClassValidationForProperties();
    }
    @Test
    public void testPropertyWithStringReturnValue() {
        GoverningStructureRuleVirtualAttributeCfg mock = mockCfg(GoverningStructureRuleVirtualAttributeCfg.class);
@@ -76,7 +63,6 @@
    @Test
    public void testPropertyWithAttributeTypeReturnValue() throws Exception {
        AttributeTypePropertyDefinition.setCheckSchema(false); // attribute type is not in default schema
        CollectiveAttributeSubentriesVirtualAttributeCfg mock =
                mockCfg(CollectiveAttributeSubentriesVirtualAttributeCfg.class);
        assertThat(mock.getAttributeType()).isEqualTo(
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/AbstractManagedObjectDefinitionTest.java
@@ -64,7 +64,6 @@
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
        TestCfg.setUp();
    }
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/AdminTestCase.java
@@ -54,12 +54,12 @@
        return configRepository;
    }
    /** Returns the name used for this entry (the value of the cn attribute) */
    /** Returns the name used for the provided entry (the value of the cn attribute) */
    protected final String entryName(final Entry entry) {
        return entry.getName().rdn().getFirstAVA().getAttributeValue().toString();
    }
    /** Gets the named parent configuration corresponding to the entry */
    /** Gets the named parent configuration corresponding to the provided entry */
    protected final TestParentCfg getParentCfg(final Entry entry, final ServerManagementContext serverContext)
            throws Exception {
        return getParentCfg(entryName(entry), serverContext);
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/AggregationPropertyDefinitionTest.java
@@ -39,7 +39,6 @@
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
        TestCfg.setUp();
    }
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/AttributeTypePropertyDefinitionTest.java
@@ -31,23 +31,16 @@
import org.forgerock.opendj.config.ConfigTestCase;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.forgerock.opendj.ldap.schema.Schema;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@SuppressWarnings("javadoc")
public class AttributeTypePropertyDefinitionTest extends ConfigTestCase {
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
    }
    @Test
    public void testValidateValue() {
        AttributeTypePropertyDefinition.setCheckSchema(true);
        AttributeTypePropertyDefinition propertyDef = createPropertyDefinition();
        propertyDef.validateValue(Schema.getDefaultSchema().getAttributeType("cn"));
        propertyDef.validateValue(Schema.getDefaultSchema().getAttributeType("cn"), new PropertyDefinitionsOptions());
    }
    @DataProvider(name = "valueLegalData")
@@ -57,17 +50,15 @@
    @Test(dataProvider = "valueLegalData")
    public void testDecodeValue(String value) {
        AttributeTypePropertyDefinition.setCheckSchema(true);
        AttributeTypePropertyDefinition propertyDef = createPropertyDefinition();
        AttributeType expected = Schema.getDefaultSchema().getAttributeType(value);
        assertEquals(propertyDef.decodeValue(value), expected);
        assertEquals(propertyDef.decodeValue(value, new PropertyDefinitionsOptions()), expected);
    }
    @Test(dataProvider = "valueLegalData")
    public void testEncodeValue(String value) {
        AttributeTypePropertyDefinition.setCheckSchema(true);
        AttributeTypePropertyDefinition propertyDef = createPropertyDefinition();
        assertEquals(propertyDef.encodeValue(propertyDef.decodeValue(value)), value);
        assertEquals(propertyDef.encodeValue(propertyDef.decodeValue(value, new PropertyDefinitionsOptions())), value);
    }
    @DataProvider(name = "valueIllegalData")
@@ -77,21 +68,15 @@
    @Test(dataProvider = "valueIllegalData", expectedExceptions = { IllegalPropertyValueStringException.class })
    public void testDecodeValueIllegal(String value) {
        AttributeTypePropertyDefinition.setCheckSchema(true);
        AttributeTypePropertyDefinition propertyDef = createPropertyDefinition();
        propertyDef.decodeValue(value);
        propertyDef.decodeValue(value, new PropertyDefinitionsOptions());
    }
    @Test(dataProvider = "valueIllegalData")
    public void testDecodeValueIllegalNoSchemaCheck(String value) {
        AttributeTypePropertyDefinition.setCheckSchema(false);
        AttributeTypePropertyDefinition propertyDef = createPropertyDefinition();
        AttributeType type = propertyDef.decodeValue(value);
        AttributeType type = propertyDef.decodeValue(value, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        assertEquals(type.getNameOrOID(), value);
        // Make sure to turn schema checking back on
        // so that other tests which depend on it don't fail.
        AttributeTypePropertyDefinition.setCheckSchema(true);
    }
    // Create a new definition.
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/BooleanPropertyDefinitionTest.java
@@ -40,20 +40,19 @@
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
        builder = BooleanPropertyDefinition.createBuilder(RootCfgDefn.getInstance(), "test-property");
    }
    @Test
    public void testValidateValue() {
        BooleanPropertyDefinition def = createPropertyDefinition();
        def.validateValue(Boolean.TRUE);
        def.validateValue(Boolean.TRUE, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @Test(expectedExceptions = NullPointerException.class)
    public void testValidateValueIllegal() {
        BooleanPropertyDefinition def = createPropertyDefinition();
        def.validateValue(null);
        def.validateValue(null, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @DataProvider(name = "decodeValueData")
@@ -64,7 +63,7 @@
    @Test(dataProvider = "decodeValueData")
    public void testDecodeValue(String value, Boolean expected) {
        BooleanPropertyDefinition def = createPropertyDefinition();
        assertEquals(def.decodeValue(value), expected);
        assertEquals(def.decodeValue(value, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS), expected);
    }
    @DataProvider(name = "decodeValueDataIllegal")
@@ -76,7 +75,7 @@
            IllegalPropertyValueStringException.class })
    public void testDecodeValueIllegal(String value) {
        BooleanPropertyDefinition def = createPropertyDefinition();
        def.decodeValue(value);
        def.decodeValue(value, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    private BooleanPropertyDefinition createPropertyDefinition() {
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/ClassPropertyDefinitionTest.java
@@ -34,18 +34,12 @@
import org.forgerock.opendj.admin.meta.RootCfgDefn;
import org.forgerock.opendj.config.ConfigTestCase;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@SuppressWarnings("javadoc")
public class ClassPropertyDefinitionTest extends ConfigTestCase {
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
    }
    // Dummy class used in tests.
    public static final class Dummy {
        public class X {
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/DNPropertyDefinitionTest.java
@@ -32,18 +32,12 @@
import org.forgerock.opendj.config.ConfigTestCase;
import org.forgerock.opendj.ldap.DN;
import org.opends.server.types.DirectoryException;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@SuppressWarnings("javadoc")
public class DNPropertyDefinitionTest extends ConfigTestCase {
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
    }
    @DataProvider(name = "baseDN")
    public Object[][] createBuilderSetBaseDN() {
        return new Object[][] {
@@ -102,7 +96,7 @@
                "test-property");
        localBuilder.setBaseDN(baseDN);
        DNPropertyDefinition propertyDef = localBuilder.getInstance();
        propertyDef.validateValue(DN.valueOf(valueToValidate));
        propertyDef.validateValue(DN.valueOf(valueToValidate), PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @Test(dataProvider = "illegalValues", expectedExceptions = IllegalPropertyValueException.class)
@@ -111,7 +105,7 @@
                "test-property");
        localBuilder.setBaseDN(baseDN);
        DNPropertyDefinition propertyDef = localBuilder.getInstance();
        propertyDef.validateValue(DN.valueOf(valueToValidate));
        propertyDef.validateValue(DN.valueOf(valueToValidate), PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @Test(dataProvider = "legalValues")
@@ -120,7 +114,7 @@
                "test-property");
        localBuilder.setBaseDN(baseDN);
        DNPropertyDefinition propertyDef = localBuilder.getInstance();
        propertyDef.decodeValue(valueToValidate);
        propertyDef.decodeValue(valueToValidate, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @Test(dataProvider = "illegalValues", expectedExceptions = IllegalPropertyValueStringException.class)
@@ -129,6 +123,6 @@
                "test-property");
        localBuilder.setBaseDN(baseDN);
        DNPropertyDefinition propertyDef = localBuilder.getInstance();
        propertyDef.decodeValue(valueToValidate);
        propertyDef.decodeValue(valueToValidate, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
}
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/DurationPropertyDefinitionTest.java
@@ -31,18 +31,12 @@
import org.forgerock.opendj.admin.meta.RootCfgDefn;
import org.forgerock.opendj.config.ConfigTestCase;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@SuppressWarnings("javadoc")
public class DurationPropertyDefinitionTest extends ConfigTestCase {
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
    }
    @Test
    public void testCreateBuilder() {
        DurationPropertyDefinition.Builder builder = createTestBuilder();
@@ -130,7 +124,7 @@
        DurationPropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(true);
        DurationPropertyDefinition def = buildTestDefinition(builder);
        def.decodeValue("unlimited");
        def.decodeValue("unlimited", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @Test(expectedExceptions = IllegalPropertyValueStringException.class)
@@ -138,7 +132,7 @@
        DurationPropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(false);
        DurationPropertyDefinition def = buildTestDefinition(builder);
        def.decodeValue("unlimited");
        def.decodeValue("unlimited", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @Test(expectedExceptions = IllegalPropertyValueException.class)
@@ -146,7 +140,7 @@
        DurationPropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(false);
        DurationPropertyDefinition def = buildTestDefinition(builder);
        def.validateValue(-1L);
        def.validateValue(-1L, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @DataProvider(name = "validateValueData")
@@ -169,7 +163,7 @@
        builder.setUpperLimit(higherLimitInMillis);
        builder.setAllowUnlimited(isAllowUnlimited);
        DurationPropertyDefinition def = buildTestDefinition(builder);
        def.validateValue(valueInSeconds);
        def.validateValue(valueInSeconds, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @DataProvider(name = "illegalValidateValueData")
@@ -191,7 +185,7 @@
        builder.setUpperLimit(highLimitInMillis);
        builder.setAllowUnlimited(isAllowUnlimited);
        DurationPropertyDefinition def = buildTestDefinition(builder);
        def.validateValue(valueInSeconds);
        def.validateValue(valueInSeconds, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @DataProvider(name = "encodeValueData")
@@ -310,7 +304,8 @@
        builder.setMaximumUnit(DurationUnit.DAYS);
        DurationPropertyDefinition def = buildTestDefinition(builder);
        assertThat(def.decodeValue(valueToDecode)).isEqualTo(expectedValue);
        assertThat(def.decodeValue(valueToDecode, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS)).
            isEqualTo(expectedValue);
    }
    @DataProvider(name = "decodeValueDataIllegal")
@@ -343,7 +338,7 @@
        builder.setLowerLimit(5L);
        builder.setUpperLimit(10L);
        DurationPropertyDefinition def = buildTestDefinition(builder);
        def.decodeValue(valueToDecode);
        def.decodeValue(valueToDecode, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    private DurationPropertyDefinition.Builder createTestBuilder() {
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/EnumPropertyDefinitionTest.java
@@ -45,7 +45,6 @@
    @BeforeClass
    public void setUp() {
        disableClassValidationForProperties();
        builder = EnumPropertyDefinition.createBuilder(RootCfgDefn.getInstance(), "test-property");
        builder.setEnumClass(TestEnum.class);
    }
@@ -95,7 +94,7 @@
    @Test(dataProvider = "decodeValueData")
    public void testDecodeValue(String value, TestEnum expectedValue) {
        EnumPropertyDefinition<?> def = builder.getInstance();
        assertEquals(def.decodeValue(value), expectedValue);
        assertEquals(def.decodeValue(value, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS), expectedValue);
    }
    /**
@@ -118,7 +117,7 @@
            IllegalPropertyValueStringException.class })
    public void testDecodeValueIllegalData(String value) {
        EnumPropertyDefinition<?> def = builder.getInstance();
        def.decodeValue(value);
        def.decodeValue(value, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    /**
@@ -136,7 +135,7 @@
    @Test
    public void testValidateValue() {
        EnumPropertyDefinition<TestEnum> def = builder.getInstance();
        def.validateValue(TestEnum.ONE);
        def.validateValue(TestEnum.ONE, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
}
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/IntegerPropertyDefinitionTest.java
@@ -29,18 +29,12 @@
import org.forgerock.opendj.admin.meta.RootCfgDefn;
import org.forgerock.opendj.config.ConfigTestCase;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@SuppressWarnings("javadoc")
public class IntegerPropertyDefinitionTest extends ConfigTestCase {
    @BeforeClass
    public void setUp() {
        disableClassValidationForProperties();
    }
    @Test
    public void testCreateBuilder() {
        IntegerPropertyDefinition.Builder builder = createTestBuilder();
@@ -98,7 +92,7 @@
        IntegerPropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(true);
        IntegerPropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.decodeValue("unlimited");
        propertyDef.decodeValue("unlimited", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @Test(expectedExceptions = IllegalPropertyValueStringException.class)
@@ -106,7 +100,7 @@
        IntegerPropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(false);
        IntegerPropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.decodeValue("unlimited");
        propertyDef.decodeValue("unlimited", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @Test(expectedExceptions = IllegalPropertyValueException.class)
@@ -114,7 +108,7 @@
        IntegerPropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(false);
        IntegerPropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.validateValue(-1);
        propertyDef.validateValue(-1, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @DataProvider(name = "validateValueData")
@@ -134,7 +128,7 @@
        builder.setUpperLimit(high);
        builder.setAllowUnlimited(allowUnlimited);
        IntegerPropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.validateValue(valueToValidate);
        propertyDef.validateValue(valueToValidate, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @DataProvider(name = "illegalValidateValueData")
@@ -158,7 +152,7 @@
        builder.setUpperLimit(high);
        builder.setAllowUnlimited(allowUnlimited);
        IntegerPropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.validateValue(value);
        propertyDef.validateValue(value, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @DataProvider(name = "encodeValueData")
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/LDAPProfileTest.java
@@ -31,17 +31,11 @@
import org.forgerock.opendj.admin.meta.GlobalCfgDefn;
import org.forgerock.opendj.config.ConfigTestCase;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@SuppressWarnings("javadoc")
public class LDAPProfileTest extends ConfigTestCase {
    @BeforeClass
    public void setUp() {
        disableClassValidationForProperties();
    }
    /** Makes sure the returned list contains "top" */
    @Test
    public void testGetObjectClasses() {
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/ManagedObjectDefinitionI18NResourceTest.java
@@ -41,7 +41,6 @@
    @BeforeClass
    public void setUp() {
        disableClassValidationForProperties();
        definitionI18NResource = ManagedObjectDefinitionI18NResource.getInstanceForProfile("ldap");
    }
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/ManagedObjectPathTest.java
@@ -41,17 +41,11 @@
import org.forgerock.opendj.admin.server.LDAPConnectionHandlerCfg;
import org.forgerock.opendj.config.ConfigTestCase;
import org.forgerock.opendj.ldap.DN;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@SuppressWarnings("javadoc")
public class ManagedObjectPathTest extends ConfigTestCase {
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
    }
    @Test
    public void testEmptyPathIsEmpty() {
        ManagedObjectPath<?, ?> path = ManagedObjectPath.emptyPath();
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/RelativeInheritedDefaultBehaviorProviderTest.java
@@ -43,7 +43,6 @@
    @BeforeClass
    public void setUp() {
        disableClassValidationForProperties();
        parentDefinition = TestParentCfgDefn.getInstance();
        this.defaultBehaviorProvider = new RelativeInheritedDefaultBehaviorProvider<Boolean>(
            parentDefinition,
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/SizePropertyDefinitionTest.java
@@ -29,18 +29,12 @@
import org.forgerock.opendj.admin.meta.RootCfgDefn;
import org.forgerock.opendj.config.ConfigTestCase;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@SuppressWarnings("javadoc")
public class SizePropertyDefinitionTest extends ConfigTestCase {
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
    }
    @Test
    public void testCreateBuilder() {
        SizePropertyDefinition.Builder builder = createTestBuilder();
@@ -105,7 +99,7 @@
        SizePropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(true);
        SizePropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.decodeValue("unlimited");
        propertyDef.decodeValue("unlimited", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @Test(expectedExceptions = IllegalPropertyValueStringException.class)
@@ -113,7 +107,7 @@
        SizePropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(false);
        SizePropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.decodeValue("unlimited");
        propertyDef.decodeValue("unlimited", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @Test(expectedExceptions = IllegalPropertyValueException.class)
@@ -121,7 +115,7 @@
        SizePropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(false);
        SizePropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.validateValue(-1L);
        propertyDef.validateValue(-1L, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @DataProvider(name = "validateValueData")
@@ -141,7 +135,7 @@
        builder.setUpperLimit(high);
        builder.setAllowUnlimited(isAllowUnlimited);
        SizePropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.validateValue(valueToValidate);
        propertyDef.validateValue(valueToValidate, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @DataProvider(name = "illegalValidateValueData")
@@ -165,7 +159,7 @@
        builder.setUpperLimit(high);
        builder.setAllowUnlimited(allowUnlimited);
        SizePropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.validateValue(valueToValidate);
        propertyDef.validateValue(valueToValidate, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @DataProvider(name = "encodeValueData")
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/StringPropertyDefinitionTest.java
@@ -29,47 +29,40 @@
import org.forgerock.opendj.admin.meta.RootCfgDefn;
import org.forgerock.opendj.config.ConfigTestCase;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@SuppressWarnings("javadoc")
public class StringPropertyDefinitionTest extends ConfigTestCase {
    @BeforeClass
    public void setUp() {
        disableClassValidationForProperties();
    }
    @Test
    public void testValidateValueNoPattern() {
        StringPropertyDefinition d = getDefinition(true, null);
        d.validateValue("abc");
        d.validateValue("abc", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @Test
    public void testValidateValuePatternMatches() {
        StringPropertyDefinition d = getDefinition(true, "^[a-z]+$");
        d.validateValue("abc");
        d.validateValue("abc", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    // TODO : I18N problem
    @Test(enabled = false, expectedExceptions = IllegalPropertyValueException.class)
    public void testValidateValuePatternDoesNotMatch() {
        StringPropertyDefinition d = getDefinition(true, "^[a-z]+$");
        d.validateValue("abc123");
        d.validateValue("abc123", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    @Test
    public void testDecodeValuePatternMatches() {
        StringPropertyDefinition d = getDefinition(true, "^[a-z]+$");
        assertEquals(d.decodeValue("abc"), "abc");
        assertEquals(d.decodeValue("abc", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS), "abc");
    }
    // TODO : I18N problem
    @Test(enabled = false, expectedExceptions = IllegalPropertyValueStringException.class)
    public void testDecodeValuePatternDoesNotMatch() {
        StringPropertyDefinition d = getDefinition(true, "^[a-z]+$");
        d.decodeValue("abc123");
        d.decodeValue("abc123", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
    }
    // Create a string property definition.
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/TestTopCfgDefnTest.java
@@ -31,7 +31,6 @@
import org.forgerock.opendj.admin.meta.RootCfgDefn;
import org.forgerock.opendj.config.ConfigTestCase;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@@ -39,11 +38,6 @@
@Test(singleThreaded = true)
public class TestTopCfgDefnTest extends ConfigTestCase {
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
    }
    @Test
    public void testGetInstance() {
        assertNotNull(TopCfgDefn.getInstance());
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/ValidateConfigDefinitionsTest.java
@@ -51,7 +51,6 @@
    @BeforeClass
    public void setup() throws Exception {
        disableClassValidationForProperties();
        TestCfg.setUp();
    }
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/client/ldap/AggregationClientTest.java
@@ -34,6 +34,8 @@
import org.forgerock.opendj.admin.client.RootCfgClient;
import org.opends.server.admin.AdminTestCase;
import org.opends.server.admin.IllegalPropertyValueStringException;
import org.opends.server.admin.LDAPProfile;
import org.opends.server.admin.PropertyDefinitionsOptions;
import org.opends.server.admin.PropertyException;
import org.opends.server.admin.TestCfg;
import org.opends.server.admin.TestChildCfgClient;
@@ -154,7 +156,6 @@
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
        TestCfg.setUp();
    }
@@ -177,7 +178,8 @@
    public void testAggregationEmpty() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
            PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 1");
        assertSetEquals(child.getAggregationProperty(), new String[0]);
@@ -194,7 +196,8 @@
    public void testAggregationSingle() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
            PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 2");
@@ -215,7 +218,8 @@
    public void testAggregationMultiple() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
            PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 3");
        assertSetEquals(child.getAggregationProperty(), "LDAPS Connection Handler", "LDAP Connection Handler");
@@ -232,7 +236,8 @@
    public void testAggregationBadBaseDN() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
            PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        try {
@@ -275,7 +280,8 @@
        c.addExpectedAttribute("ds-cfg-rotation-policy",
                "cn=LDAP Connection Handler,cn=connection handlers, cn=config");
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
            PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
        child.setMandatoryBooleanProperty(true);
@@ -301,7 +307,8 @@
        c.addExpectedModification("ds-cfg-rotation-policy",
            "cn=HTTP Connection Handler,cn=connection handlers, cn=config",
            "cn=JMX Connection Handler,cn=connection handlers, cn=config");
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
            PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 2");
        child.setAggregationProperty(Arrays.asList("JMX Connection Handler", "HTTP Connection Handler"));
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/client/ldap/LDAPClientTest.java
@@ -40,8 +40,10 @@
import org.forgerock.opendj.ldap.responses.SearchResultEntry;
import org.opends.server.admin.AdminTestCase;
import org.opends.server.admin.Constraint;
import org.opends.server.admin.LDAPProfile;
import org.opends.server.admin.ManagedObjectAlreadyExistsException;
import org.opends.server.admin.ManagedObjectNotFoundException;
import org.opends.server.admin.PropertyDefinitionsOptions;
import org.opends.server.admin.TestCfg;
import org.opends.server.admin.TestChildCfgClient;
import org.opends.server.admin.TestChildCfgDefn;
@@ -61,7 +63,7 @@
@Test(singleThreaded = true)
public final class LDAPClientTest extends AdminTestCase {
    // Test LDIF.
    // @Checkstyle:off
    private static final String[] TEST_LDIF = new String[] {
        // Base entries.
        "dn: cn=config",
@@ -164,6 +166,7 @@
        "objectclass: ds-cfg-test-child-dummy", "cn: test child 1", "ds-cfg-enabled: true",
        "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
        "ds-cfg-attribute-type: description", "", };
    // @Checkstyle:on
    /**
     * Provide valid naming exception to client API exception mappings.
@@ -173,14 +176,14 @@
    @DataProvider(name = "createManagedObjectExceptions")
    public Object[][] createManagedObjectExceptions() {
        return new Object[][] {
            // result code corresponding to exception thrown, expected exception, expected code result
            // result code corresponding to exception thrown, expected
            // exception, expected code result
            { ResultCode.PROTOCOL_ERROR, ErrorResultException.class, ResultCode.PROTOCOL_ERROR },
            { ResultCode.UNAVAILABLE , ErrorResultException.class, ResultCode.UNAVAILABLE },
            { ResultCode.ENTRY_ALREADY_EXISTS, ManagedObjectAlreadyExistsException.class, null },
            { ResultCode.INSUFFICIENT_ACCESS_RIGHTS, ErrorResultException.class,
              ResultCode.INSUFFICIENT_ACCESS_RIGHTS },
            { ResultCode.UNWILLING_TO_PERFORM, OperationRejectedException.class, null }
        };
            { ResultCode.UNWILLING_TO_PERFORM, OperationRejectedException.class, null } };
    }
    /**
@@ -191,24 +194,21 @@
    @DataProvider(name = "getManagedObjectExceptions")
    public Object[][] getManagedObjectExceptions() {
        return new Object[][] {
            // result code corresponding to exception thrown, expected exception, expected code result
            // result code corresponding to exception thrown, expected
            // exception, expected code result
            { ResultCode.PROTOCOL_ERROR, ErrorResultException.class, ResultCode.PROTOCOL_ERROR },
            { ResultCode.UNAVAILABLE, ErrorResultException.class, ResultCode.UNAVAILABLE },
            { ResultCode.NO_SUCH_OBJECT, ManagedObjectNotFoundException.class, null },
            { ResultCode.INSUFFICIENT_ACCESS_RIGHTS, ErrorResultException.class,
              ResultCode.INSUFFICIENT_ACCESS_RIGHTS },
            { ResultCode.UNWILLING_TO_PERFORM, ErrorResultException.class,
              ResultCode.UNWILLING_TO_PERFORM }
        };
            { ResultCode.UNWILLING_TO_PERFORM, ErrorResultException.class, ResultCode.UNWILLING_TO_PERFORM } };
    }
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
        TestCfg.setUp();
    }
    @AfterClass
    public void tearDown() {
        TestCfg.cleanup();
@@ -222,7 +222,8 @@
     */
    @Test
    public void testCreateChildManagedObject() throws Exception {
        CreateEntryMockLDAPConnection c = new CreateEntryMockLDAPConnection(
        CreateEntryMockLDAPConnection c =
            new CreateEntryMockLDAPConnection(
                "cn=test child new,cn=test children,cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        c.addExpectedAttribute("cn", "test child new");
@@ -232,7 +233,9 @@
                "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        c.addExpectedAttribute("ds-cfg-attribute-type", "description");
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
        child.setMandatoryBooleanProperty(true);
@@ -258,7 +261,9 @@
        };
        conn.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(conn);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(conn, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        try {
            TestParentCfgClient parent = createTestParent(ctx, "test parent new");
            parent.setMandatoryBooleanProperty(true);
@@ -282,17 +287,18 @@
     */
    @Test
    public void testCreateTopLevelManagedObject() throws Exception {
        CreateEntryMockLDAPConnection c = new CreateEntryMockLDAPConnection(
                "cn=test parent new,cn=test parents,cn=config");
        CreateEntryMockLDAPConnection c =
            new CreateEntryMockLDAPConnection("cn=test parent new,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        c.addExpectedAttribute("cn", "test parent new");
        c.addExpectedAttribute("objectClass", "top", "ds-cfg-test-parent-dummy");
        c.addExpectedAttribute("ds-cfg-enabled", "true");
        c.addExpectedAttribute("ds-cfg-java-class",
                "org.opends.server.extensions.SomeVirtualAttributeProvider");
        c.addExpectedAttribute("ds-cfg-java-class", "org.opends.server.extensions.SomeVirtualAttributeProvider");
        c.addExpectedAttribute("ds-cfg-attribute-type", "description");
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = createTestParent(ctx, "test parent new");
        parent.setMandatoryBooleanProperty(true);
        parent.setMandatoryReadOnlyAttributeTypeProperty(DirectoryServer.getAttributeType("description"));
@@ -310,7 +316,9 @@
    public void testGetChildManagedObject() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 3");
        Assert.assertEquals(child.isMandatoryBooleanProperty(), Boolean.TRUE);
@@ -334,7 +342,9 @@
    public void testGetChildManagedObjectDefault() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 1");
        Assert.assertEquals(child.isMandatoryBooleanProperty(), Boolean.TRUE);
@@ -370,7 +380,9 @@
        };
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        try {
            getTestParent(ctx, "test parent 2");
        } catch (Exception e) {
@@ -393,7 +405,9 @@
    public void testGetTopLevelManagedObject() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 2");
        Assert.assertEquals(parent.isMandatoryBooleanProperty(), Boolean.TRUE);
        Assert.assertEquals(parent.getMandatoryClassProperty(),
@@ -414,7 +428,9 @@
    public void testGetTopLevelManagedObjectDefault() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        Assert.assertEquals(parent.isMandatoryBooleanProperty(), Boolean.TRUE);
        Assert.assertEquals(parent.getMandatoryClassProperty(),
@@ -433,7 +449,8 @@
     */
    @Test
    public void testInheritedDefaultValues1() throws Exception {
        CreateEntryMockLDAPConnection c = new CreateEntryMockLDAPConnection(
        CreateEntryMockLDAPConnection c =
            new CreateEntryMockLDAPConnection(
                "cn=test child new,cn=test children,cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        c.addExpectedAttribute("cn", "test child new");
@@ -443,7 +460,9 @@
                "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        c.addExpectedAttribute("ds-cfg-attribute-type", "description");
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
@@ -473,7 +492,8 @@
     */
    @Test
    public void testInheritedDefaultValues2() throws Exception {
        CreateEntryMockLDAPConnection c = new CreateEntryMockLDAPConnection(
        CreateEntryMockLDAPConnection c =
            new CreateEntryMockLDAPConnection(
                "cn=test child new,cn=test children,cn=test parent 2,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        c.addExpectedAttribute("cn", "test child new");
@@ -483,7 +503,9 @@
                "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        c.addExpectedAttribute("ds-cfg-attribute-type", "description");
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 2");
        TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
@@ -515,7 +537,9 @@
    public void testListChildManagedObjects() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        String[] actual = parent.listTestChildren();
        String[] expected = new String[] { "test child 1", "test child 2", "test child 3" };
@@ -532,7 +556,9 @@
    public void testListChildManagedObjectsEmpty() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 3");
        String[] actual = parent.listTestChildren();
        String[] expected = new String[] {};
@@ -549,7 +575,9 @@
    public void testListTopLevelManagedObjects() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        String[] actual = listTestParents(ctx);
        String[] expected = new String[] { "test parent 1", "test parent 2", "test parent 3" };
        Assert.assertEqualsNoOrder(actual, expected);
@@ -564,7 +592,9 @@
    @Test
    public void testListTopLevelManagedObjectsEmpty() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        String[] actual = listTestParents(ctx);
        String[] expected = new String[] {};
        Assert.assertEqualsNoOrder(actual, expected);
@@ -578,11 +608,14 @@
     */
    @Test
    public void testModifyChildManagedObjectResetToDefault() throws Exception {
        ModifyEntryMockLDAPConnection c = new ModifyEntryMockLDAPConnection(
        ModifyEntryMockLDAPConnection c =
            new ModifyEntryMockLDAPConnection(
                "cn=test child 2,cn=test children,cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        c.addExpectedModification("ds-cfg-base-dn");
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 2");
        child.setOptionalMultiValuedDNProperty1(Collections.<DN> emptySet());
@@ -598,10 +631,12 @@
     */
    @Test
    public void testModifyTopLevelManagedObjectNoChanges() throws Exception {
        ModifyEntryMockLDAPConnection c = new ModifyEntryMockLDAPConnection(
                "cn=test parent 1,cn=test parents,cn=config");
        ModifyEntryMockLDAPConnection c =
            new ModifyEntryMockLDAPConnection("cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        parent.commit();
        Assert.assertFalse(c.isEntryModified());
@@ -615,12 +650,14 @@
     */
    @Test
    public void testModifyTopLevelManagedObjectWithChanges() throws Exception {
        ModifyEntryMockLDAPConnection c = new ModifyEntryMockLDAPConnection(
                "cn=test parent 1,cn=test parents,cn=config");
        ModifyEntryMockLDAPConnection c =
            new ModifyEntryMockLDAPConnection("cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        c.addExpectedModification("ds-cfg-enabled", "false");
        c.addExpectedModification("ds-cfg-base-dn", "dc=mod1,dc=com", "dc=mod2,dc=com");
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        parent.setMandatoryBooleanProperty(false);
        parent.setOptionalMultiValuedDNProperty(Arrays.asList(DN.valueOf("dc=mod1,dc=com"),
@@ -637,10 +674,13 @@
     */
    @Test
    public void testRemoveChildManagedObject() throws Exception {
        DeleteSubtreeMockLDAPConnection c = new DeleteSubtreeMockLDAPConnection(
        DeleteSubtreeMockLDAPConnection c =
            new DeleteSubtreeMockLDAPConnection(
                "cn=test child 1,cn=test children,cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        parent.removeTestChild("test child 1");
        c.assertSubtreeIsDeleted();
@@ -654,10 +694,12 @@
     */
    @Test
    public void testRemoveTopLevelManagedObject() throws Exception {
        DeleteSubtreeMockLDAPConnection c = new DeleteSubtreeMockLDAPConnection(
                "cn=test parent 1,cn=test parents,cn=config");
        DeleteSubtreeMockLDAPConnection c =
            new DeleteSubtreeMockLDAPConnection("cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        removeTestParent(ctx, "test parent 1");
        c.assertSubtreeIsDeleted();
    }
@@ -675,7 +717,8 @@
        TestCfg.addConstraint(constraint);
        try {
            CreateEntryMockLDAPConnection c = new CreateEntryMockLDAPConnection(
            CreateEntryMockLDAPConnection c =
                new CreateEntryMockLDAPConnection(
                    "cn=test child new,cn=test children,cn=test parent 1,cn=test parents,cn=config");
            c.importLDIF(TEST_LDIF);
            c.addExpectedAttribute("cn", "test child new");
@@ -685,7 +728,9 @@
                    "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
            c.addExpectedAttribute("ds-cfg-attribute-type", "description");
            ManagementContext ctx = LDAPManagementContext.createFromContext(c);
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                    PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
            child.setMandatoryBooleanProperty(true);
@@ -712,7 +757,8 @@
        TestCfg.addConstraint(constraint);
        try {
            CreateEntryMockLDAPConnection conn = new CreateEntryMockLDAPConnection(
            CreateEntryMockLDAPConnection conn =
                new CreateEntryMockLDAPConnection(
                    "cn=test child new,cn=test children,cn=test parent 1,cn=test parents,cn=config");
            conn.importLDIF(TEST_LDIF);
            conn.addExpectedAttribute("cn", "test child new");
@@ -722,7 +768,9 @@
                    "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
            conn.addExpectedAttribute("ds-cfg-attribute-type", "description");
            ManagementContext ctx = LDAPManagementContext.createFromContext(conn);
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(conn, LDAPProfile.getInstance(),
                    PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
            child.setMandatoryBooleanProperty(true);
@@ -748,10 +796,13 @@
        TestCfg.addConstraint(constraint);
        try {
            DeleteSubtreeMockLDAPConnection c = new DeleteSubtreeMockLDAPConnection(
            DeleteSubtreeMockLDAPConnection c =
                new DeleteSubtreeMockLDAPConnection(
                    "cn=test child 1,cn=test children,cn=test parent 1,cn=test parents,cn=config");
            c.importLDIF(TEST_LDIF);
            ManagementContext ctx = LDAPManagementContext.createFromContext(c);
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                    PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            parent.removeTestChild("test child 1");
            c.assertSubtreeIsDeleted();
@@ -774,10 +825,13 @@
        TestCfg.addConstraint(constraint);
        try {
            DeleteSubtreeMockLDAPConnection c = new DeleteSubtreeMockLDAPConnection(
            DeleteSubtreeMockLDAPConnection c =
                new DeleteSubtreeMockLDAPConnection(
                    "cn=test child 1,cn=test children,cn=test parent 1,cn=test parents,cn=config");
            c.importLDIF(TEST_LDIF);
            ManagementContext ctx = LDAPManagementContext.createFromContext(c);
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                    PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            parent.removeTestChild("test child 1");
            Assert.fail("The remove constraint failed to prevent removal of the managed object");
@@ -800,11 +854,14 @@
        TestCfg.addConstraint(constraint);
        try {
            ModifyEntryMockLDAPConnection c = new ModifyEntryMockLDAPConnection(
            ModifyEntryMockLDAPConnection c =
                new ModifyEntryMockLDAPConnection(
                    "cn=test child 2,cn=test children,cn=test parent 1,cn=test parents,cn=config");
            c.importLDIF(TEST_LDIF);
            c.addExpectedModification("ds-cfg-base-dn");
            ManagementContext ctx = LDAPManagementContext.createFromContext(c);
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                    PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            TestChildCfgClient child = parent.getTestChild("test child 2");
            child.setOptionalMultiValuedDNProperty1(Collections.<DN> emptySet());
@@ -829,11 +886,14 @@
        TestCfg.addConstraint(constraint);
        try {
            ModifyEntryMockLDAPConnection c = new ModifyEntryMockLDAPConnection(
            ModifyEntryMockLDAPConnection c =
                new ModifyEntryMockLDAPConnection(
                    "cn=test child 2,cn=test children,cn=test parent 1,cn=test parents,cn=config");
            c.importLDIF(TEST_LDIF);
            c.addExpectedModification("ds-cfg-base-dn");
            ManagementContext ctx = LDAPManagementContext.createFromContext(c);
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                    PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            TestChildCfgClient child = parent.getTestChild("test child 2");
            child.setOptionalMultiValuedDNProperty1(Collections.<DN> emptySet());
@@ -857,16 +917,14 @@
    }
    // Create the named test parent managed object.
    private TestParentCfgClient createTestParent(ManagementContext context, String name)
            throws Exception {
    private TestParentCfgClient createTestParent(ManagementContext context, String name) throws Exception {
        ManagedObject<RootCfgClient> root = context.getRootConfigurationManagedObject();
        return root.createChild(TestCfg.getTestOneToManyParentRelationDefinition(), TestParentCfgDefn.getInstance(),
                name, null).getConfiguration();
    }
    // Retrieve the named test parent managed object.
    private TestParentCfgClient getTestParent(ManagementContext context, String name)
            throws Exception {
    private TestParentCfgClient getTestParent(ManagementContext context, String name) throws Exception {
        ManagedObject<RootCfgClient> root = context.getRootConfigurationManagedObject();
        return root.getChild(TestCfg.getTestOneToManyParentRelationDefinition(), name).getConfiguration();
    }
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/server/AggregationServerTest.java
@@ -49,6 +49,7 @@
import org.opends.server.admin.AdministratorAction;
import org.opends.server.admin.AggregationPropertyDefinition;
import org.opends.server.admin.IllegalPropertyValueStringException;
import org.opends.server.admin.PropertyDefinitionsOptions;
import org.opends.server.admin.PropertyException;
import org.opends.server.admin.PropertyOption;
import org.opends.server.admin.TestCfg;
@@ -104,11 +105,13 @@
        }
    }
    // @Checkstyle:off
    private static final Entry TEST_CHILD_1 = makeEntry(
        "dn: cn=test child 1,cn=test children,cn=test parent 1,cn=test parents,cn=config",
        "objectclass: top",
        "objectclass: ds-cfg-test-child-dummy",
        "cn: test child 1", "ds-cfg-enabled: true",
        "cn: test child 1",
        "ds-cfg-enabled: true",
        "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
        "ds-cfg-attribute-type: description",
        "ds-cfg-conflict-behavior: virtual-overrides-real");
@@ -117,7 +120,8 @@
        "dn: cn=test child 2,cn=test children,cn=test parent 1,cn=test parents,cn=config",
        "objectclass: top",
        "objectclass: ds-cfg-test-child-dummy",
        "cn: test child 2", "ds-cfg-enabled: true",
        "cn: test child 2",
        "ds-cfg-enabled: true",
        "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
        "ds-cfg-attribute-type: description",
        "ds-cfg-conflict-behavior: virtual-overrides-real",
@@ -151,7 +155,8 @@
        "objectclass: ds-cfg-test-child-dummy",
        "cn: test child 5", "ds-cfg-enabled: true",
        "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
        "ds-cfg-attribute-type: description", "ds-cfg-conflict-behavior: virtual-overrides-real",
        "ds-cfg-attribute-type: description",
        "ds-cfg-conflict-behavior: virtual-overrides-real",
        "ds-cfg-rotation-policy: cn=BAD Connection Handler 1, cn=connection handlers, cn=config",
        "ds-cfg-rotation-policy: cn=BAD Connection Handler 2, cn=connection handlers, cn=config",
        "ds-cfg-rotation-policy: cn=LDAP Connection Handler, cn=connection handlers, cn=config");
@@ -162,7 +167,8 @@
        "objectclass: ds-cfg-test-child-dummy",
        "cn: test child 6", "ds-cfg-enabled: true",
        "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
        "ds-cfg-attribute-type: description", "ds-cfg-conflict-behavior: virtual-overrides-real",
        "ds-cfg-attribute-type: description",
        "ds-cfg-conflict-behavior: virtual-overrides-real",
        "ds-cfg-rotation-policy: cn=Test Connection Handler, cn=connection handlers, cn=config");
    private static final Entry TEST_CHILD_7 = makeEntry(
@@ -218,6 +224,7 @@
        "ds-cfg-java-class: org.opends.server.protocols.ldap.LDAPConnectionHandler",
        "ds-cfg-enabled: true",
        "ds-cfg-listen-address: 0.0.0.0", "ds-cfg-listen-port: 389");
    // @Checkstyle:on
    // @Checkstyle:off
    /**
@@ -240,13 +247,12 @@
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
        TestCfg.setUp();
        // Save the aggregation property definition so that it can be
        // replaced and restored later.
        aggregationPropertyDefinitionDefault = TestChildCfgDefn.getInstance()
                .getAggregationPropertyPropertyDefinition();
        aggregationPropertyDefinitionDefault =
            TestChildCfgDefn.getInstance().getAggregationPropertyPropertyDefinition();
        // Create the two test aggregation properties.
        AggregationPropertyDefinition.Builder<ConnectionHandlerCfgClient, ConnectionHandlerCfg> builder;
@@ -289,9 +295,10 @@
     */
    @Test
    public void testAggregationBadBaseDN() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_3,
            LDAP_CONN_HANDLER_ENTRY);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_3, LDAP_CONN_HANDLER_ENTRY);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        try {
            parentCfg.getTestChild(entryName(TEST_CHILD_3));
@@ -315,9 +322,10 @@
     */
    @Test
    public void testAggregationDanglingReference() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(
            TEST_PARENT_1, TEST_CHILD_5, LDAP_CONN_HANDLER_ENTRY);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_5, LDAP_CONN_HANDLER_ENTRY);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        try {
@@ -337,9 +345,10 @@
     */
    @Test
    public void testAggregationDisabledReference1() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(
                TEST_PARENT_1, TEST_CHILD_6, TEST_CONNECTION_HANDLER_ENTRY_DISABLED);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_6, TEST_CONNECTION_HANDLER_ENTRY_DISABLED);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        registerAggregationDefinitionWithTargetEnabled();
@@ -363,9 +372,10 @@
     */
    @Test
    public void testAggregationDisabledReference2() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(
                TEST_PARENT_1, TEST_CHILD_7, TEST_CONNECTION_HANDLER_ENTRY_DISABLED);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_7, TEST_CONNECTION_HANDLER_ENTRY_DISABLED);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        registerAggregationDefinitionWithTargetEnabled();
@@ -390,9 +400,10 @@
     */
    @Test
    public void testAggregationDisabledReference3() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(
                TEST_PARENT_1, TEST_CHILD_6, TEST_CONNECTION_HANDLER_ENTRY_DISABLED);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_6, TEST_CONNECTION_HANDLER_ENTRY_DISABLED);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        registerAggregationDefinitionWithTargetAndSourceEnabled();
@@ -416,9 +427,10 @@
     */
    @Test
    public void testAggregationDisabledReference4() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(
                TEST_PARENT_1, TEST_CHILD_7, TEST_CONNECTION_HANDLER_ENTRY_DISABLED);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_7, TEST_CONNECTION_HANDLER_ENTRY_DISABLED);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        registerAggregationDefinitionWithTargetAndSourceEnabled();
@@ -437,14 +449,15 @@
    @Test
    public void testAggregationEmpty() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_1);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        TestChildCfg testChildCfg = parentCfg.getTestChild(entryName(TEST_CHILD_1));
        assertEquals(testChildCfg.getMandatoryClassProperty(),
                "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        assertEquals(testChildCfg.getMandatoryReadOnlyAttributeTypeProperty(),
                Schema.getDefaultSchema().getAttributeType("description"));
        assertEquals(testChildCfg.getMandatoryReadOnlyAttributeTypeProperty(), Schema.getDefaultSchema()
            .getAttributeType("description"));
        assertSetEquals(testChildCfg.getAggregationProperty(), new String[0]);
    }
@@ -454,18 +467,19 @@
     */
    @Test
    public void testAggregationMultipleValues() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_4,
            LDAP_CONN_HANDLER_ENTRY, LDAPS_CONN_HANDLER_ENTRY);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_4, LDAP_CONN_HANDLER_ENTRY,
                LDAPS_CONN_HANDLER_ENTRY);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        TestChildCfg testChildCfg = parentCfg.getTestChild(entryName(TEST_CHILD_4));
        assertEquals(testChildCfg.getMandatoryClassProperty(),
                "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        assertEquals(testChildCfg.getMandatoryReadOnlyAttributeTypeProperty(),
                Schema.getDefaultSchema().getAttributeType("description"));
        assertSetEquals(testChildCfg.getAggregationProperty(),
                "LDAPS Connection Handler", "LDAP Connection Handler");
        assertEquals(testChildCfg.getMandatoryReadOnlyAttributeTypeProperty(), Schema.getDefaultSchema()
            .getAttributeType("description"));
        assertSetEquals(testChildCfg.getAggregationProperty(), "LDAPS Connection Handler", "LDAP Connection Handler");
    }
    /**
@@ -474,16 +488,17 @@
     */
    @Test
    public void testAggregationSingle() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_2,
                LDAP_CONN_HANDLER_ENTRY);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_2, LDAP_CONN_HANDLER_ENTRY);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        TestChildCfg testChildCfg = parentCfg.getTestChild(entryName(TEST_CHILD_2));
        assertEquals(testChildCfg.getMandatoryClassProperty(),
                "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        assertEquals(testChildCfg.getMandatoryReadOnlyAttributeTypeProperty(),
                Schema.getDefaultSchema().getAttributeType("description"));
        assertEquals(testChildCfg.getMandatoryReadOnlyAttributeTypeProperty(), Schema.getDefaultSchema()
            .getAttributeType("description"));
        // Test normalization.
        assertSetEquals(testChildCfg.getAggregationProperty(), "LDAP Connection Handler");
@@ -498,9 +513,11 @@
     */
    @Test
    public void testCannotDeleteReferencedComponent() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENTS, TEST_PARENT_1,
                TEST_BASE_CHILD, TEST_CHILD_7, CONN_HANDLER_ENTRY, TEST_CONNECTION_HANDLER_ENTRY_ENABLED);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENTS, TEST_PARENT_1, TEST_BASE_CHILD, TEST_CHILD_7,
                CONN_HANDLER_ENTRY, TEST_CONNECTION_HANDLER_ENTRY_ENABLED);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        registerAggregationDefinitionWithTargetEnabled();
@@ -518,9 +535,9 @@
                registeredListener.capture());
            // Now simulate the delete ofthe referenced connection handler.
            assertThat(registeredListener.getValue().
                    configDeleteIsAcceptable(TEST_CONNECTION_HANDLER_ENTRY_ENABLED, new LocalizableMessageBuilder())).
                    isFalse();
            assertThat(
                registeredListener.getValue().configDeleteIsAcceptable(TEST_CONNECTION_HANDLER_ENTRY_ENABLED,
                    new LocalizableMessageBuilder())).isFalse();
        } finally {
            putBackDefaultAggregationDefinitionFromTargetEnabled();
@@ -534,9 +551,11 @@
     */
    @Test
    public void testCannotDisableReferencedComponent() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENTS, TEST_PARENT_1,
                TEST_BASE_CHILD, TEST_CHILD_7, CONN_HANDLER_ENTRY, TEST_CONNECTION_HANDLER_ENTRY_ENABLED);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENTS, TEST_PARENT_1, TEST_BASE_CHILD, TEST_CHILD_7,
                CONN_HANDLER_ENTRY, TEST_CONNECTION_HANDLER_ENTRY_ENABLED);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        registerAggregationDefinitionWithTargetEnabled();
@@ -554,9 +573,9 @@
            verify(configRepository).registerChangeListener(eq(TEST_CHILD_7.getName()), registeredListener.capture());
            // Now simulate the disabling ofthe referenced connection handler.
            assertThat(registeredListener.getValue().
                configChangeIsAcceptable(TEST_CONNECTION_HANDLER_ENTRY_DISABLED, new LocalizableMessageBuilder())).
                isFalse();
            assertThat(
                registeredListener.getValue().configChangeIsAcceptable(TEST_CONNECTION_HANDLER_ENTRY_DISABLED,
                    new LocalizableMessageBuilder())).isFalse();
        } finally {
            putBackDefaultAggregationDefinitionFromTargetEnabled();
@@ -606,8 +625,8 @@
    /** Asserts that the actual set of DNs contains the expected values. */
    private void assertSetEquals(SortedSet<String> actual, String... expected) {
        SortedSet<String> values = new TreeSet<String>(TestChildCfgDefn.getInstance()
                .getAggregationPropertyPropertyDefinition());
        SortedSet<String> values =
            new TreeSet<String>(TestChildCfgDefn.getInstance().getAggregationPropertyPropertyDefinition());
        if (expected != null) {
            for (String value : expected) {
                values.add(value);
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/server/ConstraintTest.java
@@ -39,6 +39,7 @@
import org.forgerock.opendj.ldif.LDIF;
import org.mockito.ArgumentCaptor;
import org.opends.server.admin.AdminTestCase;
import org.opends.server.admin.PropertyDefinitionsOptions;
import org.opends.server.admin.TestCfg;
import org.opends.server.admin.TestChildCfg;
import org.opends.server.admin.TestChildCfgDefn;
@@ -98,21 +99,16 @@
    }
    // @Checkstyle:off
    private static final Entry TEST_CHILD_1 = LDIF.makeEntry(
        "dn: cn=test child 1,cn=test children,cn=test parent 1,cn=test parents,cn=config", "objectclass: top",
        "objectclass: ds-cfg-test-child-dummy", "cn: test child 1", "ds-cfg-enabled: true",
        "dn: cn=test child 1,cn=test children,cn=test parent 1,cn=test parents,cn=config",
        "objectclass: top",
        "objectclass: ds-cfg-test-child-dummy",
        "cn: test child 1",
        "ds-cfg-enabled: true",
        "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
        "ds-cfg-attribute-type: description", "ds-cfg-conflict-behavior: virtual-overrides-real");
    private static final Entry NEW_TEST_CHILD_1 = LDIF.makeEntry(
        "dn: cn=test child 1,cn=test children,cn=test parent 1,cn=test parents,cn=config", "objectclass: top",
        "objectclass: ds-cfg-test-child-dummy", "cn: test child 1", "ds-cfg-enabled: true",
        "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
        "ds-cfg-attribute-type: description", "ds-cfg-conflict-behavior: virtual-overrides-real",
        "ds-cfg-base-dn: dc=new value 1,dc=com",
        "ds-cfg-base-dn: dc=new value 2,dc=com",
        "ds-cfg-group-dn: dc=new value 3,dc=com",
        "ds-cfg-group-dn: dc=new value 4,dc=com");
        "ds-cfg-attribute-type: description",
        "ds-cfg-conflict-behavior: virtual-overrides-real");
    private static final Entry TEST_BASE_CHILD = LDIF.makeEntry(
        "dn:cn=test children,cn=test parent 1,cn=test parents,cn=config",
@@ -123,23 +119,19 @@
    // Parent 1 - uses default values for
    // optional-multi-valued-dn-property.
    private static final Entry TEST_PARENT_1 = LDIF.makeEntry(
        "dn: cn=test parent 1,cn=test parents,cn=config", "objectclass: top",
        "objectclass: ds-cfg-test-parent-dummy", "cn: test parent 1", "ds-cfg-enabled: true",
        "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
        "ds-cfg-attribute-type: description", "ds-cfg-conflict-behavior: virtual-overrides-real");
    private static final String[] TEST_LDIF = new String[] {
        // Base entries.
        "dn: cn=test parents,cn=config",
        "dn: cn=test parent 1,cn=test parents,cn=config",
        "objectclass: top",
        "objectclass: ds-cfg-branch",
        "cn: test parents",
        ""};
        "objectclass: ds-cfg-test-parent-dummy",
        "cn: test parent 1",
        "ds-cfg-enabled: true",
        "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
        "ds-cfg-attribute-type: description",
        "ds-cfg-conflict-behavior: virtual-overrides-real");
    // @Checkstyle:on
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
        TestCfg.setUp();
    }
@@ -152,9 +144,10 @@
    @Test
    public void testGetManagedObjectSuccess() throws Exception {
        // arrange
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_BASE_CHILD,
            TEST_CHILD_1);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_BASE_CHILD, TEST_CHILD_1);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        MockConstraint constraint = new MockConstraint(true, false, configRepository);
        try {
            TestCfg.addConstraint(constraint);
@@ -170,9 +163,10 @@
    @Test
    public void testGetManagedObjectFail() throws Exception {
        // arrange
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_BASE_CHILD,
                TEST_CHILD_1);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_BASE_CHILD, TEST_CHILD_1);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        MockConstraint constraint = new MockConstraint(false, true, configRepository);
        try {
            TestCfg.addConstraint(constraint);
@@ -206,9 +200,10 @@
    @Test(dataProvider = "constraintValues")
    public void testAddConstraint(boolean isUsableConstraint) throws Exception {
        // arrange
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_BASE_CHILD,
                TEST_CHILD_1);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_BASE_CHILD, TEST_CHILD_1);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        parentCfg.addTestChildAddListener(new AddListener());
        MockConstraint constraint = new MockConstraint(isUsableConstraint, false, configRepository);
@@ -228,9 +223,10 @@
    @Test(dataProvider = "constraintValues")
    public void testDeleteConstraint(boolean isDeleteAllowedConstraint) throws Exception {
        // arrange
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_BASE_CHILD,
                TEST_CHILD_1);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_BASE_CHILD, TEST_CHILD_1);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        parentCfg.addTestChildDeleteListener(new DeleteListener());
        MockConstraint constraint = new MockConstraint(false, isDeleteAllowedConstraint, configRepository);
@@ -250,9 +246,10 @@
    @Test(dataProvider = "constraintValues")
    public void testChangeConstraint(boolean isUsableConstraint) throws Exception {
        // arrange
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_BASE_CHILD,
                TEST_CHILD_1);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_BASE_CHILD, TEST_CHILD_1);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        MockConstraint constraint = new MockConstraint(isUsableConstraint, false, configRepository);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        TestChildCfg childCfg = parentCfg.getTestChild(entryName(TEST_CHILD_1));
@@ -274,7 +271,9 @@
    }
    /**
     * Simulate an entry add by triggering configAddIsAcceptable method of last registered add listener.
     * Simulate an entry add by triggering configAddIsAcceptable method of last
     * registered add listener.
     *
     * @return true if add is acceptable, false otherwise.
     */
    private boolean simulateEntryAdd(Entry entry, ConfigurationRepository configRepository) throws IOException {
@@ -286,7 +285,9 @@
    }
    /**
     * Simulate an entry delete by triggering configDeleteIsAcceptable method of last registered add listener.
     * Simulate an entry delete by triggering configDeleteIsAcceptable method of
     * last registered add listener.
     *
     * @return true if delete is acceptable, false otherwise.
     */
    private boolean simulateEntryDelete(Entry entry, ConfigurationRepository configRepository) throws IOException {
@@ -298,7 +299,9 @@
    }
    /**
     * Simulate an entry change by triggering configChangeIsAcceptable method on last registered change listener.
     * Simulate an entry change by triggering configChangeIsAcceptable method on
     * last registered change listener.
     *
     * @return true if change is acceptable, false otherwise.
     */
    private boolean simulateEntryChange(Entry newEntry, ConfigurationRepository configRepository) {
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/server/DNBuilderTest.java
@@ -47,7 +47,6 @@
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
        TestCfg.setUp();
    }
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/server/DefaultBehaviorTest.java
@@ -44,6 +44,7 @@
import org.forgerock.opendj.ldap.schema.Schema;
import org.mockito.ArgumentCaptor;
import org.opends.server.admin.AdminTestCase;
import org.opends.server.admin.PropertyDefinitionsOptions;
import org.opends.server.admin.TestCfg;
import org.opends.server.admin.TestChildCfg;
import org.opends.server.admin.TestParentCfg;
@@ -107,6 +108,7 @@
        }
    }
    // @Checkstyle:off
    static final Entry CONFIG = makeEntry(
        "dn: cn=config",
        "objectClass: top",
@@ -219,9 +221,10 @@
        "ds-cfg-attribute-type: description",
        "ds-cfg-conflict-behavior: virtual-overrides-real");
    // @Checkstyle:on
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
        TestCfg.setUp();
    }
@@ -250,20 +253,21 @@
            { TEST_PARENT_2, TEST_CHILD_BASE_2, TEST_CHILD_4,
              Arrays.asList("dc=default value p2v1,dc=com", "dc=default value p2v2,dc=com"),
              Arrays.asList("dc=default value p2v1,dc=com", "dc=default value p2v2,dc=com") }
        };
                Arrays.asList("dc=default value p2v1,dc=com", "dc=default value p2v2,dc=com") } };
    }
    /**
     * Test that a child config have correct values when accessed from its parent config.
     * Test that a child config have correct values when accessed from its
     * parent config.
     */
    @Test(dataProvider = "childConfigurationsValues")
    public void testChildValues(Entry testParent, Entry testBaseChild, Entry testChild,
            List<String> valuesForOptionalDNProperty1, List<String> valuesForOptionalDNProperty2) throws Exception {
        // arrange
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(
                testParent, testBaseChild, testChild);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(testParent, testBaseChild, testChild);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfg parentCfg = getParentCfg(testParent, context);
        // assert
@@ -272,15 +276,17 @@
    }
    /**
     * Test that a child config have correct values when accessed through an add listener.
     * Test that a child config have correct values when accessed through an add
     * listener.
     */
    @Test(dataProvider = "childConfigurationsValues")
    public void testAddListenerChildValues(Entry testParent, Entry testBaseChild, Entry testChild,
            List<String> valuesForOptionalDNProperty1, List<String> valuesForOptionalDNProperty2) throws Exception {
        // arrange
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(
                testParent, testBaseChild, testChild);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(testParent, testBaseChild, testChild);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfg parentCfg = getParentCfg(testParent, context);
        TestConfigurationAddListener addListener = new TestConfigurationAddListener();
        parentCfg.addTestChildAddListener(addListener);
@@ -296,7 +302,8 @@
    @DataProvider
    Object[][] childConfigurationsValuesForChangeListener() {
        return new Object[][] {
            // new entry after change, expected first dn property values, expected second dn property values
            // new entry after change, expected first dn property values,
            // expected second dn property values
            { makeEntryFrom(LDIF_TEST_CHILD_1, NEW_ATTRS_1),
              Arrays.asList("dc=new value 1,dc=com", "dc=new value 2,dc=com"),
              Arrays.asList("dc=new value 3,dc=com", "dc=new value 4,dc=com") },
@@ -311,21 +318,22 @@
            { makeEntryFrom(LDIF_TEST_PARENT_1, NEW_ATTRS_2),
              Arrays.asList("dc=new value 1,dc=com", "dc=new value 2,dc=com"),
              Arrays.asList("dc=new value 1,dc=com", "dc=new value 2,dc=com") }
        };
                Arrays.asList("dc=new value 1,dc=com", "dc=new value 2,dc=com") } };
    }
    /**
     * Tests that a child config have correct values when accessed through an change listener.
     * The defaulted properties are replaced with some real values.
     * Tests that a child config have correct values when accessed through an
     * change listener. The defaulted properties are replaced with some real
     * values.
     */
    @Test(dataProvider = "childConfigurationsValuesForChangeListener")
    public void testChangeListenerChildValues(Entry newEntry, List<String> valuesForOptionalDNProperty1,
            List<String> valuesForOptionalDNProperty2) throws Exception {
        // arrange
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(
                TEST_PARENT_1, TEST_CHILD_BASE_1, TEST_CHILD_1);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_BASE_1, TEST_CHILD_1);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        TestChildCfg childCfg = parentCfg.getTestChild(entryName(TEST_CHILD_1));
        TestConfigurationChangeListener changeListener = new TestConfigurationChangeListener();
@@ -335,17 +343,17 @@
        simulateEntryChange(newEntry, configRepository);
        // assert
        assertChildHasCorrectValues(changeListener.getChildCfg(entryName(TEST_CHILD_1)), valuesForOptionalDNProperty1,
            valuesForOptionalDNProperty2);
        assertChildHasCorrectValues(changeListener.getChildCfg(entryName(TEST_CHILD_1)),
            valuesForOptionalDNProperty1, valuesForOptionalDNProperty2);
    }
    @DataProvider
    Object[][] parentConfigurationsValues() {
        return new Object[][] {
            // parent entry, expected first dn property values, expected second dn property values
            // parent entry, expected first dn property values, expected second
            // dn property values
            { TEST_PARENT_1, Arrays.asList("dc=domain1,dc=com", "dc=domain2,dc=com", "dc=domain3,dc=com") },
            { TEST_PARENT_2, Arrays.asList("dc=default value p2v1,dc=com", "dc=default value p2v2,dc=com") }
        };
            { TEST_PARENT_2, Arrays.asList("dc=default value p2v1,dc=com", "dc=default value p2v2,dc=com") } };
    }
    /**
@@ -354,7 +362,8 @@
    @Test(dataProvider = "parentConfigurationsValues")
    public void testParentValues(Entry parentEntry, List<String> valuesForOptionalDNProperty) throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(parentEntry);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        TestParentCfg parent = getParentCfg(parentEntry, context);
        assertThat(parent.getMandatoryClassProperty()).isEqualTo(
@@ -364,10 +373,9 @@
        assertDNSetEquals(parent.getOptionalMultiValuedDNProperty(), valuesForOptionalDNProperty);
    }
    /**
     * Simulate an entry add by triggering configAddIsAcceptable method of last registered add listener.
     * Simulate an entry add by triggering configAddIsAcceptable method of last
     * registered add listener.
     */
    private void simulateEntryAdd(Entry entry, ConfigurationRepository configRepository) throws IOException {
        // use argument capture to retrieve the actual listener
@@ -378,7 +386,8 @@
    }
    /**
     * Simulate an entry change by triggering configChangeIsAcceptable method on last registered change listener.
     * Simulate an entry change by triggering configChangeIsAcceptable method on
     * last registered change listener.
     */
    private void simulateEntryChange(Entry newEntry, ConfigurationRepository configRepository) {
        // use argument capture to retrieve the actual listener
opendj-sdk/opendj-admin/src/test/java/org/opends/server/admin/server/ListenerTest.java
@@ -36,6 +36,7 @@
import org.forgerock.opendj.ldap.Entry;
import org.mockito.ArgumentCaptor;
import org.opends.server.admin.AdminTestCase;
import org.opends.server.admin.PropertyDefinitionsOptions;
import org.opends.server.admin.TestCfg;
import org.opends.server.admin.TestParentCfg;
import org.opends.server.api.ConfigAddListener;
@@ -47,7 +48,6 @@
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@SuppressWarnings({ "javadoc", "rawtypes", "unchecked" })
public class ListenerTest extends AdminTestCase {
@@ -56,7 +56,6 @@
    @BeforeClass
    public void setUp() throws Exception {
        disableClassValidationForProperties();
        TestCfg.setUp();
    }
@@ -66,10 +65,7 @@
    }
    private Entry getTestParentEntry() throws Exception {
        return makeEntry(
            "dn: cn=test parents,cn=config",
            "objectclass: top",
            "objectclass: ds-cfg-branch",
        return makeEntry("dn: cn=test parents,cn=config", "objectclass: top", "objectclass: ds-cfg-branch",
            "cn: test parents");
    }
@@ -84,10 +80,12 @@
        return configRepository;
    }
    /** Register a listener for test parent entry and return the actual registered listener */
    /**
     * Register a listener for test parent entry and return the actual
     * registered listener
     */
    private ConfigAddListener registerAddListenerForTestParent(ConfigurationRepository configRepository,
            ServerManagedObject<RootCfg> root, ConfigurationAddListener<TestParentCfg> parentListener)
            throws Exception {
        ServerManagedObject<RootCfg> root, ConfigurationAddListener<TestParentCfg> parentListener) throws Exception {
        root.registerAddListener(TestCfg.getTestOneToManyParentRelationDefinition(), parentListener);
        ArgumentCaptor<ConfigAddListener> registered = ArgumentCaptor.forClass(ConfigAddListener.class);
@@ -95,10 +93,13 @@
        return registered.getValue();
    }
    /** Register a listener for test parent entry in delayed scenario and return the actual registered listener */
    private DelayedConfigAddListener registerAddListenerForTestParentDelayed(ConfigurationRepository configRepository,
            ServerManagedObject<RootCfg> root, ConfigurationAddListener<TestParentCfg> parentListener)
            throws Exception {
    /**
     * Register a listener for test parent entry in delayed scenario and return
     * the actual registered listener
     */
    private DelayedConfigAddListener registerAddListenerForTestParentDelayed(
        ConfigurationRepository configRepository, ServerManagedObject<RootCfg> root,
        ConfigurationAddListener<TestParentCfg> parentListener) throws Exception {
        root.registerAddListener(TestCfg.getTestOneToManyParentRelationDefinition(), parentListener);
        ArgumentCaptor<DelayedConfigAddListener> registered = ArgumentCaptor.forClass(DelayedConfigAddListener.class);
@@ -109,20 +110,21 @@
    @Test
    public void testRegisterAddListenerWithInstantiableRelationImmediate() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN, TEST_PARENTS_DN);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        root.registerAddListener(TestCfg.getTestOneToManyParentRelationDefinition(),
                mock(ConfigurationAddListener.class));
        verify(configRepository).registerAddListener(eq(TEST_PARENTS_DN),
                isA(ConfigAddListener.class));
        verify(configRepository).registerAddListener(eq(TEST_PARENTS_DN), isA(ConfigAddListener.class));
    }
    @Test
    public void testRegisterAddListenerWithInstantiableRelationDelayed() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        ConfigurationAddListener<TestParentCfg> parentListener = mock(ConfigurationAddListener.class);
@@ -141,7 +143,8 @@
    @Test
    public void testRegisterAddListenerWithInstantiableRelationDelayedThenActualized() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        // register a listener to root
@@ -157,7 +160,8 @@
        when(configRepository.hasEntry(DN.valueOf(parentDN))).thenReturn(true);
        registered.getValue().applyConfigurationAdd(getTestParentEntry());
        // check that listener is added for target entry and deleted for its parent entry
        // check that listener is added for target entry and deleted for its
        // parent entry
        ConfigAddListenerAdaptor listener =
                (ConfigAddListenerAdaptor<?>) registered.getValue().getDelayedAddListener();
        verify(configRepository).registerAddListener(DN.valueOf(parentDN), listener);
@@ -167,33 +171,34 @@
    @Test
    public void testRegisterAddListenerWithOptionalRelation() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        root.registerAddListener(TestCfg.getTestOneToZeroOrOneParentRelationDefinition(),
            mock(ConfigurationAddListener.class));
        verify(configRepository).registerAddListener(eq(ROOT_CONFIG_DN),
                isA(ConfigAddListener.class));
        verify(configRepository).registerAddListener(eq(ROOT_CONFIG_DN), isA(ConfigAddListener.class));
    }
    @Test
    public void testRegisterDeleteListenerWithInstantiableRelationImmediate() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN, TEST_PARENTS_DN);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        root.registerDeleteListener(TestCfg.getTestOneToManyParentRelationDefinition(),
                mock(ConfigurationDeleteListener.class));
        verify(configRepository).registerDeleteListener(eq(TEST_PARENTS_DN),
                isA(ConfigDeleteListener.class));
        verify(configRepository).registerDeleteListener(eq(TEST_PARENTS_DN), isA(ConfigDeleteListener.class));
    }
    @Test
    public void testRegisterDeleteListenerWithInstantiableRelationDelayed() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        ConfigurationDeleteListener<TestParentCfg> parentListener = mock(ConfigurationDeleteListener.class);
@@ -212,34 +217,35 @@
    @Test
    public void testRegisterDeleteListenerWithOptionalRelation() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        root.registerDeleteListener(TestCfg.getTestOneToZeroOrOneParentRelationDefinition(),
                mock(ConfigurationDeleteListener.class));
        verify(configRepository).registerDeleteListener(eq(ROOT_CONFIG_DN),
                isA(ConfigDeleteListener.class));
        verify(configRepository).registerDeleteListener(eq(ROOT_CONFIG_DN), isA(ConfigDeleteListener.class));
    }
    @Test
    public void testRegisterChangeListener() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        root.setConfigDN(ROOT_CONFIG_DN);
        root.registerChangeListener(mock(ConfigurationChangeListener.class));
        verify(configRepository).registerChangeListener(eq(ROOT_CONFIG_DN),
                isA(ConfigChangeListener.class));
        verify(configRepository).registerChangeListener(eq(ROOT_CONFIG_DN), isA(ConfigChangeListener.class));
    }
    @Test
    public void testDeregisterAddListenerWithInstantiableRelationImmediate() throws Exception {
        // arrange
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN, TEST_PARENTS_DN);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        ConfigurationAddListener<TestParentCfg> parentListener = mock(ConfigurationAddListener.class);
@@ -258,7 +264,8 @@
    public void testDeregisterAddListenerWithInstantiableRelationDelayed() throws Exception {
        // arrange
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN);
        ServerManagementContext context = new ServerManagementContext(configRepository);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        ConfigurationAddListener<TestParentCfg> parentListener = mock(ConfigurationAddListener.class);