AbandonOperationBasis.java revision ea1068c292e9b341af6d6b563cd8988a96be20a9
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * CDDL HEADER START
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The contents of this file are subject to the terms of the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Common Development and Distribution License, Version 1.0 only
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * (the "License"). You may not use this file except in compliance
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * with the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * or http://forgerock.org/license/CDDLv1.0.html.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * See the License for the specific language governing permissions
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * and limitations under the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * When distributing Covered Code, include this CDDL HEADER in each
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * file and include the License file at legal-notices/CDDLv1_0.txt.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * If applicable, add the following below this CDDL HEADER, with the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * fields enclosed by brackets "[]" replaced with your own identifying
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * information:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Portions Copyright [yyyy] [name of copyright owner]
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * CDDL HEADER END
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright 2007-2008 Sun Microsystems, Inc.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Portions Copyright 2013-2015 ForgeRock AS
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpackage org.opends.server.core;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport static org.opends.messages.CoreMessages.*;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport static org.opends.server.loggers.AccessLogger.*;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.List;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.forgerock.i18n.LocalizableMessage;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.opends.server.api.ClientConnection;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.opends.server.api.plugin.PluginResult;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.opends.server.types.*;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.forgerock.opendj.ldap.ResultCode;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.opends.server.types.operation.PostOperationAbandonOperation;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.opends.server.types.operation.PreParseAbandonOperation;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * This class defines an operation that may be used to abandon an operation
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * that may already be in progress in the Directory Server.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpublic class AbandonOperationBasis extends AbstractOperation
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster implements AbandonOperation,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster PreParseAbandonOperation,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster PostOperationAbandonOperation
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /** The message ID of the operation that should be abandoned. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private final int idToAbandon;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Creates a new abandon operation with the provided information.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param clientConnection The client connection with which this operation
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * is associated.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param operationID The operation ID for this operation.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param messageID The message ID of the request with which this
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * operation is associated.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param requestControls The set of controls included in the request.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param idToAbandon The message ID of the operation that should be
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * abandoned.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public AbandonOperationBasis(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ClientConnection clientConnection,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster long operationID,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int messageID,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List<Control> requestControls,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int idToAbandon)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster super(clientConnection, operationID, messageID, requestControls);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.idToAbandon = idToAbandon;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this.cancelResult = new CancelResult(ResultCode.CANNOT_CANCEL,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ERR_CANNOT_CANCEL_ABANDON.get());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Retrieves the message ID of the operation that should be abandoned.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return The message ID of the operation that should be abandoned.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster @Override
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public final int getIDToAbandon()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return idToAbandon;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * {@inheritDoc}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster @Override
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public final OperationType getOperationType()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Note that no debugging will be done in this method because it is a likely
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // candidate for being called by the logging subsystem.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return OperationType.ABANDON;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * {@inheritDoc}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster @Override
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public final List<Control> getResponseControls()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // An abandon operation can never have a response, so just return an empty
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // list.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return NO_RESPONSE_CONTROLS;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * {@inheritDoc}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster @Override
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public final void addResponseControl(Control control)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // An abandon operation can never have a response, so just ignore this.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * {@inheritDoc}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster @Override
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public final void removeResponseControl(Control control)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // An abandon operation can never have a response, so just ignore this.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Performs the work of actually processing this operation. This
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * should include all processing for the operation, including
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * invoking plugins, logging messages, performing access control,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * managing synchronization, and any other work that might need to
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * be done in the course of processing.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster @Override
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public final void run()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster setResultCode(ResultCode.UNDEFINED);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Start the processing timer.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster setProcessingStartTime();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Log the abandon request message.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logAbandonRequest(this);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Get the plugin config manager that will be used for invoking plugins.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster PluginConfigManager pluginConfigManager =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DirectoryServer.getPluginConfigManager();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Create a labeled block of code that we can break out of if a problem is
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // detected.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan FosterabandonProcessing:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Invoke the pre-parse abandon plugins.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster PluginResult.PreParse preParseResult =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster pluginConfigManager.invokePreParseAbandonPlugins(this);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!preParseResult.continueProcessing())
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster setResultCode(preParseResult.getResultCode());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster appendErrorMessage(preParseResult.getErrorMessage());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster setMatchedDN(preParseResult.getMatchedDN());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster setReferralURLs(preParseResult.getReferralURLs());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break abandonProcessing;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Actually perform the abandon operation. Make sure to set the result
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // code to reflect whether the abandon was successful and an error message
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // if it was not. Even though there is no response, the result should
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // still be logged.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Even though it is technically illegal to send a response for
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // operations that have been abandoned, it may be a good idea to do so
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // to ensure that the requestor isn't left hanging. This will be a
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // configurable option in the server.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean notifyRequestor = DirectoryServer.notifyAbandonedOperations();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LocalizableMessage cancelReason = INFO_CANCELED_BY_ABANDON_REQUEST.get(messageID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster CancelRequest _cancelRequest = new CancelRequest(notifyRequestor,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster cancelReason);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster CancelResult result = clientConnection.cancelOperation(idToAbandon,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster _cancelRequest);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster setResultCode(result.getResultCode());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster appendErrorMessage(result.getResponseMessage());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster PluginResult.PostOperation postOpResult =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster pluginConfigManager.invokePostOperationAbandonPlugins(this);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!postOpResult.continueProcessing())
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster setResultCode(preParseResult.getResultCode());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster appendErrorMessage(preParseResult.getErrorMessage());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster setMatchedDN(preParseResult.getMatchedDN());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster setReferralURLs(preParseResult.getReferralURLs());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break abandonProcessing;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Stop the processing timer.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster setProcessingStopTime();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Log the result of the abandon operation.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logAbandonResult(this);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * {@inheritDoc}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster @Override
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public final void toString(StringBuilder buffer)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster buffer.append("AbandonOperation(connID=");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster buffer.append(clientConnection.getConnectionID());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster buffer.append(", opID=");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster buffer.append(operationID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster buffer.append(", idToAbandon=");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster buffer.append(idToAbandon);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster buffer.append(")");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster