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

matthew_swift
11.23.2010 4ea2bc73aa3a298a61532530eb177704fa4a569f
Fix SDK issue 4421: Remove generic AsynchronousConnection parameter from ConnectionFactory.

18 files modified
459 ■■■■ changed files
opendj-sdk/sdk/src/com/sun/opends/sdk/ldap/LDAPConnectionFactoryImpl.java 5 ●●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/com/sun/opends/sdk/tools/ArgumentParserConnectionFactory.java 63 ●●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/com/sun/opends/sdk/tools/AuthenticatedConnectionFactory.java 93 ●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/com/sun/opends/sdk/tools/ModRate.java 4 ●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/com/sun/opends/sdk/tools/PerformanceRunner.java 8 ●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/com/sun/opends/sdk/tools/SearchRate.java 4 ●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/org/opends/sdk/AbstractConnectionFactory.java 16 ●●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/org/opends/sdk/AbstractLoadBalancingAlgorithm.java 14 ●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/org/opends/sdk/AsynchronousConnection.java 1 ●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/org/opends/sdk/AuthenticatedConnectionFactory.java 11 ●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/org/opends/sdk/ConnectionFactory.java 9 ●●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/org/opends/sdk/ConnectionPool.java 105 ●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/org/opends/sdk/Connections.java 16 ●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/org/opends/sdk/FailoverLoadBalancingAlgorithm.java 15 ●●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/org/opends/sdk/HeartBeatConnectionFactory.java 49 ●●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/org/opends/sdk/LoadBalancingAlgorithm.java 7 ●●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/org/opends/sdk/LoadBalancingConnectionFactory.java 34 ●●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/org/opends/sdk/ldap/LDAPConnectionFactory.java 5 ●●●●● patch | view | raw | blame | history
opendj-sdk/sdk/src/com/sun/opends/sdk/ldap/LDAPConnectionFactoryImpl.java
@@ -67,8 +67,7 @@
 * LDAP connection factory implementation.
 */
