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

Matthew Swift
13.49.2013 8adb7af006bb6bf8a71f86bb520671de381c8e3e
Minor API cleanup to make it easier to use.
11 files modified
339 ■■■■ changed files
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractAttribute.java 15 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/Attribute.java 12 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/Attributes.java 8 ●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/LinkedAttribute.java 50 ●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/SortKey.java 41 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/controls/MatchedValuesRequestControl.java 34 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/controls/ServerSideSortRequestControl.java 24 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/requests/ModifyRequestImpl.java 8 ●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/ConnectionPoolTestCase.java 56 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/TestCaseUtils.java 84 ●●●●● patch | view | raw | blame | history
opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/LDAPConstantAttributeMapper.java 7 ●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractAttribute.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2012 ForgeRock AS.
 *      Portions copyright 2012-2013 ForgeRock AS.
 */
package org.forgerock.opendj.ldap;
@@ -165,14 +165,11 @@
    /**
     * {@inheritDoc}
     */
    public boolean add(final Object firstValue, final Object... remainingValues) {
        Validator.ensureNotNull(firstValue);
        boolean modified = add(ByteString.valueOf(firstValue));
        if (remainingValues != null) {
            for (final Object value : remainingValues) {
                modified |= add(ByteString.valueOf(value));
            }
    public boolean add(final Object... values) {
        Validator.ensureNotNull(values);
        boolean modified = false;
        for (final Object value : values) {
            modified |= add(ByteString.valueOf(value));
        }
        return modified;
    }
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/Attribute.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2012 ForgeRock AS.
 *      Portions copyright 2012-2013 ForgeRock AS.
 */
package org.forgerock.opendj.ldap;
@@ -69,18 +69,16 @@
     * Any attribute values which are not instances of {@code ByteString} will
     * be converted using the {@link ByteString#valueOf(Object)} method.
     *
     * @param firstValue
     *            The first attribute value to be added to this attribute.
     * @param remainingValues
     *            The remaining attribute values to be added to this attribute.
     * @param values
     *            The attribute values to be added to this attribute.
     * @return {@code true} if this attribute changed as a result of this call.
     * @throws UnsupportedOperationException
     *             If this attribute does not support addition of attribute
     *             values.
     * @throws NullPointerException
     *             If {@code firstValue} was {@code null}.
     *             If {@code values} was {@code null}.
     */
    boolean add(Object firstValue, Object... remainingValues);
    boolean add(Object... values);
    /**
     * Adds all of the attribute values contained in {@code values} to this
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/Attributes.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2010 Sun Microsystems, Inc.
 *      Portions copyright 2011-2012 ForgeRock AS.
 *      Portions copyright 2011-2013 ForgeRock AS.
 */
package org.forgerock.opendj.ldap;
@@ -113,8 +113,8 @@
        }
        @Override
        public boolean add(final Object firstValue, final Object... remainingValues) {
            return attribute.add(firstValue, remainingValues);
        public boolean add(final Object... values) {
            return attribute.add(values);
        }
        @Override
@@ -320,7 +320,7 @@
        }
        @Override
        public boolean add(final Object firstValue, final Object... remainingValues) {
        public boolean add(final Object... values) {
            throw new UnsupportedOperationException();
        }
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/LinkedAttribute.java
@@ -22,12 +22,11 @@
 *
 *
 *      Copyright 2009-2010 Sun Microsystems, Inc.
 *      Portions copyright 2012 ForgeRock AS.
 *      Portions copyright 2012-2013 ForgeRock AS.
 */
package org.forgerock.opendj.ldap;
import java.util.Arrays;
import java.util.Collection;
import java.util.ConcurrentModificationException;
import java.util.HashMap;
@@ -506,6 +505,9 @@
    /**
     * Creates a new attribute having the specified attribute description and
     * single attribute value.
     * <p>
     * If {@code value} is not an instance of {@code ByteString} then it will be
     * converted using the {@link ByteString#valueOf(Object)} method.
     *
     * @param attributeDescription
     *            The attribute description.
@@ -515,7 +517,7 @@
     *             If {@code attributeDescription} or {@code value} was
     *             {@code null} .
     */
    public LinkedAttribute(final AttributeDescription attributeDescription, final ByteString value) {
    public LinkedAttribute(final AttributeDescription attributeDescription, final Object value) {
        this(attributeDescription);
        add(value);
    }
@@ -523,6 +525,9 @@
    /**
     * Creates a new attribute having the specified attribute description and
     * attribute values.
     * <p>
     * Any attribute values which are not instances of {@code ByteString} will
     * be converted using the {@link ByteString#valueOf(Object)} method.
     *
     * @param attributeDescription
     *            The attribute description.
@@ -533,14 +538,17 @@
     *             {@code null}.
     */
    public LinkedAttribute(final AttributeDescription attributeDescription,
            final ByteString... values) {
            final Object... values) {
        this(attributeDescription);
        addAll(Arrays.asList(values));
        add(values);
    }
    /**
     * Creates a new attribute having the specified attribute description and
     * attribute values.
     * <p>
     * Any attribute values which are not instances of {@code ByteString} will
     * be converted using the {@link ByteString#valueOf(Object)} method.
     *
     * @param attributeDescription
     *            The attribute description.
@@ -551,9 +559,9 @@
     *             {@code null}.
     */
    public LinkedAttribute(final AttributeDescription attributeDescription,
            final Collection<ByteString> values) {
            final Collection<?> values) {
        this(attributeDescription);
        addAll(values);
        addAll(values, null);
    }
    /**
@@ -575,6 +583,30 @@
    /**
     * Creates a new attribute having the specified attribute description and
     * attribute values. The attribute description will be decoded using the
     * default schema.
     * <p>
     * Any attribute values which are not instances of {@code ByteString} will
     * be converted using the {@link ByteString#valueOf(Object)} method.
     *
     * @param attributeDescription
     *            The attribute description.
     * @param values
     *            The attribute values.
     * @throws LocalizedIllegalArgumentException
     *             If {@code attributeDescription} could not be decoded using
     *             the default schema.
     * @throws NullPointerException
     *             If {@code attributeDescription} or {@code values} was
     *             {@code null}.
     */
    public LinkedAttribute(final String attributeDescription, final Collection<?> values) {
        this(attributeDescription);
        addAll(values, null);
    }
    /**
     * Creates a new attribute having the specified attribute description and
     * single attribute value. The attribute description will be decoded using
     * the default schema.
     * <p>
@@ -618,9 +650,7 @@
     */
    public LinkedAttribute(final String attributeDescription, final Object... values) {
        this(attributeDescription);
        for (final Object value : values) {
            add(ByteString.valueOf(value));
        }
        add(values);
    }
    /**
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/SortKey.java
@@ -22,13 +22,14 @@
 *
 *
 *      Copyright 2010 Sun Microsystems, Inc.
 *      Portions copyright 2012 ForgeRock AS.
 *      Portions copyright 2012-2013 ForgeRock AS.
 */
package org.forgerock.opendj.ldap;
import static org.forgerock.opendj.ldap.CoreMessages.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.LinkedList;
@@ -223,28 +224,19 @@
     *
     * @param schema
     *            The schema which should be used for decoding the sort keys.
     * @param firstKey
     *            The first sort key.
     * @param remainingKeys
     *            The remaining sort keys.
     * @param keys
     *            The list of sort keys.
     * @return The {@code Comparator}.
     * @throws LocalizedIllegalArgumentException
     *             If one of the sort keys could not be converted to a
     *             comparator.
     * @throws IllegalArgumentException
     *             If {@code keys} was empty.
     * @throws NullPointerException
     *             If {@code schema} or {@code firstKey} was {@code null}.
     *             If {@code schema} or {@code keys} was {@code null}.
     */
    public static Comparator<Entry> comparator(final Schema schema, final SortKey firstKey,
            final SortKey... remainingKeys) {
        Validator.ensureNotNull(schema, firstKey, remainingKeys);
        final List<Comparator<Entry>> comparators =
                new ArrayList<Comparator<Entry>>(1 + remainingKeys.length);
        comparators.add(firstKey.comparator(schema));
        for (final SortKey key : remainingKeys) {
            comparators.add(key.comparator(schema));
        }
        return new CompositeEntryComparator(comparators);
    public static Comparator<Entry> comparator(final Schema schema, final SortKey... keys) {
        return comparator(schema, Arrays.asList(keys));
    }
    /**
@@ -252,20 +244,19 @@
     * the provided list of sort keys. The sort keys will be decoded using the
     * default schema.
     *
     * @param firstKey
     *            The first sort key.
     * @param remainingKeys
     *            The remaining sort keys.
     * @param keys
     *            The list of sort keys.
     * @return The {@code Comparator}.
     * @throws LocalizedIllegalArgumentException
     *             If one of the sort keys could not be converted to a
     *             comparator.
     * @throws IllegalArgumentException
     *             If {@code keys} was empty.
     * @throws NullPointerException
     *             If {@code firstKey} was {@code null}.
     *             If {@code keys} was {@code null}.
     */
    public static Comparator<Entry> comparator(final SortKey firstKey,
            final SortKey... remainingKeys) {
        return comparator(Schema.getDefaultSchema(), firstKey, remainingKeys);
    public static Comparator<Entry> comparator(final SortKey... keys) {
        return comparator(Schema.getDefaultSchema(), keys);
    }
    /**
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/controls/MatchedValuesRequestControl.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Portions copyright 2012 ForgeRock AS.
 *      Portions copyright 2012-2013 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.controls;
@@ -271,36 +271,28 @@
     *            {@code true} if it is unacceptable to perform the operation
     *            without applying the semantics of this control, or
     *            {@code false} if it can be ignored.
     * @param firstFilter
     *            The first matched values filter.
     * @param remainingFilters
     *            The remaining matched values filter, may be {@code null} or
     *            empty.
     * @param filters
     *            The list of filters of which at least one must match an
     *            attribute value in order for the attribute value to be
     *            returned to the client. The list must not be empty.
     * @return The new control.
     * @throws LocalizedIllegalArgumentException
     *             If one or more filters could not be parsed, or if one or more
     *             filters failed to conform to the filter constraints defined
     *             in RFC 3876.
     * @throws NullPointerException
     *             If {@code firstFilter} was {@code null}.
     *             If {@code filters} was {@code null}.
     */
    public static MatchedValuesRequestControl newControl(final boolean isCritical,
            final String firstFilter, final String... remainingFilters) {
        Validator.ensureNotNull(firstFilter);
            final String... filters) {
        Validator.ensureTrue(filters.length > 0, "filters is empty");
        List<Filter> filters;
        if (remainingFilters == null || remainingFilters.length == 0) {
            filters = Collections.singletonList(validateFilter(Filter.valueOf(firstFilter)));
        } else {
            filters = new ArrayList<Filter>(1 + remainingFilters.length);
            filters.add(validateFilter(Filter.valueOf(firstFilter)));
            for (final String filter : remainingFilters) {
                filters.add(validateFilter(Filter.valueOf(filter)));
            }
            filters = Collections.unmodifiableList(filters);
        final List<Filter> parsedFilters = new ArrayList<Filter>(filters.length);
        for (final String filter : filters) {
            parsedFilters.add(validateFilter(Filter.valueOf(filter)));
        }
        return new MatchedValuesRequestControl(isCritical, filters);
        return new MatchedValuesRequestControl(isCritical, Collections
                .unmodifiableList(parsedFilters));
    }
    private static Filter validateFilter(final Filter filter) {
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/controls/ServerSideSortRequestControl.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2010 Sun Microsystems, Inc.
 *      Portions copyright 2012 ForgeRock AS.
 *      Portions copyright 2012-2013 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.controls;
@@ -31,6 +31,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
@@ -209,24 +210,17 @@
     *            {@code true} if it is unacceptable to perform the operation
     *            without applying the semantics of this control, or
     *            {@code false} if it can be ignored.
     * @param firstKey
     *            The first sort key.
     * @param remainingKeys
     *            The remaining sort keys.
     * @param keys
     *            The list of sort keys.
     * @return The new control.
     * @throws IllegalArgumentException
     *             If {@code keys} was empty.
     * @throws NullPointerException
     *             If {@code firstKey} was {@code null}.
     *             If {@code keys} was {@code null}.
     */
    public static ServerSideSortRequestControl newControl(final boolean isCritical,
            final SortKey firstKey, final SortKey... remainingKeys) {
        Validator.ensureNotNull(firstKey, remainingKeys);
        final List<SortKey> keys = new ArrayList<SortKey>(1 + remainingKeys.length);
        keys.add(firstKey);
        for (final SortKey key : remainingKeys) {
            keys.add(key);
        }
        return new ServerSideSortRequestControl(isCritical, Collections.unmodifiableList(keys));
            final SortKey... keys) {
        return newControl(isCritical, Arrays.asList(keys));
    }
    /**
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/requests/ModifyRequestImpl.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2010 Sun Microsystems, Inc.
 *      Portions copyright 2012 ForgeRock AS.
 *      Portions copyright 2012-2013 ForgeRock AS.
 */
package org.forgerock.opendj.ldap.requests;
@@ -88,12 +88,6 @@
        return v.visitChangeRecord(p, this);
    }
    public ModifyRequest addChange(final ModificationType type, final String attributeDescription,
            final Object firstValue, final Object... remainingValues) {
        // TODO Auto-generated method stub
        return null;
    }
    /**
     * {@inheritDoc}
     */
opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/ConnectionPoolTestCase.java
@@ -30,11 +30,11 @@
import static org.fest.assertions.Assertions.assertThat;
import static org.forgerock.opendj.ldap.Connections.newFixedConnectionPool;
import static org.forgerock.opendj.ldap.ErrorResultException.newErrorResult;
import static org.forgerock.opendj.ldap.TestCaseUtils.*;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -49,12 +49,8 @@
import org.forgerock.opendj.ldap.requests.Requests;
import org.forgerock.opendj.ldap.responses.ExtendedResult;
import org.forgerock.opendj.ldap.responses.Responses;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.testng.annotations.Test;
import com.forgerock.opendj.util.CompletedFutureResult;
/**
 * Tests the connection pool implementation..
 */
@@ -418,54 +414,4 @@
        pool.close();
    }
    private Connection mockConnection(final List<ConnectionEventListener> listeners) {
        final Connection mockConnection = mock(Connection.class);
        // Handle listener registration / deregistration in mock connection.
        doAnswer(new Answer<Void>() {
            @Override
            public Void answer(final InvocationOnMock invocation) throws Throwable {
                final ConnectionEventListener listener =
                        (ConnectionEventListener) invocation.getArguments()[0];
                listeners.add(listener);
                return null;
            }
        }).when(mockConnection).addConnectionEventListener(any(ConnectionEventListener.class));
        doAnswer(new Answer<Void>() {
            @Override
            public Void answer(final InvocationOnMock invocation) throws Throwable {
                final ConnectionEventListener listener =
                        (ConnectionEventListener) invocation.getArguments()[0];
                listeners.remove(listener);
                return null;
            }
        }).when(mockConnection).removeConnectionEventListener(any(ConnectionEventListener.class));
        return mockConnection;
    }
    @SuppressWarnings("unchecked")
    private ConnectionFactory mockConnectionFactory(final Connection first,
            final Connection... remaining) throws ErrorResultException {
        final ConnectionFactory factory = mock(ConnectionFactory.class);
        when(factory.getConnection()).thenReturn(first, remaining);
        when(factory.getConnectionAsync(any(ResultHandler.class))).thenAnswer(
                new Answer<FutureResult<Connection>>() {
                    @Override
                    public FutureResult<Connection> answer(final InvocationOnMock invocation)
                            throws Throwable {
                        final Connection connection = factory.getConnection();
                        // Execute handler and return future.
                        final ResultHandler<? super Connection> handler =
                                (ResultHandler<? super Connection>) invocation.getArguments()[0];
                        if (handler != null) {
                            handler.handleResult(connection);
                        }
                        return new CompletedFutureResult<Connection>(connection);
                    }
                });
        return factory;
    }
}
opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/TestCaseUtils.java
@@ -22,16 +22,28 @@
 *
 *
 *      Copyright 2009-2010 Sun Microsystems, Inc.
 *      Portions copyright 2012 ForgeRock AS.
 */
package org.forgerock.opendj.ldap;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.SocketAddress;
import java.util.List;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import com.forgerock.opendj.util.CompletedFutureResult;
/**
 * This class defines some utility functions which can be used by test cases.
@@ -118,4 +130,76 @@
    public static SocketAddress getServerSocketAddress() {
        return LDAPServer.getInstance().getSocketAddress();
    }
    /**
     * Creates a mock connection factory which will return the provided
     * connections in order.
     *
     * @param first
     *            The first connection to return.
     * @param remaining
     *            The remaining connections to return.
     * @return The connection factory.
     */
    @SuppressWarnings("unchecked")
    public static ConnectionFactory mockConnectionFactory(final Connection first,
            final Connection... remaining) {
        final ConnectionFactory factory = mock(ConnectionFactory.class);
        try {
            when(factory.getConnection()).thenReturn(first, remaining);
        } catch (ErrorResultException ignored) {
            // Cannot happen.
        }
        when(factory.getConnectionAsync(any(ResultHandler.class))).thenAnswer(
                new Answer<FutureResult<Connection>>() {
                    @Override
                    public FutureResult<Connection> answer(final InvocationOnMock invocation)
                            throws Throwable {
                        final Connection connection = factory.getConnection();
                        // Execute handler and return future.
                        final ResultHandler<? super Connection> handler =
                                (ResultHandler<? super Connection>) invocation.getArguments()[0];
                        if (handler != null) {
                            handler.handleResult(connection);
                        }
                        return new CompletedFutureResult<Connection>(connection);
                    }
                });
        return factory;
    }
    /**
     * Creates a mock connection which will store connection event listeners in
     * the provided list.
     *
     * @param listeners
     *            The list which should be used for storing event listeners.
     * @return The mock connection.
     */
    public static Connection mockConnection(final List<ConnectionEventListener> listeners) {
        final Connection mockConnection = mock(Connection.class);
        // Handle listener registration / deregistration in mock connection.
        doAnswer(new Answer<Void>() {
            @Override
            public Void answer(final InvocationOnMock invocation) throws Throwable {
                final ConnectionEventListener listener =
                        (ConnectionEventListener) invocation.getArguments()[0];
                listeners.add(listener);
                return null;
            }
        }).when(mockConnection).addConnectionEventListener(any(ConnectionEventListener.class));
        doAnswer(new Answer<Void>() {
            @Override
            public Void answer(final InvocationOnMock invocation) throws Throwable {
                final ConnectionEventListener listener =
                        (ConnectionEventListener) invocation.getArguments()[0];
                listeners.remove(listener);
                return null;
            }
        }).when(mockConnection).removeConnectionEventListener(any(ConnectionEventListener.class));
        return mockConnection;
    }
}
opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/LDAPConstantAttributeMapper.java
@@ -43,11 +43,8 @@
        if (attributeValues.length == 1) {
            attributes = singletonList(singletonAttribute(attributeName, attributeValues[0]));
        } else {
            Attribute attribute = new LinkedAttribute(attributeName);
            for (Object o : attributeValues) {
                attribute.add(o);
            }
            attributes = singletonList(attribute);
            attributes =
                    singletonList((Attribute) new LinkedAttribute(attributeName, attributeValues));
        }
    }