From eec7ba4411d0535c8229d08f0cdad60d04da7ca6 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Thu, 25 Aug 2016 14:28:39 +0000
Subject: [PATCH] OPENDJ-3160 Pass Context through to PropertyMapper methods
---
opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResourceImpl.java | 70 ++++++++++++++++------------------
1 files changed, 33 insertions(+), 37 deletions(-)
diff --git a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResourceImpl.java b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResourceImpl.java
index e48282d..5e6f81c 100644
--- a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResourceImpl.java
+++ b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SubResourceImpl.java
@@ -34,6 +34,7 @@
import static org.forgerock.opendj.ldap.SearchScope.SINGLE_LEVEL;
import static org.forgerock.opendj.ldap.requests.Requests.*;
import static org.forgerock.opendj.rest2ldap.ReadOnUpdatePolicy.CONTROLS;
+import static org.forgerock.opendj.rest2ldap.Utils.connectionFrom;
import static org.forgerock.opendj.rest2ldap.Utils.newBadRequestException;
import static org.forgerock.opendj.rest2ldap.Utils.newNotSupportedException;
import static org.forgerock.opendj.rest2ldap.Utils.toFilter;
@@ -262,7 +263,7 @@
// Now build the LDAP representation and add it.
final Connection connection = connectionFrom(context);
return subType.getPropertyMapper()
- .create(connection, subType, ROOT, request.getContent())
+ .create(context, subType, ROOT, request.getContent())
.thenAsync(new AsyncFunction<List<Attribute>, ResourceResponse, ResourceException>() {
@Override
public Promise<ResourceResponse, ResourceException> apply(final List<Attribute> attributes) {
@@ -285,7 +286,7 @@
}
return connection.addAsync(addRequest)
.thenCatchAsync(lazilyAddGlueEntry(connection, addRequest))
- .thenAsync(encodeUpdateResourceResponse(connection, subType),
+ .thenAsync(encodeUpdateResourceResponse(context, subType),
adaptLdapException(ResourceResponse.class));
}
});
@@ -322,10 +323,6 @@
};
}
- private Connection connectionFrom(final Context context) {
- return context.asContext(AuthenticatedConnectionContext.class).getConnection();
- }
-
Promise<ResourceResponse, ResourceException> delete(
final Context context, final String resourceId, final DeleteRequest request) {
final Connection connection = connectionFrom(context);
@@ -349,7 +346,7 @@
return connection.applyChangeAsync(deleteRequest)
.thenCatchAsync(deleteSubtreeWithoutUsingSubtreeDeleteControl(connection,
deleteRequest))
- .thenAsync(encodeUpdateResourceResponse(connection, dnAndType.getType()),
+ .thenAsync(encodeUpdateResourceResponse(context, dnAndType.getType()),
adaptLdapException(ResourceResponse.class));
}
});
@@ -436,7 +433,7 @@
final Resource subType = dnAndType.getType();
final PropertyMapper propertyMapper = subType.getPropertyMapper();
for (final PatchOperation operation : request.getPatchOperations()) {
- promises.add(propertyMapper.patch(connection, subType, ROOT, operation));
+ promises.add(propertyMapper.patch(context, subType, ROOT, operation));
}
return when(promises);
}
@@ -460,7 +457,7 @@
if (modifyRequest.getModifications().isEmpty()) {
// This patch is a no-op so just read the entry and check its version.
return connection.readEntryAsync(dnAndType.getDn(), attributes)
- .thenAsync(encodeEmptyPatchResourceResponse(connection, subType, request),
+ .thenAsync(encodeEmptyPatchResourceResponse(context, subType, request),
adaptLdapException(ResourceResponse.class));
} else {
// Add controls and perform the modify request.
@@ -472,7 +469,7 @@
}
addAssertionControl(modifyRequest, request.getRevision());
return connection.applyChangeAsync(modifyRequest)
- .thenAsync(encodeUpdateResourceResponse(connection, subType),
+ .thenAsync(encodeUpdateResourceResponse(context, subType),
adaptLdapException(ResourceResponse.class));
}
}
@@ -480,13 +477,13 @@
}
private AsyncFunction<Entry, ResourceResponse, ResourceException> encodeEmptyPatchResourceResponse(
- final Connection connection, final Resource resource, final PatchRequest request) {
+ final Context context, final Resource resource, final PatchRequest request) {
return new AsyncFunction<Entry, ResourceResponse, ResourceException>() {
@Override
public Promise<ResourceResponse, ResourceException> apply(Entry entry) throws ResourceException {
try {
ensureMvccVersionMatches(entry, request.getRevision());
- return encodeResourceResponse(connection, resource, entry);
+ return encodeResourceResponse(context, resource, entry);
} catch (final Exception e) {
return asResourceException(e).asPromise();
}
@@ -496,14 +493,13 @@
Promise<QueryResponse, ResourceException> query(
final Context context, final QueryRequest request, final QueryResourceHandler resourceHandler) {
- final Connection connection = connectionFrom(context);
- return getLdapFilter(connection, request.getQueryFilter())
- .thenAsync(runQuery(request, resourceHandler, connection));
+ return getLdapFilter(context, request.getQueryFilter())
+ .thenAsync(runQuery(context, request, resourceHandler));
}
// FIXME: supporting assertions against sub-type properties.
private Promise<Filter, ResourceException> getLdapFilter(
- final Connection connection, final QueryFilter<JsonPointer> queryFilter) {
+ final Context context, final QueryFilter<JsonPointer> queryFilter) {
if (queryFilter == null) {
return new BadRequestException(ERR_QUERY_BY_ID_OR_EXPRESSION_NOT_SUPPORTED.get().toString()).asPromise();
}
@@ -553,14 +549,14 @@
public Promise<Filter, ResourceException> visitContainsFilter(
final Void unused, final JsonPointer field, final Object valueAssertion) {
return propertyMapper.getLdapFilter(
- connection, resource, ROOT, field, CONTAINS, null, valueAssertion);
+ context, resource, ROOT, field, CONTAINS, null, valueAssertion);
}
@Override
public Promise<Filter, ResourceException> visitEqualsFilter(
final Void unused, final JsonPointer field, final Object valueAssertion) {
return propertyMapper.getLdapFilter(
- connection, resource, ROOT, field, EQUAL_TO, null, valueAssertion);
+ context, resource, ROOT, field, EQUAL_TO, null, valueAssertion);
}
@Override
@@ -569,35 +565,35 @@
final String operator,
final Object valueAssertion) {
return propertyMapper.getLdapFilter(
- connection, resource, ROOT, field, EXTENDED, operator, valueAssertion);
+ context, resource, ROOT, field, EXTENDED, operator, valueAssertion);
}
@Override
public Promise<Filter, ResourceException> visitGreaterThanFilter(
final Void unused, final JsonPointer field, final Object valueAssertion) {
return propertyMapper.getLdapFilter(
- connection, resource, ROOT, field, GREATER_THAN, null, valueAssertion);
+ context, resource, ROOT, field, GREATER_THAN, null, valueAssertion);
}
@Override
public Promise<Filter, ResourceException> visitGreaterThanOrEqualToFilter(
final Void unused, final JsonPointer field, final Object valueAssertion) {
return propertyMapper.getLdapFilter(
- connection, resource, ROOT, field, GREATER_THAN_OR_EQUAL_TO, null, valueAssertion);
+ context, resource, ROOT, field, GREATER_THAN_OR_EQUAL_TO, null, valueAssertion);
}
@Override
public Promise<Filter, ResourceException> visitLessThanFilter(
final Void unused, final JsonPointer field, final Object valueAssertion) {
return propertyMapper.getLdapFilter(
- connection, resource, ROOT, field, LESS_THAN, null, valueAssertion);
+ context, resource, ROOT, field, LESS_THAN, null, valueAssertion);
}
@Override
public Promise<Filter, ResourceException> visitLessThanOrEqualToFilter(
final Void unused, final JsonPointer field, final Object valueAssertion) {
return propertyMapper.getLdapFilter(
- connection, resource, ROOT, field, LESS_THAN_OR_EQUAL_TO, null, valueAssertion);
+ context, resource, ROOT, field, LESS_THAN_OR_EQUAL_TO, null, valueAssertion);
}
@Override
@@ -653,14 +649,14 @@
@Override
public Promise<Filter, ResourceException> visitPresentFilter(
final Void unused, final JsonPointer field) {
- return propertyMapper.getLdapFilter(connection, resource, ROOT, field, PRESENT, null, null);
+ return propertyMapper.getLdapFilter(context, resource, ROOT, field, PRESENT, null, null);
}
@Override
public Promise<Filter, ResourceException> visitStartsWithFilter(
final Void unused, final JsonPointer field, final Object valueAssertion) {
return propertyMapper.getLdapFilter(
- connection, resource, ROOT, field, STARTS_WITH, null, valueAssertion);
+ context, resource, ROOT, field, STARTS_WITH, null, valueAssertion);
}
};
// Note that the returned LDAP filter may be null if it could not be mapped by any property mappers.
@@ -668,7 +664,7 @@
}
private AsyncFunction<Filter, QueryResponse, ResourceException> runQuery(
- final QueryRequest request, final QueryResourceHandler resourceHandler, final Connection connection) {
+ final Context context, final QueryRequest request, final QueryResourceHandler resourceHandler) {
return new AsyncFunction<Filter, QueryResponse, ResourceException>() {
// The following fields are guarded by sequenceLock. In addition, the sequenceLock ensures that
// we send one JSON resource at a time back to the client.
@@ -714,7 +710,7 @@
pageResultStartIndex = 0;
}
- connection.searchAsync(searchRequest, new SearchResultHandler() {
+ connectionFrom(context).searchAsync(searchRequest, new SearchResultHandler() {
@Override
public boolean handleEntry(final SearchResultEntry entry) {
// Search result entries will be returned before the search result/error so the only reason
@@ -746,7 +742,7 @@
final String revision = getRevisionFromEntry(entry);
final Resource subType = resource.resolveSubTypeFromObjectClasses(entry);
final PropertyMapper propertyMapper = subType.getPropertyMapper();
- propertyMapper.read(connection, subType, ROOT, entry)
+ propertyMapper.read(context, subType, ROOT, entry)
.thenOnResult(new ResultHandler<JsonValue>() {
@Override
public void handleResult(final JsonValue result) {
@@ -849,7 +845,7 @@
@Override
public Promise<ResourceResponse, ResourceException> apply(SearchResultEntry entry) {
final Resource subType = resource.resolveSubTypeFromObjectClasses(entry);
- return encodeResourceResponse(connection, subType, entry);
+ return encodeResourceResponse(context, subType, entry);
}
});
}
@@ -875,7 +871,7 @@
final Resource subType = resource.resolveSubTypeFromObjectClasses(entry);
subTypeHolder.set(subType);
final PropertyMapper propertyMapper = subType.getPropertyMapper();
- return propertyMapper.update(connection, subType , ROOT, entry, request.getContent());
+ return propertyMapper.update(context, subType , ROOT, entry, request.getContent());
}
}).thenAsync(new AsyncFunction<List<Modification>, ResourceResponse, ResourceException>() {
@Override
@@ -884,7 +880,7 @@
final Resource subType = subTypeHolder.get();
if (modifications.isEmpty()) {
// No changes to be performed so just return the entry that we read.
- return encodeResourceResponse(connection, subType, entryHolder.get());
+ return encodeResourceResponse(context, subType, entryHolder.get());
}
// Perform the modify operation.
final ModifyRequest modifyRequest = newModifyRequest(entryHolder.get().getName());
@@ -898,16 +894,16 @@
addAssertionControl(modifyRequest, request.getRevision());
modifyRequest.getModifications().addAll(modifications);
return connection.applyChangeAsync(modifyRequest)
- .thenAsync(encodeUpdateResourceResponse(connection, subType),
+ .thenAsync(encodeUpdateResourceResponse(context, subType),
adaptLdapException(ResourceResponse.class));
}
});
}
private Promise<ResourceResponse, ResourceException> encodeResourceResponse(
- final Connection connection, final Resource resource, final Entry entry) {
+ final Context context, final Resource resource, final Entry entry) {
final PropertyMapper propertyMapper = resource.getPropertyMapper();
- return propertyMapper.read(connection, resource, ROOT, entry)
+ return propertyMapper.read(context, resource, ROOT, entry)
.then(new Function<JsonValue, ResourceResponse, ResourceException>() {
@Override
public ResourceResponse apply(final JsonValue value) {
@@ -1020,7 +1016,7 @@
}
private AsyncFunction<Result, ResourceResponse, ResourceException> encodeUpdateResourceResponse(
- final Connection connection, final Resource resource) {
+ final Context context, final Resource resource) {
return new AsyncFunction<Result, ResourceResponse, ResourceException>() {
@Override
public Promise<ResourceResponse, ResourceException> apply(Result result) {
@@ -1029,12 +1025,12 @@
final PostReadResponseControl postReadControl =
result.getControl(PostReadResponseControl.DECODER, decodeOptions);
if (postReadControl != null) {
- return encodeResourceResponse(connection, resource, postReadControl.getEntry());
+ return encodeResourceResponse(context, resource, postReadControl.getEntry());
}
final PreReadResponseControl preReadControl =
result.getControl(PreReadResponseControl.DECODER, decodeOptions);
if (preReadControl != null) {
- return encodeResourceResponse(connection, resource, preReadControl.getEntry());
+ return encodeResourceResponse(context, resource, preReadControl.getEntry());
}
} catch (final DecodeException e) {
logger.error(ERR_DECODING_CONTROL.get(e.getLocalizedMessage()), e);
--
Gitblit v1.10.0