public final class LDAPConnectionFactoryImpl extends
    AbstractConnectionFactory<AsynchronousConnection> implements
    ConnectionFactory<AsynchronousConnection>
    AbstractConnectionFactory implements ConnectionFactory
{
  private final class LDAPTransport extends AbstractLDAPTransport
  {
@@ -373,7 +372,7 @@
   * {@inheritDoc}
   */
  public FutureResult<AsynchronousConnection> getAsynchronousConnection(
      ResultHandler<? super AsynchronousConnection> handler)
      ResultHandler<AsynchronousConnection> handler)
  {
    FutureResultImpl future = new FutureResultImpl(handler);
opendj-sdk/sdk/src/com/sun/opends/sdk/tools/ArgumentParserConnectionFactory.java
@@ -65,8 +65,7 @@
 * A connection factory designed for use with command line tools.
 */
final class ArgumentParserConnectionFactory extends
    AbstractConnectionFactory<AsynchronousConnection> implements
    ConnectionFactory<AsynchronousConnection>
    AbstractConnectionFactory implements ConnectionFactory
{
  /**
   * End Of Line.
@@ -174,7 +173,7 @@
  private SSLContext sslContext;
  private ConnectionFactory<? extends AsynchronousConnection> connFactory;
  private ConnectionFactory connFactory;
  private BindRequest bindRequest = null;
@@ -349,8 +348,8 @@
  /**
   * {@inheritDoc}
   */
  public FutureResult<? extends AsynchronousConnection> getAsynchronousConnection(
      ResultHandler<? super AsynchronousConnection> handler)
  public FutureResult<AsynchronousConnection> getAsynchronousConnection(
      ResultHandler<AsynchronousConnection> handler)
  {
    return connFactory.getAsynchronousConnection(handler);
  }
@@ -364,8 +363,8 @@
    // Couldn't have at the same time bindPassword and bindPasswordFile
    if (bindPasswordArg.isPresent() && bindPasswordFileArg.isPresent())
    {
      LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS
          .get(bindPasswordArg.getLongIdentifier(), bindPasswordFileArg
      LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(
          bindPasswordArg.getLongIdentifier(), bindPasswordFileArg
              .getLongIdentifier());
      throw new ArgumentException(message);
    }
@@ -374,22 +373,23 @@
    // trustStore related arg
    if (trustAllArg.isPresent() && trustStorePathArg.isPresent())
    {
      LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(trustAllArg
          .getLongIdentifier(), trustStorePathArg.getLongIdentifier());
      LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(
          trustAllArg.getLongIdentifier(), trustStorePathArg
              .getLongIdentifier());
      throw new ArgumentException(message);
    }
    if (trustAllArg.isPresent() && trustStorePasswordArg.isPresent())
    {
      LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(trustAllArg
          .getLongIdentifier(), trustStorePasswordArg
      LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(
          trustAllArg.getLongIdentifier(), trustStorePasswordArg
          .getLongIdentifier());
      throw new ArgumentException(message);
    }
    if (trustAllArg.isPresent()
        && trustStorePasswordFileArg.isPresent())
    {
      LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(trustAllArg
          .getLongIdentifier(), trustStorePasswordFileArg
      LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(
          trustAllArg.getLongIdentifier(), trustStorePasswordFileArg
          .getLongIdentifier());
      throw new ArgumentException(message);
    }
@@ -411,7 +411,8 @@
      String value = trustStorePathArg.getValue();
      if (!canRead(trustStorePathArg.getValue()))
      {
        LocalizableMessage message = ERR_CANNOT_READ_TRUSTSTORE.get(value);
        LocalizableMessage message = ERR_CANNOT_READ_TRUSTSTORE
            .get(value);
        throw new ArgumentException(message);
      }
    }
@@ -422,7 +423,8 @@
      String value = keyStorePathArg.getValue();
      if (!canRead(trustStorePathArg.getValue()))
      {
        LocalizableMessage message = ERR_CANNOT_READ_KEYSTORE.get(value);
        LocalizableMessage message = ERR_CANNOT_READ_KEYSTORE
            .get(value);
        throw new ArgumentException(message);
      }
    }
@@ -431,8 +433,9 @@
    // useSSLArg
    if (useStartTLSArg.isPresent() && useSSLArg.isPresent())
    {
      LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(useStartTLSArg
          .getLongIdentifier(), useSSLArg.getLongIdentifier());
      LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(
          useStartTLSArg.getLongIdentifier(), useSSLArg
              .getLongIdentifier());
      throw new ArgumentException(message);
    }
@@ -492,8 +495,8 @@
    }
    catch (CLIException e)
    {
      throw new ArgumentException(LocalizableMessage.raw("Error reading input: "
          + e.toString()));
      throw new ArgumentException(LocalizableMessage
          .raw("Error reading input: " + e.toString()));
    }
    if (bindRequest != null)
    {
@@ -522,7 +525,8 @@
      if (bindDnArg.isPresent() || bindPasswordFileArg.isPresent()
          || bindPasswordArg.isPresent())
      {
        return Requests.newSimpleBindRequest(getBindDN(), getPassword());
        return Requests
            .newSimpleBindRequest(getBindDN(), getPassword());
      }
      return null;
    }
@@ -559,12 +563,14 @@
    {
      if (sslContext == null)
      {
        LocalizableMessage message = ERR_TOOL_SASLEXTERNAL_NEEDS_SSL_OR_TLS.get();
        LocalizableMessage message = ERR_TOOL_SASLEXTERNAL_NEEDS_SSL_OR_TLS
            .get();
        throw new ArgumentException(message);
      }
      if (!keyStorePathArg.isPresent() && getKeyStore() == null)
      {
        LocalizableMessage message = ERR_TOOL_SASLEXTERNAL_NEEDS_KEYSTORE.get();
        LocalizableMessage message = ERR_TOOL_SASLEXTERNAL_NEEDS_KEYSTORE
            .get();
        throw new ArgumentException(message);
      }
      return new ExternalSASLBindRequest(getAuthzID());
@@ -591,8 +597,8 @@
    }
    else if (app.isInteractive())
    {
      value = app.readInput(LocalizableMessage.raw("Bind DN:"), bindDnArg
          .getDefaultValue() == null ? value : bindDnArg
      value = app.readInput(LocalizableMessage.raw("Bind DN:"),
          bindDnArg.getDefaultValue() == null ? value : bindDnArg
          .getDefaultValue());
    }
@@ -626,13 +632,15 @@
    }
    if (value == null && app.isInteractive())
    {
      value = app.readInput(LocalizableMessage.raw("Authentication ID:"),
      value = app.readInput(LocalizableMessage
          .raw("Authentication ID:"),
          bindDnArg.getDefaultValue() == null ? null : "dn: "
              + bindDnArg.getDefaultValue());
    }
    if (value == null)
    {
      LocalizableMessage message = ERR_LDAPAUTH_SASL_AUTHID_REQUIRED.get(mech);
      LocalizableMessage message = ERR_LDAPAUTH_SASL_AUTHID_REQUIRED
          .get(mech);
      throw new ArgumentException(message);
    }
    return value;
@@ -676,7 +684,8 @@
    }
    if (value.length() == 0 && app.isInteractive())
    {
      value = app.readLineOfInput(LocalizableMessage.raw("Bind Password:"));
      value = app.readLineOfInput(LocalizableMessage
          .raw("Bind Password:"));
    }
    return ByteString.valueOf(value);
opendj-sdk/sdk/src/com/sun/opends/sdk/tools/AuthenticatedConnectionFactory.java
@@ -67,72 +67,18 @@
 * then the connection attempt will fail and an {@code
 * ErrorResultException} will be thrown.
 */
final class AuthenticatedConnectionFactory
    implements
    ConnectionFactory<AuthenticatedConnectionFactory.AuthenticatedAsynchronousConnection>
final class AuthenticatedConnectionFactory extends
    AbstractConnectionFactory implements ConnectionFactory
{
  // We implement the factory using the pimpl idiom in order have
  // cleaner Javadoc which does not expose implementation methods from
  // AbstractConnectionFactory.
  private static final class Impl
      extends
      AbstractConnectionFactory<AuthenticatedConnectionFactory.AuthenticatedAsynchronousConnection>
      implements
      ConnectionFactory<AuthenticatedConnectionFactory.AuthenticatedAsynchronousConnection>
  {
    private final BindRequest request;
    private final ConnectionFactory<?> parentFactory;
  private final ConnectionFactory parentFactory;
    private boolean allowRebinds = false;
    private Impl(ConnectionFactory<?> factory, BindRequest request)
        throws NullPointerException
    {
      Validator.ensureNotNull(factory, request);
      this.parentFactory = factory;
      // FIXME: should do a defensive copy.
      this.request = request;
    }
    /**
     * {@inheritDoc}
     */
    public FutureResult<AuthenticatedAsynchronousConnection> getAsynchronousConnection(
        ResultHandler<? super AuthenticatedAsynchronousConnection> handler)
    {
      FutureResultImpl future = new FutureResultImpl(request, handler);
      future.futureConnectionResult.setFutureResult(parentFactory
          .getAsynchronousConnection(future.futureConnectionResult));
      return future.futureBindResult;
    }
    /**
     * {@inheritDoc}
     */
    public AuthenticatedConnection getConnection()
        throws ErrorResultException
    {
      return new AuthenticatedConnection(
          blockingGetAsynchronousConnection());
    }
  }
  private final Impl impl;
  /**
   * An authenticated synchronous connection supports all operations
   * except Bind operations.
@@ -555,17 +501,21 @@
   * @throws NullPointerException
   *           If {@code factory} or {@code request} was {@code null}.
   */
  public AuthenticatedConnectionFactory(ConnectionFactory<?> factory,
  public AuthenticatedConnectionFactory(ConnectionFactory factory,
      BindRequest request) throws NullPointerException
  {
    impl = new Impl(factory, request);
    Validator.ensureNotNull(factory, request);
    this.parentFactory = factory;
    // FIXME: should do a defensive copy.
    this.request = request;
  }
  private static final class FutureResultImpl
  {
    private final FutureResultTransformer<BindResult, AuthenticatedAsynchronousConnection> futureBindResult;
    private final FutureResultTransformer<BindResult, AsynchronousConnection> futureBindResult;
    private final RecursiveFutureResult<AsynchronousConnection, BindResult> futureConnectionResult;
@@ -575,12 +525,11 @@
    private FutureResultImpl(
        BindRequest request,
        ResultHandler<? super AuthenticatedAsynchronousConnection> handler)
    private FutureResultImpl(BindRequest request,
        ResultHandler<AsynchronousConnection> handler)
    {
      this.bindRequest = request;
      this.futureBindResult = new FutureResultTransformer<BindResult, AuthenticatedAsynchronousConnection>(
      this.futureBindResult = new FutureResultTransformer<BindResult, AsynchronousConnection>(
          handler)
      {
@@ -647,7 +596,7 @@
  public AuthenticatedConnectionFactory setRebindAllowed(
      boolean allowRebinds)
  {
    impl.allowRebinds = allowRebinds;
    this.allowRebinds = allowRebinds;
    return this;
  }
@@ -666,15 +615,18 @@
   */
  public boolean isRebindAllowed()
  {
    return impl.allowRebinds;
    return allowRebinds;
  }
  public FutureResult<AuthenticatedAsynchronousConnection> getAsynchronousConnection(
      ResultHandler<? super AuthenticatedAsynchronousConnection> handler)
  public FutureResult<AsynchronousConnection> getAsynchronousConnection(
      ResultHandler<AsynchronousConnection> handler)
  {
    return impl.getAsynchronousConnection(handler);
    FutureResultImpl future = new FutureResultImpl(request, handler);
    future.futureConnectionResult.setFutureResult(parentFactory
        .getAsynchronousConnection(future.futureConnectionResult));
    return future.futureBindResult;
  }
@@ -682,7 +634,8 @@
  public AuthenticatedConnection getConnection()
      throws ErrorResultException
  {
    return impl.getConnection();
    return new AuthenticatedConnection(
        (AuthenticatedAsynchronousConnection) blockingGetAsynchronousConnection());
  }
}
opendj-sdk/sdk/src/com/sun/opends/sdk/tools/ModRate.java
@@ -254,7 +254,7 @@
    WorkerThread<?> newWorkerThread(AsynchronousConnection connection,
        ConnectionFactory<?> connectionFactory)
        ConnectionFactory connectionFactory)
    {
      return new ModifyWorkerThread(connection, connectionFactory);
    }
@@ -277,7 +277,7 @@
      private ModifyWorkerThread(AsynchronousConnection connection,
          ConnectionFactory<?> connectionFactory)
          ConnectionFactory connectionFactory)
      {
        super(connection, connectionFactory);
      }
opendj-sdk/sdk/src/com/sun/opends/sdk/tools/PerformanceRunner.java
@@ -224,7 +224,7 @@
  final int run(ConnectionFactory<?> connectionFactory)
  final int run(ConnectionFactory connectionFactory)
  {
    List<Thread> threads = new ArrayList<Thread>();
@@ -291,7 +291,7 @@
  abstract WorkerThread<?> newWorkerThread(
      AsynchronousConnection connection,
      ConnectionFactory<?> connectionFactory);
      ConnectionFactory connectionFactory);
@@ -357,12 +357,12 @@
    private final AsynchronousConnection connection;
    private final ConnectionFactory<?> connectionFactory;
    private final ConnectionFactory connectionFactory;
    WorkerThread(AsynchronousConnection connection,
        ConnectionFactory<?> connectionFactory)
        ConnectionFactory connectionFactory)
    {
      super("Worker Thread");
      this.connection = connection;
opendj-sdk/sdk/src/com/sun/opends/sdk/tools/SearchRate.java
@@ -309,7 +309,7 @@
    WorkerThread<?> newWorkerThread(AsynchronousConnection connection,
        ConnectionFactory<?> connectionFactory)
        ConnectionFactory connectionFactory)
    {
      return new SearchWorkerThread(connection, connectionFactory);
    }
@@ -357,7 +357,7 @@
      private SearchWorkerThread(AsynchronousConnection connection,
          ConnectionFactory<?> connectionFactory)
          ConnectionFactory connectionFactory)
      {
        super(connection, connectionFactory);
      }
opendj-sdk/sdk/src/org/opends/sdk/AbstractConnectionFactory.java
@@ -38,13 +38,9 @@
 * This class provides a skeletal implementation of the {@code
 * ConnectionFactory} interface, to minimize the effort required to
 * implement this interface.
 *
 * @param <C>
 *          The type of asynchronous connection returned by this
 *          connection factory.
 */
public abstract class AbstractConnectionFactory<C extends AsynchronousConnection>
    implements ConnectionFactory<C>
public abstract class AbstractConnectionFactory implements
    ConnectionFactory
{
  /**
   * Creates a new abstract connection factory.
@@ -59,8 +55,8 @@
  /**
   * {@inheritDoc}
   */
  public abstract FutureResult<? extends C> getAsynchronousConnection(
      ResultHandler<? super C> handler);
  public abstract FutureResult<AsynchronousConnection> getAsynchronousConnection(
      ResultHandler<AsynchronousConnection> handler);
@@ -101,10 +97,10 @@
   * @throws ErrorResultException
   *           If the connection request failed for some reason.
   */
  protected final C blockingGetAsynchronousConnection()
  protected final AsynchronousConnection blockingGetAsynchronousConnection()
      throws ErrorResultException
  {
    FutureResult<? extends C> future = getAsynchronousConnection(null);
    FutureResult<AsynchronousConnection> future = getAsynchronousConnection(null);
    try
    {
      return future.get();
opendj-sdk/sdk/src/org/opends/sdk/AbstractLoadBalancingAlgorithm.java
@@ -51,12 +51,12 @@
  protected AbstractLoadBalancingAlgorithm(
      ConnectionFactory<?>... factories)
      ConnectionFactory... factories)
  {
    Validator.ensureNotNull((Object[]) factories);
    factoryList = new ArrayList<MonitoredConnectionFactory>(
        factories.length);
    for (ConnectionFactory<?> f : factories)
    for (ConnectionFactory f : factories)
    {
      factoryList.add(new MonitoredConnectionFactory(f));
    }
@@ -67,10 +67,10 @@
  protected class MonitoredConnectionFactory extends
      AbstractConnectionFactory<AsynchronousConnection> implements
      AbstractConnectionFactory implements
      ResultHandler<AsynchronousConnection>
  {
    private final ConnectionFactory<?> factory;
    private final ConnectionFactory factory;
    private volatile boolean isOperational;
@@ -78,7 +78,7 @@
    private MonitoredConnectionFactory(ConnectionFactory<?> factory)
    private MonitoredConnectionFactory(ConnectionFactory factory)
    {
      this.factory = factory;
      this.isOperational = true;
@@ -109,8 +109,8 @@
    public FutureResult<? extends AsynchronousConnection> getAsynchronousConnection(
        final ResultHandler<? super AsynchronousConnection> resultHandler)
    public FutureResult<AsynchronousConnection> getAsynchronousConnection(
        final ResultHandler<AsynchronousConnection> resultHandler)
    {
      ResultHandler<AsynchronousConnection> handler = new ResultHandler<AsynchronousConnection>()
      {
opendj-sdk/sdk/src/org/opends/sdk/AsynchronousConnection.java
@@ -31,7 +31,6 @@
import java.io.Closeable;
import java.util.Collection;
import java.util.concurrent.TimeUnit;
import org.opends.sdk.requests.*;
import org.opends.sdk.responses.BindResult;
opendj-sdk/sdk/src/org/opends/sdk/AuthenticatedConnectionFactory.java
@@ -57,12 +57,12 @@
 * ErrorResultException} will be thrown.
 */
final class AuthenticatedConnectionFactory extends
    AbstractConnectionFactory<AsynchronousConnection>
    AbstractConnectionFactory
{
  private final BindRequest request;
  private final ConnectionFactory<?> parentFactory;
  private final ConnectionFactory parentFactory;
@@ -77,7 +77,7 @@
   * @param request
   *          The Bind request to use for authentication.
   */
  AuthenticatedConnectionFactory(ConnectionFactory<?> factory,
  AuthenticatedConnectionFactory(ConnectionFactory factory,
      BindRequest request) throws NullPointerException
  {
    this.parentFactory = factory;
@@ -92,7 +92,7 @@
   * {@inheritDoc}
   */
  public FutureResult<AsynchronousConnection> getAsynchronousConnection(
      ResultHandler<? super AsynchronousConnection> handler)
      ResultHandler<AsynchronousConnection> handler)
  {
    FutureResultImpl future = new FutureResultImpl(request, handler);
    future.futureConnectionResult.setFutureResult(parentFactory
@@ -253,7 +253,8 @@
    /**
     * {@inheritDoc}
     */
    public boolean isValid() {
    public boolean isValid()
    {
      return connection.isValid();
    }
opendj-sdk/sdk/src/org/opends/sdk/ConnectionFactory.java
@@ -49,11 +49,8 @@
 * connection. Applications should aim to close connections as soon as
 * possible in order to avoid resource contention.
 *
 * @param <C>
 *          The type of asynchronous connection returned by this
 *          connection factory.
 */
public interface ConnectionFactory<C extends AsynchronousConnection>
public interface ConnectionFactory
{
  /**
   * Returns a connection to the Directory Server associated with this
@@ -83,6 +80,6 @@
   * @return A future which can be used to retrieve the asynchronous
   *         connection.
   */
  FutureResult<? extends C> getAsynchronousConnection(
      ResultHandler<? super C> handler);
  FutureResult<AsynchronousConnection> getAsynchronousConnection(
      ResultHandler<AsynchronousConnection> handler);
}
opendj-sdk/sdk/src/org/opends/sdk/ConnectionPool.java
@@ -30,10 +30,8 @@
import java.util.Collection;
import java.util.Stack;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import org.opends.sdk.requests.*;
@@ -42,7 +40,6 @@
import com.sun.opends.sdk.util.AbstractFutureResult;
import com.sun.opends.sdk.util.CompletedFutureResult;
import com.sun.opends.sdk.util.FutureResultTransformer;
import com.sun.opends.sdk.util.StaticUtils;
@@ -50,10 +47,9 @@
/**
 * A simple connection pool implementation.
 */
final class ConnectionPool extends
    AbstractConnectionFactory<AsynchronousConnection>
final class ConnectionPool extends AbstractConnectionFactory
{
  private final ConnectionFactory<?> connectionFactory;
  private final ConnectionFactory connectionFactory;
  private volatile int numConnections;
@@ -70,9 +66,11 @@
      AsynchronousConnection, ConnectionEventListener
  {
    private final AsynchronousConnection connection;
    private volatile boolean isClosed;
    private PooledConnectionWapper(AsynchronousConnection connection)
    {
      this.connection = connection;
@@ -145,31 +143,27 @@
      connection.close();
      if (StaticUtils.DEBUG_LOG.isLoggable(Level.WARNING))
      {
        StaticUtils.DEBUG_LOG
            .warning(String
                .format(
        StaticUtils.DEBUG_LOG.warning(String.format(
                "Dead connection released and closed. "
                    + "numConnections: %d, poolSize: %d, " +
                    "pendingFutures: %d",
                numConnections, pool.size(), pendingFutures
                    .size()));
                + "numConnections: %d, poolSize: %d, "
                + "pendingFutures: %d", numConnections, pool.size(),
            pendingFutures.size()));
      }
      if (StaticUtils.DEBUG_LOG.isLoggable(Level.WARNING))
      {
        StaticUtils.DEBUG_LOG
            .warning(String
                .format(
        StaticUtils.DEBUG_LOG.warning(String.format(
                "Reconnect attempt starting. "
                    + "numConnections: %d, poolSize: %d, " +
                    "pendingFutures: %d",
                numConnections, pool.size(), pendingFutures
                    .size()));
                + "numConnections: %d, poolSize: %d, "
                + "pendingFutures: %d", numConnections, pool.size(),
            pendingFutures.size()));
      }
      connectionFactory.getAsynchronousConnection(new ReconnectHandler());
      connectionFactory
          .getAsynchronousConnection(new ReconnectHandler());
    }
    public void close(UnbindRequest request, String reason)
        throws NullPointerException
    {
@@ -380,11 +374,15 @@
      return isClosed;
    }
    public boolean isValid()
    {
      return !isClosed && connection.isValid();
    }
    public void connectionReceivedUnsolicitedNotification(
        GenericExtendedResult notification)
    {
@@ -396,8 +394,10 @@
    public void connectionErrorOccurred(
        boolean isDisconnectNotification, ErrorResultException error)
    {
      // Remove this connection from the pool if its in there. If not, just
      // ignore and wait for the user to close and we can deal with it there.
      // Remove this connection from the pool if its in there. If not,
      // just
      // ignore and wait for the user to close and we can deal with it
      // there.
      if(pool.remove(this))
      {
        numConnections--;
@@ -422,13 +422,17 @@
    }
  }
  private class ReconnectHandler
      implements ResultHandler<AsynchronousConnection>
  private class ReconnectHandler implements
      ResultHandler<AsynchronousConnection>
  {
    public void handleErrorResult(ErrorResultException error) {
    public void handleErrorResult(ErrorResultException error)
    {
      // The reconnect failed. Fail the connect attempt.
      numConnections --;
      // The reconnect failed. The underlying connection factory probably went
      // The reconnect failed. The underlying connection factory
      // probably went
      // down. Just fail all pending futures
      synchronized (pool)
      {
@@ -445,13 +449,15 @@
                "Reconnect failed. Failed all pending futures: "
                    + error.getMessage()
                    + " numConnections: %d, poolSize: %d, pendingFutures: %d",
                numConnections, pool.size(), pendingFutures
                    .size()));
                    numConnections, pool.size(), pendingFutures.size()));
      }
    }
    public void handleResult(AsynchronousConnection connection) {
    public void handleResult(AsynchronousConnection connection)
    {
      if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINE))
      {
        StaticUtils.DEBUG_LOG
@@ -459,8 +465,7 @@
                .format(
                "Reconnect succeded. "
                    + " numConnections: %d, poolSize: %d, pendingFutures: %d",
                numConnections, pool.size(), pendingFutures
                    .size()));
                    numConnections, pool.size(), pendingFutures.size()));
      }
      synchronized (pool)
      {
@@ -469,6 +474,8 @@
    }
  }
  // Future used for waiting for pooled connections to become available.
  private static final class FuturePooledConnection extends
      AbstractFutureResult<AsynchronousConnection>
@@ -491,6 +498,8 @@
  }
  private void releaseConnection(AsynchronousConnection connection)
  {
    // See if there waiters pending.
@@ -519,8 +528,8 @@
                  .format(
                  "Connection released and directly "
                      + "given to waiter. numConnections: %d, poolSize: %d, "
                      + "pendingFutures: %d", numConnections,
                  pool.size(), pendingFutures.size()));
                          + "pendingFutures: %d", numConnections, pool
                          .size(), pendingFutures.size()));
        }
        return;
      }
@@ -530,11 +539,9 @@
    pool.offer(connection);
    if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINE))
    {
      StaticUtils.DEBUG_LOG
          .finest(String
              .format(
              "Connection released to pool. numConnections: %d, " +
                  "poolSize: %d, pendingFutures: %d", numConnections,
      StaticUtils.DEBUG_LOG.finest(String.format(
          "Connection released to pool. numConnections: %d, "
              + "poolSize: %d, pendingFutures: %d", numConnections,
              pool.size(), pendingFutures.size()));
    }
  }
@@ -551,7 +558,7 @@
   * @param poolSize
   *          The maximum size of the connection pool.
   */
  ConnectionPool(ConnectionFactory<?> connectionFactory, int poolSize)
  ConnectionPool(ConnectionFactory connectionFactory, int poolSize)
  {
    this.connectionFactory = connectionFactory;
    this.poolSize = poolSize;
@@ -561,10 +568,11 @@
  public synchronized FutureResult<AsynchronousConnection>
  getAsynchronousConnection(ResultHandler<? super AsynchronousConnection> handler)
  public synchronized FutureResult<AsynchronousConnection> getAsynchronousConnection(
      ResultHandler<AsynchronousConnection> handler)
  {
    // This entire method is synchronized to ensure new connects are done
    // This entire method is synchronized to ensure new connects are
    // done
    // synchronously to avoid the "pending connect" case.
    AsynchronousConnection conn;
    synchronized(pool)
@@ -577,7 +585,8 @@
        // reached
        if (numConnections >= poolSize)
        {
          // We reached max # of conns so wait for a connection to become available.
          // We reached max # of conns so wait for a connection to
          // become available.
          FuturePooledConnection future = new FuturePooledConnection(
              handler);
          pendingFutures.add(future);
@@ -626,9 +635,8 @@
      }
      catch (InterruptedException e)
      {
        ErrorResultException error =
            new ErrorResultException(Responses.newResult(
                ResultCode.CLIENT_SIDE_LOCAL_ERROR).setCause(e));
        ErrorResultException error = new ErrorResultException(Responses
            .newResult(ResultCode.CLIENT_SIDE_LOCAL_ERROR).setCause(e));
        if (handler != null)
        {
          handler.handleErrorResult(error);
@@ -645,8 +653,7 @@
                .format(
                "Connection aquired from pool. "
                + "numConnections: %d, poolSize: %d, pendingFutures: %d",
                numConnections, pool.size(), pendingFutures
                    .size()));
                    numConnections, pool.size(), pendingFutures.size()));
      }
    }
opendj-sdk/sdk/src/org/opends/sdk/Connections.java
@@ -75,8 +75,8 @@
   * @throws NullPointerException
   *           If {@code factory} or {@code request} was {@code null}.
   */
  public static ConnectionFactory<AsynchronousConnection> newAuthenticatedConnectionFactory(
      ConnectionFactory<?> factory, BindRequest request)
  public static ConnectionFactory newAuthenticatedConnectionFactory(
      ConnectionFactory factory, BindRequest request)
      throws NullPointerException
  {
    Validator.ensureNotNull(factory, request);
@@ -101,8 +101,8 @@
   * @throws NullPointerException
   *           If {@code factory} was {@code null}.
   */
  public static ConnectionFactory<AsynchronousConnection> newConnectionPool(
      ConnectionFactory<?> factory, int poolSize)
  public static ConnectionFactory newConnectionPool(
      ConnectionFactory factory, int poolSize)
      throws IllegalArgumentException, NullPointerException
  {
    Validator.ensureNotNull(factory);
@@ -130,8 +130,8 @@
   * @throws NullPointerException
   *           If {@code factory} or {@code unit} was {@code null}.
   */
  public static ConnectionFactory<AsynchronousConnection> newHeartBeatConnectionFactory(
      ConnectionFactory<?> factory, long timeout, TimeUnit unit)
  public static ConnectionFactory newHeartBeatConnectionFactory(
      ConnectionFactory factory, long timeout, TimeUnit unit)
      throws IllegalArgumentException, NullPointerException
  {
    Validator.ensureNotNull(factory, unit);
@@ -163,8 +163,8 @@
   *           If {@code factory}, {@code unit}, or {@code heartBeat}
   *           was {@code null}.
   */
  public static ConnectionFactory<AsynchronousConnection> newHeartBeatConnectionFactory(
      ConnectionFactory<?> factory, long timeout, TimeUnit unit,
  public static ConnectionFactory newHeartBeatConnectionFactory(
      ConnectionFactory factory, long timeout, TimeUnit unit,
      SearchRequest heartBeat) throws IllegalArgumentException,
      NullPointerException
  {
opendj-sdk/sdk/src/org/opends/sdk/FailoverLoadBalancingAlgorithm.java
@@ -1,18 +1,21 @@
package org.opends.sdk;
/**
 * Created by IntelliJ IDEA. User: digitalperk Date: Dec 15, 2009 Time: 5:42:01
 * PM To change this template use File | Settings | File Templates.
 * Created by IntelliJ IDEA. User: digitalperk Date: Dec 15, 2009 Time:
 * 5:42:01 PM To change this template use File | Settings | File
 * Templates.
 */
public class FailoverLoadBalancingAlgorithm
    extends AbstractLoadBalancingAlgorithm
public class FailoverLoadBalancingAlgorithm extends
    AbstractLoadBalancingAlgorithm
{
  public FailoverLoadBalancingAlgorithm(ConnectionFactory<?>... factories)
  public FailoverLoadBalancingAlgorithm(ConnectionFactory... factories)
  {
    super(factories);
  }
  public ConnectionFactory<?> getNextConnectionFactory()
  public ConnectionFactory getNextConnectionFactory()
  {
    for(MonitoredConnectionFactory f : factoryList)
    {
opendj-sdk/sdk/src/org/opends/sdk/HeartBeatConnectionFactory.java
@@ -33,7 +33,6 @@
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.opends.sdk.requests.*;
import org.opends.sdk.responses.*;
@@ -48,7 +47,7 @@
 * that sends a periodic search request to a Directory Server.
 */
final class HeartBeatConnectionFactory extends
    AbstractConnectionFactory<AsynchronousConnection>
    AbstractConnectionFactory
{
  private final SearchRequest heartBeat;
@@ -58,7 +57,7 @@
  private final List<AsynchronousConnectionImpl> activeConnections;
  private final ConnectionFactory<?> parentFactory;
  private final ConnectionFactory parentFactory;
@@ -77,7 +76,7 @@
   * @param unit
   *          The time unit of the timeout argument.
   */
  HeartBeatConnectionFactory(ConnectionFactory<?> connectionFactory,
  HeartBeatConnectionFactory(ConnectionFactory connectionFactory,
      long timeout, TimeUnit unit)
  {
    this(connectionFactory, timeout, unit, DEFAULT_SEARCH);
@@ -106,7 +105,7 @@
   * @param heartBeat
   *          The search request to use when pinging connections.
   */
  HeartBeatConnectionFactory(ConnectionFactory<?> connectionFactory,
  HeartBeatConnectionFactory(ConnectionFactory connectionFactory,
      long timeout, TimeUnit unit, SearchRequest heartBeat)
  {
    this.heartBeat = heartBeat;
@@ -125,13 +124,17 @@
   * operations.
   */
  private final class AsynchronousConnectionImpl implements
      AsynchronousConnection, ConnectionEventListener, ResultHandler<Result>
      AsynchronousConnection, ConnectionEventListener,
      ResultHandler<Result>
  {
    private final AsynchronousConnection connection;
    private long lastSuccessfulPing;
    private FutureResult<Result> lastPingFuture;
    private AsynchronousConnectionImpl(AsynchronousConnection connection)
    {
      this.connection = connection;
@@ -345,16 +348,20 @@
      return connection.isClosed();
    }
    /**
     * {@inheritDoc}
     */
    public boolean isValid()
    {
      return connection.isValid() && (lastSuccessfulPing <= 0 ||
          System.currentTimeMillis() - lastSuccessfulPing <
              unit.toMillis(timeout) * 2);
      return connection.isValid()
          && (lastSuccessfulPing <= 0 || System.currentTimeMillis()
              - lastSuccessfulPing < unit.toMillis(timeout) * 2);
    }
    public void connectionReceivedUnsolicitedNotification(
        GenericExtendedResult notification)
    {
@@ -373,12 +380,18 @@
      }
    }
    public void handleErrorResult(ErrorResultException error) {
    public void handleErrorResult(ErrorResultException error)
    {
      connection.close(Requests.newUnbindRequest(),
          "Heartbeat retured error: " + error);
    }
    public void handleResult(Result result) {
    public void handleResult(Result result)
    {
        lastSuccessfulPing = System.currentTimeMillis();
    }
  }
@@ -405,18 +418,18 @@
        {
          for (AsynchronousConnectionImpl connection : activeConnections)
          {
            if(connection.lastPingFuture == null ||
                connection.lastPingFuture.isDone())
            if (connection.lastPingFuture == null
                || connection.lastPingFuture.isDone())
            {
              connection.lastPingFuture =
                  connection.search(heartBeat, connection, null);
              connection.lastPingFuture = connection.search(heartBeat,
                  connection, null);
            }
          }
        }
        try
        {
          sleep(unit.toMillis(timeout) -
              (System.currentTimeMillis() - startTime));
          sleep(unit.toMillis(timeout)
              - (System.currentTimeMillis() - startTime));
        }
        catch (InterruptedException e)
        {
@@ -464,7 +477,7 @@
  public FutureResult<AsynchronousConnection> getAsynchronousConnection(
      ResultHandler<? super AsynchronousConnection> handler)
      ResultHandler<AsynchronousConnection> handler)
  {
    FutureResultImpl future = new FutureResultImpl(handler);
    future.setFutureResult(parentFactory
opendj-sdk/sdk/src/org/opends/sdk/LoadBalancingAlgorithm.java
@@ -1,10 +1,11 @@
package org.opends.sdk;
/**
 * Created by IntelliJ IDEA. User: digitalperk Date: Dec 15, 2009 Time: 3:37:03
 * PM To change this template use File | Settings | File Templates.
 * Created by IntelliJ IDEA. User: digitalperk Date: Dec 15, 2009 Time:
 * 3:37:03 PM To change this template use File | Settings | File
 * Templates.
 */
public interface LoadBalancingAlgorithm
{
  public ConnectionFactory<?> getNextConnectionFactory();
  public ConnectionFactory getNextConnectionFactory();
}
opendj-sdk/sdk/src/org/opends/sdk/LoadBalancingConnectionFactory.java
@@ -1,43 +1,51 @@
package org.opends.sdk;
import com.sun.opends.sdk.util.Validator;
import com.sun.opends.sdk.util.AbstractFutureResult;
import org.opends.sdk.responses.Responses;
/**
 * Created by IntelliJ IDEA. User: digitalperk Date: Dec 15, 2009 Time: 3:23:52
 * PM To change this template use File | Settings | File Templates.
 * Created by IntelliJ IDEA. User: digitalperk Date: Dec 15, 2009 Time:
 * 3:23:52 PM To change this template use File | Settings | File
 * Templates.
 */
public class LoadBalancingConnectionFactory
    extends AbstractConnectionFactory<AsynchronousConnection>
public class LoadBalancingConnectionFactory extends
    AbstractConnectionFactory
{
  private final LoadBalancingAlgorithm algorithm;
  public LoadBalancingConnectionFactory(LoadBalancingAlgorithm algorithm)
  {
    Validator.ensureNotNull(algorithm);
    this.algorithm = algorithm;
  }
  public FutureResult<? extends AsynchronousConnection>
  getAsynchronousConnection(
      ResultHandler<? super AsynchronousConnection> resultHandler)
  public FutureResult<AsynchronousConnection> getAsynchronousConnection(
      ResultHandler<AsynchronousConnection> resultHandler)
  {
    ConnectionFactory<?> factory = algorithm.getNextConnectionFactory();
    ConnectionFactory factory = algorithm.getNextConnectionFactory();
    if(factory == null)
    {
      AbstractFutureResult<AsynchronousConnection> future =
          new AbstractFutureResult<AsynchronousConnection>(resultHandler)
      AbstractFutureResult<AsynchronousConnection> future = new AbstractFutureResult<AsynchronousConnection>(
          resultHandler)
      {
        public int getRequestID()
        {
          return -1;
        }
      };
      future.handleErrorResult(new ErrorResultException(
          Responses.newResult(ResultCode.CLIENT_SIDE_CONNECT_ERROR).
              setDiagnosticMessage("No connection factories available")));
      future.handleErrorResult(new ErrorResultException(Responses
          .newResult(ResultCode.CLIENT_SIDE_CONNECT_ERROR)
          .setDiagnosticMessage("No connection factories available")));
      return future;
    }
opendj-sdk/sdk/src/org/opends/sdk/ldap/LDAPConnectionFactory.java
@@ -37,8 +37,7 @@
/**
 * LDAP connection factory implementation.
 */
public final class LDAPConnectionFactory implements
    ConnectionFactory<AsynchronousConnection>
public final class LDAPConnectionFactory implements ConnectionFactory
{
  // We implement the factory using the pimpl idiom in order have
  // cleaner Javadoc which does not expose implementation methods from
@@ -115,7 +114,7 @@
  public FutureResult<AsynchronousConnection> getAsynchronousConnection(
      ResultHandler<? super AsynchronousConnection> handler)
      ResultHandler<AsynchronousConnection> handler)
  {
    return impl.getAsynchronousConnection(handler);
  }