From a5809829e89ea42665396a628ea277d253ef9fa1 Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 03 Nov 2016 10:18:29 +0000
Subject: [PATCH] Do not put JsonValue inside JSON schemas

---
 opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/PropertyMapper.java             |    8 +++++++-
 opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SimplePropertyMapper.java       |    2 +-
 opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/JsonConstantPropertyMapper.java |    7 ++++---
 opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ObjectPropertyMapper.java       |    4 ++--
 opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ReferencePropertyMapper.java    |    2 +-
 opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Resource.java                   |    6 +++---
 6 files changed, 18 insertions(+), 11 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 5ded770..617b285 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
@@ -171,13 +171,14 @@
             for (String key : value.keys()) {
                 jsonProps.put(key, toJsonSchema(value.get(key)));
             }
-            jsonSchema.put("properties", jsonSchema);
+            jsonSchema.put("properties", jsonProps.getObject());
             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));
+            JsonValue firstItemJson = toJsonSchema(firstItem);
+            jsonSchema.put("items", firstItemJson != null ? firstItemJson.getObject() : null);
             if (value.getObject() instanceof Set) {
                 jsonSchema.put("uniqueItems", true);
             }
@@ -194,7 +195,7 @@
         } else if (value.isNull()) {
             return json(object(field("type", "null")));
         } else {
-            return null;
+            throw new IllegalStateException("Unsupported json value: " + value);
         }
     }
 }
diff --git a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ObjectPropertyMapper.java b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ObjectPropertyMapper.java
index 249cfb5..d98b694 100644
--- a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ObjectPropertyMapper.java
+++ b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ObjectPropertyMapper.java
@@ -446,7 +446,7 @@
         for (Mapping mapping : mappings.values()) {
             final String attribute = mapping.name;
             PropertyMapper mapper = mapping.mapper;
-            jsonProps.put(attribute, mapper.toJsonSchema());
+            jsonProps.put(attribute, mapper.toJsonSchema().getObject());
             if (mapper.isRequired()) {
                 requiredFields.add(attribute);
             }
@@ -457,7 +457,7 @@
             jsonSchema.put("required", requiredFields);
         }
         if (jsonProps.size() > 0) {
-            jsonSchema.put("properties", jsonProps);
+            jsonSchema.put("properties", jsonProps.getObject());
         }
         return jsonSchema;
     }
diff --git a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/PropertyMapper.java b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/PropertyMapper.java
index a496a2b..4c1c42d 100644
--- a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/PropertyMapper.java
+++ b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/PropertyMapper.java
@@ -186,6 +186,8 @@
      *
      * @param context The request context.
      * @param resource The exact type of resource being updated.
+     * @param path the path to update.
+     * @param e the entry containing the new value.
      * @param v
      *            The JSON value to be converted to LDAP attributes, which may
      *            be {@code null} indicating that the JSON value was not present
@@ -195,8 +197,12 @@
     abstract Promise<List<Modification>, ResourceException> update(Context context, Resource resource,
                                                                    JsonPointer path, Entry e, JsonValue v);
 
-    // TODO: methods for obtaining schema information (e.g. name, description, type information).
     // TODO: methods for creating sort controls.
 
+    /**
+     * Returns the non-null JSON schema for this property mapper.
+     *
+     * @return the non-null JSON schema for this property mapper
+     */
     abstract JsonValue toJsonSchema();
 }
diff --git a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ReferencePropertyMapper.java b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ReferencePropertyMapper.java
index 9dda3f0..9879681 100644
--- a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ReferencePropertyMapper.java
+++ b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ReferencePropertyMapper.java
@@ -363,7 +363,7 @@
         if (mapper.isMultiValued()) {
             final JsonValue jsonSchema = json(object(
                 field("type", "array"),
-                field("items", mapper.toJsonSchema()),
+                field("items", mapper.toJsonSchema().getObject()),
                 // LDAP has set semantics => all items are unique
                 field("uniqueItems", true)));
             putWritabilityProperties(jsonSchema);
diff --git a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Resource.java b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Resource.java
index 8e8b3d3..9c8fbd0 100644
--- a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Resource.java
+++ b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Resource.java
@@ -857,7 +857,7 @@
             }
             final JsonValue jsonSchema = mapper.toJsonSchema();
             if (jsonSchema != null) {
-                properties.put(propertyName, jsonSchema);
+                properties.put(propertyName, jsonSchema.getObject());
             }
         }
 
@@ -870,14 +870,14 @@
             jsonSchema.put("required", requiredFields);
         }
         if (properties.size() > 0) {
-            jsonSchema.put("properties", properties);
+            jsonSchema.put("properties", properties.getObject());
         }
 
         if (superType != null) {
             return schema(json(object(
                 field("allOf", array(
                     object(field("$ref", "#/definitions/" + superType.id)),
-                    jsonSchema)))));
+                    jsonSchema.getObject())))));
         }
         return schema(jsonSchema);
     }
diff --git a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SimplePropertyMapper.java b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SimplePropertyMapper.java
index c705ca7..4b303b0 100644
--- a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SimplePropertyMapper.java
+++ b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SimplePropertyMapper.java
@@ -228,7 +228,7 @@
                 field("type", "array"),
                 // LDAP has set semantics => all items are unique
                 field("uniqueItems", true),
-                field("items", itemsSchema(attrType))));
+                field("items", itemsSchema(attrType).getObject())));
         } else {
             jsonSchema = itemsSchema(attrType);
         }

--
Gitblit v1.10.0