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

Matthew Swift
07.28.2014 0e8d607d49d683199d938e0dba22c79342937991
OPENDJ-1343: Migrate dsconfig

* migrate opendj-config LDAP client support to SDK APIs
* refactored unit tests to use SDK's memory backend.
5 files deleted
1 files renamed
5 files modified
1564 ■■■■ changed files
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/DNBuilder.java 41 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPConnection.java 125 ●●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPDriver.java 84 ●●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPManagedObject.java 15 ●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPManagementContext.java 5 ●●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/client/ldap/AggregationClientTest.java 115 ●●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/client/ldap/CreateEntryMockLDAPConnection.java 111 ●●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/client/ldap/DeleteSubtreeMockLDAPConnection.java 70 ●●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/client/ldap/LDAPClientTest.java 497 ●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/client/ldap/MockLDAPConnection.java 387 ●●●●● patch | view | raw | blame | history
opendj-config/src/test/java/org/forgerock/opendj/config/client/ldap/ModifyEntryMockLDAPConnection.java 114 ●●●●● patch | view | raw | blame | history
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/DNBuilder.java
File was renamed from opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPNameBuilder.java
@@ -20,8 +20,8 @@
 *
 * CDDL HEADER END
 *
 *
 *      Copyright 2008-2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.config.client.ldap;
@@ -48,7 +48,7 @@
/**
 * A strategy for creating <code>DN</code>s from managed object paths.
 */
