From e4c0edea06c8fee28369f03f393b7d54b2b6235c Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 16 Sep 2016 13:25:06 +0000
Subject: [PATCH] OPENDJ-3246 Return the CREST descriptor over REST for rest2ldap endpoints

---
 opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/JsonConstantPropertyMapper.java |   75 +++++++++++++++++++++++++++++++------
 1 files changed, 62 insertions(+), 13 deletions(-)

diff --git a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/JsonConstantPropertyMapper.java b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/JsonConstantPropertyMapper.java
index 01525ff..dc6400b 100644
--- a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/JsonConstantPropertyMapper.java
+++ b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/JsonConstantPropertyMapper.java
@@ -16,6 +16,7 @@
 package org.forgerock.opendj.rest2ldap;
 
 import static org.forgerock.opendj.rest2ldap.Rest2ldapMessages.*;
+import static org.forgerock.json.JsonValue.*;
 import static org.forgerock.opendj.ldap.Filter.alwaysFalse;
 import static org.forgerock.opendj.ldap.Filter.alwaysTrue;
 import static org.forgerock.opendj.rest2ldap.Utils.isNullOrEmpty;
@@ -50,6 +51,16 @@
     }
 
     @Override
+    boolean isRequired() {
+        return false;
+    }
+
+    @Override
+    boolean isMultiValued() {
+        return false;
+    }
+
+    @Override
     public String toString() {
         return "constant(" + value + ")";
     }
@@ -75,39 +86,38 @@
                                                      final JsonPointer path, final JsonPointer subPath,
                                                      final FilterType type, final String operator,
                                                      final Object valueAssertion) {
-        final Filter filter;
+        return newResultPromise(getLdapFilter0(subPath, type, valueAssertion));
+    }
+
+    private Filter getLdapFilter0(final JsonPointer subPath, final FilterType type, final Object valueAssertion) {
         final JsonValue subValue = value.get(subPath);
         if (subValue == null) {
-            filter = alwaysFalse();
+            return alwaysFalse();
         } else if (type == FilterType.PRESENT) {
-            filter = alwaysTrue();
+            return alwaysTrue();
         } else if (value.isString() && valueAssertion instanceof String) {
             final String v1 = toLowerCase(value.asString());
             final String v2 = toLowerCase((String) valueAssertion);
             switch (type) {
             case CONTAINS:
-                filter = toFilter(v1.contains(v2));
-                break;
+                return toFilter(v1.contains(v2));
             case STARTS_WITH:
-                filter = toFilter(v1.startsWith(v2));
-                break;
+                return toFilter(v1.startsWith(v2));
             default:
-                filter = compare(type, v1, v2);
-                break;
+                return compare(type, v1, v2);
             }
         } else if (value.isNumber() && valueAssertion instanceof Number) {
             final Double v1 = value.asDouble();
             final Double v2 = ((Number) valueAssertion).doubleValue();
-            filter = compare(type, v1, v2);
+            return compare(type, v1, v2);
         } else if (value.isBoolean() && valueAssertion instanceof Boolean) {
             final Boolean v1 = value.asBoolean();
             final Boolean v2 = (Boolean) valueAssertion;
-            filter = compare(type, v1, v2);
+            return compare(type, v1, v2);
         } else {
             // This property mapper is a candidate but it does not match.
-            filter = alwaysFalse();
+            return alwaysFalse();
         }
-        return newResultPromise(filter);
     }
 
     @Override
@@ -148,4 +158,43 @@
             return alwaysFalse(); // Not supported.
         }
     }
+
+    @Override
+    JsonValue toJsonSchema() {
+        return toJsonSchema(value);
+    }
+
+    private static JsonValue toJsonSchema(JsonValue value) {
+        if (value.isMap()) {
+            final JsonValue jsonSchema = json(object(field("type", "object")));
+            final JsonValue jsonProps = json(object());
+            for (String key : value.keys()) {
+                jsonProps.put(key, toJsonSchema(value.get(key)));
+            }
+            jsonSchema.put("properties", jsonSchema);
+            return jsonSchema;
+        } else if (value.isCollection()) {
+            final JsonValue jsonSchema = json(object(field("type", "array")));
+            final JsonValue firstItem = value.get(value.keys().iterator().next());
+            // assume all items have the same schema
+            jsonSchema.put("items", toJsonSchema(firstItem));
+            if (value.isSet()) {
+                jsonSchema.put("uniqueItems", true);
+            }
+            return jsonSchema;
+        } else if (value.isBoolean()) {
+            return json(object(field("type", "boolean"),
+                               field("default", value)));
+        } else if (value.isString()) {
+            return json(object(field("type", "string"),
+                               field("default", value)));
+        } else if (value.isNumber()) {
+            return json(object(field("type", "number"),
+                               field("default", value)));
+        } else if (value.isNull()) {
+            return json(object(field("type", "null")));
+        } else {
+            return null;
+        }
+    }
 }

--
Gitblit v1.10.0