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