From 09c6cce8f858c4859deecc65271420740bf00346 Mon Sep 17 00:00:00 2001
From: jdemendi <jdemendi@localhost>
Date: Tue, 17 Jul 2007 07:56:57 +0000
Subject: [PATCH] This fix is the refactoring of the abandon operation (issue #1885).

---
 opendj-sdk/opends/src/server/org/opends/server/core/PluginConfigManager.java                                 |    4 
 opendj-sdk/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendWorkflowElement.java |    7 
 opendj-sdk/opends/src/server/org/opends/server/core/AbandonOperation.java                                    |  346 --------------------------
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/AbandonOperationTestCase.java    |   19 
 opendj-sdk/opends/src/server/org/opends/server/core/AbandonOperationBasis.java                               |  390 ++++++++++++++++++++++++++++++
 opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java                      |    6 
 6 files changed, 413 insertions(+), 359 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/AbandonOperation.java b/opendj-sdk/opends/src/server/org/opends/server/core/AbandonOperation.java
index cf2d828..c5f6643 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/AbandonOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/AbandonOperation.java
@@ -26,361 +26,21 @@
  */
 package org.opends.server.core;
 
-
-
-import static org.opends.server.core.CoreConstants.LOG_ELEMENT_ERROR_MESSAGE;
-import static org.opends.server.core.CoreConstants.LOG_ELEMENT_ID_TO_ABANDON;
-import static org.opends.server.core.CoreConstants.LOG_ELEMENT_PROCESSING_TIME;
-import static org.opends.server.core.CoreConstants.LOG_ELEMENT_RESULT_CODE;
-import static org.opends.server.messages.CoreMessages.*;
-import static org.opends.server.messages.MessageHandler.getMessage;
-
-import java.util.List;
-
-import org.opends.server.api.ClientConnection;
-import org.opends.server.api.plugin.PreParsePluginResult;
-import org.opends.server.loggers.debug.DebugLogger;
-import org.opends.server.loggers.debug.DebugTracer;
-import org.opends.server.types.AbstractOperation;
-import org.opends.server.types.CancelRequest;
-import org.opends.server.types.CancelResult;
-import org.opends.server.types.Control;
-import org.opends.server.types.DisconnectReason;
-import org.opends.server.types.OperationType;
-import org.opends.server.types.ResultCode;
-import org.opends.server.types.operation.PostOperationAbandonOperation;
-import org.opends.server.types.operation.PreParseAbandonOperation;
-
-import static org.opends.server.loggers.AccessLogger.*;
+import org.opends.server.types.Operation;
 
 
 /**
  * This class defines an operation that may be used to abandon an operation that
  * may already be in progress in the Directory Server.
  */
-public class AbandonOperation
-       extends AbstractOperation
-       implements PreParseAbandonOperation, PostOperationAbandonOperation
+public interface AbandonOperation extends Operation
 {
-
-  /**
-   * The tracer object for the debug logger.
-   */
-  private static final DebugTracer TRACER = DebugLogger.getTracer();
-
-  // The message ID of the operation that should be abandoned.
-  private final int idToAbandon;
-
-  /**
-   * Creates a new abandon operation with the provided information.
-   *
-   * @param  clientConnection  The client connection with which this operation
-   *                           is associated.
-   * @param  operationID       The operation ID for this operation.
-   * @param  messageID         The message ID of the request with which this
-   *                           operation is associated.
-   * @param  requestControls   The set of controls included in the request.
-   * @param  idToAbandon       The message ID of the operation that should be
-   *                           abandoned.
-   */
-  public AbandonOperation(ClientConnection clientConnection, long operationID,
-                          int messageID, List<Control> requestControls,
-                          int idToAbandon)
-  {
-    super(clientConnection, operationID, messageID, requestControls);
-
-
-    this.idToAbandon = idToAbandon;
-  }
-
-
-
   /**
    * Retrieves the message ID of the operation that should be abandoned.
    *
    * @return  The message ID of the operation that should be abandoned.
    */
-  public final int getIDToAbandon()
-  {
-    return idToAbandon;
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public final OperationType getOperationType()
-  {
-    // Note that no debugging will be done in this method because it is a likely
-    // candidate for being called by the logging subsystem.
-
-    return OperationType.ABANDON;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public final void disconnectClient(DisconnectReason disconnectReason,
-                                     boolean sendNotification, String message,
-                                     int messageID)
-  {
-    // Since abandon operations can't be cancelled, we don't need to do anything
-    // but forward the request on to the client connection.
-    clientConnection.disconnect(disconnectReason, sendNotification, message,
-                                messageID);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public final String[][] getRequestLogElements()
-  {
-    // Note that no debugging will be done in this method because it is a likely
-    // candidate for being called by the logging subsystem.
-
-    return new String[][]
-    {
-      new String[] { LOG_ELEMENT_ID_TO_ABANDON, String.valueOf(idToAbandon) }
-    };
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public final String[][] getResponseLogElements()
-  {
-    // Note that no debugging will be done in this method because it is a likely
-    // candidate for being called by the logging subsystem.
-
-    // There is no response for an abandon.  However, we will still want to log
-    // information about whether it was successful.
-    String resultCode = String.valueOf(getResultCode().getIntValue());
-
-    String errorMessage;
-    StringBuilder errorMessageBuffer = getErrorMessage();
-    if (errorMessageBuffer == null)
-    {
-      errorMessage = null;
-    }
-    else
-    {
-      errorMessage = errorMessageBuffer.toString();
-    }
-
-    String processingTime =
-         String.valueOf(getProcessingTime());
-
-    return new String[][]
-    {
-      new String[] { LOG_ELEMENT_RESULT_CODE, resultCode },
-      new String[] { LOG_ELEMENT_ERROR_MESSAGE, errorMessage },
-      new String[] { LOG_ELEMENT_PROCESSING_TIME, processingTime }
-    };
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public final List<Control> getResponseControls()
-  {
-    // An abandon operation can never have a response, so just return an empty
-    // list.
-    return NO_RESPONSE_CONTROLS;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public final void addResponseControl(Control control)
-  {
-    // An abandon operation can never have a response, so just ignore this.
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public final void removeResponseControl(Control control)
-  {
-    // An abandon operation can never have a response, so just ignore this.
-  }
-
-
-
-  /**
-   * Performs the work of actually processing this operation.  This
-   * should include all processing for the operation, including
-   * invoking plugins, logging messages, performing access control,
-   * managing synchronization, and any other work that might need to
-   * be done in the course of processing.
-   */
-  public final void run()
-  {
-    setResultCode(ResultCode.UNDEFINED);
-
-
-    // Get the plugin config manager that will be used for invoking plugins.
-    PluginConfigManager pluginConfigManager =
-         DirectoryServer.getPluginConfigManager();
-    boolean skipPostOperation = false;
-
-
-    // Start the processing timer.
-    setProcessingStartTime();
-
-
-    // Create a labeled block of code that we can break out of if a problem is
-    // detected.
-abandonProcessing:
-    {
-      // Invoke the pre-parse abandon plugins.
-      PreParsePluginResult preParseResult =
-           pluginConfigManager.invokePreParseAbandonPlugins(this);
-      if (preParseResult.connectionTerminated())
-      {
-        // There's no point in continuing.  Log the request and result and
-        // return.
-        setResultCode(ResultCode.CANCELED);
-
-        int msgID = MSGID_CANCELED_BY_PREPARSE_DISCONNECT;
-        appendErrorMessage(getMessage(msgID));
-
-        setProcessingStopTime();
-
-        logAbandonRequest(this);
-        logAbandonResult(this);
-        return;
-      }
-      else if (preParseResult.sendResponseImmediately())
-      {
-        skipPostOperation = true;
-        break abandonProcessing;
-      }
-      else if (preParseResult.skipCoreProcessing())
-      {
-        skipPostOperation = false;
-        break abandonProcessing;
-      }
-
-
-      // Log the abandon request message.
-      logAbandonRequest(this);
-
-
-      // Actually perform the abandon operation.  Make sure to set the result
-      // code to reflect whether the abandon was successful and an error message
-      // if it was not.  Even though there is no response, the result should
-      // still be logged.
-      AbstractOperation operation =
-           clientConnection.getOperationInProgress(idToAbandon);
-      if (operation == null)
-      {
-        setResultCode(ResultCode.NO_SUCH_OPERATION);
-        appendErrorMessage(getMessage(MSGID_ABANDON_OP_NO_SUCH_OPERATION,
-                                      idToAbandon));
-      }
-      else
-      {
-        // Even though it is technically illegal to send a response for
-        // operations that have been abandoned, it may be a good idea to do so
-        // to ensure that the requestor isn't left hanging.  This will be a
-        // configurable option in the server.
-        boolean notifyRequestor = DirectoryServer.notifyAbandonedOperations();
-        String cancelReason = getMessage(MSGID_CANCELED_BY_ABANDON_REQUEST,
-                                         messageID);
-        StringBuilder cancelResponse = new StringBuilder();
-        CancelResult result =
-             operation.cancel(new CancelRequest(notifyRequestor, cancelReason,
-                                                cancelResponse));
-        setResultCode(result.getResultCode());
-        setErrorMessage(cancelResponse);
-      }
-    }
-
-
-    // Invoke the post-operation abandon plugins.
-    if (! skipPostOperation)
-    {
-      pluginConfigManager.invokePostOperationAbandonPlugins(this);
-    }
-
-
-    // Stop the processing timer.
-    setProcessingStopTime();
-
-
-    // Log the result of the abandon operation.
-    logAbandonResult(this);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public final CancelResult cancel(CancelRequest cancelRequest)
-  {
-    cancelRequest.addResponseMessage(getMessage(MSGID_CANNOT_CANCEL_ABANDON));
-    return CancelResult.CANNOT_CANCEL;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public final CancelRequest getCancelRequest()
-  {
-    return null;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public boolean setCancelRequest(CancelRequest cancelRequest)
-  {
-    // Abandon operations cannot be canceled.
-    return false;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override()
-  public final void toString(StringBuilder buffer)
-  {
-    buffer.append("AbandonOperation(connID=");
-    buffer.append(clientConnection.getConnectionID());
-    buffer.append(", opID=");
-    buffer.append(operationID);
-    buffer.append(", idToAbandon=");
-    buffer.append(idToAbandon);
-    buffer.append(")");
-  }
+  public int getIDToAbandon();
 
 }
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/AbandonOperationBasis.java b/opendj-sdk/opends/src/server/org/opends/server/core/AbandonOperationBasis.java
new file mode 100644
index 0000000..e497933
--- /dev/null
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/AbandonOperationBasis.java
@@ -0,0 +1,390 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+package org.opends.server.core;
+
+import static org.opends.server.core.CoreConstants.LOG_ELEMENT_ERROR_MESSAGE;
+import static org.opends.server.core.CoreConstants.LOG_ELEMENT_ID_TO_ABANDON;
+import static org.opends.server.core.CoreConstants.LOG_ELEMENT_PROCESSING_TIME;
+import static org.opends.server.core.CoreConstants.LOG_ELEMENT_RESULT_CODE;
+import static org.opends.server.loggers.AccessLogger.logAbandonRequest;
+import static org.opends.server.loggers.AccessLogger.logAbandonResult;
+import static org.opends.server.messages.CoreMessages.*;
+import static org.opends.server.messages.MessageHandler.getMessage;
+
+import java.util.List;
+
+import org.opends.server.api.ClientConnection;
+import org.opends.server.api.plugin.PreParsePluginResult;
+import org.opends.server.loggers.debug.DebugLogger;
+import org.opends.server.loggers.debug.DebugTracer;
+import org.opends.server.types.AbstractOperation;
+import org.opends.server.types.CancelRequest;
+import org.opends.server.types.CancelResult;
+import org.opends.server.types.Control;
+import org.opends.server.types.DisconnectReason;
+import org.opends.server.types.OperationType;
+import org.opends.server.types.ResultCode;
+import org.opends.server.types.operation.PostOperationAbandonOperation;
+import org.opends.server.types.operation.PreParseAbandonOperation;
+
+
+/**
+ * This class defines an operation that may be used to abandon an operation
+ * that may already be in progress in the Directory Server.
+ */
+public class AbandonOperationBasis extends AbstractOperation
+    implements Runnable,
+               AbandonOperation,
+               PreParseAbandonOperation,
+               PostOperationAbandonOperation
+{
+
+  /**
+   * The tracer object for the debug logger.
+   */
+  private static final DebugTracer TRACER = DebugLogger.getTracer();
+
+  // The message ID of the operation that should be abandoned.
+  private final int idToAbandon;
+
+
+  /**
+   * Creates a new abandon operation with the provided information.
+   *
+   * @param  clientConnection  The client connection with which this operation
+   *                           is associated.
+   * @param  operationID       The operation ID for this operation.
+   * @param  messageID         The message ID of the request with which this
+   *                           operation is associated.
+   * @param  requestControls   The set of controls included in the request.
+   * @param  idToAbandon       The message ID of the operation that should be
+   *                           abandoned.
+   */
+  public AbandonOperationBasis(
+      ClientConnection clientConnection,
+      long operationID,
+      int messageID,
+      List<Control> requestControls,
+      int idToAbandon)
+  {
+    super(clientConnection, operationID, messageID, requestControls);
+
+
+    this.idToAbandon = idToAbandon;
+  }
+
+
+
+  /**
+   * Retrieves the message ID of the operation that should be abandoned.
+   *
+   * @return  The message ID of the operation that should be abandoned.
+   */
+  public final int getIDToAbandon()
+  {
+    return idToAbandon;
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final OperationType getOperationType()
+  {
+    // Note that no debugging will be done in this method because it is a likely
+    // candidate for being called by the logging subsystem.
+
+    return OperationType.ABANDON;
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void disconnectClient(DisconnectReason disconnectReason,
+                                     boolean sendNotification, String message,
+                                     int messageID)
+  {
+    // Since abandon operations can't be cancelled, we don't need to do anything
+    // but forward the request on to the client connection.
+    clientConnection.disconnect(disconnectReason, sendNotification, message,
+                                messageID);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final String[][] getRequestLogElements()
+  {
+    // Note that no debugging will be done in this method because it is a likely
+    // candidate for being called by the logging subsystem.
+
+    return new String[][]
+    {
+      new String[] { LOG_ELEMENT_ID_TO_ABANDON, String.valueOf(idToAbandon) }
+    };
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final String[][] getResponseLogElements()
+  {
+    // Note that no debugging will be done in this method because it is a likely
+    // candidate for being called by the logging subsystem.
+
+    // There is no response for an abandon.  However, we will still want to log
+    // information about whether it was successful.
+    String resultCode = String.valueOf(getResultCode().getIntValue());
+
+    String errorMessage;
+    StringBuilder errorMessageBuffer = getErrorMessage();
+    if (errorMessageBuffer == null)
+    {
+      errorMessage = null;
+    }
+    else
+    {
+      errorMessage = errorMessageBuffer.toString();
+    }
+
+    String processingTime =
+         String.valueOf(getProcessingTime());
+
+    return new String[][]
+    {
+      new String[] { LOG_ELEMENT_RESULT_CODE, resultCode },
+      new String[] { LOG_ELEMENT_ERROR_MESSAGE, errorMessage },
+      new String[] { LOG_ELEMENT_PROCESSING_TIME, processingTime }
+    };
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final List<Control> getResponseControls()
+  {
+    // An abandon operation can never have a response, so just return an empty
+    // list.
+    return NO_RESPONSE_CONTROLS;
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void addResponseControl(Control control)
+  {
+    // An abandon operation can never have a response, so just ignore this.
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void removeResponseControl(Control control)
+  {
+    // An abandon operation can never have a response, so just ignore this.
+  }
+
+
+
+  /**
+   * Performs the work of actually processing this operation.  This
+   * should include all processing for the operation, including
+   * invoking plugins, logging messages, performing access control,
+   * managing synchronization, and any other work that might need to
+   * be done in the course of processing.
+   */
+  public final void run()
+  {
+    setResultCode(ResultCode.UNDEFINED);
+
+
+    // Get the plugin config manager that will be used for invoking plugins.
+    PluginConfigManager pluginConfigManager =
+         DirectoryServer.getPluginConfigManager();
+    boolean skipPostOperation = false;
+
+
+    // Start the processing timer.
+    setProcessingStartTime();
+
+
+    // Create a labeled block of code that we can break out of if a problem is
+    // detected.
+abandonProcessing:
+    {
+      // Invoke the pre-parse abandon plugins.
+      PreParsePluginResult preParseResult =
+           pluginConfigManager.invokePreParseAbandonPlugins(this);
+      if (preParseResult.connectionTerminated())
+      {
+        // There's no point in continuing.  Log the request and result and
+        // return.
+        setResultCode(ResultCode.CANCELED);
+
+        int msgID = MSGID_CANCELED_BY_PREPARSE_DISCONNECT;
+        appendErrorMessage(getMessage(msgID));
+
+        setProcessingStopTime();
+
+        logAbandonRequest(this);
+        logAbandonResult(this);
+        return;
+      }
+      else if (preParseResult.sendResponseImmediately())
+      {
+        skipPostOperation = true;
+        break abandonProcessing;
+      }
+      else if (preParseResult.skipCoreProcessing())
+      {
+        skipPostOperation = false;
+        break abandonProcessing;
+      }
+
+
+      // Log the abandon request message.
+      logAbandonRequest(this);
+
+
+      // Actually perform the abandon operation.  Make sure to set the result
+      // code to reflect whether the abandon was successful and an error message
+      // if it was not.  Even though there is no response, the result should
+      // still be logged.
+      AbstractOperation operation =
+           clientConnection.getOperationInProgress(idToAbandon);
+      if (operation == null)
+      {
+        setResultCode(ResultCode.NO_SUCH_OPERATION);
+        appendErrorMessage(getMessage(MSGID_ABANDON_OP_NO_SUCH_OPERATION,
+                                      idToAbandon));
+      }
+      else
+      {
+        // Even though it is technically illegal to send a response for
+        // operations that have been abandoned, it may be a good idea to do so
+        // to ensure that the requestor isn't left hanging.  This will be a
+        // configurable option in the server.
+        boolean notifyRequestor = DirectoryServer.notifyAbandonedOperations();
+        String cancelReason = getMessage(MSGID_CANCELED_BY_ABANDON_REQUEST,
+                                         messageID);
+        StringBuilder cancelResponse = new StringBuilder();
+        CancelResult result =
+             operation.cancel(new CancelRequest(notifyRequestor, cancelReason,
+                                                cancelResponse));
+        setResultCode(result.getResultCode());
+        setErrorMessage(cancelResponse);
+      }
+    }
+
+
+    // Invoke the post-operation abandon plugins.
+    if (! skipPostOperation)
+    {
+      pluginConfigManager.invokePostOperationAbandonPlugins(this);
+    }
+
+
+    // Stop the processing timer.
+    setProcessingStopTime();
+
+
+    // Log the result of the abandon operation.
+    logAbandonResult(this);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final CancelResult cancel(CancelRequest cancelRequest)
+  {
+    cancelRequest.addResponseMessage(getMessage(MSGID_CANNOT_CANCEL_ABANDON));
+    return CancelResult.CANNOT_CANCEL;
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final CancelRequest getCancelRequest()
+  {
+    return null;
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public boolean setCancelRequest(CancelRequest cancelRequest)
+  {
+    // Abandon operations cannot be canceled.
+    return false;
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public final void toString(StringBuilder buffer)
+  {
+    buffer.append("AbandonOperation(connID=");
+    buffer.append(clientConnection.getConnectionID());
+    buffer.append(", opID=");
+    buffer.append(operationID);
+    buffer.append(", idToAbandon=");
+    buffer.append(idToAbandon);
+    buffer.append(")");
+  }
+}
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/PluginConfigManager.java b/opendj-sdk/opends/src/server/org/opends/server/core/PluginConfigManager.java
index cde00ad..223c382 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/PluginConfigManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/PluginConfigManager.java
@@ -1733,7 +1733,7 @@
    * @return  The result of processing the pre-parse abandon plugins.
    */
   public PreParsePluginResult invokePreParseAbandonPlugins(
-                                   AbandonOperation abandonOperation)
+                                   AbandonOperationBasis abandonOperation)
   {
     PreParsePluginResult result = null;
 
@@ -3201,7 +3201,7 @@
    * @return  The result of processing the post-operation abandon plugins.
    */
   public PostOperationPluginResult invokePostOperationAbandonPlugins(
-                                        AbandonOperation abandonOperation)
+                                        AbandonOperationBasis abandonOperation)
   {
     PostOperationPluginResult result = null;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java b/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
index 518f834..9a4bea1 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
@@ -53,7 +53,7 @@
 import org.opends.server.api.ClientConnection;
 import org.opends.server.api.ConnectionHandler;
 import org.opends.server.api.ConnectionSecurityProvider;
-import org.opends.server.core.AbandonOperation;
+import org.opends.server.core.AbandonOperationBasis;
 import org.opends.server.core.AddOperationBasis;
 import org.opends.server.core.BindOperationBasis;
 import org.opends.server.core.CompareOperationBasis;
@@ -1832,8 +1832,8 @@
                                         ArrayList<Control> controls)
   {
     AbandonRequestProtocolOp protocolOp = message.getAbandonRequestProtocolOp();
-    AbandonOperation abandonOp =
-         new AbandonOperation(this, nextOperationID.getAndIncrement(),
+    AbandonOperationBasis abandonOp =
+         new AbandonOperationBasis(this, nextOperationID.getAndIncrement(),
                               message.getMessageID(), controls,
                               protocolOp.getIDToAbandon());
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendWorkflowElement.java b/opendj-sdk/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendWorkflowElement.java
index 5f95e28..7d85435 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendWorkflowElement.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendWorkflowElement.java
@@ -182,9 +182,12 @@
     case COMPARE:
       processCompare((CompareOperation) operation);
       break;
+    case ABANDON:
+      // There is no processing for an abandon operation.
+      break;
     default:
-      // jdemendi - temporary code, just make sure that we don't fell into
-      // that incomplete code...
+      // jdemendi - temporary code, just make sure that we are not falling
+      // into that incomplete code...
       Validator.ensureTrue(false);
       break;
     }
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/AbandonOperationTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/AbandonOperationTestCase.java
index efa7e1f..539591b 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/AbandonOperationTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/AbandonOperationTestCase.java
@@ -101,7 +101,8 @@
 
     return new Operation[]
     {
-      new AbandonOperation(conn, conn.nextOperationID(), conn.nextMessageID(),
+      new AbandonOperationBasis(conn, conn.nextOperationID(),
+                           conn.nextMessageID(),
                            new ArrayList<Control>(), 1)
     };
   }
@@ -117,8 +118,8 @@
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
 
-    AbandonOperation abandonOperation =
-         new AbandonOperation(conn, conn.nextOperationID(),
+    AbandonOperationBasis abandonOperation =
+         new AbandonOperationBasis(conn, conn.nextOperationID(),
                   conn.nextMessageID(), new ArrayList<Control>(), 1);
     assertEquals(abandonOperation.getIDToAbandon(), 1);
   }
@@ -134,8 +135,8 @@
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
 
-    AbandonOperation abandonOperation =
-         new AbandonOperation(conn, conn.nextOperationID(),
+    AbandonOperationBasis abandonOperation =
+         new AbandonOperationBasis(conn, conn.nextOperationID(),
                   conn.nextMessageID(), new ArrayList<Control>(), 1);
 
     CancelRequest cancelRequest = new CancelRequest(true, "Test Cancel");
@@ -154,8 +155,8 @@
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
 
-    AbandonOperation abandonOperation =
-         new AbandonOperation(conn, conn.nextOperationID(),
+    AbandonOperationBasis abandonOperation =
+         new AbandonOperationBasis(conn, conn.nextOperationID(),
                   conn.nextMessageID(), new ArrayList<Control>(), 1);
     assertNull(abandonOperation.getCancelRequest());
   }
@@ -191,8 +192,8 @@
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
 
-    AbandonOperation abandonOperation =
-         new AbandonOperation(conn, conn.nextOperationID(),
+    AbandonOperationBasis abandonOperation =
+         new AbandonOperationBasis(conn, conn.nextOperationID(),
                   conn.nextMessageID(), new ArrayList<Control>(), 1);
     abandonOperation.run();
     assertEquals(abandonOperation.getResultCode(),

--
Gitblit v1.10.0