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

Matthew Swift
11.51.2013 56a6404d2b1c440d78a3c833b6d9e6f392875a68
Additional fix for OPENDJ-699: Implement DN reference mapping

Minor bug fixes to deal with cases where the referenced resource does not exist.
3 files modified
48 ■■■■ changed files
opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ReferenceAttributeMapper.java 44 ●●●● patch | view | raw | blame | history
opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SimpleAttributeMapper.java 2 ●●● patch | view | raw | blame | history
opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Utils.java 2 ●●●●● patch | view | raw | blame | history
opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ReferenceAttributeMapper.java
@@ -39,12 +39,15 @@
import org.forgerock.json.resource.ResultHandler;
import org.forgerock.opendj.ldap.Attribute;
import org.forgerock.opendj.ldap.AttributeDescription;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.Entry;
import org.forgerock.opendj.ldap.EntryNotFoundException;
import org.forgerock.opendj.ldap.ErrorResultException;
import org.forgerock.opendj.ldap.Filter;
import org.forgerock.opendj.ldap.Function;
import org.forgerock.opendj.ldap.LinkedAttribute;
import org.forgerock.opendj.ldap.MultipleEntriesFoundException;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.SearchResultHandler;
import org.forgerock.opendj.ldap.SearchScope;
@@ -296,8 +299,8 @@
                        v.isList() ? v : new JsonValue(singletonList(v.getObject()));
                final Attribute reference = new LinkedAttribute(ldapAttributeName);
                final AtomicInteger pendingSearches = new AtomicInteger(valueList.size());
                final AtomicReference<ErrorResultException> exception =
                        new AtomicReference<ErrorResultException>();
                final AtomicReference<ResourceException> exception =
                        new AtomicReference<ResourceException>();
                for (final JsonValue value : valueList) {
                    mapper.toLDAP(c, value, new ResultHandler<List<Attribute>>() {
@@ -338,9 +341,9 @@
                            }
                            // Now search for the referenced entry in to get its DN.
                            final ByteString primaryKeyValue = primaryKeyAttribute.firstValue();
                            final Filter filter =
                                    Filter.equality(primaryKey.toString(), primaryKeyAttribute
                                            .firstValue());
                                    Filter.equality(primaryKey.toString(), primaryKeyValue);
                            final SearchRequest search = createSearchRequest(filter);
                            c.getConnection()
                                    .searchSingleEntryAsync(
@@ -350,7 +353,29 @@
                                                @Override
                                                public void handleErrorResult(
                                                        final ErrorResultException error) {
                                                    exception.compareAndSet(null, error);
                                                    ResourceException re;
                                                    try {
                                                        throw error;
                                                    } catch (EntryNotFoundException e) {
                                                        // FIXME: improve error message.
                                                        re =
                                                                new BadRequestException(
                                                                        "the resource referenced by '"
                                                                                + primaryKeyValue
                                                                                        .toString()
                                                                                + "' does not exist");
                                                    } catch (MultipleEntriesFoundException e) {
                                                        // FIXME: improve error message.
                                                        re =
                                                                new BadRequestException(
                                                                        "the resource referenced by '"
                                                                                + primaryKeyValue
                                                                                        .toString()
                                                                                + "' is ambiguous");
                                                    } catch (ErrorResultException e) {
                                                        re = adapt(e);
                                                    }
                                                    exception.compareAndSet(null, re);
                                                    completeIfNecessary();
                                                }
@@ -370,7 +395,7 @@
                                if (exception.get() == null) {
                                    h.handleResult(singletonList(reference));
                                } else {
                                    h.handleError(adapt(exception.get()));
                                    h.handleError(exception.get());
                                }
                            }
                        }
@@ -407,7 +432,12 @@
                    @Override
                    public void handleErrorResult(final ErrorResultException error) {
                        handler.handleError(adapt(error));
                        if (!(error instanceof EntryNotFoundException)) {
                            handler.handleError(adapt(error));
                        } else {
                            // The referenced entry does not exist so ignore it since it cannot be mapped.
                            handler.handleResult(null);
                        }
                    }
                    @Override
opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SimpleAttributeMapper.java
@@ -183,7 +183,7 @@
            final String operator, final Object valueAssertion, final ResultHandler<Filter> h) {
        if (jsonAttribute.isEmpty()) {
            try {
                final ByteString va = encoder().apply(valueAssertion, null);
                final ByteString va = valueAssertion != null ? encoder().apply(valueAssertion, null) : null;
                h.handleResult(toFilter(c, type, ldapAttributeName.toString(), va));
            } catch (Exception e) {
                // Invalid assertion value - bad request.
opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Utils.java
@@ -201,6 +201,8 @@
        int resourceResultCode;
        try {
            throw t;
        } catch (final ResourceException e) {
            return e;
        } catch (final AssertionFailureException e) {
            resourceResultCode = ResourceException.VERSION_MISMATCH;
        } catch (final AuthenticationException e) {