From 35a408038c1de64a6f13f0e7b246a645e9945e3c Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Tue, 18 Mar 2008 22:44:58 +0000
Subject: [PATCH] With this refactoring:

---
 opends/src/server/org/opends/server/core/ModifyDNOperationBasis.java |  227 ++++++++++++--------------------------------------------
 1 files changed, 50 insertions(+), 177 deletions(-)

diff --git a/opends/src/server/org/opends/server/core/ModifyDNOperationBasis.java b/opends/src/server/org/opends/server/core/ModifyDNOperationBasis.java
index 392d1c2..306e8f6 100644
--- a/opends/src/server/org/opends/server/core/ModifyDNOperationBasis.java
+++ b/opends/src/server/org/opends/server/core/ModifyDNOperationBasis.java
@@ -32,28 +32,14 @@
 import java.util.Iterator;
 import java.util.List;
 import org.opends.server.api.ClientConnection;
-import org.opends.server.api.plugin.PreParsePluginResult;
+import org.opends.server.api.plugin.PluginResult;
 import org.opends.server.protocols.asn1.ASN1OctetString;
-import org.opends.server.types.AbstractOperation;
-import org.opends.server.types.ByteString;
-import org.opends.server.types.CancelRequest;
-import org.opends.server.types.CancelResult;
-import org.opends.server.types.Control;
-import org.opends.server.types.DirectoryException;
-import org.opends.server.types.DisconnectReason;
-import org.opends.server.types.DN;
-import org.opends.server.types.Entry;
-import org.opends.server.types.Modification;
-import org.opends.server.types.Operation;
-import org.opends.server.types.OperationType;
-import org.opends.server.types.RDN;
-import org.opends.server.types.ResultCode;
 import org.opends.server.types.operation.PostResponseModifyDNOperation;
 import org.opends.server.types.operation.PreParseModifyDNOperation;
 import static org.opends.server.core.CoreConstants.*;
 import static org.opends.server.loggers.AccessLogger.*;
 
-import org.opends.server.types.DebugLogLevel;
+import org.opends.server.types.*;
 import org.opends.server.workflowelement.localbackend.*;
 
 import static org.opends.server.loggers.debug.DebugLogger.*;
@@ -94,9 +80,6 @@
   // client.
   private ByteString rawNewSuperior;
 
-  // The cancel request issued for this modify DN operation.
-  private CancelRequest cancelRequest;
-
   // The current DN of the entry.
   private DN entryDN;
 
@@ -451,19 +434,6 @@
    * {@inheritDoc}
    */
   @Override()
