From 4465bb9e91d398dcf1a436df73a0c171a4e4f440 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).

---
 opends/src/server/org/opends/server/core/AbandonOperation.java |  346 ---------------------------------------------------------
 1 files changed, 3 insertions(+), 343 deletions(-)

diff --git a/opends/src/server/org/opends/server/core/AbandonOperation.java b/opends/src/server/org/opends/server/core/AbandonOperation.java
index cf2d828..c5f6643 100644
--- a/opends/src/server/org/opends/server/core/AbandonOperation.java
+++ b/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();
 
 }
 

--
Gitblit v1.10.0