final class LDAPNameBuilder implements ManagedObjectPathSerializer {
final class DNBuilder implements ManagedObjectPathSerializer {
    /**
     * Creates a new DN representing the specified managed object path.
@@ -59,10 +59,10 @@
     *            The LDAP profile which should be used to construct LDAP names.
     * @return Returns a new DN representing the specified managed object path.
     */
    public static DN create(ManagedObjectPath<?, ?> path, LDAPProfile profile) {
        LDAPNameBuilder builder = new LDAPNameBuilder(profile);
    static DN create(ManagedObjectPath<?, ?> path, LDAPProfile profile) {
        DNBuilder builder = new DNBuilder(profile);
        path.serialize(builder);
        return builder.getInstance();
        return builder.build();
    }
    /**
@@ -78,12 +78,12 @@
     * @return Returns a new DN representing the specified managed object path
     *         and instantiable relation.
     */
    public static DN create(ManagedObjectPath<?, ?> path, InstantiableRelationDefinition<?, ?> relation,
            LDAPProfile profile) {
        LDAPNameBuilder builder = new LDAPNameBuilder(profile);
    static DN create(ManagedObjectPath<?, ?> path,
            InstantiableRelationDefinition<?, ?> relation, LDAPProfile profile) {
        DNBuilder builder = new DNBuilder(profile);
        path.serialize(builder);
        builder.appendManagedObjectPathElement(relation);
        return builder.getInstance();
        return builder.build();
    }
    /**
@@ -99,11 +99,12 @@
     * @return Returns a new DN representing the specified managed object path
     *         and set relation.
     */
    public static DN create(ManagedObjectPath<?, ?> path, SetRelationDefinition<?, ?> relation, LDAPProfile profile) {
        LDAPNameBuilder builder = new LDAPNameBuilder(profile);
    static DN create(ManagedObjectPath<?, ?> path, SetRelationDefinition<?, ?> relation,
            LDAPProfile profile) {
        DNBuilder builder = new DNBuilder(profile);
        path.serialize(builder);
        builder.appendManagedObjectPathElement(relation);
        return builder.getInstance();
        return builder.build();
    }
    /** The list of RDNs in big-endian order. */
@@ -117,7 +118,7 @@
     * @param profile
     *            The LDAP profile which should be used to construct DNs.
     */
    public LDAPNameBuilder(LDAPProfile profile) {
    private DNBuilder(LDAPProfile profile) {
        this.rdns = new LinkedList<RDN>();
        this.profile = profile;
    }
@@ -126,8 +127,8 @@
     * {@inheritDoc}
     */
    public <C extends ConfigurationClient, S extends Configuration> void appendManagedObjectPathElement(
        InstantiableRelationDefinition<? super C, ? super S> r, AbstractManagedObjectDefinition<C, S> d,
        String name) {
            InstantiableRelationDefinition<? super C, ? super S> r,
            AbstractManagedObjectDefinition<C, S> d, String name) {
        // Add the RDN sequence representing the relation.
        appendManagedObjectPathElement(r);
@@ -144,7 +145,7 @@
     * @param r
     *            The relation definition.
     */
    public void appendManagedObjectPathElement(RelationDefinition<?, ?> r) {
    private void appendManagedObjectPathElement(RelationDefinition<?, ?> r) {
        // Add the RDN sequence representing the relation.
        DN dn = DN.valueOf(profile.getRelationRDNSequence(r));
        List<RDN> rdnsOfDn = getRdnsInBigEndianOrder(dn);
@@ -171,7 +172,8 @@
     * {@inheritDoc}
     */
    public <C extends ConfigurationClient, S extends Configuration> void appendManagedObjectPathElement(
            OptionalRelationDefinition<? super C, ? super S> r, AbstractManagedObjectDefinition<C, S> d) {
            OptionalRelationDefinition<? super C, ? super S> r,
            AbstractManagedObjectDefinition<C, S> d) {
        // Add the RDN sequence representing the relation.
        appendManagedObjectPathElement(r);
    }
@@ -180,7 +182,8 @@
     * {@inheritDoc}
     */
    public <C extends ConfigurationClient, S extends Configuration> void appendManagedObjectPathElement(
            SingletonRelationDefinition<? super C, ? super S> r, AbstractManagedObjectDefinition<C, S> d) {
            SingletonRelationDefinition<? super C, ? super S> r,
            AbstractManagedObjectDefinition<C, S> d) {
        // Add the RDN sequence representing the relation.
        appendManagedObjectPathElement(r);
    }
@@ -204,7 +207,7 @@
     *
     * @return Returns the new DN instance.
     */
    public DN getInstance() {
    private DN build() {
        DN dn = DN.rootDN();
        for (RDN rdn : rdns) {
            dn = dn.child(rdn);
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPConnection.java
File was deleted
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPDriver.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2008-2009 Sun Microsystems, Inc.
 *      Portions Copyright 2013 ForgeRock, AS.
 *      Portions Copyright 2013-2014 ForgeRock, AS.
 */
package org.forgerock.opendj.config.client.ldap;
@@ -66,10 +66,17 @@
import org.forgerock.opendj.config.client.spi.PropertySet;
import org.forgerock.opendj.ldap.Attribute;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.Connection;
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.EntryNotFoundException;
import org.forgerock.opendj.ldap.ErrorResultException;
import org.forgerock.opendj.ldap.ErrorResultIOException;
import org.forgerock.opendj.ldap.Filter;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.SearchResultReferenceIOException;
import org.forgerock.opendj.ldap.SearchScope;
import org.forgerock.opendj.ldap.responses.SearchResultEntry;
import org.forgerock.opendj.ldif.ConnectionEntryReader;
/**
 * The LDAP management context driver implementation.
@@ -132,7 +139,7 @@
    private LDAPManagementContext context;
    private final LDAPConnection connection;
    private final Connection connection;
    // The LDAP profile which should be used to construct LDAP
    // requests and decode LDAP responses.
@@ -147,7 +154,7 @@
     * @param profile
     *            The LDAP profile.
     */
    public LDAPDriver(LDAPConnection connection, LDAPProfile profile) {
    LDAPDriver(Connection connection, LDAPProfile profile) {
        this.connection = connection;
        this.profile = profile;
    }
@@ -161,7 +168,7 @@
     */
    @Override
    public void close() {
        connection.unbind();
        connection.close();
    }
    /**
@@ -177,7 +184,7 @@
        try {
            // Read the entry associated with the managed object.
            DN dn = LDAPNameBuilder.create(path, profile);
            DN dn = DNBuilder.create(path, profile);
            AbstractManagedObjectDefinition<C, S> d = path.getManagedObjectDefinition();
            ManagedObjectDefinition<? extends C, ? extends S> mod = getEntryDefinition(d, dn);
@@ -186,8 +193,8 @@
                String attrId = profile.getAttributeName(mod, pd);
                attrIds.add(attrId);
            }
            SearchResultEntry searchResultEntry = connection.readEntry(dn, attrIds);
            SearchResultEntry searchResultEntry =
                    connection.readEntry(dn, attrIds.toArray(new String[0]));
            // Build the managed object's properties.
            List<PropertyException> exceptions = new LinkedList<PropertyException>();
@@ -241,7 +248,7 @@
        try {
            // Read the entry associated with the managed object.
            DN dn = LDAPNameBuilder.create(path, profile);
            DN dn = DNBuilder.create(path, profile);
            ManagedObjectDefinition<? extends C, ? extends S> objectDef = getEntryDefinition(d, dn);
            // Make sure we use the correct property definition, the
@@ -250,7 +257,7 @@
            propertyDef = (PropertyDefinition<P>) objectDef.getPropertyDefinition(propertyDef.getName());
            String attrID = profile.getAttributeName(objectDef, propertyDef);
            SearchResultEntry resultEntry = connection.readEntry(dn, Collections.singleton(attrID));
            SearchResultEntry resultEntry = connection.readEntry(dn, attrID);
            Attribute attribute = resultEntry.getAttribute(attrID);
            // Decode the values.
@@ -309,19 +316,14 @@
        }
        // Get the search base DN.
        DN dn = LDAPNameBuilder.create(parent, rd, profile);
        DN dn = DNBuilder.create(parent, rd, profile);
        // Retrieve only those entries which are sub-types of the
        // specified definition.
        StringBuilder builder = new StringBuilder();
        builder.append("(objectclass=");
        builder.append(profile.getObjectClass(d));
        builder.append(')');
        String filter = builder.toString();
        Filter filter = Filter.equality("objectClass", profile.getObjectClass(d));
        List<String> children = new ArrayList<String>();
        try {
            for (DN child : connection.listEntries(dn, filter)) {
            for (DN child : listEntries(dn, filter)) {
                children.add(child.rdn().getFirstAVA().getAttributeValue().toString());
            }
        } catch (ErrorResultException e) {
@@ -351,19 +353,14 @@
        }
        // Get the search base DN.
        DN dn = LDAPNameBuilder.create(parent, rd, profile);
        DN dn = DNBuilder.create(parent, rd, profile);
        // Retrieve only those entries which are sub-types of the
        // specified definition.
        StringBuilder builder = new StringBuilder();
        builder.append("(objectclass=");
        builder.append(profile.getObjectClass(d));
        builder.append(')');
        String filter = builder.toString();
        Filter filter = Filter.equality("objectClass", profile.getObjectClass(d));
        List<String> children = new ArrayList<String>();
        try {
            for (DN child : connection.listEntries(dn, filter)) {
            for (DN child : listEntries(dn, filter)) {
                children.add(child.rdn().getFirstAVA().getAttributeValue().toString());
            }
        } catch (ErrorResultException e) {
@@ -390,12 +387,12 @@
        }
        ManagedObjectPath<?, ?> parent = path.parent();
        DN dn = LDAPNameBuilder.create(parent, profile);
        DN dn = DNBuilder.create(parent, profile);
        if (!entryExists(dn)) {
            throw new ManagedObjectNotFoundException();
        }
        dn = LDAPNameBuilder.create(path, profile);
        dn = DNBuilder.create(path, profile);
        return entryExists(dn);
    }
@@ -406,9 +403,9 @@
    protected <C extends ConfigurationClient, S extends Configuration> void deleteManagedObject(
        ManagedObjectPath<C, S> path) throws OperationRejectedException, ErrorResultException {
        // Delete the entry and any subordinate entries.
        DN dn = LDAPNameBuilder.create(path, profile);
        DN dn = DNBuilder.create(path, profile);
        try {
            connection.deleteSubtree(dn);
            connection.deleteSubtree(dn.toString());
        } catch (ErrorResultException e) {
            if (e.getResult().getResultCode() == ResultCode.UNWILLING_TO_PERFORM) {
                AbstractManagedObjectDefinition<?, ?> d = path.getManagedObjectDefinition();
@@ -437,7 +434,12 @@
     *             if a problem occurs.
     */
    boolean entryExists(DN dn) throws ErrorResultException {
        return connection.entryExists(dn);
        try {
            connection.readEntry(dn, "1.1");
            return true;
        } catch (EntryNotFoundException e) {
            return false;
        }
    }
    /**
@@ -445,7 +447,7 @@
     *
     * @return Returns the LDAP connection used for interacting with the server.
     */
    LDAPConnection getLDAPConnection() {
    Connection getLDAPConnection() {
        return connection;
    }
@@ -525,7 +527,7 @@
        getEntryDefinition(AbstractManagedObjectDefinition<C, S> d, DN dn) throws ErrorResultException,
        DefinitionDecodingException {
        // @Checkstyle:on
        SearchResultEntry searchResultEntry = connection.readEntry(dn, Collections.singleton("objectclass"));
        SearchResultEntry searchResultEntry = connection.readEntry(dn, "objectclass");
        Attribute objectClassAttr = searchResultEntry.getAttribute("objectclass");
        if (objectClassAttr == null) {
@@ -554,4 +556,22 @@
        return d.resolveManagedObjectDefinition(resolver);
    }
    private Collection<DN> listEntries(DN dn, Filter filter) throws ErrorResultException {
        List<DN> names = new LinkedList<DN>();
        ConnectionEntryReader reader =
                connection.search(dn.toString(), SearchScope.SINGLE_LEVEL, filter.toString());
        try {
            while (reader.hasNext()) {
                names.add(reader.readEntry().getName());
            }
        } catch (ErrorResultIOException e) {
            throw e.getCause();
        } catch (SearchResultReferenceIOException e) {
            // Ignore.
        } finally {
            reader.close();
        }
        return names;
    }
}
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPManagedObject.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2007-2009 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.config.client.ldap;
@@ -159,10 +160,10 @@
            // be required anyway).
            DN dn;
            if (r instanceof InstantiableRelationDefinition) {
                dn = LDAPNameBuilder.create(parent, (InstantiableRelationDefinition<?, ?>) r,
                dn = DNBuilder.create(parent, (InstantiableRelationDefinition<?, ?>) r,
                        driver.getLDAPProfile());
            } else {
                dn = LDAPNameBuilder.create(parent, (SetRelationDefinition<?, ?>) r,
                dn = DNBuilder.create(parent, (SetRelationDefinition<?, ?>) r,
                        driver.getLDAPProfile());
            }
@@ -178,7 +179,7 @@
                // Create the entry.
                try {
                    driver.getLDAPConnection().createEntry(entry);
                    driver.getLDAPConnection().add(entry);
                } catch (ErrorResultException e) {
                    if (e.getResult().getResultCode() == ResultCode.UNWILLING_TO_PERFORM) {
                        LocalizableMessage m = LocalizableMessage.raw("%s", e.getLocalizedMessage());
@@ -191,7 +192,7 @@
        }
        // Now add the entry representing this new managed object.
        DN dn = LDAPNameBuilder.create(path, driver.getLDAPProfile());
        DN dn = DNBuilder.create(path, driver.getLDAPProfile());
        Entry entry = new LinkedHashMapEntry(dn);
        // Create the object class attribute.
@@ -217,7 +218,7 @@
        try {
            // Create the entry.
            driver.getLDAPConnection().createEntry(entry);
            driver.getLDAPConnection().add(entry);
        } catch (ErrorResultException e) {
            if (e.getResult().getResultCode() == ResultCode.ENTRY_ALREADY_EXISTS) {
                throw new ManagedObjectAlreadyExistsException();
@@ -254,7 +255,7 @@
            ErrorResultException {
        // Build the modify request
        ManagedObjectPath<?, ?> path = getManagedObjectPath();
        DN dn = LDAPNameBuilder.create(path, driver.getLDAPProfile());
        DN dn = DNBuilder.create(path, driver.getLDAPProfile());
        ModifyRequest request = Requests.newModifyRequest(dn);
        ManagedObjectDefinition<?, ?> d = getManagedObjectDefinition();
        for (PropertyDefinition<?> pd : d.getAllPropertyDefinitions()) {
@@ -271,7 +272,7 @@
        // Perform the LDAP modification if something has changed.
        if (!request.getModifications().isEmpty()) {
            try {
                driver.getLDAPConnection().modifyEntry(request);
                driver.getLDAPConnection().modify(request);
            } catch (ErrorResultException e) {
                if (e.getResult().getResultCode() == ResultCode.UNWILLING_TO_PERFORM) {
                    LocalizableMessage m = LocalizableMessage.raw("%s", e.getLocalizedMessage());
opendj-config/src/main/java/org/forgerock/opendj/config/client/ldap/LDAPManagementContext.java
@@ -22,6 +22,7 @@
 *
 *
 *      Copyright 2008 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.config.client.ldap;
@@ -29,13 +30,13 @@
import org.forgerock.opendj.config.LDAPProfile;
import org.forgerock.opendj.config.client.ManagementContext;
import org.forgerock.opendj.config.client.spi.Driver;
import org.forgerock.opendj.ldap.Connection;
import org.forgerock.util.Reject;
/**
 * An LDAP management connection context.
 */
public final class LDAPManagementContext extends ManagementContext {
    /**
     * Create a new LDAP management context using the provided LDAP connection.
     *
@@ -45,7 +46,7 @@
     *            The LDAP profile.
     * @return Returns the new management context.
     */
    public static ManagementContext createFromContext(LDAPConnection connection, LDAPProfile profile) {
    public static ManagementContext newManagementContext(Connection connection, LDAPProfile profile) {
        Reject.ifNull(connection, profile);
        LDAPDriver driver = new LDAPDriver(connection, profile);
        LDAPManagementContext context = new LDAPManagementContext(driver);
opendj-config/src/test/java/org/forgerock/opendj/config/client/ldap/AggregationClientTest.java
@@ -22,9 +22,13 @@
 *
 *
 *      Copyright 2007-2008 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.config.client.ldap;
import static org.fest.assertions.Assertions.assertThat;
import static org.forgerock.opendj.ldap.Connections.newInternalConnection;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -32,8 +36,8 @@
import java.util.TreeSet;
import org.forgerock.opendj.config.AdminTestCase;
import org.forgerock.opendj.config.PropertyException;
import org.forgerock.opendj.config.LDAPProfile;
import org.forgerock.opendj.config.PropertyException;
import org.forgerock.opendj.config.TestCfg;
import org.forgerock.opendj.config.TestChildCfgClient;
import org.forgerock.opendj.config.TestChildCfgDefn;
@@ -41,7 +45,11 @@
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.Connection;
import org.forgerock.opendj.ldap.LinkedHashMapEntry;
import org.forgerock.opendj.ldap.MemoryBackend;
import org.forgerock.opendj.ldap.schema.Schema;
import org.forgerock.opendj.ldif.LDIFEntryReader;
import org.forgerock.opendj.server.config.client.RootCfgClient;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
@@ -54,7 +62,12 @@
    // Test LDIF.
    private static final String[] TEST_LDIF = new String[] {
        // @formatter:off
        // Base entries.
        "dn:",
        "objectclass: top",
        "objectclass: ds-cfg-branch",
        "",
        "dn: cn=config",
        "objectclass: top",
        "objectclass: ds-cfg-branch",
@@ -151,6 +164,7 @@
        "ds-cfg-enabled: false",
        "ds-cfg-listen-port: 1689",
        "" };
    // @formatter:on
    @BeforeClass
    public void setUp() throws Exception {
@@ -174,9 +188,10 @@
     */
    @Test
    public void testAggregationEmpty() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 1");
        assertSetEquals(child.getAggregationProperty(), new String[0]);
@@ -191,9 +206,10 @@
     */
    @Test
    public void testAggregationSingle() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 2");
@@ -212,12 +228,14 @@
     */
    @Test
    public void testAggregationMultiple() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
                LDAPManagementContext.newManagementContext(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");
        assertSetEquals(child.getAggregationProperty(), "LDAPS Connection Handler",
                "LDAP Connection Handler");
    }
    /**
@@ -229,14 +247,16 @@
     */
    @Test
    public void testAggregationBadBaseDN() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        try {
            parent.getTestChild("test child 4");
            Assert.fail("Unexpectedly retrieved test child 4" + " when it had a bad aggregation value");
            Assert.fail("Unexpectedly retrieved test child 4"
                    + " when it had a bad aggregation value");
        } catch (ManagedObjectDecodingException e) {
            Collection<PropertyException> causes = e.getCauses();
            Assert.assertEquals(causes.size(), 1);
@@ -261,27 +281,29 @@
     */
    @Test
    public void testCreateChildManagedObject() throws Exception {
        CreateEntryMockLDAPConnection c = new CreateEntryMockLDAPConnection(
                "cn=test child new,cn=test children,cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        c.addExpectedAttribute("cn", "test child new");
        c.addExpectedAttribute("objectClass", "top", "ds-cfg-test-child-dummy");
        c.addExpectedAttribute("ds-cfg-enabled", "true");
        c.addExpectedAttribute("ds-cfg-java-class",
                "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        c.addExpectedAttribute("ds-cfg-attribute-type", "description");
        c.addExpectedAttribute("ds-cfg-rotation-policy",
                "cn=LDAP Connection Handler,cn=connection handlers, cn=config");
        ManagementContext ctx = LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
        TestChildCfgClient child =
                parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
        child.setMandatoryBooleanProperty(true);
        child.setMandatoryReadOnlyAttributeTypeProperty(Schema.getDefaultSchema().getAttributeType("description"));
        child.setMandatoryReadOnlyAttributeTypeProperty(Schema.getDefaultSchema().getAttributeType(
                "description"));
        child.setAggregationProperty(Collections.singleton("LDAP Connection Handler"));
        child.commit();
        c.assertEntryIsCreated();
        String dn = "cn=test child new,cn=test children,cn=test parent 1,cn=test parents,cn=config";
        assertThat(backend.get(dn)).isEqualTo(new LinkedHashMapEntry(
                "dn: " + dn,
                "cn: test child new",
                "objectClass: top",
                "objectClass: ds-cfg-test-child-dummy",
                "ds-cfg-enabled: true",
                "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
                "ds-cfg-attribute-type: description",
                "ds-cfg-rotation-policy: cn=LDAP Connection Handler,cn=connection handlers, cn=config"));
    }
    /**
@@ -293,30 +315,35 @@
     */
    @Test
    public void testModifyChildManagedObject() throws Exception {
        ModifyEntryMockLDAPConnection c = new ModifyEntryMockLDAPConnection(
                "cn=test child 2,cn=test children,cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        c.addExpectedModification("ds-cfg-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());
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
                LDAPManagementContext.newManagementContext(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"));
        child.setAggregationProperty(Arrays.asList("JMX Connection Handler",
                "HTTP Connection Handler"));
        child.commit();
        Assert.assertTrue(c.isEntryModified());
        String dn = "cn=test child 2,cn=test children,cn=test parent 1,cn=test parents,cn=config";
        assertThat(backend.get(dn).parseAttribute("ds-cfg-rotation-policy").asSetOfString())
                .containsOnly("cn=HTTP Connection Handler,cn=connection handlers, cn=config",
                        "cn=JMX Connection Handler,cn=connection handlers, cn=config");
    }
    // Retrieve the named test parent managed object.
    private TestParentCfgClient getTestParent(ManagementContext context, String name) throws Exception {
    private TestParentCfgClient getTestParent(ManagementContext context, String name)
            throws Exception {
        ManagedObject<RootCfgClient> root = context.getRootConfigurationManagedObject();
        return root.getChild(TestCfg.getTestOneToManyParentRelationDefinition(), name).getConfiguration();
        return root.getChild(TestCfg.getTestOneToManyParentRelationDefinition(), name)
                .getConfiguration();
    }
    // Asserts that the actual set of DNs contains the expected values.
    private void assertSetEquals(SortedSet<String> actual, String... expected) {
        SortedSet<String> values = new TreeSet<String>(TestChildCfgDefn.getInstance()
                .getAggregationPropertyPropertyDefinition());
        SortedSet<String> values =
                new TreeSet<String>(TestChildCfgDefn.getInstance()
                        .getAggregationPropertyPropertyDefinition());
        if (expected != null) {
            for (String value : expected) {
                values.add(value);
opendj-config/src/test/java/org/forgerock/opendj/config/client/ldap/CreateEntryMockLDAPConnection.java
File was deleted
opendj-config/src/test/java/org/forgerock/opendj/config/client/ldap/DeleteSubtreeMockLDAPConnection.java
File was deleted
opendj-config/src/test/java/org/forgerock/opendj/config/client/ldap/LDAPClientTest.java
@@ -22,15 +22,17 @@
 *
 *
 *      Copyright 2008 Sun Microsystems, Inc.
 *      Portions copyright 2014 ForgeRock AS.
 */
package org.forgerock.opendj.config.client.ldap;
import static org.fest.assertions.Assertions.assertThat;
import static org.forgerock.opendj.ldap.Connections.newInternalConnection;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.SortedSet;
import java.util.concurrent.atomic.AtomicBoolean;
import org.forgerock.opendj.config.AdminTestCase;
import org.forgerock.opendj.config.Constraint;
@@ -45,13 +47,20 @@
import org.forgerock.opendj.config.client.ManagedObject;
import org.forgerock.opendj.config.client.ManagementContext;
import org.forgerock.opendj.config.client.OperationRejectedException;
import org.forgerock.opendj.ldap.AbstractConnectionWrapper;
import org.forgerock.opendj.ldap.Connection;
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.Entry;
import org.forgerock.opendj.ldap.ErrorResultException;
import org.forgerock.opendj.ldap.LinkedHashMapEntry;
import org.forgerock.opendj.ldap.MemoryBackend;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.requests.ModifyRequest;
import org.forgerock.opendj.ldap.responses.Result;
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.ldif.LDIFEntryReader;
import org.forgerock.opendj.server.config.client.RootCfgClient;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
@@ -66,6 +75,10 @@
    // @Checkstyle:off
    private static final String[] TEST_LDIF = new String[] {
        // Base entries.
        "dn:",
        "objectclass: top",
        "objectclass: ds-cfg-branch",
        "",
        "dn: cn=config",
        "objectclass: top",
        "objectclass: ds-cfg-branch",
@@ -162,10 +175,12 @@
        // Child 4 inherits overridden defaults for both
        // optional-multi-valued-dn-property1 and
        // optional-multi-valued-dn-property2.
        "dn: cn=test child 1,cn=test children,cn=test parent 2,cn=test parents,cn=config", "objectclass: top",
        "objectclass: ds-cfg-test-child-dummy", "cn: test child 1", "ds-cfg-enabled: true",
        "dn: cn=test child 1,cn=test children,cn=test parent 2,cn=test parents,cn=config",
        "objectclass: top", "objectclass: ds-cfg-test-child-dummy", "cn: test child 1",
        "ds-cfg-enabled: true",
        "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
        "ds-cfg-attribute-type: description", "", };
    // @Checkstyle:on
    /**
@@ -201,7 +216,8 @@
            { ResultCode.NO_SUCH_OBJECT, ManagedObjectNotFoundException.class, null },
            { ResultCode.INSUFFICIENT_ACCESS_RIGHTS, ErrorResultException.class,
                ResultCode.INSUFFICIENT_ACCESS_RIGHTS },
            { ResultCode.UNWILLING_TO_PERFORM, ErrorResultException.class, ResultCode.UNWILLING_TO_PERFORM } };
            { ResultCode.UNWILLING_TO_PERFORM, ErrorResultException.class,
                ResultCode.UNWILLING_TO_PERFORM } };
    }
    @BeforeClass
@@ -222,26 +238,28 @@
     */
    @Test
    public void testCreateChildManagedObject() throws Exception {
        CreateEntryMockLDAPConnection c =
            new CreateEntryMockLDAPConnection(
                "cn=test child new,cn=test children,cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        c.addExpectedAttribute("cn", "test child new");
        c.addExpectedAttribute("objectClass", "top", "ds-cfg-test-child-dummy");
        c.addExpectedAttribute("ds-cfg-enabled", "true");
        c.addExpectedAttribute("ds-cfg-java-class",
            "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        c.addExpectedAttribute("ds-cfg-attribute-type", "description");
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
        TestChildCfgClient child =
                parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
        child.setMandatoryBooleanProperty(true);
        child.setMandatoryReadOnlyAttributeTypeProperty(getAttributeType("description"));
        child.commit();
        c.assertEntryIsCreated();
        String dn = "cn=test child new,cn=test children,cn=test parent 1,cn=test parents,cn=config";
        assertThat(backend.get(dn))
                .isEqualTo(
                        new LinkedHashMapEntry(
                                "dn: " + dn,
                                "cn: test child new",
                                "objectClass: top",
                                "objectClass: ds-cfg-test-child-dummy",
                                "ds-cfg-enabled: true",
                                "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
                                "ds-cfg-attribute-type: description"));
    }
    /**
@@ -250,18 +268,17 @@
     */
    @Test(dataProvider = "createManagedObjectExceptions")
    public void testCreateManagedObjectException(final ResultCode resultCodeOfThrownException,
        Class<? extends Exception> expectedExceptionClass, ResultCode expectedCode) {
        MockLDAPConnection conn = new MockLDAPConnection() {
            Class<? extends Exception> expectedExceptionClass, ResultCode expectedCode)
            throws Exception {
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = new AbstractConnectionWrapper<Connection>(newInternalConnection(backend)) {
            @Override
            public void createEntry(Entry entry) throws ErrorResultException {
            public Result add(Entry entry) throws ErrorResultException {
                throw ErrorResultException.newErrorResult(resultCodeOfThrownException);
            }
        };
        conn.importLDIF(TEST_LDIF);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(conn, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        try {
            TestParentCfgClient parent = createTestParent(ctx, "test parent new");
            parent.setMandatoryBooleanProperty(true);
@@ -270,7 +287,8 @@
        } catch (Exception e) {
            if (expectedExceptionClass.equals(ErrorResultException.class)) {
                assertThat(e).isInstanceOf(ErrorResultException.class);
                assertThat(((ErrorResultException) e).getResult().getResultCode()).isEqualTo(expectedCode);
                assertThat(((ErrorResultException) e).getResult().getResultCode()).isEqualTo(
                        expectedCode);
            } else {
                assertThat(e).isInstanceOf(expectedExceptionClass);
            }
@@ -285,22 +303,26 @@
     */
    @Test
    public void testCreateTopLevelManagedObject() throws Exception {
        CreateEntryMockLDAPConnection c =
            new CreateEntryMockLDAPConnection("cn=test parent new,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        c.addExpectedAttribute("cn", "test parent new");
        c.addExpectedAttribute("objectClass", "top", "ds-cfg-test-parent-dummy");
        c.addExpectedAttribute("ds-cfg-enabled", "true");
        c.addExpectedAttribute("ds-cfg-java-class", "org.opends.server.extensions.SomeVirtualAttributeProvider");
        c.addExpectedAttribute("ds-cfg-attribute-type", "description");
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = createTestParent(ctx, "test parent new");
        parent.setMandatoryBooleanProperty(true);
        parent.setMandatoryReadOnlyAttributeTypeProperty(getAttributeType("description"));
        parent.commit();
        c.assertEntryIsCreated();
        String dn = "cn=test parent new,cn=test parents,cn=config";
        assertThat(backend.get(dn))
                .isEqualTo(
                        new LinkedHashMapEntry(
                                "dn: " + dn,
                                "cn: test parent new",
                                "objectClass: top",
                                "objectClass: ds-cfg-test-parent-dummy",
                                "ds-cfg-enabled: true",
                                "ds-cfg-java-class: org.opends.server.extensions.SomeVirtualAttributeProvider",
                                "ds-cfg-attribute-type: description"));
    }
    /**
@@ -311,21 +333,21 @@
     */
    @Test
    public void testGetChildManagedObject() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(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");
                "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        Assert.assertEquals(child.getMandatoryReadOnlyAttributeTypeProperty(),
            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",
            "dc=default value c3v4,dc=com");
                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", "dc=default value c3v4,dc=com");
    }
    /**
@@ -336,21 +358,21 @@
     */
    @Test
    public void testGetChildManagedObjectDefault() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(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");
                "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        Assert.assertEquals(child.getMandatoryReadOnlyAttributeTypeProperty(),
            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",
            "dc=domain3,dc=com");
                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", "dc=domain3,dc=com");
        Assert.assertEquals(child.isMandatoryBooleanProperty(), Boolean.TRUE);
    }
@@ -365,24 +387,25 @@
     */
    @Test(dataProvider = "getManagedObjectExceptions")
    public void testGetManagedObjectException(final ResultCode resultCodeOfThrownException,
        final Class<? extends Exception> expectedExceptionClass, final ResultCode expectedCode) {
        MockLDAPConnection c = new MockLDAPConnection() {
            final Class<? extends Exception> expectedExceptionClass, final ResultCode expectedCode)
            throws Exception {
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = new AbstractConnectionWrapper<Connection>(newInternalConnection(backend)) {
            @Override
            public SearchResultEntry readEntry(DN dn, Collection<String> attrIds) throws ErrorResultException {
            public SearchResultEntry readEntry(DN name, String... attributeDescriptions)
                    throws ErrorResultException {
                throw ErrorResultException.newErrorResult(resultCodeOfThrownException);
            }
        };
        c.importLDIF(TEST_LDIF);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        try {
            getTestParent(ctx, "test parent 2");
        } catch (Exception e) {
            if (expectedExceptionClass.equals(ErrorResultException.class)) {
                assertThat(e).isInstanceOf(ErrorResultException.class);
                assertThat(((ErrorResultException) e).getResult().getResultCode()).isEqualTo(expectedCode);
                assertThat(((ErrorResultException) e).getResult().getResultCode()).isEqualTo(
                        expectedCode);
            } else {
                assertThat(e).isInstanceOf(expectedExceptionClass);
            }
@@ -397,18 +420,18 @@
     */
    @Test
    public void testGetTopLevelManagedObject() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(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");
                "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        Assert.assertEquals(parent.getMandatoryReadOnlyAttributeTypeProperty(),
            getAttributeType("description"));
        assertDNSetEquals(parent.getOptionalMultiValuedDNProperty(), "dc=default value p2v1,dc=com",
            "dc=default value p2v2,dc=com");
                getAttributeType("description"));
        assertDNSetEquals(parent.getOptionalMultiValuedDNProperty(),
                "dc=default value p2v1,dc=com", "dc=default value p2v2,dc=com");
    }
    /**
@@ -419,18 +442,18 @@
     */
    @Test
    public void testGetTopLevelManagedObjectDefault() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(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");
                "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        Assert.assertEquals(parent.getMandatoryReadOnlyAttributeTypeProperty(),
            getAttributeType("description"));
        assertDNSetEquals(parent.getOptionalMultiValuedDNProperty(), "dc=domain1,dc=com", "dc=domain2,dc=com",
            "dc=domain3,dc=com");
                getAttributeType("description"));
        assertDNSetEquals(parent.getOptionalMultiValuedDNProperty(), "dc=domain1,dc=com",
                "dc=domain2,dc=com", "dc=domain3,dc=com");
    }
    /**
@@ -441,38 +464,40 @@
     */
    @Test
    public void testInheritedDefaultValues1() throws Exception {
        CreateEntryMockLDAPConnection c =
            new CreateEntryMockLDAPConnection(
                "cn=test child new,cn=test children,cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        c.addExpectedAttribute("cn", "test child new");
        c.addExpectedAttribute("objectClass", "top", "ds-cfg-test-child-dummy");
        c.addExpectedAttribute("ds-cfg-enabled", "true");
        c.addExpectedAttribute("ds-cfg-java-class",
            "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        c.addExpectedAttribute("ds-cfg-attribute-type", "description");
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
        TestChildCfgClient child =
                parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
        // Check pre-commit values.
        Assert.assertEquals(child.isMandatoryBooleanProperty(), null);
        Assert.assertEquals(child.getMandatoryClassProperty(),
            "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
                "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        Assert.assertEquals(child.getMandatoryReadOnlyAttributeTypeProperty(), null);
        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",
            "dc=domain3,dc=com");
        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", "dc=domain3,dc=com");
        // Check that the default values are not committed.
        child.setMandatoryBooleanProperty(true);
        child.setMandatoryReadOnlyAttributeTypeProperty(getAttributeType("description"));
        child.commit();
        c.assertEntryIsCreated();
        String dn = "cn=test child new,cn=test children,cn=test parent 1,cn=test parents,cn=config";
        assertThat(backend.get(dn))
                .isEqualTo(
                        new LinkedHashMapEntry(
                                "dn: " + dn,
                                "cn: test child new",
                                "objectClass: top",
                                "objectClass: ds-cfg-test-child-dummy",
                                "ds-cfg-enabled: true",
                                "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
                                "ds-cfg-attribute-type: description"));
    }
    /**
@@ -483,38 +508,40 @@
     */
    @Test
    public void testInheritedDefaultValues2() throws Exception {
        CreateEntryMockLDAPConnection c =
            new CreateEntryMockLDAPConnection(
                "cn=test child new,cn=test children,cn=test parent 2,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        c.addExpectedAttribute("cn", "test child new");
        c.addExpectedAttribute("objectClass", "top", "ds-cfg-test-child-dummy");
        c.addExpectedAttribute("ds-cfg-enabled", "true");
        c.addExpectedAttribute("ds-cfg-java-class",
            "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        c.addExpectedAttribute("ds-cfg-attribute-type", "description");
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 2");
        TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
        TestChildCfgClient child =
                parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
        // Check pre-commit values.
        Assert.assertEquals(child.isMandatoryBooleanProperty(), null);
        Assert.assertEquals(child.getMandatoryClassProperty(),
            "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
                "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
        Assert.assertEquals(child.getMandatoryReadOnlyAttributeTypeProperty(), null);
        assertDNSetEquals(child.getOptionalMultiValuedDNProperty1(), "dc=default value p2v1,dc=com",
            "dc=default value p2v2,dc=com");
        assertDNSetEquals(child.getOptionalMultiValuedDNProperty2(), "dc=default value p2v1,dc=com",
            "dc=default value p2v2,dc=com");
        assertDNSetEquals(child.getOptionalMultiValuedDNProperty1(),
                "dc=default value p2v1,dc=com", "dc=default value p2v2,dc=com");
        assertDNSetEquals(child.getOptionalMultiValuedDNProperty2(),
                "dc=default value p2v1,dc=com", "dc=default value p2v2,dc=com");
        // Check that the default values are not committed.
        child.setMandatoryBooleanProperty(true);
        child.setMandatoryReadOnlyAttributeTypeProperty(getAttributeType("description"));
        child.commit();
        c.assertEntryIsCreated();
        String dn = "cn=test child new,cn=test children,cn=test parent 2,cn=test parents,cn=config";
        assertThat(backend.get(dn))
                .isEqualTo(
                        new LinkedHashMapEntry(
                                "dn: " + dn,
                                "cn: test child new",
                                "objectClass: top",
                                "objectClass: ds-cfg-test-child-dummy",
                                "ds-cfg-enabled: true",
                                "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
                                "ds-cfg-attribute-type: description"));
    }
    /**
@@ -525,10 +552,10 @@
     */
    @Test
    public void testListChildManagedObjects() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(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" };
@@ -543,10 +570,10 @@
     */
    @Test
    public void testListChildManagedObjectsEmpty() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 3");
        String[] actual = parent.listTestChildren();
        String[] expected = new String[] {};
@@ -561,10 +588,10 @@
     */
    @Test
    public void testListTopLevelManagedObjects() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        c.importLDIF(TEST_LDIF);
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        String[] actual = listTestParents(ctx);
        String[] expected = new String[] { "test parent 1", "test parent 2", "test parent 3" };
        Assert.assertEqualsNoOrder(actual, expected);
@@ -578,9 +605,10 @@
     */
    @Test
    public void testListTopLevelManagedObjectsEmpty() throws Exception {
        MockLDAPConnection c = new MockLDAPConnection();
        MemoryBackend backend = new MemoryBackend();
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        String[] actual = listTestParents(ctx);
        String[] expected = new String[] {};
        Assert.assertEqualsNoOrder(actual, expected);
@@ -594,18 +622,26 @@
     */
    @Test
    public void testModifyChildManagedObjectResetToDefault() throws Exception {
        ModifyEntryMockLDAPConnection c =
            new ModifyEntryMockLDAPConnection(
                "cn=test child 2,cn=test children,cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        c.addExpectedModification("ds-cfg-base-dn");
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        TestChildCfgClient child = parent.getTestChild("test child 2");
        child.setOptionalMultiValuedDNProperty1(Collections.<DN> emptySet());
        child.commit();
        Assert.assertTrue(c.isEntryModified());
        String dn = "cn=test child 2,cn=test children,cn=test parent 1,cn=test parents,cn=config";
        assertThat(backend.get(dn))
                .isEqualTo(
                        new LinkedHashMapEntry(
                                "dn: " + dn,
                                "cn: test child 2",
                                "objectClass: top",
                                "objectClass: ds-cfg-test-child-dummy",
                                "ds-cfg-enabled: true",
                                "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
                                "ds-cfg-attribute-type: description"));
    }
    /**
@@ -616,14 +652,20 @@
     */
    @Test
    public void testModifyTopLevelManagedObjectNoChanges() throws Exception {
        ModifyEntryMockLDAPConnection c =
            new ModifyEntryMockLDAPConnection("cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        final AtomicBoolean isModified = new AtomicBoolean();
        Connection c = new AbstractConnectionWrapper<Connection>(newInternalConnection(backend)) {
            @Override
            public Result modify(ModifyRequest request) throws ErrorResultException {
                isModified.set(true);
                return super.modify(request);
            }
        };
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        parent.commit();
        Assert.assertFalse(c.isEntryModified());
        assertThat(isModified.get()).isFalse(); // Nothing to do, so no modify.
    }
    /**
@@ -634,19 +676,37 @@
     */
    @Test
    public void testModifyTopLevelManagedObjectWithChanges() throws Exception {
        ModifyEntryMockLDAPConnection c =
            new ModifyEntryMockLDAPConnection("cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        c.addExpectedModification("ds-cfg-enabled", "false");
        c.addExpectedModification("ds-cfg-base-dn", "dc=mod1,dc=com", "dc=mod2,dc=com");
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        final AtomicBoolean isModified = new AtomicBoolean();
        Connection c = new AbstractConnectionWrapper<Connection>(newInternalConnection(backend)) {
            @Override
            public Result modify(ModifyRequest request) throws ErrorResultException {
                isModified.set(true);
                return super.modify(request);
            }
        };
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        parent.setMandatoryBooleanProperty(false);
        parent.setOptionalMultiValuedDNProperty(Arrays.asList(DN.valueOf("dc=mod1,dc=com"),
            DN.valueOf("dc=mod2,dc=com")));
        parent.setOptionalMultiValuedDNProperty(Arrays.asList(DN.valueOf("dc=mod1,dc=com"), DN
                .valueOf("dc=mod2,dc=com")));
        parent.commit();
        Assert.assertTrue(c.isEntryModified());
        String dn = "cn=test parent 1,cn=test parents,cn=config";
        assertThat(backend.get(dn))
                .isEqualTo(
                        new LinkedHashMapEntry(
                                "dn: " + dn,
                                "objectclass: top",
                                "objectclass: ds-cfg-test-parent-dummy",
                                "cn: test parent 1",
                                "ds-cfg-enabled: false",
                                "ds-cfg-base-dn: dc=mod1,dc=com",
                                "ds-cfg-base-dn: dc=mod2,dc=com",
                                "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
                                "ds-cfg-attribute-type: description"));
        assertThat(isModified.get()).isTrue();
    }
    /**
@@ -657,15 +717,14 @@
     */
    @Test
    public void testRemoveChildManagedObject() throws Exception {
        DeleteSubtreeMockLDAPConnection c =
            new DeleteSubtreeMockLDAPConnection(
                "cn=test child 1,cn=test children,cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
        parent.removeTestChild("test child 1");
        c.assertSubtreeIsDeleted();
        String dn = "cn=test child 1,cn=test children,cn=test parent 1,cn=test parents,cn=config";
        assertThat(backend.get(dn)).isNull();
    }
    /**
@@ -676,13 +735,13 @@
     */
    @Test
    public void testRemoveTopLevelManagedObject() throws Exception {
        DeleteSubtreeMockLDAPConnection c =
            new DeleteSubtreeMockLDAPConnection("cn=test parent 1,cn=test parents,cn=config");
        c.importLDIF(TEST_LDIF);
        MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
        Connection c = newInternalConnection(backend);
        ManagementContext ctx =
            LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
        removeTestParent(ctx, "test parent 1");
        c.assertSubtreeIsDeleted();
        String dn = "cn=test parent 1,cn=test parents,cn=config";
        assertThat(backend.get(dn)).isNull();
    }
    /**
@@ -696,30 +755,29 @@
    public void testAddConstraintSuccess() throws Exception {
        Constraint constraint = new MockConstraint(true, false, false);
        TestCfg.addConstraint(constraint);
        try {
            CreateEntryMockLDAPConnection c =
                new CreateEntryMockLDAPConnection(
                    "cn=test child new,cn=test children,cn=test parent 1,cn=test parents,cn=config");
            c.importLDIF(TEST_LDIF);
            c.addExpectedAttribute("cn", "test child new");
            c.addExpectedAttribute("objectClass", "top", "ds-cfg-test-child-dummy");
            c.addExpectedAttribute("ds-cfg-enabled", "true");
            c.addExpectedAttribute("ds-cfg-java-class",
                "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
            c.addExpectedAttribute("ds-cfg-attribute-type", "description");
            MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
            Connection c = newInternalConnection(backend);
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                    LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
            TestChildCfgClient child =
                    parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
            child.setMandatoryBooleanProperty(true);
            child.setMandatoryReadOnlyAttributeTypeProperty(getAttributeType("description"));
            child.commit();
            c.assertEntryIsCreated();
            String dn =
                    "cn=test child new,cn=test children,cn=test parent 1,cn=test parents,cn=config";
            assertThat(backend.get(dn)).isEqualTo(new LinkedHashMapEntry(
                    "dn: " + dn,
                    "objectclass: top",
                    "objectclass: ds-cfg-test-child-dummy",
                    "cn: test child new",
                    "ds-cfg-enabled: true",
                    "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
                    "ds-cfg-attribute-type: description"));
        } finally {
            // Clean up.
            TestCfg.removeConstraint(constraint);
        }
    }
@@ -735,29 +793,19 @@
    public void testAddConstraintFail() throws Exception {
        Constraint constraint = new MockConstraint(false, true, true);
        TestCfg.addConstraint(constraint);
        try {
            CreateEntryMockLDAPConnection conn =
                new CreateEntryMockLDAPConnection(
                    "cn=test child new,cn=test children,cn=test parent 1,cn=test parents,cn=config");
            conn.importLDIF(TEST_LDIF);
            conn.addExpectedAttribute("cn", "test child new");
            conn.addExpectedAttribute("objectClass", "top", "ds-cfg-test-child-dummy");
            conn.addExpectedAttribute("ds-cfg-enabled", "true");
            conn.addExpectedAttribute("ds-cfg-java-class",
                "org.opends.server.extensions.UserDefinedVirtualAttributeProvider");
            conn.addExpectedAttribute("ds-cfg-attribute-type", "description");
            MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
            Connection c = newInternalConnection(backend);
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(conn, LDAPProfile.getInstance());
                    LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            TestChildCfgClient child = parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
            TestChildCfgClient child =
                    parent.createTestChild(TestChildCfgDefn.getInstance(), "test child new", null);
            child.setMandatoryBooleanProperty(true);
            child.setMandatoryReadOnlyAttributeTypeProperty(getAttributeType("description"));
            child.commit();
            Assert.fail("The add constraint failed to prevent creation of the managed object");
        } finally {
            // Clean up.
            TestCfg.removeConstraint(constraint);
        }
    }
@@ -773,19 +821,17 @@
    public void testRemoveConstraintSuccess() throws Exception {
        Constraint constraint = new MockConstraint(false, false, true);
        TestCfg.addConstraint(constraint);
        try {
            DeleteSubtreeMockLDAPConnection c =
                new DeleteSubtreeMockLDAPConnection(
                    "cn=test child 1,cn=test children,cn=test parent 1,cn=test parents,cn=config");
            c.importLDIF(TEST_LDIF);
            MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
            Connection c = newInternalConnection(backend);
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                    LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            parent.removeTestChild("test child 1");
            c.assertSubtreeIsDeleted();
            String dn =
                    "cn=test child 1,cn=test children,cn=test parent 1,cn=test parents,cn=config";
            assertThat(backend.get(dn)).isNull();
        } finally {
            // Clean up.
            TestCfg.removeConstraint(constraint);
        }
    }
@@ -801,19 +847,15 @@
    public void testRemoveConstraintFail() throws Exception {
        Constraint constraint = new MockConstraint(true, true, false);
        TestCfg.addConstraint(constraint);
        try {
            DeleteSubtreeMockLDAPConnection c =
                new DeleteSubtreeMockLDAPConnection(
                    "cn=test child 1,cn=test children,cn=test parent 1,cn=test parents,cn=config");
            c.importLDIF(TEST_LDIF);
            MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
            Connection c = newInternalConnection(backend);
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                    LDAPManagementContext.newManagementContext(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");
        } finally {
            // Clean up.
            TestCfg.removeConstraint(constraint);
        }
    }
@@ -829,22 +871,27 @@
    public void testModifyConstraintSuccess() throws Exception {
        Constraint constraint = new MockConstraint(false, true, false);
        TestCfg.addConstraint(constraint);
        try {
            ModifyEntryMockLDAPConnection c =
                new ModifyEntryMockLDAPConnection(
                    "cn=test child 2,cn=test children,cn=test parent 1,cn=test parents,cn=config");
            c.importLDIF(TEST_LDIF);
            c.addExpectedModification("ds-cfg-base-dn");
            MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
            Connection c = newInternalConnection(backend);
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                    LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            TestChildCfgClient child = parent.getTestChild("test child 2");
            child.setOptionalMultiValuedDNProperty1(Collections.<DN> emptySet());
            child.commit();
            Assert.assertTrue(c.isEntryModified());
            String dn =
                    "cn=test child 2,cn=test children,cn=test parent 1,cn=test parents,cn=config";
            assertThat(backend.get(dn)).isEqualTo(new LinkedHashMapEntry(
                    "dn: " + dn,
                    "cn: test child 2",
                    "objectClass: top",
                    "objectClass: ds-cfg-test-child-dummy",
                    "ds-cfg-enabled: true",
                    "ds-cfg-java-class: org.opends.server.extensions.UserDefinedVirtualAttributeProvider",
                    "ds-cfg-attribute-type: description"));
        } finally {
            // Clean up.
            TestCfg.removeConstraint(constraint);
        }
    }
@@ -860,22 +907,17 @@
    public void testModifyConstraintFail() throws Exception {
        Constraint constraint = new MockConstraint(true, false, true);
        TestCfg.addConstraint(constraint);
        try {
            ModifyEntryMockLDAPConnection c =
                new ModifyEntryMockLDAPConnection(
                    "cn=test child 2,cn=test children,cn=test parent 1,cn=test parents,cn=config");
            c.importLDIF(TEST_LDIF);
            c.addExpectedModification("ds-cfg-base-dn");
            MemoryBackend backend = new MemoryBackend(new LDIFEntryReader(TEST_LDIF));
            Connection c = newInternalConnection(backend);
            ManagementContext ctx =
                LDAPManagementContext.createFromContext(c, LDAPProfile.getInstance());
                    LDAPManagementContext.newManagementContext(c, LDAPProfile.getInstance());
            TestParentCfgClient parent = getTestParent(ctx, "test parent 1");
            TestChildCfgClient child = parent.getTestChild("test child 2");
            child.setOptionalMultiValuedDNProperty1(Collections.<DN> emptySet());
            child.commit();
            Assert.fail("The modify constraint failed to prevent modification of the managed object");
        } finally {
            // Clean up.
            TestCfg.removeConstraint(constraint);
        }
    }
@@ -892,16 +934,19 @@
    }
    // Create the named test parent managed object.
    private TestParentCfgClient createTestParent(ManagementContext context, String name) throws Exception {
    private TestParentCfgClient createTestParent(ManagementContext context, String name)
            throws Exception {
        ManagedObject<RootCfgClient> root = context.getRootConfigurationManagedObject();
        return root.createChild(TestCfg.getTestOneToManyParentRelationDefinition(), TestParentCfgDefn.getInstance(),
            name, null).getConfiguration();
        return root.createChild(TestCfg.getTestOneToManyParentRelationDefinition(),
                TestParentCfgDefn.getInstance(), name, null).getConfiguration();
    }
    // Retrieve the named test parent managed object.
    private TestParentCfgClient getTestParent(ManagementContext context, String name) throws Exception {
    private TestParentCfgClient getTestParent(ManagementContext context, String name)
            throws Exception {
        ManagedObject<RootCfgClient> root = context.getRootConfigurationManagedObject();
        return root.getChild(TestCfg.getTestOneToManyParentRelationDefinition(), name).getConfiguration();
        return root.getChild(TestCfg.getTestOneToManyParentRelationDefinition(), name)
                .getConfiguration();
    }
    // List test parent managed objects.
opendj-config/src/test/java/org/forgerock/opendj/config/client/ldap/MockLDAPConnection.java
File was deleted
opendj-config/src/test/java/org/forgerock/opendj/config/client/ldap/ModifyEntryMockLDAPConnection.java
File was deleted