-  public final void disconnectClient(DisconnectReason disconnectReason,
-                                     boolean sendNotification, Message message
-  )
-  {
-    clientConnection.disconnect(disconnectReason, sendNotification,
-            message);
-  }
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
   public final String[][] getRequestLogElements()
   {
     // Note that no debugging will be done in this method because it is a likely
@@ -608,68 +578,40 @@
   {
     setResultCode(ResultCode.UNDEFINED);
 
-    // Get the plugin config manager that will be used for invoking plugins.
-    PluginConfigManager pluginConfigManager =
-      DirectoryServer.getPluginConfigManager();
-
     // Start the processing timer.
     setProcessingStartTime();
 
-    // Check for and handle a request to cancel this operation.
-    if (cancelRequest != null)
-    {
-      indicateCancelled(cancelRequest);
-      setProcessingStopTime();
-      return;
-    }
+    // Log the modify DN request message.
+    logModifyDNRequest(this);
 
+    // Get the plugin config manager that will be used for invoking plugins.
+    PluginConfigManager pluginConfigManager =
+        DirectoryServer.getPluginConfigManager();
 
     // This flag is set to true as soon as a workflow has been executed.
     boolean workflowExecuted = false;
 
 
-    // Create a labeled block of code that we can break out of if a problem is
-    // detected.
-modifyDNProcessing:
+    try
     {
+      // Check for and handle a request to cancel this operation.
+      checkIfCanceled(false);
+
       // Invoke the pre-parse modify DN plugins.
-      PreParsePluginResult preParseResult =
-        pluginConfigManager.invokePreParseModifyDNPlugins(this);
-      if (preParseResult.connectionTerminated())
+      PluginResult.PreParse preParseResult =
+          pluginConfigManager.invokePreParseModifyDNPlugins(this);
+
+      if(!preParseResult.continueProcessing())
       {
-        // There's no point in continuing with anything.  Log the request and
-        // result and return.
-        setResultCode(ResultCode.CANCELED);
-
-        appendErrorMessage(ERR_CANCELED_BY_PREPARSE_DISCONNECT.get());
-
-        setProcessingStopTime();
-
-        logModifyDNRequest(this);
-        logModifyDNResponse(this);
-        pluginConfigManager.invokePostResponseModifyDNPlugins(this);
+        setResultCode(preParseResult.getResultCode());
+        appendErrorMessage(preParseResult.getErrorMessage());
+        setMatchedDN(preParseResult.getMatchedDN());
+        setReferralURLs(preParseResult.getReferralURLs());
         return;
       }
-      else if (preParseResult.sendResponseImmediately())
-      {
-        logModifyDNRequest(this);
-        break modifyDNProcessing;
-      }
-      else if (preParseResult.skipCoreProcessing())
-      {
-        break modifyDNProcessing;
-      }
 
-
-      // Log the modify DN request message.
-      logModifyDNRequest(this);
-
-
-      // Check for a request to cancel this operation.
-      if (cancelRequest != null)
-      {
-        break modifyDNProcessing;
-      }
+      // Check for and handle a request to cancel this operation.
+      checkIfCanceled(false);
 
       // Process the entry DN, newRDN, and newSuperior elements from their raw
       // forms as provided by the client to the forms required for the rest of
@@ -677,7 +619,7 @@
       DN entryDN = getEntryDN();
       if (entryDN == null)
       {
-        break modifyDNProcessing;
+        return;
       }
 
       // Retrieve the network group attached to the client connection
@@ -689,59 +631,52 @@
         // We have found no workflow for the requested base DN, just return
         // a no such entry result code and stop the processing.
         updateOperationErrMsgAndResCode();
-        break modifyDNProcessing;
+        return;
       }
       workflow.execute(this);
       workflowExecuted = true;
     }
-
-    // Check for a terminated connection.
-    if (getCancelResult() == CancelResult.CANCELED)
+    catch(CanceledOperationException coe)
     {
-      // Stop the processing timer.
-      setProcessingStopTime();
+      if (debugEnabled())
+      {
+        TRACER.debugCaught(DebugLogLevel.ERROR, coe);
+      }
 
-      // Log the add response message.
-      logModifyDNResponse(this);
+      setResultCode(ResultCode.CANCELED);
+      cancelResult = new CancelResult(ResultCode.CANCELED, null);
 
-      return;
+      appendErrorMessage(coe.getCancelRequest().getCancelReason());
     }
-
-    // Check for and handle a request to cancel this operation.
-    if (cancelRequest != null)
+    finally
     {
-      indicateCancelled(cancelRequest);
-
       // Stop the processing timer.
       setProcessingStopTime();
 
-      // Log the modify DN response message.
+      if(cancelRequest == null || cancelResult == null ||
+          cancelResult.getResultCode() != ResultCode.CANCELED ||
+          cancelRequest.notifyOriginalRequestor() ||
+          DirectoryServer.notifyAbandonedOperations())
+      {
+        clientConnection.sendResponse(this);
+      }
+
+      // Log the modify DN response.
       logModifyDNResponse(this);
 
+      // Notifies any persistent searches that might be registered with the
+      // server.
+      notifyPersistentSearches(workflowExecuted);
+
       // Invoke the post-response modify DN plugins.
       invokePostResponsePlugins(workflowExecuted);
 
-      return;
+      // If no cancel result, set it
+      if(cancelResult == null)
+      {
+        cancelResult = new CancelResult(ResultCode.TOO_LATE, null);
+      }
     }
-
-    // Indicate that it is now too late to attempt to cancel the operation.
-    setCancelResult(CancelResult.TOO_LATE);
-
-    // Stop the processing timer.
-    setProcessingStopTime();
-
-    // Send the modify DN response to the client.
-    clientConnection.sendResponse(this);
-
-    // Log the modify DN response.
-    logModifyDNResponse(this);
-
-    // Notifies any persistent searches that might be registered with the
-    // server.
-    notifyPersistentSearches(workflowExecuted);
-
-    // Invoke the post-response modify DN plugins.
-    invokePostResponsePlugins(workflowExecuted);
   }
 
 
@@ -862,68 +797,6 @@
    * {@inheritDoc}
    */
   @Override()
-  public final CancelResult cancel(CancelRequest cancelRequest)
-  {
-    this.cancelRequest = cancelRequest;
-
-    CancelResult cancelResult = getCancelResult();
-    long stopWaitingTime = System.currentTimeMillis() + 5000;
-    while ((cancelResult == null) &&
-        (System.currentTimeMillis() < stopWaitingTime))
-    {
-      try
-      {
-        Thread.sleep(50);
-      }
-      catch (Exception e)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, e);
-        }
-      }
-
-      cancelResult = getCancelResult();
-    }
-
-    if (cancelResult == null)
-    {
-      // This can happen in some rare cases (e.g., if a client disconnects and
-      // there is still a lot of data to send to that client), and in this case
-      // we'll prevent the cancel thread from blocking for a long period of
-      // time.
-      cancelResult = CancelResult.CANNOT_CANCEL;
-    }
-
-    return cancelResult;
-  }
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public final CancelRequest getCancelRequest()
-  {
-    return cancelRequest;
-  }
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public boolean setCancelRequest(CancelRequest cancelRequest)
-  {
-    this.cancelRequest = cancelRequest;
-    return true;
-  }
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
   public final void toString(StringBuilder buffer)
   {
     buffer.append("ModifyDNOperation(connID=");

--
Gitblit v1.10.0