From 7b74f935a4ebe00537635b6a76e3c498398e1d85 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Wed, 03 Apr 2013 16:39:18 +0000
Subject: [PATCH] CREST-692: Implement delete support

---
 opendj-sdk/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/LDAPCollectionResourceProvider.java |   43 ++++++++++++++++++++++++++++++++++++++++---
 opendj-sdk/opendj3/opendj-rest2ldap/src/test/java/org/forgerock/opendj/rest2ldap/BasicRequestsTest.java              |    6 +++---
 2 files changed, 43 insertions(+), 6 deletions(-)

diff --git a/opendj-sdk/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/LDAPCollectionResourceProvider.java b/opendj-sdk/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/LDAPCollectionResourceProvider.java
index f2fe99d..cc71506 100644
--- a/opendj-sdk/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/LDAPCollectionResourceProvider.java
+++ b/opendj-sdk/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/LDAPCollectionResourceProvider.java
@@ -64,6 +64,7 @@
 import org.forgerock.opendj.ldap.SearchScope;
 import org.forgerock.opendj.ldap.controls.PostReadRequestControl;
 import org.forgerock.opendj.ldap.controls.PostReadResponseControl;
+import org.forgerock.opendj.ldap.controls.PreReadRequestControl;
 import org.forgerock.opendj.ldap.controls.PreReadResponseControl;
 import org.forgerock.opendj.ldap.requests.AddRequest;
 import org.forgerock.opendj.ldap.requests.Requests;
@@ -71,6 +72,7 @@
 import org.forgerock.opendj.ldap.responses.Result;
 import org.forgerock.opendj.ldap.responses.SearchResultEntry;
 import org.forgerock.opendj.ldap.responses.SearchResultReference;
+import org.forgerock.opendj.ldif.ChangeRecord;
 
 /**
  * A {@code CollectionResourceProvider} implementation which maps a JSON
@@ -162,7 +164,43 @@
     @Override
     public void deleteInstance(final ServerContext context, final String resourceId,
             final DeleteRequest request, final ResultHandler<Resource> handler) {
-        handler.handleError(new NotSupportedException("Not yet implemented"));
+        final Context c = wrap(context);
+        final ResultHandler<Resource> h = wrap(c, handler);
+
+        // FIXME: assertion and subtree delete controls.
+
+        // Get connection then perform the search.
+        c.run(h, new Runnable() {
+            @Override
+            public void run() {
+                // Find the entry and then delete it.
+                final SearchRequest searchRequest =
+                        nameStrategy.createSearchRequest(c, getBaseDN(c), resourceId).addAttribute(
+                                "1.1");
+                c.getConnection().searchSingleEntryAsync(searchRequest,
+                        new org.forgerock.opendj.ldap.ResultHandler<SearchResultEntry>() {
+                            @Override
+                            public void handleErrorResult(final ErrorResultException error) {
+                                h.handleError(asResourceException(error));
+                            }
+
+                            @Override
+                            public void handleResult(final SearchResultEntry entry) {
+                                // Perform delete operation.
+                                final ChangeRecord deleteRequest =
+                                        Requests.newDeleteRequest(entry.getName());
+                                if (config.readOnUpdatePolicy() == CONTROLS) {
+                                    final String[] attributes =
+                                            getLDAPAttributes(c, request.getFields());
+                                    deleteRequest.addControl(PreReadRequestControl.newControl(
+                                            false, attributes));
+                                }
+                                c.getConnection().applyChangeAsync(deleteRequest, null,
+                                        postUpdateHandler(c, h));
+                            }
+                        });
+            }
+        });
     }
 
     @Override
@@ -195,8 +233,7 @@
                             h.handleResult(new QueryResult());
                         } else {
                             // Perform the search.
-                            final String[] attributes =
-                                    getLDAPAttributes(c, request.getFields());
+                            final String[] attributes = getLDAPAttributes(c, request.getFields());
                             final SearchRequest request =
                                     Requests.newSearchRequest(getBaseDN(c),
                                             SearchScope.SINGLE_LEVEL, ldapFilter == Filter
diff --git a/opendj-sdk/opendj3/opendj-rest2ldap/src/test/java/org/forgerock/opendj/rest2ldap/BasicRequestsTest.java b/opendj-sdk/opendj3/opendj-rest2ldap/src/test/java/org/forgerock/opendj/rest2ldap/BasicRequestsTest.java
index 20767ac..68af5c4 100644
--- a/opendj-sdk/opendj3/opendj-rest2ldap/src/test/java/org/forgerock/opendj/rest2ldap/BasicRequestsTest.java
+++ b/opendj-sdk/opendj3/opendj-rest2ldap/src/test/java/org/forgerock/opendj/rest2ldap/BasicRequestsTest.java
@@ -50,7 +50,7 @@
     // so that we can check that the request handler is returning everything.
     // FIXME: factor out test for re-use as common test suite (e.g. for InMemoryBackend).
 
-    @Test(enabled = false)
+    @Test
     public void testDelete() throws Exception {
         final RequestHandler handler = newCollection(builder().build());
         final Connection connection = newInternalConnection(handler);
@@ -64,7 +64,7 @@
         }
     }
 
-    @Test(enabled = false)
+    @Test
     public void testDeleteMVCCMatch() throws Exception {
         final RequestHandler handler = newCollection(builder().build());
         final Connection connection = newInternalConnection(handler);
@@ -86,7 +86,7 @@
         connection.delete(c(), newDeleteRequest("/test1").setRevision("12346"));
     }
 
-    @Test(expectedExceptions = NotFoundException.class, enabled = false)
+    @Test(expectedExceptions = NotFoundException.class)
     public void testDeleteNotFound() throws Exception {
         final RequestHandler handler = newCollection(builder().build());
         final Connection connection = newInternalConnection(handler);

--
Gitblit v1.10.0