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-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Context.java | 117 ++++++++++++++++++++++------------------------------------
1 files changed, 45 insertions(+), 72 deletions(-)
diff --git a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Context.java b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Context.java
index 498e84a..94a42e4 100644
--- a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Context.java
+++ b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Context.java
@@ -11,14 +11,10 @@
* Header, with the fields enclosed by brackets [] replaced by your own identifying
* information: "Portions Copyright [year] [name of copyright owner]".
*
- * Copyright 2013 ForgeRock AS.
+ * Copyright 2013-2014 ForgeRock AS.
*/
package org.forgerock.opendj.rest2ldap;
-import static org.forgerock.opendj.ldap.ErrorResultException.newErrorResult;
-import static org.forgerock.opendj.rest2ldap.Rest2LDAP.asResourceException;
-import static org.forgerock.opendj.rest2ldap.Utils.i18n;
-
import java.io.Closeable;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -58,6 +54,11 @@
import org.forgerock.opendj.ldap.responses.Result;
import org.forgerock.opendj.ldap.responses.SearchResultEntry;
import org.forgerock.opendj.ldap.responses.SearchResultReference;
+import org.forgerock.util.promise.FailureHandler;
+import org.forgerock.util.promise.SuccessHandler;
+
+import static org.forgerock.opendj.rest2ldap.Rest2LDAP.*;
+import static org.forgerock.opendj.rest2ldap.Utils.*;
/**
* Common context information passed to containers and mappers. A new context is
@@ -68,7 +69,7 @@
/*
* A cached read request - see cachedReads for more information.
*/
- private static final class CachedRead implements SearchResultHandler {
+ private static final class CachedRead implements SearchResultHandler, ResultHandler<Result> {
private SearchResultEntry cachedEntry;
private final String cachedFilterString;
private FutureResult<Result> cachedFuture; // Guarded by latch.
@@ -91,7 +92,7 @@
}
@Override
- public void handleErrorResult(final ErrorResultException error) {
+ public void handleError(final ErrorResultException error) {
handleResult(error.getResult());
}
@@ -171,14 +172,9 @@
}
}
- private void invokeResultHandler(final SearchResultHandler resultHandler) {
+ private void invokeResultHandler(final SearchResultHandler searchResultHandler) {
if (cachedEntry != null) {
- resultHandler.handleEntry(cachedEntry);
- }
- if (cachedResult.isSuccess()) {
- resultHandler.handleResult(cachedResult);
- } else {
- resultHandler.handleErrorResult(newErrorResult(cachedResult));
+ searchResultHandler.handleEntry(cachedEntry);
}
}
@@ -214,9 +210,7 @@
*/
if (config.getAuthorizationPolicy() != AuthorizationPolicy.NONE
&& context.containsContext(AuthenticatedConnectionContext.class)) {
- final Connection connection =
- context.asContext(AuthenticatedConnectionContext.class).getConnection();
- this.connection = wrap(connection);
+ this.connection = wrap(context.asContext(AuthenticatedConnectionContext.class).getConnection());
} else {
this.connection = null; // We'll allocate the connection.
}
@@ -268,11 +262,9 @@
if (connection == null && config.getAuthorizationPolicy() == AuthorizationPolicy.PROXY) {
if (context.containsContext(SecurityContext.class)) {
try {
- final SecurityContext securityContext =
- context.asContext(SecurityContext.class);
- final String authzId =
- config.getProxiedAuthorizationTemplate().formatAsAuthzId(
- securityContext.getAuthorizationId(), config.schema());
+ final SecurityContext securityContext = context.asContext(SecurityContext.class);
+ final String authzId = config.getProxiedAuthorizationTemplate().formatAsAuthzId(
+ securityContext.getAuthorizationId(), config.schema());
proxiedAuthzControl = ProxiedAuthV2RequestControl.newControl(authzId);
} catch (final ResourceException e) {
handler.handleError(e);
@@ -280,8 +272,7 @@
}
} else {
handler.handleError(new InternalServerErrorException(
- i18n("The request could not be authorized because it did "
- + "not contain a security context")));
+ i18n("The request could not be authorized because it did not contain a security context")));
return;
}
}
@@ -295,22 +286,21 @@
// Invoke the handler immediately since a connection is available.
runnable.run();
} else if (config.connectionFactory() != null) {
- config.connectionFactory().getConnectionAsync(new ResultHandler<Connection>() {
- @Override
- public final void handleErrorResult(final ErrorResultException error) {
- handler.handleError(asResourceException(error));
- }
-
+ config.connectionFactory().getConnectionAsync().onSuccess(new SuccessHandler<Connection>() {
@Override
public final void handleResult(final Connection result) {
connection = wrap(result);
runnable.run();
}
+ }).onFailure(new FailureHandler<ErrorResultException>() {
+ @Override
+ public final void handleError(final ErrorResultException error) {
+ handler.handleError(asResourceException(error));
+ }
});
} else {
handler.handleError(new InternalServerErrorException(
- i18n("The request could not be processed because there was no LDAP "
- + "connection available for use")));
+ i18n("The request could not be processed because there was no LDAP connection available for use")));
}
}
@@ -331,10 +321,8 @@
@Override
public FutureResult<Result> addAsync(final AddRequest request,
- final IntermediateResponseHandler intermediateResponseHandler,
- final ResultHandler<? super Result> resultHandler) {
- return connection.addAsync(withControls(request), intermediateResponseHandler,
- resultHandler);
+ final IntermediateResponseHandler intermediateResponseHandler) {
+ return connection.addAsync(withControls(request), intermediateResponseHandler);
}
@Override
@@ -344,14 +332,13 @@
@Override
public FutureResult<BindResult> bindAsync(final BindRequest request,
- final IntermediateResponseHandler intermediateResponseHandler,
- final ResultHandler<? super BindResult> resultHandler) {
+ final IntermediateResponseHandler intermediateResponseHandler) {
/*
* Simple brute force implementation in case the bind operation
* modifies an entry: clear the cachedReads.
*/
evictAll();
- return connection.bindAsync(request, intermediateResponseHandler, resultHandler);
+ return connection.bindAsync(request, intermediateResponseHandler);
}
@Override
@@ -366,33 +353,26 @@
@Override
public FutureResult<CompareResult> compareAsync(final CompareRequest request,
- final IntermediateResponseHandler intermediateResponseHandler,
- final ResultHandler<? super CompareResult> resultHandler) {
- return connection.compareAsync(withControls(request), intermediateResponseHandler,
- resultHandler);
+ final IntermediateResponseHandler intermediateResponseHandler) {
+ return connection.compareAsync(withControls(request), intermediateResponseHandler);
}
@Override
public FutureResult<Result> deleteAsync(final DeleteRequest request,
- final IntermediateResponseHandler intermediateResponseHandler,
- final ResultHandler<? super Result> resultHandler) {
+ final IntermediateResponseHandler intermediateResponseHandler) {
evict(request.getName());
- return connection.deleteAsync(withControls(request), intermediateResponseHandler,
- resultHandler);
+ return connection.deleteAsync(withControls(request), intermediateResponseHandler);
}
@Override
- public <R extends ExtendedResult> FutureResult<R> extendedRequestAsync(
- final ExtendedRequest<R> request,
- final IntermediateResponseHandler intermediateResponseHandler,
- final ResultHandler<? super R> resultHandler) {
+ public <R extends ExtendedResult> FutureResult<R> extendedRequestAsync(final ExtendedRequest<R> request,
+ final IntermediateResponseHandler intermediateResponseHandler) {
/*
* Simple brute force implementation in case the extended
* operation modifies an entry: clear the cachedReads.
*/
evictAll();
- return connection.extendedRequestAsync(withControls(request),
- intermediateResponseHandler, resultHandler);
+ return connection.extendedRequestAsync(withControls(request), intermediateResponseHandler);
}
@Override
@@ -407,21 +387,17 @@
@Override
public FutureResult<Result> modifyAsync(final ModifyRequest request,
- final IntermediateResponseHandler intermediateResponseHandler,
- final ResultHandler<? super Result> resultHandler) {
+ final IntermediateResponseHandler intermediateResponseHandler) {
evict(request.getName());
- return connection.modifyAsync(withControls(request), intermediateResponseHandler,
- resultHandler);
+ return connection.modifyAsync(withControls(request), intermediateResponseHandler);
}
@Override
public FutureResult<Result> modifyDNAsync(final ModifyDNRequest request,
- final IntermediateResponseHandler intermediateResponseHandler,
- final ResultHandler<? super Result> resultHandler) {
+ final IntermediateResponseHandler intermediateResponseHandler) {
// Simple brute force implementation: clear the cachedReads.
evictAll();
- return connection.modifyDNAsync(withControls(request), intermediateResponseHandler,
- resultHandler);
+ return connection.modifyDNAsync(withControls(request), intermediateResponseHandler);
}
@Override
@@ -434,17 +410,14 @@
*/
@Override
public FutureResult<Result> searchAsync(final SearchRequest request,
- final IntermediateResponseHandler intermediateResponseHandler,
- final SearchResultHandler resultHandler) {
+ final IntermediateResponseHandler intermediateResponseHandler, final SearchResultHandler entryHandler) {
/*
* Don't attempt caching if this search is not a read (base
* object), or if the search request passed in an intermediate
* response handler.
*/
- if (!request.getScope().equals(SearchScope.BASE_OBJECT)
- || intermediateResponseHandler != null) {
- return connection.searchAsync(withControls(request),
- intermediateResponseHandler, resultHandler);
+ if (!request.getScope().equals(SearchScope.BASE_OBJECT) || intermediateResponseHandler != null) {
+ return connection.searchAsync(withControls(request), intermediateResponseHandler, entryHandler);
}
// This is a read request and a candidate for caching.
@@ -454,17 +427,17 @@
}
if (cachedRead != null && cachedRead.isMatchingRead(request)) {
// The cached read matches this read request.
- cachedRead.addResultHandler(resultHandler);
+ cachedRead.addResultHandler(entryHandler);
return cachedRead.getFutureResult();
} else {
// Cache the read, possibly evicting a non-matching cached read.
- final CachedRead pendingCachedRead = new CachedRead(request, resultHandler);
+ final CachedRead pendingCachedRead = new CachedRead(request, entryHandler);
synchronized (cachedReads) {
cachedReads.put(request.getName(), pendingCachedRead);
}
- final FutureResult<Result> future =
- connection.searchAsync(withControls(request),
- intermediateResponseHandler, pendingCachedRead);
+ final FutureResult<Result> future = (FutureResult<Result>) connection
+ .searchAsync(withControls(request), intermediateResponseHandler, pendingCachedRead)
+ .onSuccess(pendingCachedRead).onFailure(pendingCachedRead);
pendingCachedRead.setFuture(future);
return future;
}
--
Gitblit v1.10.0