From b61c9c0ad2812db02dbe57a3048a08d3a1e482be Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Mon, 08 Apr 2013 12:51:11 +0000
Subject: [PATCH] OPENDJ-832 (CR-1519) Leverage the work queue for processing requests received on the HTTP connection handler 

---
 opends/src/server/org/opends/server/protocols/http/SdkConnectionAdapter.java |  110 +++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 74 insertions(+), 36 deletions(-)

diff --git a/opends/src/server/org/opends/server/protocols/http/SdkConnectionAdapter.java b/opends/src/server/org/opends/server/protocols/http/SdkConnectionAdapter.java
index ed97979..9e1d354 100644
--- a/opends/src/server/org/opends/server/protocols/http/SdkConnectionAdapter.java
+++ b/opends/src/server/org/opends/server/protocols/http/SdkConnectionAdapter.java
@@ -56,9 +56,17 @@
 import org.forgerock.opendj.ldap.responses.CompareResult;
 import org.forgerock.opendj.ldap.responses.ExtendedResult;
 import org.forgerock.opendj.ldap.responses.Result;
+import org.opends.server.core.AbandonOperationBasis;
+import org.opends.server.core.AddOperationBasis;
 import org.opends.server.core.BindOperationBasis;
+import org.opends.server.core.CompareOperationBasis;
+import org.opends.server.core.DeleteOperationBasis;
+import org.opends.server.core.ExtendedOperationBasis;
+import org.opends.server.core.ModifyDNOperationBasis;
+import org.opends.server.core.ModifyOperationBasis;
 import org.opends.server.core.QueueingStrategy;
 import org.opends.server.core.SearchOperationBasis;
+import org.opends.server.core.UnbindOperationBasis;
 import org.opends.server.core.WorkQueueStrategy;
 import org.opends.server.loggers.debug.DebugTracer;
 import org.opends.server.types.ByteString;
@@ -107,15 +115,18 @@
     this.clientConnection = clientConnection;
   }
 
-  private <R extends Result> FutureResult<R> enqueueOperation(
+  @SuppressWarnings({ "rawtypes", "unchecked" })
+  private <R> FutureResult<R> enqueueOperation(
       Operation operation, ResultHandler<? super R> resultHandler)
   {
-    // TODO JNR set requestID, but where to get it?
     final AsynchronousFutureResult<R, ResultHandler<? super R>> futureResult =
-       new AsynchronousFutureResult<R, ResultHandler<? super R>>(resultHandler);
+        new AsynchronousFutureResult<R, ResultHandler<? super R>>(
+            resultHandler, operation.getMessageID());
 
     try
     {
+      // need this raw cast here to fool the compiler's generic type safety
+      // Problem here is due to the generic type R on enqueueOperation()
       clientConnection.addOperationInProgress(operation,
           (AsynchronousFutureResult) futureResult);
 
@@ -139,12 +150,12 @@
   @Override
   public FutureResult<Void> abandonAsync(AbandonRequest request)
   {
-    // TODO Auto-generated method stub
-    // for (ConnectionEventListener listener : this.listeners)
-    // {
-    // listener.
-    // }
-    throw new RuntimeException("Not implemented");
+    final int messageID = nextMessageID.getAndIncrement();
+    AbandonOperationBasis operation =
+        new AbandonOperationBasis(clientConnection, messageID, messageID,
+            to(request.getControls()), request.getRequestID());
+
+    return enqueueOperation(operation, null);
   }
 
   /** {@inheritDoc} */
@@ -153,17 +164,13 @@
       IntermediateResponseHandler intermediateResponseHandler,
       ResultHandler<? super Result> resultHandler)
   {
-    // AddOperationBasis operation =
-    // new AddOperationBasis(clientConnection, operationID, messageID,
-    // to(request.getControls()), to(valueOf(request.getName())),
-    // to(request.getAllAttributes()));
+    final int messageID = nextMessageID.getAndIncrement();
+    AddOperationBasis operation =
+        new AddOperationBasis(clientConnection, messageID, messageID,
+            to(request.getControls()), to(valueOf(request.getName())),
+            to(request.getAllAttributes()));
 
-    // DirectoryServer.enqueueRequest(operation);
-
-    // return StaticUtils.getResponseResult(addOperation);
-
-    // TODO Auto-generated method stub
-    throw new RuntimeException("Not implemented");
+    return enqueueOperation(operation, resultHandler);
   }
 
   /** {@inheritDoc} */
@@ -179,7 +186,7 @@
       IntermediateResponseHandler intermediateResponseHandler,
       ResultHandler<? super BindResult> resultHandler)
   {
-    int messageID = nextMessageID.get();
+    final int messageID = nextMessageID.get();
     String userName = request.getName();
     byte[] password = ((SimpleBindRequest) request).getPassword();
     BindOperationBasis operation =
@@ -194,9 +201,15 @@
   @Override
   public void close(UnbindRequest request, String reason)
   {
+    final int messageID = nextMessageID.get();
+    UnbindOperationBasis operation =
+        new UnbindOperationBasis(clientConnection, messageID, messageID,
+            to(request.getControls()));
+
+    // run synchronous
+    operation.run();
+
     isClosed = true;
-    // TODO Auto-generated method stub
-    throw new RuntimeException("Not implemented");
   }
 
   /** {@inheritDoc} */
@@ -205,8 +218,14 @@
       IntermediateResponseHandler intermediateResponseHandler,
       ResultHandler<? super CompareResult> resultHandler)
   {
-    // TODO Auto-generated method stub
-    throw new RuntimeException("Not implemented");
+    final int messageID = nextMessageID.getAndIncrement();
+    CompareOperationBasis operation =
+        new CompareOperationBasis(clientConnection, messageID, messageID,
+            to(request.getControls()), to(valueOf(request.getName())),
+            request.getAttributeDescription().getAttributeType().getOID(),
+            to(request.getAssertionValue()));
+
+    return enqueueOperation(operation, resultHandler);
   }
 
   /** {@inheritDoc} */
@@ -215,8 +234,12 @@
       IntermediateResponseHandler intermediateResponseHandler,
       ResultHandler<? super Result> resultHandler)
   {
-    // TODO Auto-generated method stub
-    throw new RuntimeException("Not implemented");
+    final int messageID = nextMessageID.getAndIncrement();
+    DeleteOperationBasis operation =
+        new DeleteOperationBasis(clientConnection, messageID, messageID,
+            to(request.getControls()), to(valueOf(request.getName())));
+
+    return enqueueOperation(operation, resultHandler);
   }
 
   /** {@inheritDoc} */
