From 33255bfee39fb3cb3813894831a76bc7c014c13a Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Fri, 08 Feb 2013 18:23:37 +0000
Subject: [PATCH] Partial fix for OPENDJ-691: Implement add/create support

---
 opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/DefaultAttributeMapper.java |   51 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 50 insertions(+), 1 deletions(-)

diff --git a/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/DefaultAttributeMapper.java b/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/DefaultAttributeMapper.java
index 7c8fe43..030055b 100644
--- a/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/DefaultAttributeMapper.java
+++ b/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/DefaultAttributeMapper.java
@@ -20,6 +20,9 @@
 import static org.forgerock.opendj.rest2ldap.Utils.toFilter;
 import static org.forgerock.opendj.rest2ldap.Utils.toLowerCase;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -27,8 +30,11 @@
 
 import org.forgerock.json.fluent.JsonPointer;
 import org.forgerock.json.fluent.JsonValue;
+import org.forgerock.json.resource.BadRequestException;
 import org.forgerock.json.resource.ResultHandler;
 import org.forgerock.opendj.ldap.Attribute;
+import org.forgerock.opendj.ldap.AttributeDescription;
+import org.forgerock.opendj.ldap.Attributes;
 import org.forgerock.opendj.ldap.Entry;
 import org.forgerock.opendj.ldap.Filter;
 
@@ -126,7 +132,50 @@
 
     @Override
     void toLDAP(final Context c, final JsonValue v, final ResultHandler<List<Attribute>> h) {
-        // TODO:
+        if (v.isMap()) {
+            List<Attribute> result = new ArrayList<Attribute>(v.size());
+            for (Map.Entry<String, Object> field : v.asMap().entrySet()) {
+                final AttributeDescription ad;
+                try {
+                    ad = AttributeDescription.valueOf(field.getKey(), c.getConfig().schema());
+                } catch (Exception e) {
+                    // FIXME: improve error message.
+                    h.handleError(new BadRequestException("The field " + field.getKey()
+                            + " is invalid"));
+                    return;
+                }
+                Object value = field.getValue();
+                if (isJSONPrimitive(value)) {
+                    result.add(Attributes.singletonAttribute(ad, value));
+                } else if (value instanceof Collection<?>) {
+                    Attribute a =
+                            c.getConfig().decodeOptions().getAttributeFactory().newAttribute(ad);
+                    for (Object o : (Collection<?>) value) {
+                        if (isJSONPrimitive(o)) {
+                            a.add(o);
+                        } else {
+                            // FIXME: improve error message.
+                            h.handleError(new BadRequestException("The field " + field.getKey()
+                                    + " is invalid"));
+                            return;
+                        }
+                    }
+                    result.add(a);
+                } else {
+                    // FIXME: improve error message.
+                    h.handleError(new BadRequestException("The field " + field.getKey()
+                            + " is invalid"));
+                    return;
+                }
+            }
+            h.handleResult(result);
+        } else {
+            h.handleResult(Collections.<Attribute> emptyList());
+        }
+    }
+
+    private boolean isJSONPrimitive(Object value) {
+        return value instanceof String || value instanceof Boolean || value instanceof Number;
     }
 
     private boolean isIncludedAttribute(final String name) {

--
Gitblit v1.10.0