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

Matthew Swift
05.45.2014 e0e6d30a905e47931a89b7e9063d752a6f28106d
OPENDJ-1235: Migrate configuration framework

* removed dependencies on DirectoryServer class
* renamed ClassLoaderProvider to ConfigurationFramework to make its responsibility for overall management of the configuration framework more obvious
* removed PropertyDefinitionsOptions and replaced with single "isClient" getter/setter in ConfigurationFramework. This is now used throughout the framework
* use default schema throughout. If we need to add support for customization of the schema then we could provide the capability via the ConfigurationFramework class
* pass in install/instance paths to ConfigurationFramework during initialization. Default to "user.dir" property if no paths are provided.
4 files deleted
1 files added
44 files modified
2386 ■■■■■ changed files
opendj-config/src/main/java/org/forgerock/opendj/config/ACIPropertyDefinition.java 4 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/AbstractManagedObjectDefinition.java 7 ●●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/AggregationPropertyDefinition.java 6 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/AttributeTypePropertyDefinition.java 29 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/BooleanPropertyDefinition.java 4 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/ClassLoaderProvider.java 721 ●●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/ClassPropertyDefinition.java 15 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/ConfigurationFramework.java 804 ●●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/DNPropertyDefinition.java 6 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/DefaultManagedObject.java 2 ●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/DurationPropertyDefinition.java 6 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/EnumPropertyDefinition.java 4 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/IPAddressMaskPropertyDefinition.java 4 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/IPAddressPropertyDefinition.java 4 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/IntegerPropertyDefinition.java 6 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/ManagedObjectDefinitionI18NResource.java 2 ●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/ManagedObjectDefinitionResource.java 2 ●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/ManagedObjectPath.java 6 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/PropertyDefinition.java 12 ●●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/PropertyDefinitionsOptions.java 137 ●●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/Reference.java 2 ●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/SizePropertyDefinition.java 6 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/StringPropertyDefinition.java 6 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/client/IllegalManagedObjectNameException.java 19 ●●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPDriver.java 27 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPManagedObject.java 3 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPManagementContext.java 28 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/client/spi/AbstractManagedObject.java 19 ●●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/client/spi/Driver.java 14 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/client/spi/PropertySet.java 8 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/conditions/ContainsCondition.java 3 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/server/ServerManagementContext.java 40 ●●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/opends/server/core/DirectoryServer.java 99 ●●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/opends/server/core/package-info.java 54 ●●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/AttributeTypePropertyDefinitionTest.java 17 ●●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/BooleanPropertyDefinitionTest.java 8 ●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/ConfigurationMock.java 2 ●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/DNPropertyDefinitionTest.java 8 ●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/DurationPropertyDefinitionTest.java 14 ●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/EnumPropertyDefinitionTest.java 6 ●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/IntegerPropertyDefinitionTest.java 10 ●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/SizePropertyDefinitionTest.java 10 ●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/StringPropertyDefinitionTest.java 10 ●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/client/ldap/AggregationClientTest.java 23 ●●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/client/ldap/LDAPClientTest.java 105 ●●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/server/AggregationServerTest.java 23 ●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/server/ConstraintTest.java 11 ●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/server/DefaultBehaviorTest.java 9 ●●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/server/ListenerTest.java 21 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/ACIPropertyDefinition.java
@@ -85,7 +85,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(Aci value, PropertyDefinitionsOptions options) {
    public void validateValue(Aci value) {
        Reject.ifNull(value);
        // No additional validation required.
@@ -95,7 +95,7 @@
     * {@inheritDoc}
     */
    @Override
    public Aci decodeValue(String value, PropertyDefinitionsOptions options) {
    public Aci decodeValue(String value) {
        Reject.ifNull(value);
        try {
opendj-config/src/main/java/org/forgerock/opendj/config/AbstractManagedObjectDefinition.java
@@ -796,9 +796,10 @@
        for (AggregationPropertyDefinition<?, ?> apd : getAllAggregationPropertyDefinitions()) {
            apd.initialize();
            // Now register the aggregation property in the referenced managed
            // object
            // definition for reverse lookups.
            /*
             * Now register the aggregation property in the referenced managed
             * object definition for reverse lookups.
             */
            registerReverseAggregationPropertyDefinition(apd);
        }
opendj-config/src/main/java/org/forgerock/opendj/config/AggregationPropertyDefinition.java
@@ -812,11 +812,11 @@
     * {@inheritDoc}
     */
    @Override
    public String decodeValue(String value, PropertyDefinitionsOptions options) {
    public String decodeValue(String value) {
        Reject.ifNull(value);
        try {
            validateValue(value, options);
            validateValue(value);
            return value;
        } catch (PropertyException e) {
            throw PropertyException.illegalPropertyValueException(this, value);
@@ -980,7 +980,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(String value, PropertyDefinitionsOptions options) {
    public void validateValue(String value) {
        try {
            Reference.parseName(parentPath, relationDefinition, value);
        } catch (IllegalArgumentException e) {
opendj-config/src/main/java/org/forgerock/opendj/config/AttributeTypePropertyDefinition.java
@@ -31,7 +31,7 @@
import java.util.EnumSet;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.core.DirectoryServer;
import org.forgerock.opendj.ldap.schema.Schema;
/**
 * Attribute type property definition.
@@ -109,21 +109,22 @@
     * {@inheritDoc}
     */
    @Override
    public AttributeType decodeValue(String value, PropertyDefinitionsOptions options) {
    public AttributeType decodeValue(String value) {
        Reject.ifNull(value);
        String name = value.trim().toLowerCase();
        AttributeType type = DirectoryServer.getAttributeType(name, !options.checkSchemaForAttributes());
        if (type == null) {
        final String name = value.trim();
        if (!ConfigurationFramework.getInstance().isClient()
                && !Schema.getDefaultSchema().hasAttributeType(name)) {
            // If this is the server then the attribute type must be defined.
            throw PropertyException.illegalPropertyValueException(this, value);
        } else {
            try {
                validateValue(type, options);
                return type;
            } catch (PropertyException e) {
                throw PropertyException.illegalPropertyValueException(this, value);
            }
        }
        final AttributeType type =
                Schema.getDefaultSchema().asNonStrictSchema().getAttributeType(name);
        try {
            validateValue(type);
            return type;
        } catch (PropertyException e) {
            throw PropertyException.illegalPropertyValueException(this, value);
        }
    }
@@ -139,7 +140,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(AttributeType value, PropertyDefinitionsOptions options) {
    public void validateValue(AttributeType value) {
        Reject.ifNull(value);
        // No implementation required.
opendj-config/src/main/java/org/forgerock/opendj/config/BooleanPropertyDefinition.java
@@ -97,7 +97,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(Boolean value, PropertyDefinitionsOptions options) {
    public void validateValue(Boolean value) {
        Reject.ifNull(value);
        // No additional validation required.
@@ -107,7 +107,7 @@
     * {@inheritDoc}
     */
    @Override
    public Boolean decodeValue(String value, PropertyDefinitionsOptions options) {
    public Boolean decodeValue(String value) {
        Reject.ifNull(value);
        String nvalue = value.trim().toLowerCase();
opendj-config/src/main/java/org/forgerock/opendj/config/ClassLoaderProvider.java
File was deleted
opendj-config/src/main/java/org/forgerock/opendj/config/ClassPropertyDefinition.java
@@ -43,9 +43,8 @@
 * <p>
 * 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 using the appropriate
 * {@link PropertyDefinitionsOptions}.
 * access to the interfaces it is supposed to implement). For this reason,
 * validation is disabled in client applications.
 */
public final class ClassPropertyDefinition extends PropertyDefinition<String> {
@@ -117,7 +116,7 @@
    // Load a named class.
    private static Class<?> loadClass(String className, boolean initialize) throws ClassNotFoundException {
        return Class.forName(className, initialize, ClassLoaderProvider.getInstance().getClassLoader());
        return Class.forName(className, initialize, ConfigurationFramework.getInstance().getClassLoader());
    }
    // List of interfaces which property values must implement.
@@ -152,11 +151,11 @@
     * {@inheritDoc}
     */
    @Override
    public String decodeValue(String value, PropertyDefinitionsOptions options) {
    public String decodeValue(String value) {
        Reject.ifNull(value);
        try {
            validateValue(value, options);
            validateValue(value);
        } catch (PropertyException e) {
            throw PropertyException.illegalPropertyValueException(this, value, e.getCause());
        }
@@ -219,7 +218,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(String value, PropertyDefinitionsOptions options) {
    public void validateValue(String value) {
        Reject.ifNull(value);
        // Always make sure the name is a valid class name.
@@ -229,7 +228,7 @@
         * If additional validation is enabled then attempt to load the class
         * and check the interfaces that it implements/extends.
         */
        if (options.allowClassValidation()) {
        if (!ConfigurationFramework.getInstance().isClient()) {
            validateClassInterfaces(value, false);
        }
    }
opendj-config/src/main/java/org/forgerock/opendj/config/ConfigurationFramework.java
New file
@@ -0,0 +1,804 @@
/*
 * 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 2008-2009 Sun Microsystems, Inc.
 *      Portions copyright 2012-2014 ForgeRock AS.
 */
package org.forgerock.opendj.config;
import static com.forgerock.opendj.ldap.AdminMessages.*;
import static com.forgerock.opendj.ldap.ExtensionMessages.NOTE_LOG_EXTENSION_INFORMATION;
import static com.forgerock.opendj.util.StaticUtils.EOL;
import static com.forgerock.opendj.util.StaticUtils.stackTraceToSingleLineString;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.config.server.ConfigException;
import org.forgerock.opendj.server.config.meta.RootCfgDefn;
import org.forgerock.util.Reject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.forgerock.opendj.ldap.AdminMessages;
/**
 * This class is responsible for managing the configuration framework including:
 * <ul>
 * <li>loading core components during application initialization
 * <li>loading extensions during and after application initialization
 * <li>changing the property validation strategy based on whether the
 * application is a client or server.
 * </ul>
 * This class defines a class loader which will be used for loading components.
 * For extensions which define their own extended configuration definitions, the
 * class loader will make sure that the configuration definition classes are
 * loaded and initialized.
 * <p>
 * Initially the configuration framework is disabled, and calls to the
 * {@link #getClassLoader()} will return the system default class loader.
 * <p>
 * Applications <b>MUST NOT</b> maintain persistent references to the class
 * loader as it can change at run-time.
 */
public final class ConfigurationFramework {
    /**
     * Private URLClassLoader implementation. This is only required so that we
     * can provide access to the addURL method.
     */
    private static final class MyURLClassLoader extends URLClassLoader {
        /**
         * Create a class loader with the default parent class loader.
         */
        public MyURLClassLoader() {
            super(new URL[0]);
        }
        /**
         * Create a class loader with the provided parent class loader.
         *
         * @param parent
         *            The parent class loader.
         */
        public MyURLClassLoader(final ClassLoader parent) {
            super(new URL[0], parent);
        }
        /**
         * Add a Jar file to this class loader.
         *
         * @param jarFile
         *            The name of the Jar file.
         * @throws MalformedURLException
         *             If a protocol handler for the URL could not be found, or
         *             if some other error occurred while constructing the URL.
         * @throws SecurityException
         *             If a required system property value cannot be accessed.
         */
        public void addJarFile(final File jarFile) throws MalformedURLException {
            addURL(jarFile.toURI().toURL());
        }
    }
    private static final String MANIFEST =
            "META-INF/services/org.forgerock.opendj.config.AbstractManagedObjectDefinition";
    private static final LocalizedLogger adminLogger = LocalizedLogger
            .getLocalizedLogger(AdminMessages.resourceName());
    private static final Logger debugLogger = LoggerFactory.getLogger(ConfigurationFramework.class);
    // The name of the lib directory.
    private static final String LIB_DIR = "lib";
    // The name of the extensions directory.
    private static final String EXTENSIONS_DIR = "extensions";
    // The singleton instance.
    private static final ConfigurationFramework INSTANCE = new ConfigurationFramework();
    // Attribute name in jar's MANIFEST corresponding to the revision number.
    private static final String REVISION_NUMBER = "Revision-Number";
    // The attribute names for build information is name, version and revision
    // number
    private static final String[] BUILD_INFORMATION_ATTRIBUTE_NAMES = new String[] {
        Attributes.Name.EXTENSION_NAME.toString(),
        Attributes.Name.IMPLEMENTATION_VERSION.toString(), REVISION_NUMBER };
    /**
     * Returns the single application wide configuration framework instance.
     *
     * @return The single application wide configuration framework instance.
     */
    public static ConfigurationFramework getInstance() {
        return INSTANCE;
    }
    // Set of registered Jar files.
    private Set<File> jarFiles = new HashSet<File>();
    // Underlying class loader used to load classes and resources (null
    // if disabled).
    //
    // We contain a reference to the URLClassLoader rather than
    // sub-class it so that it is possible to replace the loader at
    // run-time. For example, when removing or replacing extension Jar
    // files (the URLClassLoader only supports adding new
    // URLs, not removal).
    private MyURLClassLoader loader = null;
    private boolean isClient = true;
    private String installPath;
    private String instancePath;
    private ClassLoader parent;
    // Private constructor.
    private ConfigurationFramework() {
        // No implementation required.
    }
    /**
     * Loads the named extensions into the configuration framework.
     *
     * @param extensions
     *            The names of the extensions to be loaded. The names should not
     *            contain any path elements and must be located within the
     *            extensions folder.
     * @throws ConfigException
     *             If one of the extensions could not be loaded and initialized.
     * @throws IllegalStateException
     *             If the configuration framework has not yet been initialized.
     * @throws IllegalArgumentException
     *             If one of the extension names was not a single relative path
     *             name element or was an absolute path.
     */
    public synchronized void addExtension(final String... extensions) throws ConfigException {
        Reject.ifNull(extensions);
        ensureInitialized();
        final File libPath = new File(instancePath, LIB_DIR);
        final File extensionsPath = new File(libPath, EXTENSIONS_DIR);
        final ArrayList<File> files = new ArrayList<File>(extensions.length);
        for (final String extension : extensions) {
            final File file = new File(extensionsPath, extension);
            // For security reasons we need to make sure that the file name
            // passed in did not contain any path elements and names a file
            // in the extensions folder.
            // Can handle potential null parent.
            if (!extensionsPath.equals(file.getParentFile())) {
                throw new IllegalArgumentException("Illegal file name: " + extension);
            }
            // The file is valid.
            files.add(file);
        }
        // Add the extensions.
        addExtension(files.toArray(new File[files.size()]));
    }
    /**
     * Returns the class loader which should be used for loading classes and
     * resources. When this configuration framework is disabled, the system
     * default class loader will be returned by default.
     * <p>
     * Applications <b>MUST NOT</b> maintain persistent references to the class
     * loader as it can change at run-time.
     *
     * @return Returns the class loader which should be used for loading classes
     *         and resources.
     */
    public synchronized ClassLoader getClassLoader() {
        if (loader != null) {
            return loader;
        } else {
            return ClassLoader.getSystemClassLoader();
        }
    }
    /**
     * Initializes the configuration framework using the application's class
     * loader as the parent class loader, and the current working directory as
     * the install and instance path.
     *
     * @return The configuration framework.
     * @throws ConfigException
     *             If the configuration framework could not initialize
     *             successfully.
     * @throws IllegalStateException
     *             If the configuration framework has already been initialized.
     */
    public ConfigurationFramework initialize() throws ConfigException {
        return initialize(null);
    }
    /**
     * Initializes the configuration framework using the application's class
     * loader as the parent class loader, and the provided install/instance
     * path.
     *
     * @param installAndInstancePath
     *            The path where application binaries and data are located.
     * @return The configuration framework.
     * @throws ConfigException
     *             If the configuration framework could not initialize
     *             successfully.
     * @throws IllegalStateException
     *             If the configuration framework has already been initialized.
     */
    public ConfigurationFramework initialize(final String installAndInstancePath)
            throws ConfigException {
        return initialize(installAndInstancePath, installAndInstancePath);
    }
    /**
     * Initializes the configuration framework using the application's class
     * loader as the parent class loader, and the provided install and instance
     * paths.
     *
     * @param installPath
     *            The path where application binaries are located.
     * @param instancePath
     *            The path where application data are located.
     * @return The configuration framework.
     * @throws ConfigException
     *             If the configuration framework could not initialize
     *             successfully.
     * @throws IllegalStateException
     *             If the configuration framework has already been initialized.
     */
    public ConfigurationFramework initialize(final String installPath, final String instancePath)
            throws ConfigException {
        return initialize(installPath, instancePath, RootCfgDefn.class.getClassLoader());
    }
    /**
     * Initializes the configuration framework using the provided parent class
     * loader and install and instance paths.
     *
     * @param installPath
     *            The path where application binaries are located.
     * @param instancePath
     *            The path where application data are located.
     * @param parent
     *            The parent class loader.
     * @return The configuration framework.
     * @throws ConfigException
     *             If the configuration framework could not initialize
     *             successfully.
     * @throws IllegalStateException
     *             If the configuration framework has already been initialized.
     */
    public synchronized ConfigurationFramework initialize(final String installPath,
            final String instancePath, final ClassLoader parent) throws ConfigException {
        if (loader != null) {
            throw new IllegalStateException("configuration framework already initialized.");
        }
        this.installPath = installPath == null ? System.getProperty("user.dir") : installPath;
        this.instancePath = instancePath == null ? installPath : instancePath;
        this.parent = parent;
        initialize0();
        return this;
    }
    /**
     * Returns {@code true} if the configuration framework is being used within
     * a client application. Client applications will perform less property
     * value validation than server applications because they do not have
     * resources available such as the server schema.
     *
     * @return {@code true} if the configuration framework is being used within
     *         a client application.
     */
    public boolean isClient() {
        return isClient;
    }
    /**
     * Returns {@code true} if the configuration framework has been enabled.
     *
     * @return {@code true} if the configuration framework has been enabled.
     */
    public synchronized boolean isEnabled() {
        return loader != null;
    }
    /**
     * Prints out all information about extensions.
     *
     * @return A string representing all information about extensions;
     *         <code>null</code> if there is no information available.
     */
    public String printExtensionInformation() {
        final File extensionsPath =
                new File(new StringBuilder(installPath).append(File.separator).append(LIB_DIR)
                        .append(File.separator).append(EXTENSIONS_DIR).toString());
        if (!extensionsPath.exists() || !extensionsPath.isDirectory()) {
            // no extensions' directory
            return null;
        }
        final File[] extensions = extensionsPath.listFiles(new FileFilter() {
            @Override
            public boolean accept(final File pathname) {
                // only files with names ending with ".jar"
                return pathname.isFile() && pathname.getName().endsWith(".jar");
            }
        });
        if (extensions.length == 0) {
            return null;
        }
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        final PrintStream ps = new PrintStream(baos);
        // prints:
        // --
        // Name Build number Revision number
        ps.printf("--%s           %-20s %-20s %-20s%s", EOL, "Name", "Build number",
                "Revision number", EOL);
        for (final File extension : extensions) {
            // retrieve MANIFEST entry and display name, build number and
            // revision number
            try {
                final JarFile jarFile = new JarFile(extension);
                final JarEntry entry = jarFile.getJarEntry(MANIFEST);
                if (entry == null) {
                    continue;
                }
                final String[] information = getBuildInformation(jarFile);
                ps.append("Extension: ");
                boolean addBlank = false;
                for (final String name : information) {
                    if (addBlank) {
                        ps.append(addBlank ? " " : ""); // add blank if not
                                                        // first append
                    } else {
                        addBlank = true;
                    }
                    ps.printf("%-20s", name);
                }
                ps.append(EOL);
            } catch (final Exception e) {
                // ignore extra information for this extension
            }
        }
        return baos.toString();
    }
    /**
     * Reloads the configuration framework.
     *
     * @throws ConfigException
     *             If the configuration framework could not initialize
     *             successfully.
     * @throws IllegalStateException
     *             If the configuration framework has not yet been initialized.
     */
    public synchronized void reload() throws ConfigException {
        ensureInitialized();
        loader = null;
        jarFiles = new HashSet<File>();
        initialize0();
    }
    /**
     * Specifies whether or not the configuration framework is being used within
     * a client application. Client applications will perform less property
     * value validation than server applications because they do not have
     * resources available such as the server schema.
     *
     * @param isClient
     *            {@code true} if the configuration framework is being used
     *            within a client application.
     * @return The configuration framework.
     */
    public ConfigurationFramework setIsClient(final boolean isClient) {
        this.isClient = isClient;
        return this;
    }
    private void addExtension(final File... extensions) throws ConfigException {
        // First add the Jar files to the class loader.
        final List<JarFile> jars = new LinkedList<JarFile>();
        for (final File extension : extensions) {
            if (jarFiles.contains(extension)) {
                // Skip this file as it is already loaded.
                continue;
            }
            // Attempt to load it.
            jars.add(loadJarFile(extension));
            // Register the Jar file with the class loader.
            try {
                loader.addJarFile(extension);
            } catch (final Exception e) {
                debugLogger.trace("Unable to register the jar file with the class loader", e);
                final LocalizableMessage message =
                        ERR_ADMIN_CANNOT_OPEN_JAR_FILE.get(extension.getName(), extension
                                .getParent(), stackTraceToSingleLineString(e, true));
                throw new ConfigException(message);
            }
            jarFiles.add(extension);
        }
        // Now forcefully load the configuration definition classes.
        for (final JarFile jar : jars) {
            initializeExtension(jar);
        }
    }
    private void ensureInitialized() {
        if (loader == null) {
            throw new IllegalStateException("configuration framework is disabled.");
        }
    }
    /**
     * Returns a String array with the following information : <br>
     * index 0: the name of the extension. <br>
     * index 1: the build number of the extension. <br>
     * index 2: the revision number of the extension.
     *
     * @param extension
     *            the jar file of the extension
     * @return a String array containing the name, the build number and the
     *         revision number of the extension given in argument
     * @throws java.io.IOException
     *             thrown if the jar file has been closed.
     */
    private String[] getBuildInformation(final JarFile extension) throws IOException {
        final String[] result = new String[3];
        // retrieve MANIFEST entry and display name, version and revision
        final Manifest manifest = extension.getManifest();
        if (manifest != null) {
            final Attributes attributes = manifest.getMainAttributes();
            int index = 0;
            for (final String name : BUILD_INFORMATION_ATTRIBUTE_NAMES) {
                String value = attributes.getValue(name);
                if (value == null) {
                    value = "<unknown>";
                }
                result[index++] = value;
            }
        }
        return result;
    }
    private void initialize0() throws ConfigException {
        if (parent != null) {
            loader = new MyURLClassLoader(parent);
        } else {
            loader = new MyURLClassLoader();
        }
        // Forcefully load all configuration definition classes in
        // OpenDS.jar.
        initializeCoreComponents();
        // Put extensions jars into the class loader and load all
        // configuration definition classes in that they contain.
        // First load the extension from the install directory, then
        // from the instance directory.
        File libDir;
        File installExtensionsPath;
        File instanceExtensionsPath;
        // load install dir extension
        libDir = new File(installPath, LIB_DIR);
        try {
            installExtensionsPath = new File(libDir, EXTENSIONS_DIR).getCanonicalFile();
        } catch (final Exception e) {
            installExtensionsPath = new File(libDir, EXTENSIONS_DIR);
        }
        initializeAllExtensions(installExtensionsPath);
        // load instance dir extension
        libDir = new File(instancePath, LIB_DIR);
        try {
            instanceExtensionsPath = new File(libDir, EXTENSIONS_DIR).getCanonicalFile();
        } catch (final Exception e) {
            instanceExtensionsPath = new File(libDir, EXTENSIONS_DIR);
        }
        if (!installExtensionsPath.getAbsolutePath().equals(
                instanceExtensionsPath.getAbsolutePath())) {
            initializeAllExtensions(instanceExtensionsPath);
        }
    }
    /**
     * Put extensions jars into the class loader and load all configuration
     * definition classes in that they contain.
     *
     * @param extensionsPath
     *            Indicates where extensions are located.
     * @throws ConfigException
     *             If the extensions folder could not be accessed or if a
     *             extension jar file could not be accessed or if one of the
     *             configuration definition classes could not be initialized.
     */
    private void initializeAllExtensions(final File extensionsPath) throws ConfigException {
        try {
            if (!extensionsPath.exists()) {
                // The extensions directory does not exist. This is not a
                // critical problem.
                adminLogger.error(ERR_ADMIN_NO_EXTENSIONS_DIR, String.valueOf(extensionsPath));
                return;
            }
            if (!extensionsPath.isDirectory()) {
                // The extensions directory is not a directory. This is more
                // critical.
                final LocalizableMessage message =
                        ERR_ADMIN_EXTENSIONS_DIR_NOT_DIRECTORY.get(String.valueOf(extensionsPath));
                throw new ConfigException(message);
            }
            // Get each extension file name.
            final FileFilter filter = new FileFilter() {
                /**
                 * Must be a Jar file.
                 */
                @Override
                public boolean accept(final File pathname) {
                    if (!pathname.isFile()) {
                        return false;
                    }
                    final String name = pathname.getName();
                    return name.endsWith(".jar");
                }
            };
            // Add and initialize the extensions.
            addExtension(extensionsPath.listFiles(filter));
        } catch (final ConfigException e) {
            debugLogger.trace("Unable to initialize all extensions", e);
            throw e;
        } catch (final Exception e) {
            debugLogger.trace("Unable to initialize all extensions", e);
            final LocalizableMessage message =
                    ERR_ADMIN_EXTENSIONS_CANNOT_LIST_FILES.get(String.valueOf(extensionsPath),
                            stackTraceToSingleLineString(e, true));
            throw new ConfigException(message, e);
        }
    }
    /**
     * Make sure all core configuration definitions are loaded.
     *
     * @throws ConfigException
     *             If the core manifest file could not be read or if one of the
     *             configuration definition classes could not be initialized.
     */
    private void initializeCoreComponents() throws ConfigException {
        final InputStream is = RootCfgDefn.class.getResourceAsStream(MANIFEST);
        if (is == null) {
            final LocalizableMessage message = ERR_ADMIN_CANNOT_FIND_CORE_MANIFEST.get(MANIFEST);
            throw new ConfigException(message);
        }
        try {
            loadDefinitionClasses(is);
        } catch (final ConfigException e) {
            debugLogger.trace("Unable to initialize core components", e);
            final LocalizableMessage message =
                    ERR_CLASS_LOADER_CANNOT_LOAD_CORE.get(MANIFEST, stackTraceToSingleLineString(e,
                            true));
            throw new ConfigException(message);
        }
    }
    /**
     * Make sure all the configuration definition classes in a extension are
     * loaded.
     *
     * @param jarFile
     *            The extension's Jar file.
     * @throws ConfigException
     *             If the extension jar file could not be accessed or if one of
     *             the configuration definition classes could not be
     *             initialized.
     */
    private void initializeExtension(final JarFile jarFile) throws ConfigException {
        final JarEntry entry = jarFile.getJarEntry(MANIFEST);
        if (entry != null) {
            InputStream is;
            try {
                is = jarFile.getInputStream(entry);
            } catch (final Exception e) {
                debugLogger.trace("Unable to get input stream from jar", e);
                final LocalizableMessage message =
                        ERR_ADMIN_CANNOT_READ_EXTENSION_MANIFEST.get(MANIFEST, jarFile.getName(),
                                stackTraceToSingleLineString(e, true));
                throw new ConfigException(message);
            }
            try {
                loadDefinitionClasses(is);
            } catch (final ConfigException e) {
                debugLogger.trace("Unable to load classes from input stream", e);
                final LocalizableMessage message =
                        ERR_CLASS_LOADER_CANNOT_LOAD_EXTENSION.get(jarFile.getName(), MANIFEST,
                                stackTraceToSingleLineString(e, true));
                throw new ConfigException(message);
            }
            try {
                // Log build information of extensions in the error log
                final String[] information = getBuildInformation(jarFile);
                final LocalizableMessage message =
                        NOTE_LOG_EXTENSION_INFORMATION.get(jarFile.getName(), information[1],
                                information[2]);
                LocalizedLogger.getLocalizedLogger(message.resourceName()).error(message);
            } catch (final Exception e) {
                // Do not log information for that extension
            }
        }
    }
    /**
     * Forcefully load configuration definition classes named in a manifest
     * file.
     *
     * @param is
     *            The manifest file input stream.
     * @throws ConfigException
     *             If the definition classes could not be loaded and
     *             initialized.
     */
    private void loadDefinitionClasses(final InputStream is) throws ConfigException {
        final BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        final List<AbstractManagedObjectDefinition<?, ?>> definitions =
                new LinkedList<AbstractManagedObjectDefinition<?, ?>>();
        while (true) {
            String className;
            try {
                className = reader.readLine();
            } catch (final IOException e) {
                final LocalizableMessage msg =
                        ERR_CLASS_LOADER_CANNOT_READ_MANIFEST_FILE.get(String.valueOf(e
                                .getMessage()));
                throw new ConfigException(msg, e);
            }
            // Break out when the end of the manifest is reached.
            if (className == null) {
                break;
            }
            // Skip blank lines.
            className = className.trim();
            if (className.length() == 0) {
                continue;
            }
            // Skip lines beginning with #.
            if (className.startsWith("#")) {
                continue;
            }
            debugLogger.trace("Loading class " + className);
            // Load the class and get an instance of it if it is a definition.
            Class<?> theClass;
            try {
                theClass = Class.forName(className, true, loader);
            } catch (final Exception e) {
                final LocalizableMessage msg =
                        ERR_CLASS_LOADER_CANNOT_LOAD_CLASS.get(className, String.valueOf(e
                                .getMessage()));
                throw new ConfigException(msg, e);
            }
            if (AbstractManagedObjectDefinition.class.isAssignableFrom(theClass)) {
                // We need to instantiate it using its getInstance() static
                // method.
                Method method;
                try {
                    method = theClass.getMethod("getInstance");
                } catch (final Exception e) {
                    final LocalizableMessage msg =
                            ERR_CLASS_LOADER_CANNOT_FIND_GET_INSTANCE_METHOD.get(className, String
                                    .valueOf(e.getMessage()));
                    throw new ConfigException(msg, e);
                }
                // Get the definition instance.
                AbstractManagedObjectDefinition<?, ?> d;
                try {
                    d = (AbstractManagedObjectDefinition<?, ?>) method.invoke(null);
                } catch (final Exception e) {
                    final LocalizableMessage msg =
                            ERR_CLASS_LOADER_CANNOT_INVOKE_GET_INSTANCE_METHOD.get(className,
                                    String.valueOf(e.getMessage()));
                    throw new ConfigException(msg, e);
                }
                definitions.add(d);
            }
        }
        // Initialize any definitions that were loaded.
        for (final AbstractManagedObjectDefinition<?, ?> d : definitions) {
            try {
                d.initialize();
            } catch (final Exception e) {
                final LocalizableMessage msg =
                        ERR_CLASS_LOADER_CANNOT_INITIALIZE_DEFN.get(d.getName(), d.getClass()
                                .getName(), String.valueOf(e.getMessage()));
                throw new ConfigException(msg, e);
            }
        }
    }
    private JarFile loadJarFile(final File jar) throws ConfigException {
        try {
            // Load the extension jar file.
            return new JarFile(jar);
        } catch (final Exception e) {
            debugLogger.trace("Unable to load jar file: " + jar, e);
            final LocalizableMessage message =
                    ERR_ADMIN_CANNOT_OPEN_JAR_FILE.get(jar.getName(), jar.getParent(),
                            stackTraceToSingleLineString(e, true));
            throw new ConfigException(message);
        }
    }
}
opendj-config/src/main/java/org/forgerock/opendj/config/DNPropertyDefinition.java
@@ -134,7 +134,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(DN value, PropertyDefinitionsOptions options) {
    public void validateValue(DN value) {
        Reject.ifNull(value);
        if (baseDN != null) {
@@ -154,12 +154,12 @@
     * {@inheritDoc}
     */
    @Override
    public DN decodeValue(String value, PropertyDefinitionsOptions options) {
    public DN decodeValue(String value) {
        Reject.ifNull(value);
        try {
            DN dn = DN.valueOf(value);
            validateValue(dn, options);
            validateValue(dn);
            return dn;
        } catch (PropertyException e) {
            throw PropertyException.illegalPropertyValueException(this, value);
opendj-config/src/main/java/org/forgerock/opendj/config/DefaultManagedObject.java
@@ -147,7 +147,7 @@
        if (stringValues != null) {
            for (String stringValue : stringValues) {
                // TODO : is it correct to have no validation ?
                values.add(pd.decodeValue(stringValue, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS));
                values.add(pd.decodeValue(stringValue));
            }
        }
        return values;
opendj-config/src/main/java/org/forgerock/opendj/config/DurationPropertyDefinition.java
@@ -392,7 +392,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(Long value, PropertyDefinitionsOptions options) {
    public void validateValue(Long value) {
        Reject.ifNull(value);
        long nvalue = baseUnit.toMilliSeconds(value);
@@ -436,7 +436,7 @@
     * {@inheritDoc}
     */
    @Override
    public Long decodeValue(String value, PropertyDefinitionsOptions options) {
    public Long decodeValue(String value) {
        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, options);
            validateValue(i);
        } catch (PropertyException e) {
            throw PropertyException.illegalPropertyValueException(this, value);
        }
opendj-config/src/main/java/org/forgerock/opendj/config/EnumPropertyDefinition.java
@@ -150,7 +150,7 @@
     * {@inheritDoc}
     */
    @Override
    public E decodeValue(String value, PropertyDefinitionsOptions options) {
    public E decodeValue(String value) {
        Reject.ifNull(value);
        String nvalue = value.trim().toLowerCase();
@@ -219,7 +219,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(E value, PropertyDefinitionsOptions options) {
    public void validateValue(E value) {
        Reject.ifNull(value);
        // No additional validation required.
opendj-config/src/main/java/org/forgerock/opendj/config/IPAddressMaskPropertyDefinition.java
@@ -86,7 +86,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(AddressMask value, PropertyDefinitionsOptions options) {
    public void validateValue(AddressMask value) {
        Reject.ifNull(value);
        // No additional validation required.
@@ -96,7 +96,7 @@
     * {@inheritDoc}
     */
    @Override
    public AddressMask decodeValue(String value, PropertyDefinitionsOptions options) {
    public AddressMask decodeValue(String value) {
        Reject.ifNull(value);
        try {
opendj-config/src/main/java/org/forgerock/opendj/config/IPAddressPropertyDefinition.java
@@ -85,7 +85,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(InetAddress value, PropertyDefinitionsOptions options) {
    public void validateValue(InetAddress value) {
        Reject.ifNull(value);
        // No additional validation required.
@@ -95,7 +95,7 @@
     * {@inheritDoc}
     */
    @Override
    public InetAddress decodeValue(String value, PropertyDefinitionsOptions options) {
    public InetAddress decodeValue(String value) {
        Reject.ifNull(value);
        try {
opendj-config/src/main/java/org/forgerock/opendj/config/IntegerPropertyDefinition.java
@@ -229,7 +229,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(Integer value, PropertyDefinitionsOptions options) {
    public void validateValue(Integer value) {
        Reject.ifNull(value);
        if (!allowUnlimited && value < lowerLimit) {
@@ -266,7 +266,7 @@
     * {@inheritDoc}
     */
    @Override
    public Integer decodeValue(String value, PropertyDefinitionsOptions options) {
    public Integer decodeValue(String value) {
        Reject.ifNull(value);
        if (allowUnlimited) {
@@ -283,7 +283,7 @@
        }
        try {
            validateValue(i, options);
            validateValue(i);
        } catch (PropertyException e) {
            throw PropertyException.illegalPropertyValueException(this, value);
        }
opendj-config/src/main/java/org/forgerock/opendj/config/ManagedObjectDefinitionI18NResource.java
@@ -282,7 +282,7 @@
        if (resourceBundle == null) {
            String baseName = prefix + "." + d.getClass().getName();
            resourceBundle =
                ResourceBundle.getBundle(baseName, locale, ClassLoaderProvider.getInstance().getClassLoader());
                ResourceBundle.getBundle(baseName, locale, ConfigurationFramework.getInstance().getClassLoader());
            map.put(locale, resourceBundle);
        }
opendj-config/src/main/java/org/forgerock/opendj/config/ManagedObjectDefinitionResource.java
@@ -110,7 +110,7 @@
            // Load the resource file.
            String baseName = prefix + "." + d.getClass().getName();
            String path = baseName.replace('.', '/') + ".properties";
            InputStream stream = ClassLoaderProvider.getInstance().getClassLoader().getResourceAsStream(path);
            InputStream stream = ConfigurationFramework.getInstance().getClassLoader().getResourceAsStream(path);
            if (stream == null) {
                throw new MissingResourceException("Can't find resource " + path, baseName, "");
opendj-config/src/main/java/org/forgerock/opendj/config/ManagedObjectPath.java
@@ -39,7 +39,7 @@
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.RDN;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.core.DirectoryServer;
import org.forgerock.opendj.ldap.schema.Schema;
/**
 * A path which can be used to determine the location of a managed object
@@ -140,7 +140,7 @@
            // Now add the single RDN representing the named instance.
            String type = profile.getRelationChildRDNType(r);
            AttributeType attrType = DirectoryServer.getAttributeType(type.toLowerCase(), true);
            AttributeType attrType = Schema.getDefaultSchema().getAttributeType(type);
            dn = dn.child(new RDN(attrType, name));
        }
@@ -154,7 +154,7 @@
            // Now add the single RDN representing the instance.
            String type = profile.getRelationChildRDNType(r);
            AttributeType attrType = DirectoryServer.getAttributeType(type.toLowerCase(), true);
            AttributeType attrType = Schema.getDefaultSchema().getAttributeType(type);
            dn = dn.child(new RDN(attrType, d.getName()));
        }
opendj-config/src/main/java/org/forgerock/opendj/config/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, PropertyDefinitionsOptions)}.
     * performed using the method {@link #validateValue(Object)}.
     * <p>
     * This method guarantees the following expression is always
     * <code>true</code>:
@@ -318,13 +318,11 @@
     *
     * @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 PropertyException
     *             If the property value string is invalid.
     */
    public abstract T decodeValue(String value, PropertyDefinitionsOptions options);
    public abstract T decodeValue(String value);
    /**
     * Encode the provided property value into its string representation.
@@ -510,7 +508,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, PropertyDefinitionsOptions)}.
     * {@link #validateValue(Object)}.
     * <p>
     * This default implementation simply returns the string representation of
     * the provided value. Sub-classes might want to override this method if
@@ -564,12 +562,10 @@
     *
     * @param value
     *            The property value (must not be <code>null</code>).
     * @param options
     *            Options to use when decoding value.
     * @throws PropertyException
     *             If the property value is invalid.
     */
    public abstract void validateValue(T value, PropertyDefinitionsOptions options);
    public abstract void validateValue(T value);
    /**
     * Performs any run-time initialization required by this property
opendj-config/src/main/java/org/forgerock/opendj/config/PropertyDefinitionsOptions.java
File was deleted
opendj-config/src/main/java/org/forgerock/opendj/config/Reference.java
@@ -190,7 +190,7 @@
        if (pd != null) {
            try {
                // TODO : is it correct to have no validation ?
                T tvalue = pd.decodeValue(name, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
                T tvalue = pd.decodeValue(name);
                return pd.normalizeValue(tvalue);
            } catch (PropertyException e) {
                // Fall through to default normalization.
opendj-config/src/main/java/org/forgerock/opendj/config/SizePropertyDefinition.java
@@ -230,7 +230,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(Long value, PropertyDefinitionsOptions options) {
    public void validateValue(Long value) {
        Reject.ifNull(value);
        if (!allowUnlimited && value < lowerLimit) {
@@ -276,7 +276,7 @@
     * {@inheritDoc}
     */
    @Override
    public Long decodeValue(String value, PropertyDefinitionsOptions options) {
    public Long decodeValue(String value) {
        Reject.ifNull(value);
        // First check for the special "unlimited" value when necessary.
@@ -295,7 +295,7 @@
        }
        try {
            validateValue(i, options);
            validateValue(i);
        } catch (PropertyException e) {
            throw PropertyException.illegalPropertyValueException(this, value);
        }
opendj-config/src/main/java/org/forgerock/opendj/config/StringPropertyDefinition.java
@@ -170,11 +170,11 @@
     * {@inheritDoc}
     */
    @Override
    public String decodeValue(String value, PropertyDefinitionsOptions options) {
    public String decodeValue(String value) {
        Reject.ifNull(value);
        try {
            validateValue(value, options);
            validateValue(value);
        } catch (PropertyException e) {
            throw PropertyException.illegalPropertyValueException(this, value);
        }
@@ -269,7 +269,7 @@
     * {@inheritDoc}
     */
    @Override
    public void validateValue(String value, PropertyDefinitionsOptions options) {
    public void validateValue(String value) {
        Reject.ifNull(value);
        if (pattern != null) {
opendj-config/src/main/java/org/forgerock/opendj/config/client/IllegalManagedObjectNameException.java
@@ -32,7 +32,6 @@
import org.forgerock.opendj.config.OperationsException;
import org.forgerock.opendj.config.PropertyDefinition;
import org.forgerock.opendj.config.PropertyDefinitionUsageBuilder;
import org.forgerock.opendj.config.PropertyDefinitionsOptions;
/**
 * Thrown when an attempt is made to create a new managed object with an illegal
@@ -51,19 +50,20 @@
    private static final long serialVersionUID = 7491748228684293291L;
    /** Create the message. */
    private static LocalizableMessage createMessage(String illegalName, PropertyDefinition<?> namingPropertyDefinition,
        PropertyDefinitionsOptions options) {
    private static LocalizableMessage createMessage(String illegalName,
            PropertyDefinition<?> namingPropertyDefinition) {
        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, options);
                namingPropertyDefinition.decodeValue(illegalName);
            } catch (PropertyException e) {
                PropertyDefinitionUsageBuilder builder = new PropertyDefinitionUsageBuilder(true);
                return ERR_ILLEGAL_MANAGED_OBJECT_NAME_EXCEPTION_SYNTAX.get(illegalName,
                    namingPropertyDefinition.getName(), builder.getUsage(namingPropertyDefinition));
                        namingPropertyDefinition.getName(), builder
                                .getUsage(namingPropertyDefinition));
            }
        }
@@ -83,7 +83,7 @@
     *            The illegal managed object name.
     */
    public IllegalManagedObjectNameException(String illegalName) {
        this(illegalName, null, null);
        this(illegalName, null);
    }
    /**
@@ -93,12 +93,9 @@
     *            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,
        PropertyDefinitionsOptions options) {
        super(createMessage(illegalName, namingPropertyDefinition, options));
    public IllegalManagedObjectNameException(String illegalName, PropertyDefinition<?> namingPropertyDefinition) {
        super(createMessage(illegalName, namingPropertyDefinition));
        this.illegalName = illegalName;
        this.namingPropertyDefinition = namingPropertyDefinition;
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPDriver.java
@@ -53,7 +53,6 @@
import org.forgerock.opendj.config.ManagedObjectPath;
import org.forgerock.opendj.config.PropertyDefinition;
import org.forgerock.opendj.config.PropertyDefinitionVisitor;
import org.forgerock.opendj.config.PropertyDefinitionsOptions;
import org.forgerock.opendj.config.PropertyOption;
import org.forgerock.opendj.config.Reference;
import org.forgerock.opendj.config.RelationDefinition;
@@ -81,9 +80,6 @@
     * A visitor which is used to decode property LDAP values.
     */
    private static final class ValueDecoder extends PropertyDefinitionVisitor<Object, String> {
        private final PropertyDefinitionsOptions options;
        /**
         * Decodes the provided property LDAP value.
         *
@@ -93,21 +89,19 @@
         *            The property definition.
         * @param value
         *            The LDAP string representation.
         * @param options
         *            Decoding options for property definitions.
         * @return Returns the decoded LDAP value.
         * @throws PropertyException
         *             If the property value could not be decoded because it was
         *             invalid.
         */
        public static <P> P decode(PropertyDefinition<P> pd, Object value, PropertyDefinitionsOptions options) {
        public static <P> P decode(PropertyDefinition<P> pd, Object value) {
            String s = String.valueOf(value);
            return pd.castValue(pd.accept(new ValueDecoder(options), s));
            return pd.castValue(pd.accept(new ValueDecoder(), s));
        }
        // Prevent instantiation.
        private ValueDecoder(PropertyDefinitionsOptions options) {
            this.options = options;
        private ValueDecoder() {
            // Do nothing.
        }
        /**
@@ -132,7 +126,7 @@
        @Override
        public <T> Object visitUnknown(PropertyDefinition<T> d, String p) {
            // By default the property definition's decoder will do.
            return d.decodeValue(p, options);
            return d.decodeValue(p);
        }
    }
@@ -152,11 +146,8 @@
     *            The LDAP connection.
     * @param profile
     *            The LDAP profile.
     * @param propertyDefOptions
     *            Options used to validate property definitions values
     */
    public LDAPDriver(LDAPConnection connection, LDAPProfile profile, PropertyDefinitionsOptions propertyDefOptions) {
        super(propertyDefOptions);
    public LDAPDriver(LDAPConnection connection, LDAPProfile profile) {
        this.connection = connection;
        this.profile = profile;
    }
@@ -264,10 +255,9 @@
            // 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, options);
                    P value = ValueDecoder.decode(propertyDef, byteValue);
                    values.add(value);
                }
            }
@@ -489,10 +479,9 @@
        // 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, options);
                P value = ValueDecoder.decode(propertyDef, byteValue);
                activeValues.add(value);
            }
        }
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPManagedObject.java
@@ -126,8 +126,7 @@
    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,
            driver.getManagementContext().getPropertyDefOptions());
        super(d, path, properties, existsOnServer, namingPropertyDefinition);
        this.driver = driver;
    }
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPManagementContext.java
@@ -27,7 +27,6 @@
package org.forgerock.opendj.config.client.ldap;
import org.forgerock.opendj.config.LDAPProfile;
import org.forgerock.opendj.config.PropertyDefinitionsOptions;
import org.forgerock.opendj.config.client.ManagementContext;
import org.forgerock.opendj.config.client.spi.Driver;
import org.forgerock.util.Reject;
@@ -44,15 +43,12 @@
     *            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, LDAPProfile profile,
        PropertyDefinitionsOptions options) {
        Reject.ifNull(connection, profile, options);
        LDAPDriver driver = new LDAPDriver(connection, profile, options);
        LDAPManagementContext context = new LDAPManagementContext(driver, options);
    public static ManagementContext createFromContext(LDAPConnection connection, LDAPProfile profile) {
        Reject.ifNull(connection, profile);
        LDAPDriver driver = new LDAPDriver(connection, profile);
        LDAPManagementContext context = new LDAPManagementContext(driver);
        driver.setManagementContext(context);
        return context;
    }
@@ -60,13 +56,9 @@
    /** The LDAP management context driver. */
    private final LDAPDriver driver;
    /** Options to validate and decode values of property definitions. */
    private final PropertyDefinitionsOptions options;
    /** Private constructor. */
    private LDAPManagementContext(LDAPDriver driver, PropertyDefinitionsOptions options) {
    private LDAPManagementContext(LDAPDriver driver) {
        this.driver = driver;
        this.options = options;
    }
    /** {@inheritDoc} */
@@ -74,14 +66,4 @@
    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-config/src/main/java/org/forgerock/opendj/config/client/spi/AbstractManagedObject.java
@@ -48,7 +48,6 @@
import org.forgerock.opendj.config.ManagedObjectPath;
import org.forgerock.opendj.config.OptionalRelationDefinition;
import org.forgerock.opendj.config.PropertyDefinition;
import org.forgerock.opendj.config.PropertyDefinitionsOptions;
import org.forgerock.opendj.config.PropertyOption;
import org.forgerock.opendj.config.RelationDefinition;
import org.forgerock.opendj.config.RelationDefinitionVisitor;
@@ -226,9 +225,6 @@
    // 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.
     *
@@ -244,17 +240,15 @@
     *            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, PropertyDefinitionsOptions propertyDefOptions) {
        PropertyDefinition<?> namingPropertyDefinition) {
        this.definition = d;
        this.path = path;
        this.properties = properties;
        this.existsOnServer = existsOnServer;
        this.namingPropertyDefinition = namingPropertyDefinition;
        this.propertyDefOptions = propertyDefOptions;
    }
    /**
@@ -349,9 +343,9 @@
        PropertyDefinition<?> pd = r.getNamingPropertyDefinition();
        if (pd != null) {
            try {
                pd.decodeValue(name, propertyDefOptions);
                pd.decodeValue(name);
            } catch (PropertyException e) {
                throw new IllegalManagedObjectNameException(name, pd, propertyDefOptions);
                throw new IllegalManagedObjectNameException(name, pd);
            }
        }
@@ -667,7 +661,7 @@
            throw PropertyException.propertyIsReadOnlyException(pd);
        }
        properties.setPropertyValues(pd, values, propertyDefOptions);
        properties.setPropertyValues(pd, values);
        // If this is a naming property then update the name.
        if (pd.equals(namingPropertyDefinition)) {
@@ -812,9 +806,8 @@
        // Set the naming property if there is one.
        if (namingPropertyDefinition != null) {
            P value = namingPropertyDefinition.decodeValue(name, propertyDefOptions);
            childProperties.setPropertyValues(namingPropertyDefinition, Collections.singleton(value),
                propertyDefOptions);
            P value = namingPropertyDefinition.decodeValue(name);
            childProperties.setPropertyValues(namingPropertyDefinition, Collections.singleton(value));
        }
        return newInstance(d, p, childProperties, false, namingPropertyDefinition);
opendj-config/src/main/java/org/forgerock/opendj/config/client/spi/Driver.java
@@ -52,7 +52,6 @@
import org.forgerock.opendj.config.ManagedObjectPath;
import org.forgerock.opendj.config.OptionalRelationDefinition;
import org.forgerock.opendj.config.PropertyDefinition;
import org.forgerock.opendj.config.PropertyDefinitionsOptions;
import org.forgerock.opendj.config.PropertyNotFoundException;
import org.forgerock.opendj.config.PropertyOption;
import org.forgerock.opendj.config.RelationDefinition;
@@ -137,7 +136,7 @@
            for (String stringValue : stringValues) {
                try {
                    values.add(nextProperty.decodeValue(stringValue, propertyDefOptions));
                    values.add(nextProperty.decodeValue(stringValue));
                } catch (PropertyException e) {
                    exception = PropertyException.defaultBehaviorException(nextProperty, e);
                    break;
@@ -227,7 +226,7 @@
                    Collection<T> tmp = find(target, pd2);
                    Collection<T> values = new ArrayList<T>(tmp.size());
                    for (T value : tmp) {
                        pd1.validateValue(value, propertyDefOptions);
                        pd1.validateValue(value);
                        values.add(value);
                    }
                    return values;
@@ -253,16 +252,11 @@
        }
    };
    private final PropertyDefinitionsOptions propertyDefOptions;
    /**
     * Creates a new abstract driver.
     *
     * @param propertyDefOptions
     *            Decoding options for property definitions values.
     */
    protected Driver(PropertyDefinitionsOptions propertyDefOptions) {
        this.propertyDefOptions = propertyDefOptions;
    protected Driver() {
       // Do nothing.
    }
    /**
opendj-config/src/main/java/org/forgerock/opendj/config/client/spi/PropertySet.java
@@ -35,7 +35,6 @@
import org.forgerock.opendj.config.PropertyException;
import org.forgerock.opendj.config.PropertyDefinition;
import org.forgerock.opendj.config.PropertyDefinitionsOptions;
import org.forgerock.opendj.config.PropertyOption;
/**
@@ -281,8 +280,6 @@
     *            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 PropertyException
     *             If a new pending value is deemed to be invalid according to
     *             the property definition.
@@ -295,8 +292,7 @@
     *             If the specified property definition is not associated with
     *             this managed object.
     */
    <T> void setPropertyValues(PropertyDefinition<T> d, Collection<T> values,
        PropertyDefinitionsOptions options) {
    <T> void setPropertyValues(PropertyDefinition<T> d, Collection<T> values) {
        MyProperty<T> property = (MyProperty<T>) getProperty(d);
        if (values.size() > 1 && !d.hasOption(PropertyOption.MULTI_VALUED)) {
@@ -316,7 +312,7 @@
                throw new NullPointerException();
            }
            d.validateValue(e, options);
            d.validateValue(e);
        }
        // Update the property.
opendj-config/src/main/java/org/forgerock/opendj/config/conditions/ContainsCondition.java
@@ -29,7 +29,6 @@
import org.forgerock.opendj.config.AbstractManagedObjectDefinition;
import org.forgerock.opendj.config.PropertyDefinition;
import org.forgerock.opendj.config.PropertyDefinitionsOptions;
import org.forgerock.opendj.config.client.ManagedObject;
import org.forgerock.opendj.config.client.ManagementContext;
import org.forgerock.opendj.config.server.ConfigException;
@@ -151,7 +150,7 @@
    // Creates the new private implementation.
    private <T> void buildImpl(PropertyDefinition<T> pd) {
        T value = pd.decodeValue(propertyStringValue, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        T value = pd.decodeValue(propertyStringValue);
        this.impl = new Impl<T>(pd, value);
    }
opendj-config/src/main/java/org/forgerock/opendj/config/server/ServerManagementContext.java
@@ -44,7 +44,6 @@
import java.util.TreeSet;
import org.forgerock.i18n.LocalizableMessage;
import org.opends.server.core.DirectoryServer;
import org.forgerock.opendj.server.config.meta.RootCfgDefn;
import org.forgerock.opendj.server.config.server.RootCfg;
import org.forgerock.opendj.config.AbsoluteInheritedDefaultBehaviorProvider;
@@ -63,7 +62,6 @@
import org.forgerock.opendj.config.ManagedObjectPath;
import org.forgerock.opendj.config.PropertyDefinition;
import org.forgerock.opendj.config.PropertyDefinitionVisitor;
import org.forgerock.opendj.config.PropertyDefinitionsOptions;
import org.forgerock.opendj.config.PropertyNotFoundException;
import org.forgerock.opendj.config.PropertyOption;
import org.forgerock.opendj.config.Reference;
@@ -78,6 +76,7 @@
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.Entry;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.forgerock.opendj.ldap.schema.Schema;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -143,7 +142,7 @@
            for (String stringValue : stringValues) {
                try {
                    values.add(nextProperty.decodeValue(stringValue, propertyDefOptions));
                    values.add(nextProperty.decodeValue(stringValue));
                } catch (PropertyException e) {
                    exception = PropertyException.defaultBehaviorException(nextProperty, e);
                    break;
@@ -234,7 +233,7 @@
                if (attributeValues.size() > 0) {
                    Collection<T> pvalues = new ArrayList<T>();
                    for (String value : attributeValues) {
                        pvalues.add(ValueDecoder.decode(propDef1, value, propertyDefOptions));
                        pvalues.add(ValueDecoder.decode(propDef1, value));
                    }
                    return pvalues;
                } else {
@@ -242,7 +241,7 @@
                    Collection<T> tmp = find(target, propDef2);
                    Collection<T> pvalues = new ArrayList<T>(tmp.size());
                    for (T value : tmp) {
                        propDef1.validateValue(value, propertyDefOptions);
                        propDef1.validateValue(value);
                        pvalues.add(value);
                    }
                    return pvalues;
@@ -289,8 +288,6 @@
     */
    private static final class ValueDecoder extends PropertyDefinitionVisitor<Object, String> {
        private final PropertyDefinitionsOptions options;
        /**
         * Decodes the provided property LDAP value.
         *
@@ -300,21 +297,18 @@
         *            The property definition.
         * @param value
         *            The LDAP string representation.
         * @param options
         *            Options to decode property definitions values.
         * @return Returns the decoded LDAP value.
         * @throws PropertyException
         *             If the property value could not be decoded because it was
         *             invalid.
         */
        public static <P> P decode(PropertyDefinition<P> propertyDef, String value,
            PropertyDefinitionsOptions options) {
            return propertyDef.castValue(propertyDef.accept(new ValueDecoder(options), value));
        public static <P> P decode(PropertyDefinition<P> propertyDef, String value) {
            return propertyDef.castValue(propertyDef.accept(new ValueDecoder(), value));
        }
        // Prevent instantiation.
        private ValueDecoder(PropertyDefinitionsOptions options) {
            this.options = options;
        private ValueDecoder() {
            // Do nothing.
        }
        /**
@@ -339,7 +333,7 @@
        @Override
        public <T> Object visitUnknown(PropertyDefinition<T> d, String p) {
            // By default the property definition's decoder will do.
            return d.decodeValue(p, options);
            return d.decodeValue(p);
        }
    }
@@ -354,23 +348,13 @@
    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, PropertyDefinitionsOptions propertyDefOptions) {
    ServerManagementContext(ConfigurationRepository repository) {
        configRepository = repository;
        this.propertyDefOptions = propertyDefOptions;
    }
    /**
@@ -715,7 +699,7 @@
            // The property has values defined for it.
            for (String value : attributeValues) {
                try {
                    pvalues.add(ValueDecoder.decode(propertyDef, value, propertyDefOptions));
                    pvalues.add(ValueDecoder.decode(propertyDef, value));
                } catch (PropertyException e) {
                    exception = e;
                }
@@ -758,7 +742,7 @@
        // We should log a warning here if this is the case
        // since the attribute should have been defined.
        String attrID = LDAPProfile.getInstance().getAttributeName(d, pd);
        AttributeType type = DirectoryServer.getAttributeType(attrID, true);
        AttributeType type = Schema.getDefaultSchema().getAttributeType(attrID);
        Iterable<Attribute> attributes = configEntry.getAllAttributes(AttributeDescription.create(type));
        List<String> values = new ArrayList<String>();
        for (Attribute attribute : attributes) {
opendj-config/src/main/java/org/opends/server/core/DirectoryServer.java
File was deleted
opendj-config/src/main/java/org/opends/server/core/package-info.java
File was deleted
opendj-config/src/test/java/org/forgerock/opendj/config/AttributeTypePropertyDefinitionTest.java
@@ -39,7 +39,7 @@
    @Test
    public void testValidateValue() {
        AttributeTypePropertyDefinition propertyDef = createPropertyDefinition();
        propertyDef.validateValue(Schema.getDefaultSchema().getAttributeType("cn"), new PropertyDefinitionsOptions());
        propertyDef.validateValue(Schema.getDefaultSchema().getAttributeType("cn"));
    }
    @DataProvider(name = "valueLegalData")
@@ -51,13 +51,13 @@
    public void testDecodeValue(String value) {
        AttributeTypePropertyDefinition propertyDef = createPropertyDefinition();
        AttributeType expected = Schema.getDefaultSchema().getAttributeType(value);
        assertEquals(propertyDef.decodeValue(value, new PropertyDefinitionsOptions()), expected);
        assertEquals(propertyDef.decodeValue(value), expected);
    }
    @Test(dataProvider = "valueLegalData")
    public void testEncodeValue(String value) {
        AttributeTypePropertyDefinition propertyDef = createPropertyDefinition();
        assertEquals(propertyDef.encodeValue(propertyDef.decodeValue(value, new PropertyDefinitionsOptions())), value);
        assertEquals(propertyDef.encodeValue(propertyDef.decodeValue(value)), value);
    }
    @DataProvider(name = "valueIllegalData")
@@ -67,14 +67,19 @@
    @Test(dataProvider = "valueIllegalData", expectedExceptions = { PropertyException.class })
    public void testDecodeValueIllegal(String value) {
        AttributeTypePropertyDefinition propertyDef = createPropertyDefinition();
        propertyDef.decodeValue(value, new PropertyDefinitionsOptions());
        ConfigurationFramework.getInstance().setIsClient(false);
        try {
            AttributeTypePropertyDefinition propertyDef = createPropertyDefinition();
            propertyDef.decodeValue(value);
        } finally {
            ConfigurationFramework.getInstance().setIsClient(true);
        }
    }
    @Test(dataProvider = "valueIllegalData")
    public void testDecodeValueIllegalNoSchemaCheck(String value) {
        AttributeTypePropertyDefinition propertyDef = createPropertyDefinition();
        AttributeType type = propertyDef.decodeValue(value, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        AttributeType type = propertyDef.decodeValue(value);
        assertEquals(type.getNameOrOID(), value);
    }
opendj-config/src/test/java/org/forgerock/opendj/config/BooleanPropertyDefinitionTest.java
@@ -45,13 +45,13 @@
    @Test
    public void testValidateValue() {
        BooleanPropertyDefinition def = createPropertyDefinition();
        def.validateValue(Boolean.TRUE, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        def.validateValue(Boolean.TRUE);
    }
    @Test(expectedExceptions = NullPointerException.class)
    public void testValidateValueIllegal() {
        BooleanPropertyDefinition def = createPropertyDefinition();
        def.validateValue(null, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        def.validateValue(null);
    }
    @DataProvider(name = "decodeValueData")
@@ -62,7 +62,7 @@
    @Test(dataProvider = "decodeValueData")
    public void testDecodeValue(String value, Boolean expected) {
        BooleanPropertyDefinition def = createPropertyDefinition();
        assertEquals(def.decodeValue(value, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS), expected);
        assertEquals(def.decodeValue(value), expected);
    }
    @DataProvider(name = "decodeValueDataIllegal")
@@ -74,7 +74,7 @@
            PropertyException.class })
    public void testDecodeValueIllegal(String value) {
        BooleanPropertyDefinition def = createPropertyDefinition();
        def.decodeValue(value, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        def.decodeValue(value);
    }
    private BooleanPropertyDefinition createPropertyDefinition() {
opendj-config/src/test/java/org/forgerock/opendj/config/ConfigurationMock.java
@@ -182,7 +182,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, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS));
                values.add(propertyDef.decodeValue(stringValue));
            }
            return values;
        }
opendj-config/src/test/java/org/forgerock/opendj/config/DNPropertyDefinitionTest.java
@@ -94,7 +94,7 @@
                "test-property");
        localBuilder.setBaseDN(baseDN);
        DNPropertyDefinition propertyDef = localBuilder.getInstance();
        propertyDef.validateValue(DN.valueOf(valueToValidate), PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        propertyDef.validateValue(DN.valueOf(valueToValidate));
    }
    @Test(dataProvider = "illegalValues", expectedExceptions = PropertyException.class)
@@ -103,7 +103,7 @@
                "test-property");
        localBuilder.setBaseDN(baseDN);
        DNPropertyDefinition propertyDef = localBuilder.getInstance();
        propertyDef.validateValue(DN.valueOf(valueToValidate), PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        propertyDef.validateValue(DN.valueOf(valueToValidate));
    }
    @Test(dataProvider = "legalValues")
@@ -112,7 +112,7 @@
                "test-property");
        localBuilder.setBaseDN(baseDN);
        DNPropertyDefinition propertyDef = localBuilder.getInstance();
        propertyDef.decodeValue(valueToValidate, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        propertyDef.decodeValue(valueToValidate);
    }
    @Test(dataProvider = "illegalValues", expectedExceptions = PropertyException.class)
@@ -121,6 +121,6 @@
                "test-property");
        localBuilder.setBaseDN(baseDN);
        DNPropertyDefinition propertyDef = localBuilder.getInstance();
        propertyDef.decodeValue(valueToValidate, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        propertyDef.decodeValue(valueToValidate);
    }
}
opendj-config/src/test/java/org/forgerock/opendj/config/DurationPropertyDefinitionTest.java
@@ -124,7 +124,7 @@
        DurationPropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(true);
        DurationPropertyDefinition def = buildTestDefinition(builder);
        def.decodeValue("unlimited", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        def.decodeValue("unlimited");
    }
    @Test(expectedExceptions = PropertyException.class)
@@ -132,7 +132,7 @@
        DurationPropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(false);
        DurationPropertyDefinition def = buildTestDefinition(builder);
        def.decodeValue("unlimited", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        def.decodeValue("unlimited");
    }
    @Test(expectedExceptions = PropertyException.class)
@@ -140,7 +140,7 @@
        DurationPropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(false);
        DurationPropertyDefinition def = buildTestDefinition(builder);
        def.validateValue(-1L, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        def.validateValue(-1L);
    }
    @DataProvider(name = "validateValueData")
@@ -163,7 +163,7 @@
        builder.setUpperLimit(higherLimitInMillis);
        builder.setAllowUnlimited(isAllowUnlimited);
        DurationPropertyDefinition def = buildTestDefinition(builder);
        def.validateValue(valueInSeconds, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        def.validateValue(valueInSeconds);
    }
    @DataProvider(name = "illegalValidateValueData")
@@ -185,7 +185,7 @@
        builder.setUpperLimit(highLimitInMillis);
        builder.setAllowUnlimited(isAllowUnlimited);
        DurationPropertyDefinition def = buildTestDefinition(builder);
        def.validateValue(valueInSeconds, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        def.validateValue(valueInSeconds);
    }
    @DataProvider(name = "encodeValueData")
@@ -304,7 +304,7 @@
        builder.setMaximumUnit(DurationUnit.DAYS);
        DurationPropertyDefinition def = buildTestDefinition(builder);
        assertThat(def.decodeValue(valueToDecode, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS)).
        assertThat(def.decodeValue(valueToDecode)).
            isEqualTo(expectedValue);
    }
@@ -338,7 +338,7 @@
        builder.setLowerLimit(5L);
        builder.setUpperLimit(10L);
        DurationPropertyDefinition def = buildTestDefinition(builder);
        def.decodeValue(valueToDecode, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        def.decodeValue(valueToDecode);
    }
    private DurationPropertyDefinition.Builder createTestBuilder() {
opendj-config/src/test/java/org/forgerock/opendj/config/EnumPropertyDefinitionTest.java
@@ -94,7 +94,7 @@
    @Test(dataProvider = "decodeValueData")
    public void testDecodeValue(String value, TestEnum expectedValue) {
        EnumPropertyDefinition<?> def = builder.getInstance();
        assertEquals(def.decodeValue(value, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS), expectedValue);
        assertEquals(def.decodeValue(value), expectedValue);
    }
    /**
@@ -117,7 +117,7 @@
            PropertyException.class })
    public void testDecodeValueIllegalData(String value) {
        EnumPropertyDefinition<?> def = builder.getInstance();
        def.decodeValue(value, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        def.decodeValue(value);
    }
    /**
@@ -135,7 +135,7 @@
    @Test
    public void testValidateValue() {
        EnumPropertyDefinition<TestEnum> def = builder.getInstance();
        def.validateValue(TestEnum.ONE, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        def.validateValue(TestEnum.ONE);
    }
}
opendj-config/src/test/java/org/forgerock/opendj/config/IntegerPropertyDefinitionTest.java
@@ -92,7 +92,7 @@
        IntegerPropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(true);
        IntegerPropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.decodeValue("unlimited", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        propertyDef.decodeValue("unlimited");
    }
    @Test(expectedExceptions = PropertyException.class)
@@ -100,7 +100,7 @@
        IntegerPropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(false);
        IntegerPropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.decodeValue("unlimited", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        propertyDef.decodeValue("unlimited");
    }
    @Test(expectedExceptions = PropertyException.class)
@@ -108,7 +108,7 @@
        IntegerPropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(false);
        IntegerPropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.validateValue(-1, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        propertyDef.validateValue(-1);
    }
    @DataProvider(name = "validateValueData")
@@ -128,7 +128,7 @@
        builder.setUpperLimit(high);
        builder.setAllowUnlimited(allowUnlimited);
        IntegerPropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.validateValue(valueToValidate, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        propertyDef.validateValue(valueToValidate);
    }
    @DataProvider(name = "illegalValidateValueData")
@@ -152,7 +152,7 @@
        builder.setUpperLimit(high);
        builder.setAllowUnlimited(allowUnlimited);
        IntegerPropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.validateValue(value, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        propertyDef.validateValue(value);
    }
    @DataProvider(name = "encodeValueData")
opendj-config/src/test/java/org/forgerock/opendj/config/SizePropertyDefinitionTest.java
@@ -99,7 +99,7 @@
        SizePropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(true);
        SizePropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.decodeValue("unlimited", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        propertyDef.decodeValue("unlimited");
    }
    @Test(expectedExceptions = PropertyException.class)
@@ -107,7 +107,7 @@
        SizePropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(false);
        SizePropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.decodeValue("unlimited", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        propertyDef.decodeValue("unlimited");
    }
    @Test(expectedExceptions = PropertyException.class)
@@ -115,7 +115,7 @@
        SizePropertyDefinition.Builder builder = createTestBuilder();
        builder.setAllowUnlimited(false);
        SizePropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.validateValue(-1L, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        propertyDef.validateValue(-1L);
    }
    @DataProvider(name = "validateValueData")
@@ -135,7 +135,7 @@
        builder.setUpperLimit(high);
        builder.setAllowUnlimited(isAllowUnlimited);
        SizePropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.validateValue(valueToValidate, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        propertyDef.validateValue(valueToValidate);
    }
    @DataProvider(name = "illegalValidateValueData")
@@ -159,7 +159,7 @@
        builder.setUpperLimit(high);
        builder.setAllowUnlimited(allowUnlimited);
        SizePropertyDefinition propertyDef = buildTestDefinition(builder);
        propertyDef.validateValue(valueToValidate, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        propertyDef.validateValue(valueToValidate);
    }
    @DataProvider(name = "encodeValueData")
opendj-config/src/test/java/org/forgerock/opendj/config/StringPropertyDefinitionTest.java
@@ -36,33 +36,33 @@
    @Test
    public void testValidateValueNoPattern() {
        StringPropertyDefinition d = getDefinition(true, null);
        d.validateValue("abc", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        d.validateValue("abc");
    }
    @Test
    public void testValidateValuePatternMatches() {
        StringPropertyDefinition d = getDefinition(true, "^[a-z]+$");
        d.validateValue("abc", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        d.validateValue("abc");
    }
    // TODO : I18N problem
    @Test(enabled = false, expectedExceptions = PropertyException.class)
    public void testValidateValuePatternDoesNotMatch() {
        StringPropertyDefinition d = getDefinition(true, "^[a-z]+$");
        d.validateValue("abc123", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        d.validateValue("abc123");
    }
    @Test
    public void testDecodeValuePatternMatches() {
        StringPropertyDefinition d = getDefinition(true, "^[a-z]+$");
        assertEquals(d.decodeValue("abc", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS), "abc");
        assertEquals(d.decodeValue("abc"), "abc");
    }
    // TODO : I18N problem
    @Test(enabled = false, expectedExceptions = PropertyException.class)
    public void testDecodeValuePatternDoesNotMatch() {
        StringPropertyDefinition d = getDefinition(true, "^[a-z]+$");
        d.decodeValue("abc123", PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        d.decodeValue("abc123");
    }
    // Create a string property definition.
opendj-config/src/test/java/org/forgerock/opendj/config/client/ldap/AggregationClientTest.java
@@ -34,7 +34,6 @@
import org.forgerock.opendj.config.AdminTestCase;
import org.forgerock.opendj.config.PropertyException;
import org.forgerock.opendj.config.LDAPProfile;
import org.forgerock.opendj.config.PropertyDefinitionsOptions;
import org.forgerock.opendj.config.TestCfg;
import org.forgerock.opendj.config.TestChildCfgClient;
import org.forgerock.opendj.config.TestChildCfgDefn;
@@ -42,8 +41,8 @@
import org.forgerock.opendj.config.client.ManagedObject;
import org.forgerock.opendj.config.client.ManagedObjectDecodingException;
import org.forgerock.opendj.config.client.ManagementContext;
import org.forgerock.opendj.ldap.schema.Schema;
import org.forgerock.opendj.server.config.client.RootCfgClient;
import org.opends.server.core.DirectoryServer;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
@@ -177,8 +176,7 @@
    public void testAggregationEmpty() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
            PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 1");
        assertSetEquals(child.getAggregationProperty(), new String[0]);
@@ -195,8 +193,7 @@
    public void testAggregationSingle() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
            PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 2");
@@ -217,8 +214,7 @@
    public void testAggregationMultiple() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
            PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 3");
        assertSetEquals(child.getAggregationProperty(), "LDAPS Connection Handler", "LDAP Connection Handler");
@@ -235,8 +231,7 @@
    public void testAggregationBadBaseDN() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
            PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        try {
@@ -278,12 +273,11 @@
        c.addExpectedAttribute("ds-cfg-rotation-policy",
                "cn=LDAP Connection Handler,cn=connection handlers, cn=config");
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
            PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
        child.setMandatoryBooleanProperty(true);
        child.setMandatoryReadOnlyAttributeTypeProperty(DirectoryServer.getAttributeType("description"));
        child.setMandatoryReadOnlyAttributeTypeProperty(Schema.getDefaultSchema().getAttributeType("description"));
        child.setAggregationProperty(Collections.singleton("LDAP Connection Handler"));
        child.commit();
@@ -305,8 +299,7 @@
        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, LDAPProfile.getInstance(),
            PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        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-config/src/test/java/org/forgerock/opendj/config/client/ldap/LDAPClientTest.java
@@ -37,7 +37,6 @@
import org.forgerock.opendj.config.LDAPProfile;
import org.forgerock.opendj.config.ManagedObjectAlreadyExistsException;
import org.forgerock.opendj.config.ManagedObjectNotFoundException;
import org.forgerock.opendj.config.PropertyDefinitionsOptions;
import org.forgerock.opendj.config.TestCfg;
import org.forgerock.opendj.config.TestChildCfgClient;
import org.forgerock.opendj.config.TestChildCfgDefn;
@@ -51,8 +50,9 @@
import org.forgerock.opendj.ldap.ErrorResultException;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.responses.SearchResultEntry;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.forgerock.opendj.ldap.schema.Schema;
import org.forgerock.opendj.server.config.client.RootCfgClient;
import org.opends.server.core.DirectoryServer;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
@@ -234,12 +234,11 @@
        c.addExpectedAttribute("ds-cfg-attribute-type", "description");
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
        child.setMandatoryBooleanProperty(true);
        child.setMandatoryReadOnlyAttributeTypeProperty(DirectoryServer.getAttributeType("description"));
        child.setMandatoryReadOnlyAttributeTypeProperty(getAttributeType("description"));
        child.commit();
        c.assertEntryIsCreated();
@@ -262,12 +261,11 @@
        };
        conn.importLDIF(TEST_LDIF);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(conn, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(conn, LDAPProfile.getInstance());
        try {
            TestParentCfgClient parent = createTestParent(ctx, "test parent new");
            parent.setMandatoryBooleanProperty(true);
            parent.setMandatoryReadOnlyAttributeTypeProperty(DirectoryServer.getAttributeType("description"));
            parent.setMandatoryReadOnlyAttributeTypeProperty(getAttributeType("description"));
            parent.commit();
        } catch (Exception e) {
            if (expectedExceptionClass.equals(ErrorResultException.class)) {
@@ -297,11 +295,10 @@
        c.addExpectedAttribute("ds-cfg-attribute-type", "description");
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = createTestParent(ctx, "test parent new");
        parent.setMandatoryBooleanProperty(true);
        parent.setMandatoryReadOnlyAttributeTypeProperty(DirectoryServer.getAttributeType("description"));
        parent.setMandatoryReadOnlyAttributeTypeProperty(getAttributeType("description"));
        parent.commit();
        c.assertEntryIsCreated();
    }
@@ -317,15 +314,14 @@
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 3");
        Assert.assertEquals(child.isMandatoryBooleanProperty(), Boolean.TRUE);
        Assert.assertEquals(child.getMandatoryClassProperty(),
            "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        Assert.assertEquals(child.getMandatoryReadOnlyAttributeTypeProperty(),
            DirectoryServer.getAttributeType("description"));
            getAttributeType("description"));
        assertDNSetEquals(child.getOptionalMultiValuedDNProperty1(), "dc=default value c3v1,dc=com",
            "dc=default value c3v2,dc=com");
        assertDNSetEquals(child.getOptionalMultiValuedDNProperty2(), "dc=default value c3v3,dc=com",
@@ -343,15 +339,14 @@
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 1");
        Assert.assertEquals(child.isMandatoryBooleanProperty(), Boolean.TRUE);
        Assert.assertEquals(child.getMandatoryClassProperty(),
            "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        Assert.assertEquals(child.getMandatoryReadOnlyAttributeTypeProperty(),
            DirectoryServer.getAttributeType("description"));
            getAttributeType("description"));
        assertDNSetEquals(child.getOptionalMultiValuedDNProperty1(), "dc=domain1,dc=com", "dc=domain2,dc=com",
            "dc=domain3,dc=com");
        assertDNSetEquals(child.getOptionalMultiValuedDNProperty2(), "dc=domain1,dc=com", "dc=domain2,dc=com",
@@ -381,8 +376,7 @@
        };
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        try {
            getTestParent(ctx, "test parent 2");
        } catch (Exception e) {
@@ -406,14 +400,13 @@
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 2");
        Assert.assertEquals(parent.isMandatoryBooleanProperty(), Boolean.TRUE);
        Assert.assertEquals(parent.getMandatoryClassProperty(),
            "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        Assert.assertEquals(parent.getMandatoryReadOnlyAttributeTypeProperty(),
            DirectoryServer.getAttributeType("description"));
            getAttributeType("description"));
        assertDNSetEquals(parent.getOptionalMultiValuedDNProperty(), "dc=default value p2v1,dc=com",
            "dc=default value p2v2,dc=com");
    }
@@ -429,14 +422,13 @@
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        Assert.assertEquals(parent.isMandatoryBooleanProperty(), Boolean.TRUE);
        Assert.assertEquals(parent.getMandatoryClassProperty(),
            "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        Assert.assertEquals(parent.getMandatoryReadOnlyAttributeTypeProperty(),
            DirectoryServer.getAttributeType("description"));
            getAttributeType("description"));
        assertDNSetEquals(parent.getOptionalMultiValuedDNProperty(), "dc=domain1,dc=com", "dc=domain2,dc=com",
            "dc=domain3,dc=com");
    }
@@ -461,8 +453,7 @@
        c.addExpectedAttribute("ds-cfg-attribute-type", "description");
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
@@ -478,7 +469,7 @@
        // Check that the default values are not committed.
        child.setMandatoryBooleanProperty(true);
        child.setMandatoryReadOnlyAttributeTypeProperty(DirectoryServer.getAttributeType("description"));
        child.setMandatoryReadOnlyAttributeTypeProperty(getAttributeType("description"));
        child.commit();
        c.assertEntryIsCreated();
@@ -504,8 +495,7 @@
        c.addExpectedAttribute("ds-cfg-attribute-type", "description");
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 2");
        TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
@@ -521,7 +511,7 @@
        // Check that the default values are not committed.
        child.setMandatoryBooleanProperty(true);
        child.setMandatoryReadOnlyAttributeTypeProperty(DirectoryServer.getAttributeType("description"));
        child.setMandatoryReadOnlyAttributeTypeProperty(getAttributeType("description"));
        child.commit();
        c.assertEntryIsCreated();
@@ -538,8 +528,7 @@
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        String[] actual = parent.listTestChildren();
        String[] expected = new String[] { "test child 1", "test child 2", "test child 3" };
@@ -557,8 +546,7 @@
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 3");
        String[] actual = parent.listTestChildren();
        String[] expected = new String[] {};
@@ -576,8 +564,7 @@
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        String[] actual = listTestParents(ctx);
        String[] expected = new String[] { "test parent 1", "test parent 2", "test parent 3" };
        Assert.assertEqualsNoOrder(actual, expected);
@@ -593,8 +580,7 @@
    public void testListTopLevelManagedObjectsEmpty() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        String[] actual = listTestParents(ctx);
        String[] expected = new String[] {};
        Assert.assertEqualsNoOrder(actual, expected);
@@ -614,8 +600,7 @@
        c.importLDIF(TEST_LDIF);
        c.addExpectedModification("ds-cfg-base-dn");
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 2");
        child.setOptionalMultiValuedDNProperty1(Collections.<DN> emptySet());
@@ -635,8 +620,7 @@
            new ModifyEntryMockLDAPConnection("cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        parent.commit();
        Assert.assertFalse(c.isEntryModified());
@@ -656,8 +640,7 @@
        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, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        parent.setMandatoryBooleanProperty(false);
        parent.setOptionalMultiValuedDNProperty(Arrays.asList(DN.valueOf("dc=mod1,dc=com"),
@@ -679,8 +662,7 @@
                "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, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        parent.removeTestChild("test child 1");
        c.assertSubtreeIsDeleted();
@@ -698,8 +680,7 @@
            new DeleteSubtreeMockLDAPConnection("cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        removeTestParent(ctx, "test parent 1");
        c.assertSubtreeIsDeleted();
    }
@@ -729,12 +710,11 @@
            c.addExpectedAttribute("ds-cfg-attribute-type", "description");
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                    PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
            child.setMandatoryBooleanProperty(true);
            child.setMandatoryReadOnlyAttributeTypeProperty(DirectoryServer.getAttributeType("description"));
            child.setMandatoryReadOnlyAttributeTypeProperty(getAttributeType("description"));
            child.commit();
            c.assertEntryIsCreated();
@@ -769,12 +749,11 @@
            conn.addExpectedAttribute("ds-cfg-attribute-type", "description");
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(conn, LDAPProfile.getInstance(),
                    PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
                LDAPManagementContext.createFromContext(conn, LDAPProfile.getInstance());
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
            child.setMandatoryBooleanProperty(true);
            child.setMandatoryReadOnlyAttributeTypeProperty(DirectoryServer.getAttributeType("description"));
            child.setMandatoryReadOnlyAttributeTypeProperty(getAttributeType("description"));
            child.commit();
            Assert.fail("The add constraint failed to prevent creation of the managed object");
        } finally {
@@ -801,8 +780,7 @@
                    "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, LDAPProfile.getInstance(),
                    PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            parent.removeTestChild("test child 1");
            c.assertSubtreeIsDeleted();
@@ -830,8 +808,7 @@
                    "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, LDAPProfile.getInstance(),
                    PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
            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");
@@ -860,8 +837,7 @@
            c.importLDIF(TEST_LDIF);
            c.addExpectedModification("ds-cfg-base-dn");
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                    PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            TestChildCfgClient child = parent.getTestChild("test child 2");
            child.setOptionalMultiValuedDNProperty1(Collections.<DN> emptySet());
@@ -892,8 +868,7 @@
            c.importLDIF(TEST_LDIF);
            c.addExpectedModification("ds-cfg-base-dn");
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance(),
                    PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            TestChildCfgClient child = parent.getTestChild("test child 2");
            child.setOptionalMultiValuedDNProperty1(Collections.<DN> emptySet());
@@ -940,4 +915,8 @@
        ManagedObject<RootCfgClient> root = context.getRootConfigurationManagedObject();
        root.removeChild(TestCfg.getTestOneToManyParentRelationDefinition(), name);
    }
    private AttributeType getAttributeType(String type) {
        return Schema.getDefaultSchema().getAttributeType(type);
    }
}
opendj-config/src/test/java/org/forgerock/opendj/config/server/AggregationServerTest.java
@@ -43,7 +43,6 @@
import org.forgerock.opendj.config.AdministratorAction;
import org.forgerock.opendj.config.AggregationPropertyDefinition;
import org.forgerock.opendj.config.PropertyException;
import org.forgerock.opendj.config.PropertyDefinitionsOptions;
import org.forgerock.opendj.config.PropertyOption;
import org.forgerock.opendj.config.TestCfg;
import org.forgerock.opendj.config.TestChildCfg;
@@ -296,7 +295,7 @@
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_3, LDAP_CONN_HANDLER_ENTRY);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        try {
            parentCfg.getTestChild(entryName(TEST_CHILD_3));
@@ -321,7 +320,7 @@
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_5, LDAP_CONN_HANDLER_ENTRY);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        try {
@@ -344,7 +343,7 @@
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_6, TEST_CONNECTION_HANDLER_ENTRY_DISABLED);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        registerAggregationDefinitionWithTargetEnabled();
@@ -371,7 +370,7 @@
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_7, TEST_CONNECTION_HANDLER_ENTRY_DISABLED);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        registerAggregationDefinitionWithTargetEnabled();
@@ -399,7 +398,7 @@
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_6, TEST_CONNECTION_HANDLER_ENTRY_DISABLED);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        registerAggregationDefinitionWithTargetAndSourceEnabled();
@@ -426,7 +425,7 @@
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_7, TEST_CONNECTION_HANDLER_ENTRY_DISABLED);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        registerAggregationDefinitionWithTargetAndSourceEnabled();
@@ -446,7 +445,7 @@
    public void testAggregationEmpty() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_1);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        TestChildCfg testChildCfg = parentCfg.getTestChild(entryName(TEST_CHILD_1));
@@ -467,7 +466,7 @@
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_4, LDAP_CONN_HANDLER_ENTRY,
                LDAPS_CONN_HANDLER_ENTRY);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        TestChildCfg testChildCfg = parentCfg.getTestChild(entryName(TEST_CHILD_4));
@@ -487,7 +486,7 @@
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_2, LDAP_CONN_HANDLER_ENTRY);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        TestChildCfg testChildCfg = parentCfg.getTestChild(entryName(TEST_CHILD_2));
@@ -513,7 +512,7 @@
            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);
            new ServerManagementContext(configRepository);
        registerAggregationDefinitionWithTargetEnabled();
@@ -551,7 +550,7 @@
            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);
            new ServerManagementContext(configRepository);
        registerAggregationDefinitionWithTargetEnabled();
opendj-config/src/test/java/org/forgerock/opendj/config/server/ConstraintTest.java
@@ -36,7 +36,6 @@
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.LocalizableMessageBuilder;
import org.forgerock.opendj.config.AdminTestCase;
import org.forgerock.opendj.config.PropertyDefinitionsOptions;
import org.forgerock.opendj.config.TestCfg;
import org.forgerock.opendj.config.TestChildCfg;
import org.forgerock.opendj.config.TestChildCfgDefn;
@@ -146,7 +145,7 @@
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_BASE_CHILD, TEST_CHILD_1);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        MockConstraint constraint = new MockConstraint(true, false, configRepository);
        try {
            TestCfg.addConstraint(constraint);
@@ -165,7 +164,7 @@
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_BASE_CHILD, TEST_CHILD_1);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        MockConstraint constraint = new MockConstraint(false, true, configRepository);
        try {
            TestCfg.addConstraint(constraint);
@@ -202,7 +201,7 @@
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_BASE_CHILD, TEST_CHILD_1);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        parentCfg.addTestChildAddListener(new AddListener());
        MockConstraint constraint = new MockConstraint(isUsableConstraint, false, configRepository);
@@ -225,7 +224,7 @@
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_BASE_CHILD, TEST_CHILD_1);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        parentCfg.addTestChildDeleteListener(new DeleteListener());
        MockConstraint constraint = new MockConstraint(false, isDeleteAllowedConstraint, configRepository);
@@ -248,7 +247,7 @@
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_BASE_CHILD, TEST_CHILD_1);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        MockConstraint constraint = new MockConstraint(isUsableConstraint, false, configRepository);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        TestChildCfg childCfg = parentCfg.getTestChild(entryName(TEST_CHILD_1));
opendj-config/src/test/java/org/forgerock/opendj/config/server/DefaultBehaviorTest.java
@@ -39,7 +39,6 @@
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.LocalizableMessageBuilder;
import org.forgerock.opendj.config.AdminTestCase;
import org.forgerock.opendj.config.PropertyDefinitionsOptions;
import org.forgerock.opendj.config.TestCfg;
import org.forgerock.opendj.config.TestChildCfg;
import org.forgerock.opendj.config.TestParentCfg;
@@ -266,7 +265,7 @@
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(testParent, testBaseChild, testChild);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        TestParentCfg parentCfg = getParentCfg(testParent, context);
        // assert
@@ -285,7 +284,7 @@
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(testParent, testBaseChild, testChild);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        TestParentCfg parentCfg = getParentCfg(testParent, context);
        TestConfigurationAddListener addListener = new TestConfigurationAddListener();
        parentCfg.addTestChildAddListener(addListener);
@@ -332,7 +331,7 @@
        ConfigurationRepository configRepository =
            createConfigRepositoryWithEntries(TEST_PARENT_1, TEST_CHILD_BASE_1, TEST_CHILD_1);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        TestParentCfg parentCfg = getParentCfg(TEST_PARENT_1, context);
        TestChildCfg childCfg = parentCfg.getTestChild(entryName(TEST_CHILD_1));
        TestConfigurationChangeListener changeListener = new TestConfigurationChangeListener();
@@ -362,7 +361,7 @@
    public void testParentValues(Entry parentEntry, List<String> valuesForOptionalDNProperty) throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithEntries(parentEntry);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        TestParentCfg parent = getParentCfg(parentEntry, context);
        assertThat(parent.getMandatoryClassProperty()).isEqualTo(
opendj-config/src/test/java/org/forgerock/opendj/config/server/ListenerTest.java
@@ -37,7 +37,6 @@
import java.util.Arrays;
import org.forgerock.opendj.config.AdminTestCase;
import org.forgerock.opendj.config.PropertyDefinitionsOptions;
import org.forgerock.opendj.config.TestCfg;
import org.forgerock.opendj.config.TestParentCfg;
import org.forgerock.opendj.config.server.spi.ConfigAddListener;
@@ -115,7 +114,7 @@
    public void testRegisterAddListenerWithInstantiableRelationImmediate() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN, TEST_PARENTS_DN);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        root.registerAddListener(TestCfg.getTestOneToManyParentRelationDefinition(),
@@ -128,7 +127,7 @@
    public void testRegisterAddListenerWithInstantiableRelationDelayed() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        ConfigurationAddListener<TestParentCfg> parentListener = mock(ConfigurationAddListener.class);
@@ -148,7 +147,7 @@
    public void testRegisterAddListenerWithInstantiableRelationDelayedThenActualized() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        // register a listener to root
@@ -176,7 +175,7 @@
    public void testRegisterAddListenerWithOptionalRelation() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        root.registerAddListener(TestCfg.getTestOneToZeroOrOneParentRelationDefinition(),
@@ -189,7 +188,7 @@
    public void testRegisterDeleteListenerWithInstantiableRelationImmediate() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN, TEST_PARENTS_DN);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        root.registerDeleteListener(TestCfg.getTestOneToManyParentRelationDefinition(),
@@ -202,7 +201,7 @@
    public void testRegisterDeleteListenerWithInstantiableRelationDelayed() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        ConfigurationDeleteListener<TestParentCfg> parentListener = mock(ConfigurationDeleteListener.class);
@@ -222,7 +221,7 @@
    public void testRegisterDeleteListenerWithOptionalRelation() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        root.registerDeleteListener(TestCfg.getTestOneToZeroOrOneParentRelationDefinition(),
@@ -235,7 +234,7 @@
    public void testRegisterChangeListener() throws Exception {
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        root.setConfigDN(ROOT_CONFIG_DN);
@@ -249,7 +248,7 @@
        // arrange
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN, TEST_PARENTS_DN);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        ConfigurationAddListener<TestParentCfg> parentListener = mock(ConfigurationAddListener.class);
@@ -269,7 +268,7 @@
        // arrange
        ConfigurationRepository configRepository = createConfigRepositoryWithDNs(ROOT_CONFIG_DN);
        ServerManagementContext context =
            new ServerManagementContext(configRepository, PropertyDefinitionsOptions.NO_VALIDATION_OPTIONS);
            new ServerManagementContext(configRepository);
        ServerManagedObject<RootCfg> root = context.getRootConfigurationManagedObject();
        ConfigurationAddListener<TestParentCfg> parentListener = mock(ConfigurationAddListener.class);