From 507e00fb190713b1654579123d284bcd3d750abe Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Wed, 10 Apr 2013 10:31:19 +0000
Subject: [PATCH] Partial fix for OPENDJ-693: Implement modify/update support

---
 opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LDAP.java |   26 +++++++++++++++++++++-----
 1 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LDAP.java b/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LDAP.java
index 7add0d5..9de51bd 100644
--- a/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LDAP.java
+++ b/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LDAP.java
@@ -44,6 +44,7 @@
 import org.forgerock.opendj.ldap.ConnectionException;
 import org.forgerock.opendj.ldap.ConnectionFactory;
 import org.forgerock.opendj.ldap.Connections;
+import org.forgerock.opendj.ldap.ConstraintViolationException;
 import org.forgerock.opendj.ldap.DN;
 import org.forgerock.opendj.ldap.Entry;
 import org.forgerock.opendj.ldap.EntryNotFoundException;
@@ -86,6 +87,7 @@
         private AttributeMapper rootMapper;
         private Schema schema = Schema.getDefaultSchema();
         private boolean useSubtreeDelete;
+        private boolean usePermissiveModify;
 
         Builder() {
             useEtagAttribute();
@@ -144,7 +146,7 @@
             }
             return new LDAPCollectionResourceProvider(baseDN, rootMapper, nameStrategy,
                     etagAttribute, new Config(factory, readOnUpdatePolicy, authzPolicy,
-                            proxiedAuthzTemplate, useSubtreeDelete, schema),
+                            proxiedAuthzTemplate, useSubtreeDelete, usePermissiveModify, schema),
                     additionalLDAPAttributes);
         }
 
@@ -196,10 +198,14 @@
                 useEtagAttribute(etagAttribute.asString());
             }
 
-            if (configuration.get("useSubtreeDelete").required().asBoolean()) {
+            if (configuration.get("useSubtreeDelete").defaultTo(false).asBoolean()) {
                 useSubtreeDelete();
             }
 
+            if (configuration.get("usePermissiveModify").defaultTo(false).asBoolean()) {
+                usePermissiveModify();
+            }
+
             mapper(configureObjectMapper(configuration.get("attributes").required()));
 
             return this;
@@ -305,6 +311,11 @@
             return this;
         }
 
+        public Builder usePermissiveModify() {
+            this.usePermissiveModify = true;
+            return this;
+        }
+
         private AttributeDescription ad(final String attribute) {
             return AttributeDescription.valueOf(attribute, schema);
         }
@@ -323,9 +334,6 @@
                 if (config.isDefined("defaultJSONValue")) {
                     s.defaultJSONValue(config.get("defaultJSONValue").getObject());
                 }
-                if (config.isDefined("defaultLDAPValue")) {
-                    s.defaultLDAPValue(config.get("defaultLDAPValue").getObject());
-                }
                 if (config.get("isBinary").defaultTo(false).asBoolean()) {
                     s.isBinary();
                 }
@@ -507,6 +515,14 @@
             return e;
         } catch (final AssertionFailureException e) {
             resourceResultCode = ResourceException.VERSION_MISMATCH;
+        } catch (final ConstraintViolationException e) {
+            final ResultCode rc = e.getResult().getResultCode();
+            if (rc.equals(ResultCode.ENTRY_ALREADY_EXISTS)) {
+                resourceResultCode = ResourceException.VERSION_MISMATCH; // Consistent with MVCC.
+            } else {
+                // Schema violation, etc.
+                resourceResultCode = ResourceException.BAD_REQUEST;
+            }
         } catch (final AuthenticationException e) {
             resourceResultCode = 401;
         } catch (final AuthorizationException e) {

--
Gitblit v1.10.0