From 39a420d9aa3817dbe2dc9eff52464e5b464dbdde Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Thu, 06 Oct 2016 15:33:04 +0000
Subject: [PATCH] OPENDJ-2860: add support for JSON property mapping in Rest2LDAP
---
opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/schema/JsonSchema.java | 61 ++++++++++++++++++++++++++++++
1 files changed, 61 insertions(+), 0 deletions(-)
diff --git a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/schema/JsonSchema.java b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/schema/JsonSchema.java
index 50ee3b8..e87be40 100644
--- a/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/schema/JsonSchema.java
+++ b/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/schema/JsonSchema.java
@@ -20,20 +20,30 @@
import static com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS;
import static java.util.Collections.emptyList;
import static org.forgerock.opendj.ldap.schema.Schema.getCoreSchema;
+import static org.forgerock.opendj.rest2ldap.Rest2ldapMessages.ERR_JSON_IO_ERROR;
+import static org.forgerock.opendj.rest2ldap.Rest2ldapMessages.ERR_JSON_PARSE_ERROR;
+import static org.forgerock.opendj.rest2ldap.schema.JsonSchema.ValidationPolicy.LENIENT;
import static org.forgerock.opendj.rest2ldap.schema.JsonSchema.ValidationPolicy.STRICT;
import static org.forgerock.util.Options.defaultOptions;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.Collection;
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.LocalizedIllegalArgumentException;
+import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.schema.MatchingRule;
import org.forgerock.opendj.ldap.schema.MatchingRuleImpl;
import org.forgerock.opendj.ldap.schema.Schema;
import org.forgerock.opendj.ldap.schema.SchemaBuilder;
import org.forgerock.opendj.ldap.schema.Syntax;
+import org.forgerock.util.Function;
import org.forgerock.util.Option;
import org.forgerock.util.Options;
import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
@@ -54,6 +64,7 @@
.enable(ALLOW_UNQUOTED_CONTROL_CHARS)),
/** JSON validation policy which does not perform any validation. */
DISABLED(null);
+
private final ObjectMapper objectMapper;
ValidationPolicy(final ObjectMapper objectMapper) {
@@ -128,6 +139,37 @@
private static final Syntax JSON_QUERY_SYNTAX;
private static final MatchingRule CASE_IGNORE_JSON_QUERY_MATCHING_RULE;
private static final MatchingRule CASE_EXACT_JSON_QUERY_MATCHING_RULE;
+ private static final Function<ByteString, Object, LocalizedIllegalArgumentException> BYTESTRING_TO_JSON =
+ new Function<ByteString, Object, LocalizedIllegalArgumentException>() {
+ @Override
+ public Object apply(final ByteString value) {
+ try (final InputStream inputStream = value.asReader().asInputStream()) {
+ return LENIENT.getObjectMapper().readValue(inputStream, Object.class);
+ } catch (final IOException e) {
+ throw new LocalizedIllegalArgumentException(jsonParsingException(e));
+ }
+ }
+ };
+
+ static LocalizableMessage jsonParsingException(final IOException e) {
+ if (e instanceof JsonProcessingException) {
+ final JsonProcessingException jpe = (JsonProcessingException) e;
+ if (jpe.getLocation() != null) {
+ return ERR_JSON_PARSE_ERROR.get(jpe.getLocation().getLineNr(),
+ jpe.getLocation().getColumnNr(),
+ jpe.getOriginalMessage());
+ }
+ }
+ return ERR_JSON_IO_ERROR.get(e.getMessage());
+ }
+
+ private static final Function<Object, ByteString, JsonProcessingException> JSON_TO_BYTESTRING =
+ new Function<Object, ByteString, JsonProcessingException>() {
+ @Override
+ public ByteString apply(final Object value) throws JsonProcessingException {
+ return ByteString.wrap(LENIENT.getObjectMapper().writeValueAsBytes(value));
+ }
+ };
static {
final Schema schema = addJsonSyntaxesAndMatchingRulesToSchema(new SchemaBuilder(getCoreSchema())).toSchema();
@@ -247,6 +289,25 @@
return builder;
}
+ /**
+ * Returns a function which parses {@code JSON} values. Invalid values will result in a
+ * {@code LocalizedIllegalArgumentException}.
+ *
+ * @return A function which parses {@code JSON} values.
+ */
+ public static Function<ByteString, Object, LocalizedIllegalArgumentException> byteStringToJson() {
+ return BYTESTRING_TO_JSON;
+ }
+
+ /**
+ * Returns a function which converts a JSON {@code Object} to a {@code ByteString}.
+ *
+ * @return A function which converts a JSON {@code Object} to a {@code ByteString}.
+ */
+ public static Function<Object, ByteString, JsonProcessingException> jsonToByteString() {
+ return JSON_TO_BYTESTRING;
+ }
+
private JsonSchema() {
// Prevent instantiation.
}
--
Gitblit v1.10.0