From b8f496a9076253f7dc672d361b7bd65d4a110a29 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 05 Mar 2013 16:05:52 +0000
Subject: [PATCH] Partial fix for OPENDJ-699: Implement DN reference mapping

---
 opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Utils.java |   79 ++++++++++++++++++++++++++++++++-------
 1 files changed, 64 insertions(+), 15 deletions(-)

diff --git a/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Utils.java b/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Utils.java
index 9c7ef7a..ce51dcc 100644
--- a/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Utils.java
+++ b/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Utils.java
@@ -36,13 +36,22 @@
 
 import org.forgerock.json.resource.ResourceException;
 import org.forgerock.json.resource.ResultHandler;
+import org.forgerock.opendj.ldap.AssertionFailureException;
 import org.forgerock.opendj.ldap.Attribute;
 import org.forgerock.opendj.ldap.AttributeDescription;
+import org.forgerock.opendj.ldap.AuthenticationException;
+import org.forgerock.opendj.ldap.AuthorizationException;
 import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.ConnectionException;
+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.GeneralizedTime;
 import org.forgerock.opendj.ldap.LinkedAttribute;
+import org.forgerock.opendj.ldap.MultipleEntriesFoundException;
+import org.forgerock.opendj.ldap.ResultCode;
+import org.forgerock.opendj.ldap.TimeoutResultException;
 import org.forgerock.opendj.ldap.schema.Syntax;
 
 /**
@@ -82,8 +91,10 @@
          */
         @Override
         public void handleResult(final V result) {
-            synchronized (results) {
-                results.add(result);
+            if (result != null) {
+                synchronized (results) {
+                    results.add(result);
+                }
             }
             if (latch.decrementAndGet() == 0) {
                 handler.handleResult(results);
@@ -92,22 +103,22 @@
 
     }
 
-    private static final Function<ByteString, String, Void> BYTESTRING_TO_BASE64 =
-            new Function<ByteString, String, Void>() {
-                @Override
-                public String apply(ByteString value, Void p) {
-                    return value.toBase64String();
-                }
-            };
-
     private static final Function<Object, ByteString, Void> BASE64_TO_BYTESTRING =
             new Function<Object, ByteString, Void>() {
                 @Override
-                public ByteString apply(Object value, Void p) {
+                public ByteString apply(final Object value, final Void p) {
                     return ByteString.valueOfBase64(String.valueOf(value));
                 }
             };
 
+    private static final Function<ByteString, String, Void> BYTESTRING_TO_BASE64 =
+            new Function<ByteString, String, Void>() {
+                @Override
+                public String apply(final ByteString value, final Void p) {
+                    return value.toBase64String();
+                }
+            };
+
     private static final Function<ByteString, Object, AttributeDescription> BYTESTRING_TO_JSON =
             new Function<ByteString, Object, AttributeDescription>() {
                 @Override
@@ -149,6 +160,44 @@
         return new AccumulatingResultHandler<V>(size, handler);
     }
 
+    /**
+     * Adapts an LDAP result code to a resource exception.
+     *
+     * @param error
+     *            The LDAP error that should be adapted.
+     * @return The equivalent resource exception.
+     */
+    static ResourceException adapt(final ErrorResultException error) {
+        int resourceResultCode;
+        try {
+            throw error;
+        } catch (final AssertionFailureException e) {
+            resourceResultCode = ResourceException.VERSION_MISMATCH;
+        } catch (final AuthenticationException e) {
+            resourceResultCode = 401;
+        } catch (final AuthorizationException e) {
+            resourceResultCode = ResourceException.FORBIDDEN;
+        } catch (final ConnectionException e) {
+            resourceResultCode = ResourceException.UNAVAILABLE;
+        } catch (final EntryNotFoundException e) {
+            resourceResultCode = ResourceException.NOT_FOUND;
+        } catch (final MultipleEntriesFoundException e) {
+            resourceResultCode = ResourceException.INTERNAL_ERROR;
+        } catch (final TimeoutResultException e) {
+            resourceResultCode = 408;
+        } catch (final ErrorResultException e) {
+            final ResultCode rc = e.getResult().getResultCode();
+            if (rc.equals(ResultCode.ADMIN_LIMIT_EXCEEDED)) {
+                resourceResultCode = 413; // Request Entity Too Large
+            } else if (rc.equals(ResultCode.SIZE_LIMIT_EXCEEDED)) {
+                resourceResultCode = 413; // Request Entity Too Large
+            } else {
+                resourceResultCode = ResourceException.INTERNAL_ERROR;
+            }
+        }
+        return ResourceException.getException(resourceResultCode, error.getMessage(), error);
+    }
+
     static Object attributeToJson(final Attribute a) {
         final Function<ByteString, Object, Void> f =
                 fixedFunction(BYTESTRING_TO_JSON, a.getAttributeDescription());
@@ -157,16 +206,16 @@
         return isSingleValued ? a.parse().as(f) : asList(a.parse().asSetOf(f));
     }
 
-    static Function<ByteString, Object, AttributeDescription> byteStringToJson() {
-        return BYTESTRING_TO_JSON;
+    static Function<Object, ByteString, Void> base64ToByteString() {
+        return BASE64_TO_BYTESTRING;
     }
 
     static Function<ByteString, String, Void> byteStringToBase64() {
         return BYTESTRING_TO_BASE64;
     }
 
-    static Function<Object, ByteString, Void> base64ToByteString() {
-        return BASE64_TO_BYTESTRING;
+    static Function<ByteString, Object, AttributeDescription> byteStringToJson() {
+        return BYTESTRING_TO_JSON;
     }
 
     static <T> T ensureNotNull(final T object) {

--
Gitblit v1.10.0