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

matthew_swift
11.23.2010 4ea2bc73aa3a298a61532530eb177704fa4a569f
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,13 +380,19 @@
      }
    }
    public void handleErrorResult(ErrorResultException error) {
    public void handleErrorResult(ErrorResultException error)
    {
      connection.close(Requests.newUnbindRequest(),
          "Heartbeat retured error: " + error);
    }
    public void handleResult(Result result) {
        lastSuccessfulPing = System.currentTimeMillis();
    public void handleResult(Result result)
    {
      lastSuccessfulPing = System.currentTimeMillis();
    }
  }
@@ -398,25 +411,25 @@
    public void run()
    {
      long startTime;
      while(true)
      while (true)
      {
        startTime = System.currentTimeMillis();
        synchronized (activeConnections)
        {
          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