@@ -226,8 +249,13 @@
       IntermediateResponseHandler intermediateResponseHandler,
       ResultHandler<? super R> resultHandler)
   {
-    // TODO Auto-generated method stub
-    throw new RuntimeException("Not implemented");
+    final int messageID = nextMessageID.getAndIncrement();
+    ExtendedOperationBasis operation =
+        new ExtendedOperationBasis(this.clientConnection, messageID, messageID,
+            to(request.getControls()), request.getOID(),
+            to(request.getValue()));
+
+    return enqueueOperation(operation, resultHandler);
   }
 
   /** {@inheritDoc} */
@@ -250,8 +278,13 @@
       IntermediateResponseHandler intermediateResponseHandler,
       ResultHandler<? super Result> resultHandler)
   {
-    // TODO Auto-generated method stub
-    throw new RuntimeException("Not implemented");
+    final int messageID = nextMessageID.getAndIncrement();
+    ModifyOperationBasis operation =
+        new ModifyOperationBasis(clientConnection, messageID, messageID,
+            to(request.getControls()), to(request.getName()),
+            toModifications(request.getModifications()));
+
+    return enqueueOperation(operation, resultHandler);
   }
 
   /** {@inheritDoc} */
@@ -260,8 +293,14 @@
       IntermediateResponseHandler intermediateResponseHandler,
       ResultHandler<? super Result> resultHandler)
   {
-    // TODO Auto-generated method stub
-    throw new RuntimeException("Not implemented");
+    final int messageID = nextMessageID.getAndIncrement();
+    ModifyDNOperationBasis operation =
+        new ModifyDNOperationBasis(clientConnection, messageID, messageID,
+            to(request.getControls()), to(request.getName()), to(request
+                .getNewRDN()), request.isDeleteOldRDN(), to(request
+                .getNewSuperior()));
+
+    return enqueueOperation(operation, resultHandler);
   }
 
   /** {@inheritDoc} */
@@ -277,15 +316,14 @@
       final IntermediateResponseHandler intermediateResponseHandler,
       final SearchResultHandler resultHandler)
   {
-    // TODO JNR attributes
-    LinkedHashSet<String> attributes = null;
     final int messageID = nextMessageID.getAndIncrement();
     SearchOperationBasis operation =
         new SearchOperationBasis(clientConnection, messageID, messageID,
             to(request.getControls()), to(valueOf(request.getName())),
             to(request.getScope()), to(request.getDereferenceAliasesPolicy()),
-            request.getSizeLimit(), request.getTimeLimit(), request
-                .isTypesOnly(), to(request.getFilter()), attributes);
+            request.getSizeLimit(), request.getTimeLimit(),
+            request.isTypesOnly(), to(request.getFilter()),
+            new LinkedHashSet<String>(request.getAttributes()));
 
     return enqueueOperation(operation, resultHandler);
   }

--
Gitblit v1.10.0