From 45141fb11ef698b11c6fb3becca82ca10e11505a Mon Sep 17 00:00:00 2001
From: Gaetan Boismal <gaetan.boismal@forgerock.com>
Date: Mon, 15 Sep 2014 12:50:50 +0000
Subject: [PATCH] OPENDJ-1285 CR-4409 Migrate SDK from Futures to Promises

---
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java |   78 ++++++++++++++++++--------------------
 1 files changed, 37 insertions(+), 41 deletions(-)

diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
index 130e453..762f679 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
@@ -26,11 +26,6 @@
  */
 package com.forgerock.opendj.ldap.tools;
 
-import static com.forgerock.opendj.cli.ArgumentConstants.*;
-import static com.forgerock.opendj.ldap.tools.ToolsMessages.*;
-import static com.forgerock.opendj.ldap.tools.Utils.setDefaultPerfToolProperties;
-import static com.forgerock.opendj.cli.Utils.filterExitCode;
-
 import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.LinkedList;
@@ -40,24 +35,11 @@
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.forgerock.i18n.LocalizableMessage;
-
-import com.forgerock.opendj.cli.BooleanArgument;
-import com.forgerock.opendj.cli.CommonArguments;
-import com.forgerock.opendj.cli.ConnectionFactoryProvider;
-import com.forgerock.opendj.cli.ConsoleApplication;
-import com.forgerock.opendj.cli.ArgumentParser;
-import com.forgerock.opendj.cli.ArgumentException;
-import com.forgerock.opendj.cli.IntegerArgument;
-import com.forgerock.opendj.cli.MultiChoiceArgument;
-import com.forgerock.opendj.cli.StringArgument;
-
 import org.forgerock.opendj.ldap.Connection;
 import org.forgerock.opendj.ldap.ConnectionFactory;
 import org.forgerock.opendj.ldap.DereferenceAliasesPolicy;
 import org.forgerock.opendj.ldap.ErrorResultException;
-import org.forgerock.opendj.ldap.FutureResult;
 import org.forgerock.opendj.ldap.ResultCode;
-import org.forgerock.opendj.ldap.ResultHandler;
 import org.forgerock.opendj.ldap.SearchScope;
 import org.forgerock.opendj.ldap.requests.BindRequest;
 import org.forgerock.opendj.ldap.requests.CRAMMD5SASLBindRequest;
@@ -70,8 +52,23 @@
 import org.forgerock.opendj.ldap.requests.SimpleBindRequest;
 import org.forgerock.opendj.ldap.responses.BindResult;
 import org.forgerock.opendj.ldap.responses.SearchResultEntry;
+import org.forgerock.util.promise.AsyncFunction;
+import org.forgerock.util.promise.Promise;
 
-import com.forgerock.opendj.util.RecursiveFutureResult;
+import com.forgerock.opendj.cli.ArgumentException;
+import com.forgerock.opendj.cli.ArgumentParser;
+import com.forgerock.opendj.cli.BooleanArgument;
+import com.forgerock.opendj.cli.CommonArguments;
+import com.forgerock.opendj.cli.ConnectionFactoryProvider;
+import com.forgerock.opendj.cli.ConsoleApplication;
+import com.forgerock.opendj.cli.IntegerArgument;
+import com.forgerock.opendj.cli.MultiChoiceArgument;
+import com.forgerock.opendj.cli.StringArgument;
+
+import static com.forgerock.opendj.cli.ArgumentConstants.*;
+import static com.forgerock.opendj.cli.Utils.*;
+import static com.forgerock.opendj.ldap.tools.ToolsMessages.*;
+import static com.forgerock.opendj.ldap.tools.Utils.*;
 
 /**
  * A load generation tool that can be used to load a Directory Server with Bind
@@ -107,8 +104,8 @@
             }
 
             @Override
-            public void handleErrorResult(final ErrorResultException error) {
-                super.handleErrorResult(error);
+            public void handleError(final ErrorResultException error) {
+                super.handleError(error);
 
                 if (error.getResult().getResultCode() == ResultCode.INVALID_CREDENTIALS) {
                     invalidCredRecentCount.getAndIncrement();
@@ -137,7 +134,7 @@
             }
 
             @Override
-            public FutureResult<?> performOperation(final Connection connection,
+            public Promise<?, ErrorResultException> performOperation(final Connection connection,
                     final DataSource[] dataSources, final long startTime) {
                 if (dataSources != null) {
                     data = DataSource.generateData(dataSources, data);
@@ -147,14 +144,15 @@
                         data = newData;
                     }
                 }
+
+                Promise<BindResult, ErrorResultException> returnedPromise;
                 if (filter != null && baseDN != null) {
                     if (sr == null) {
                         if (dataSources == null) {
                             sr = Requests.newSearchRequest(baseDN, scope, filter, attributes);
                         } else {
-                            sr =
-                                    Requests.newSearchRequest(String.format(baseDN, data), scope,
-                                            String.format(filter, data), attributes);
+                            sr = Requests.newSearchRequest(String.format(baseDN, data), scope,
+                                    String.format(filter, data), attributes);
                         }
                         sr.setDereferenceAliasesPolicy(dereferencesAliasesPolicy);
                     } else if (dataSources != null) {
@@ -162,32 +160,30 @@
                         sr.setName(String.format(baseDN, data));
                     }
 
-                    final RecursiveFutureResult<SearchResultEntry, BindResult> future =
-                            new RecursiveFutureResult<SearchResultEntry, BindResult>(
-                                    new BindUpdateStatsResultHandler(startTime)) {
+                    returnedPromise = connection.searchSingleEntryAsync(sr).thenAsync(
+                            new AsyncFunction<SearchResultEntry, BindResult, ErrorResultException>() {
                                 @Override
-                                protected FutureResult<? extends BindResult> chainResult(
-                                        final SearchResultEntry innerResult,
-                                        final ResultHandler<? super BindResult> resultHandler)
+                                public Promise<BindResult, ErrorResultException> apply(SearchResultEntry result)
                                         throws ErrorResultException {
                                     searchWaitRecentTime.getAndAdd(System.nanoTime() - startTime);
                                     if (data == null) {
                                         data = new Object[1];
                                     }
-                                    data[data.length - 1] = innerResult.getName().toString();
-                                    return performBind(connection, data, resultHandler);
+                                    data[data.length - 1] = result.getName().toString();
+
+                                    return performBind(connection, data);
                                 }
-                            };
-                    connection.searchSingleEntryAsync(sr, future);
-                    return future;
+                            });
                 } else {
-                    return performBind(connection, data,
-                            new BindUpdateStatsResultHandler(startTime));
+                    returnedPromise = performBind(connection, data);
                 }
+
+                return returnedPromise.onSuccess(new UpdateStatsResultHandler<BindResult>(startTime)).onFailure(
+                        new BindUpdateStatsResultHandler(startTime));
             }
 
-            private FutureResult<BindResult> performBind(final Connection connection,
-                    final Object[] data, final ResultHandler<? super BindResult> handler) {
+            private Promise<BindResult, ErrorResultException> performBind(final Connection connection,
+                final Object[] data) {
                 final boolean useInvalidPassword;
 
                 // Avoid rng if possible.
@@ -307,7 +303,7 @@
                     }
                 }
 
-                return connection.bindAsync(br, null, handler);
+                return connection.bindAsync(br);
             }
         }
 

--
Gitblit v1.10.0