From 688ad011aac30561e68c16fcc26d05bcaf6a742f Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Wed, 13 Feb 2013 10:28:47 +0000
Subject: [PATCH] Refactoring work for OPENDJ-687: Implement REST to LDAP adapter for SDK

---
 opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractConnection.java |   97 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 97 insertions(+), 0 deletions(-)

diff --git a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractConnection.java b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractConnection.java
index 09c44b5..e898072 100644
--- a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractConnection.java
+++ b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractConnection.java
@@ -36,7 +36,11 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
+import org.forgerock.opendj.ldap.requests.AddRequest;
+import org.forgerock.opendj.ldap.requests.DeleteRequest;
 import org.forgerock.opendj.ldap.requests.ExtendedRequest;
+import org.forgerock.opendj.ldap.requests.ModifyDNRequest;
+import org.forgerock.opendj.ldap.requests.ModifyRequest;
 import org.forgerock.opendj.ldap.requests.Requests;
 import org.forgerock.opendj.ldap.requests.SearchRequest;
 import org.forgerock.opendj.ldap.responses.BindResult;
@@ -46,6 +50,8 @@
 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;
+import org.forgerock.opendj.ldif.ChangeRecordVisitor;
 import org.forgerock.opendj.ldif.ConnectionEntryReader;
 
 import com.forgerock.opendj.util.Validator;
@@ -206,6 +212,47 @@
 
     }
 
+    // Visitor used for processing synchronous change requests.
+    private static final ChangeRecordVisitor<Object, Connection> SYNC_VISITOR =
+            new ChangeRecordVisitor<Object, Connection>() {
+
+                @Override
+                public Object visitChangeRecord(final Connection p, final AddRequest change) {
+                    try {
+                        return p.add(change);
+                    } catch (final ErrorResultException e) {
+                        return e;
+                    }
+                }
+
+                @Override
+                public Object visitChangeRecord(final Connection p, final DeleteRequest change) {
+                    try {
+                        return p.delete(change);
+                    } catch (final ErrorResultException e) {
+                        return e;
+                    }
+                }
+
+                @Override
+                public Object visitChangeRecord(final Connection p, final ModifyRequest change) {
+                    try {
+                        return p.modify(change);
+                    } catch (final ErrorResultException e) {
+                        return e;
+                    }
+                }
+
+                @Override
+                public Object visitChangeRecord(final Connection p, final ModifyDNRequest change) {
+                    try {
+                        return p.modifyDN(change);
+                    } catch (final ErrorResultException e) {
+                        return e;
+                    }
+                }
+            };
+
     /**
      * Creates a new abstract connection.
      */
@@ -233,6 +280,56 @@
      * {@inheritDoc}
      */
     @Override
+    public Result applyChange(final ChangeRecord request) throws ErrorResultException {
+        final Object result = request.accept(SYNC_VISITOR, this);
+        if (result instanceof Result) {
+            return (Result) result;
+        } else {
+            throw (ErrorResultException) result;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public FutureResult<Result> applyChangeAsync(final ChangeRecord request,
+            final IntermediateResponseHandler intermediateResponseHandler,
+            final ResultHandler<? super Result> resultHandler) {
+        final ChangeRecordVisitor<FutureResult<Result>, Connection> visitor =
+                new ChangeRecordVisitor<FutureResult<Result>, Connection>() {
+
+                    @Override
+                    public FutureResult<Result> visitChangeRecord(final Connection p,
+                            final AddRequest change) {
+                        return p.addAsync(change, intermediateResponseHandler, resultHandler);
+                    }
+
+                    @Override
+                    public FutureResult<Result> visitChangeRecord(final Connection p,
+                            final DeleteRequest change) {
+                        return p.deleteAsync(change, intermediateResponseHandler, resultHandler);
+                    }
+
+                    @Override
+                    public FutureResult<Result> visitChangeRecord(final Connection p,
+                            final ModifyRequest change) {
+                        return p.modifyAsync(change, intermediateResponseHandler, resultHandler);
+                    }
+
+                    @Override
+                    public FutureResult<Result> visitChangeRecord(final Connection p,
+                            final ModifyDNRequest change) {
+                        return p.modifyDNAsync(change, intermediateResponseHandler, resultHandler);
+                    }
+                };
+        return request.accept(visitor, this);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
     public BindResult bind(final String name, final char[] password) throws ErrorResultException {
         return bind(Requests.newSimpleBindRequest(name, password));
     }

--
Gitblit v1.10.0