From 6d12770d7fa9fc1c103d9e21614dac75a69abc78 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Mon, 06 May 2013 22:26:14 +0000
Subject: [PATCH] CREST-3 - Add patch support
---
opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ObjectAttributeMapper.java | 32 ++++++++++++++++++++++----------
1 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ObjectAttributeMapper.java b/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ObjectAttributeMapper.java
index c05677f..ee22625 100644
--- a/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ObjectAttributeMapper.java
+++ b/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ObjectAttributeMapper.java
@@ -85,6 +85,11 @@
}
@Override
+ public String toString() {
+ return "object(" + mappings.values().toString() + ")";
+ }
+
+ @Override
void create(final Context c, final JsonPointer path, final JsonValue v,
final ResultHandler<List<Attribute>> h) {
try {
@@ -165,18 +170,21 @@
* by allowing the JSON value to be a partial object and
* add/remove/replace only the provided values.
*/
- checkMapping(path, operation.getValue());
+ final Map<String, Mapping> missingMappings = checkMapping(path, v);
// Accumulate the results of the subordinate mappings.
- final ResultHandler<List<Modification>> handler = accumulator(h);
+ final ResultHandler<List<Modification>> handler =
+ accumulator(mappings.size() - missingMappings.size(), h);
- // Invoke the sub-mappers using a new patch operation targeted at each field.
- for (final Map.Entry<String, Object> me : v.asMap().entrySet()) {
- final Mapping mapping = getMapping(me.getKey());
- final JsonValue subValue = new JsonValue(me.getValue());
- final PatchOperation subOperation =
- operation(operation.getOperation(), field /* empty */, subValue);
- mapping.mapper.patch(c, path.child(me.getKey()), subOperation, handler);
+ // Invoke mappings for which there are values provided.
+ if (!v.isNull()) {
+ for (final Map.Entry<String, Object> me : v.asMap().entrySet()) {
+ final Mapping mapping = getMapping(me.getKey());
+ final JsonValue subValue = new JsonValue(me.getValue());
+ final PatchOperation subOperation =
+ operation(operation.getOperation(), field /* empty */, subValue);
+ mapping.mapper.patch(c, path.child(me.getKey()), subOperation, handler);
+ }
}
} else {
/*
@@ -280,7 +288,11 @@
}
private <T> ResultHandler<List<T>> accumulator(final ResultHandler<List<T>> h) {
- return accumulate(mappings.size(), transform(new Function<List<List<T>>, List<T>, Void>() {
+ return accumulator(mappings.size(), h);
+ }
+
+ private <T> ResultHandler<List<T>> accumulator(final int size, final ResultHandler<List<T>> h) {
+ return accumulate(size, transform(new Function<List<List<T>>, List<T>, Void>() {
@Override
public List<T> apply(final List<List<T>> value, final Void p) {
switch (value.size()) {
--
Gitblit v1.10.0