From 4ca1423e387874accc55c1d0ffcada3eddb833c5 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Wed, 01 May 2013 00:12:40 +0000
Subject: [PATCH] Partial fix for CREST-3: Add patch support

---
 opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ReferenceAttributeMapper.java |  178 +++++++++++++++++++++++++++-------------------------------
 1 files changed, 83 insertions(+), 95 deletions(-)

diff --git a/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ReferenceAttributeMapper.java b/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ReferenceAttributeMapper.java
index c899a5d..b84037d 100644
--- a/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ReferenceAttributeMapper.java
+++ b/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ReferenceAttributeMapper.java
@@ -46,7 +46,6 @@
 import org.forgerock.opendj.ldap.Filter;
 import org.forgerock.opendj.ldap.Function;
 import org.forgerock.opendj.ldap.LinkedAttribute;
-import org.forgerock.opendj.ldap.Modification;
 import org.forgerock.opendj.ldap.MultipleEntriesFoundException;
 import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.SearchResultHandler;
@@ -193,105 +192,94 @@
                 new AtomicReference<ResourceException>();
 
         for (final Object value : newValues) {
-            mapper.toLDAP(c, path, null /* force create */, new JsonValue(value),
-                    new ResultHandler<List<Modification>>() {
+            mapper.create(c, path, new JsonValue(value), new ResultHandler<List<Attribute>>() {
 
-                        @Override
-                        public void handleError(final ResourceException error) {
-                            h.handleError(error);
+                @Override
+                public void handleError(final ResourceException error) {
+                    h.handleError(error);
+                }
+
+                @Override
+                public void handleResult(final List<Attribute> result) {
+                    Attribute primaryKeyAttribute = null;
+                    for (final Attribute attribute : result) {
+                        if (attribute.getAttributeDescription().equals(primaryKey)) {
+                            primaryKeyAttribute = attribute;
+                            break;
                         }
+                    }
 
-                        @Override
-                        public void handleResult(final List<Modification> result) {
-                            Attribute primaryKeyAttribute = null;
-                            for (final Modification modification : result) {
-                                if (modification.getAttribute().getAttributeDescription().equals(
-                                        primaryKey)) {
-                                    primaryKeyAttribute = modification.getAttribute();
-                                    break;
+                    if (primaryKeyAttribute == null || primaryKeyAttribute.isEmpty()) {
+                        h.handleError(new BadRequestException(i18n(
+                                "The request cannot be processed because the reference "
+                                        + "field '%s' contains a value which does not contain "
+                                        + "a primary key", path)));
+                        return;
+                    }
+
+                    if (primaryKeyAttribute.size() > 1) {
+                        h.handleError(new BadRequestException(i18n(
+                                "The request cannot be processed because the reference "
+                                        + "field '%s' contains a value which contains multiple "
+                                        + "primary keys", path)));
+                        return;
+                    }
+
+                    // Now search for the referenced entry in to get its DN.
+                    final ByteString primaryKeyValue = primaryKeyAttribute.firstValue();
+                    final Filter filter = Filter.equality(primaryKey.toString(), primaryKeyValue);
+                    final SearchRequest search = createSearchRequest(filter);
+                    c.getConnection().searchSingleEntryAsync(search,
+                            new org.forgerock.opendj.ldap.ResultHandler<SearchResultEntry>() {
+
+                                @Override
+                                public void handleErrorResult(final ErrorResultException error) {
+                                    ResourceException re;
+                                    try {
+                                        throw error;
+                                    } catch (final EntryNotFoundException e) {
+                                        re =
+                                                new BadRequestException(i18n(
+                                                        "The request cannot be processed "
+                                                                + "because the resource '%s' "
+                                                                + "referenced in field '%s' does "
+                                                                + "not exist", primaryKeyValue
+                                                                .toString(), path));
+                                    } catch (final MultipleEntriesFoundException e) {
+                                        re =
+                                                new BadRequestException(i18n(
+                                                        "The request cannot be processed "
+                                                                + "because the resource '%s' "
+                                                                + "referenced in field '%s' is "
+                                                                + "ambiguous", primaryKeyValue
+                                                                .toString(), path));
+                                    } catch (final ErrorResultException e) {
+                                        re = asResourceException(e);
+                                    }
+                                    exception.compareAndSet(null, re);
+                                    completeIfNecessary();
                                 }
-                            }
 
-                            if (primaryKeyAttribute == null || primaryKeyAttribute.isEmpty()) {
-                                h.handleError(new BadRequestException(
-                                        i18n("The request cannot be processed because the reference "
-                                                + "field '%s' contains a value which does not contain "
-                                                + "a primary key", path)));
-                                return;
-                            }
-
-                            if (primaryKeyAttribute.size() > 1) {
-                                h.handleError(new BadRequestException(
-                                        i18n("The request cannot be processed because the reference "
-                                                + "field '%s' contains a value which contains multiple "
-                                                + "primary keys", path)));
-                                return;
-                            }
-
-                            // Now search for the referenced entry in to get its DN.
-                            final ByteString primaryKeyValue = primaryKeyAttribute.firstValue();
-                            final Filter filter =
-                                    Filter.equality(primaryKey.toString(), primaryKeyValue);
-                            final SearchRequest search = createSearchRequest(filter);
-                            c.getConnection()
-                                    .searchSingleEntryAsync(
-                                            search,
-                                            new org.forgerock.opendj.ldap.ResultHandler<SearchResultEntry>() {
-
-                                                @Override
-                                                public void handleErrorResult(
-                                                        final ErrorResultException error) {
-                                                    ResourceException re;
-                                                    try {
-                                                        throw error;
-                                                    } catch (final EntryNotFoundException e) {
-                                                        re =
-                                                                new BadRequestException(
-                                                                        i18n("The request cannot be processed "
-                                                                                + "because the resource '%s' "
-                                                                                + "referenced in field '%s' does "
-                                                                                + "not exist",
-                                                                                primaryKeyValue
-                                                                                        .toString(),
-                                                                                path));
-                                                    } catch (final MultipleEntriesFoundException e) {
-                                                        re =
-                                                                new BadRequestException(
-                                                                        i18n("The request cannot be processed "
-                                                                                + "because the resource '%s' "
-                                                                                + "referenced in field '%s' is "
-                                                                                + "ambiguous",
-                                                                                primaryKeyValue
-                                                                                        .toString(),
-                                                                                path));
-                                                    } catch (final ErrorResultException e) {
-                                                        re = asResourceException(e);
-                                                    }
-                                                    exception.compareAndSet(null, re);
-                                                    completeIfNecessary();
-                                                }
-
-                                                @Override
-                                                public void handleResult(
-                                                        final SearchResultEntry result) {
-                                                    synchronized (newLDAPAttribute) {
-                                                        newLDAPAttribute.add(result.getName());
-                                                    }
-                                                    completeIfNecessary();
-                                                }
-                                            });
-                        }
-
-                        private void completeIfNecessary() {
-                            if (pendingSearches.decrementAndGet() == 0) {
-                                if (exception.get() == null) {
-                                    h.handleResult(newLDAPAttribute);
-                                } else {
-                                    h.handleError(exception.get());
+                                @Override
+                                public void handleResult(final SearchResultEntry result) {
+                                    synchronized (newLDAPAttribute) {
+                                        newLDAPAttribute.add(result.getName());
+                                    }
+                                    completeIfNecessary();
                                 }
-                            }
+                            });
+                }
+
+                private void completeIfNecessary() {
+                    if (pendingSearches.decrementAndGet() == 0) {
+                        if (exception.get() == null) {
+                            h.handleResult(newLDAPAttribute);
+                        } else {
+                            h.handleError(exception.get());
                         }
-                    });
+                    }
+                }
+            });
         }
     }
 
@@ -301,7 +289,7 @@
     }
 
     @Override
-    void toJSON(final Context c, final JsonPointer path, final Entry e,
+    void read(final Context c, final JsonPointer path, final Entry e,
             final ResultHandler<JsonValue> h) {
         final Attribute attribute = e.getAttribute(ldapAttributeName);
         if (attribute == null || attribute.isEmpty()) {
@@ -377,7 +365,7 @@
 
                     @Override
                     public void handleResult(final SearchResultEntry result) {
-                        mapper.toJSON(c, path, result, handler);
+                        mapper.read(c, path, result, handler);
                     }
                 });
     }

--
Gitblit v1.10.0