mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

boli
18.44.2008 35a408038c1de64a6f13f0e7b246a645e9945e3c
opends/src/messages/messages/core.properties
@@ -1764,3 +1764,7 @@
 Directory Server
NOTICE_VERSION_698=%s
NOTICE_BUILD_ID_699=Build ID:                 %s
MILD_ERR_CANNOT_CANCEL_START_TLS_700=Start TLS extended operations cannot be \
  canceled
MILD_ERR_CANNOT_CANCEL_CANCEL_701=Cancel extended operations can not be \
  canceled
opends/src/server/org/opends/server/api/Backend.java
@@ -47,7 +47,7 @@
import org.opends.server.types.AttributeType;
import org.opends.server.types.BackupConfig;
import org.opends.server.types.BackupDirectory;
import org.opends.server.types.CancelledOperationException;
import org.opends.server.types.CanceledOperationException;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.DN;
import org.opends.server.types.Entry;
@@ -531,14 +531,14 @@
   * @throws  DirectoryException  If a problem occurs while trying to
   *                              add the entry.
   *
   * @throws  CancelledOperationException  If this backend noticed and
   * @throws CanceledOperationException  If this backend noticed and
   *                                       reacted to a request to
   *                                       cancel or abandon the add
   *                                       operation.
   */
  public abstract void addEntry(Entry entry,
                                AddOperation addOperation)
         throws DirectoryException, CancelledOperationException;
         throws DirectoryException, CanceledOperationException;
@@ -560,14 +560,14 @@
   * @throws  DirectoryException  If a problem occurs while trying to
   *                              remove the entry.
   *
   * @throws  CancelledOperationException  If this backend noticed and
   * @throws CanceledOperationException  If this backend noticed and
   *                                       reacted to a request to
   *                                       cancel or abandon the
   *                                       delete operation.
   */
  public abstract void deleteEntry(DN entryDN,
                                   DeleteOperation deleteOperation)
         throws DirectoryException, CancelledOperationException;
         throws DirectoryException, CanceledOperationException;
@@ -587,14 +587,14 @@
   * @throws  DirectoryException  If a problem occurs while trying to
   *                              replace the entry.
   *
   * @throws  CancelledOperationException  If this backend noticed and
   * @throws CanceledOperationException  If this backend noticed and
   *                                       reacted to a request to
   *                                       cancel or abandon the
   *                                       modify operation.
   */
  public abstract void replaceEntry(Entry entry,
                                    ModifyOperation modifyOperation)
         throws DirectoryException, CancelledOperationException;
         throws DirectoryException, CanceledOperationException;
@@ -617,14 +617,14 @@
   * @throws  DirectoryException  If a problem occurs while trying to
   *                              perform the rename.
   *
   * @throws  CancelledOperationException  If this backend noticed and
   * @throws CanceledOperationException  If this backend noticed and
   *                                       reacted to a request to
   *                                       cancel or abandon the
   *                                       modify DN operation.
   */
  public abstract void renameEntry(DN currentDN, Entry entry,
                            ModifyDNOperation modifyDNOperation)
         throws DirectoryException, CancelledOperationException;
         throws DirectoryException, CanceledOperationException;
@@ -639,13 +639,13 @@
   * @throws  DirectoryException  If a problem occurs while processing
   *                              the search.
   *
   * @throws  CancelledOperationException  If this backend noticed and
   * @throws CanceledOperationException  If this backend noticed and
   *                                       reacted to a request to
   *                                       cancel or abandon the
   *                                       search operation.
   */
  public abstract void search(SearchOperation searchOperation)
         throws DirectoryException, CancelledOperationException;
         throws DirectoryException, CanceledOperationException;
opends/src/server/org/opends/server/api/ClientConnection.java
@@ -38,7 +38,7 @@
import java.util.concurrent.CopyOnWriteArrayList;
import org.opends.messages.Message;
import org.opends.server.api.plugin.IntermediateResponsePluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.PersistentSearch;
import org.opends.server.core.PluginConfigManager;
@@ -537,18 +537,18 @@
    // message.
    PluginConfigManager pluginConfigManager =
         DirectoryServer.getPluginConfigManager();
    IntermediateResponsePluginResult pluginResult =
    PluginResult.IntermediateResponse pluginResult =
         pluginConfigManager.invokeIntermediateResponsePlugins(
                                  intermediateResponse);
    boolean continueProcessing = true;
    if (pluginResult.sendIntermediateResponse())
    if (pluginResult.sendResponse())
    {
      continueProcessing =
           sendIntermediateResponseMessage(intermediateResponse);
    }
    return (continueProcessing && pluginResult.continueOperation());
    return (continueProcessing && pluginResult.continueProcessing());
  }
opends/src/server/org/opends/server/api/SynchronizationProvider.java
@@ -162,7 +162,7 @@
         throws DirectoryException
  {
    // No processing is required by default.
    return new SynchronizationProviderResult(true);
    return new SynchronizationProviderResult.ContinueProcessing();
  }
@@ -232,7 +232,7 @@
         throws DirectoryException
  {
    // No processing is required by default.
    return new SynchronizationProviderResult(true);
    return new SynchronizationProviderResult.ContinueProcessing();
  }
@@ -302,7 +302,7 @@
         throws DirectoryException
  {
    // No processing is required by default.
    return new SynchronizationProviderResult(true);
    return new SynchronizationProviderResult.ContinueProcessing();
  }
@@ -372,7 +372,7 @@
         throws DirectoryException
  {
    // No processing is required by default.
    return new SynchronizationProviderResult(true);
    return new SynchronizationProviderResult.ContinueProcessing();
  }
opends/src/server/org/opends/server/api/plugin/DirectoryServerPlugin.java
@@ -35,16 +35,7 @@
import org.opends.server.admin.std.server.PluginCfg;
import org.opends.server.api.ClientConnection;
import org.opends.server.config.ConfigException;
import org.opends.server.types.DisconnectReason;
import org.opends.server.types.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.InitializationException;
import org.opends.server.types.IntermediateResponse;
import org.opends.server.types.LDIFImportConfig;
import org.opends.server.types.LDIFExportConfig;
import org.opends.server.types.Modification;
import org.opends.server.types.SearchResultEntry;
import org.opends.server.types.SearchResultReference;
import org.opends.server.types.*;
import org.opends.server.types.operation.*;
import static org.opends.messages.PluginMessages.*;
@@ -247,7 +238,7 @@
   *
   * @return  The result of the startup plugin processing.
   */
  public StartupPluginResult doStartup()
  public PluginResult.Startup doStartup()
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.get(
        String.valueOf(pluginDN), PluginType.STARTUP.getName());
@@ -285,7 +276,7 @@
   *
   * @return  The result of the plugin processing.
   */
  public PostConnectPluginResult doPostConnect(ClientConnection
  public PluginResult.PostConnect doPostConnect(ClientConnection
                                                    clientConnection)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.get(
@@ -309,7 +300,7 @@
   *
   * @return  The result of the plugin processing.
   */
  public PostDisconnectPluginResult
  public PluginResult.PostDisconnect
              doPostDisconnect(ClientConnection clientConnection,
                               DisconnectReason disconnectReason,
                               Message message)
@@ -334,8 +325,8 @@
   *
   * @return  The result of the plugin processing.
   */
  public LDIFPluginResult doLDIFImport(LDIFImportConfig importConfig,
                                       Entry entry)
  public PluginResult.ImportLDIF
    doLDIFImport(LDIFImportConfig importConfig, Entry entry)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.get(
        String.valueOf(pluginDN), PluginType.LDIF_IMPORT.getName());
@@ -354,8 +345,8 @@
   *
   * @return  The result of the plugin processing.
   */
  public LDIFPluginResult doLDIFExport(LDIFExportConfig exportConfig,
                                       Entry entry)
  public PluginResult.ImportLDIF
    doLDIFExport(LDIFExportConfig exportConfig, Entry entry)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.get(
        String.valueOf(pluginDN), PluginType.LDIF_EXPORT.getName());
@@ -373,7 +364,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseAbandonOperation abandonOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -394,7 +385,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationAbandonOperation abandonOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -412,10 +403,13 @@
   * @param  addOperation  The add operation that has been requested.
   *
   * @return  Information about the result of the plugin processing.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseAddOperation addOperation)
  {
       throws CanceledOperationException {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.get(
        String.valueOf(pluginDN), PluginType.PRE_PARSE_ADD.getName());
    throw new UnsupportedOperationException(message.toString());
@@ -433,10 +427,13 @@
   * @param  addOperation  The add operation to be processed.
   *
   * @return  Information about the result of the plugin processing.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationAddOperation addOperation)
  {
      throws CanceledOperationException {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
        get(String.valueOf(pluginDN),
            PluginType.PRE_OPERATION_ADD.getName());
@@ -456,7 +453,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationAddOperation addOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -478,7 +475,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseAddOperation addOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -517,7 +514,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseBindOperation bindOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -537,7 +534,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationBindOperation bindOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -559,7 +556,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationBindOperation bindOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -581,7 +578,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseBindOperation bindOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -600,10 +597,13 @@
   *                           requested.
   *
   * @return  Information about the result of the plugin processing.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseCompareOperation compareOperation)
  {
       throws CanceledOperationException {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
        get(String.valueOf(pluginDN),
            PluginType.PRE_PARSE_COMPARE.getName());
@@ -620,10 +620,13 @@
   * @param  compareOperation  The compare operation to be processed.
   *
   * @return  Information about the result of the plugin processing.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationCompareOperation compareOperation)
  {
      throws CanceledOperationException {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
        get(String.valueOf(pluginDN),
            PluginType.PRE_OPERATION_COMPARE.getName());
@@ -643,7 +646,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationCompareOperation compareOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -665,7 +668,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseCompareOperation compareOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -684,10 +687,13 @@
   *                          requested.
   *
   * @return  Information about the result of the plugin processing.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseDeleteOperation deleteOperation)
  {
       throws CanceledOperationException {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
        get(String.valueOf(pluginDN),
            PluginType.PRE_PARSE_DELETE.getName());
@@ -706,10 +712,13 @@
   * @param  deleteOperation  The delete operation to be processed.
   *
   * @return  Information about the result of the plugin processing.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationDeleteOperation deleteOperation)
  {
      throws CanceledOperationException {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
        get(String.valueOf(pluginDN),
            PluginType.PRE_OPERATION_DELETE.getName());
@@ -729,7 +738,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationDeleteOperation deleteOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -751,7 +760,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseDeleteOperation deleteOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -789,10 +798,13 @@
   *                            requested.
   *
   * @return  Information about the result of the plugin processing.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseExtendedOperation extendedOperation)
  {
       throws CanceledOperationException {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
        get(String.valueOf(pluginDN),
            PluginType.PRE_PARSE_EXTENDED.getName());
@@ -810,10 +822,13 @@
   *                            processed.
   *
   * @return  Information about the result of the plugin processing.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationExtendedOperation extendedOperation)
  {
      throws CanceledOperationException {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
        get(String.valueOf(pluginDN),
            PluginType.PRE_OPERATION_EXTENDED.getName());
@@ -834,7 +849,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationExtendedOperation
                            extendedOperation)
  {
@@ -857,7 +872,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseExtendedOperation extendedOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -876,10 +891,13 @@
   *                          requested.
   *
   * @return  Information about the result of the plugin processing.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseModifyOperation modifyOperation)
  {
       throws CanceledOperationException {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
        get(String.valueOf(pluginDN),
            PluginType.PRE_PARSE_MODIFY.getName());
@@ -898,10 +916,13 @@
   * @param  modifyOperation  The modify operation to be processed.
   *
   * @return  Information about the result of the plugin processing.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationModifyOperation modifyOperation)
  {
      throws CanceledOperationException {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
        get(String.valueOf(pluginDN),
            PluginType.PRE_OPERATION_MODIFY.getName());
@@ -921,7 +942,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationModifyOperation modifyOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -943,7 +964,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseModifyOperation modifyOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -981,10 +1002,13 @@
   *                            requested.
   *
   * @return  Information about the result of the plugin processing.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseModifyDNOperation modifyDNOperation)
  {
       throws CanceledOperationException {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
        get(String.valueOf(pluginDN),
            PluginType.PRE_PARSE_MODIFY_DN.getName());
@@ -1004,10 +1028,13 @@
   *                            processed.
   *
   * @return  Information about the result of the plugin processing.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationModifyDNOperation modifyDNOperation)
  {
      throws CanceledOperationException {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
        get(String.valueOf(pluginDN),
            PluginType.PRE_OPERATION_MODIFY_DN.getName());
@@ -1042,7 +1069,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public SubordinateModifyDNPluginResult
  public PluginResult.SubordinateModifyDN
       processSubordinateModifyDN(SubordinateModifyDNOperation
                                       modifyDNOperation,
                                  Entry oldEntry, Entry newEntry,
@@ -1067,7 +1094,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationModifyDNOperation
                            modifyDNOperation)
  {
@@ -1090,7 +1117,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseModifyDNOperation modifyDNOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -1129,10 +1156,13 @@
   *                          requested.
   *
   * @return  Information about the result of the plugin processing.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseSearchOperation searchOperation)
  {
       throws CanceledOperationException {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
        get(String.valueOf(pluginDN),
            PluginType.PRE_PARSE_SEARCH.getName());
@@ -1149,10 +1179,13 @@
   * @param  searchOperation  The search operation to be processed.
   *
   * @return  Information about the result of the plugin processing.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationSearchOperation searchOperation)
  {
      throws CanceledOperationException {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
        get(String.valueOf(pluginDN),
            PluginType.PRE_OPERATION_SEARCH.getName());
@@ -1177,7 +1210,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public SearchEntryPluginResult
  public PluginResult.IntermediateResponse
       processSearchEntry(SearchEntrySearchOperation searchOperation,
                          SearchResultEntry searchEntry)
  {
@@ -1201,7 +1234,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public SearchReferencePluginResult
  public PluginResult.IntermediateResponse
       processSearchReference(SearchReferenceSearchOperation
                                   searchOperation,
                              SearchResultReference searchReference)
@@ -1225,7 +1258,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationSearchOperation searchOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -1247,7 +1280,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseSearchOperation searchOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -1267,7 +1300,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseUnbindOperation unbindOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -1288,7 +1321,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationUnbindOperation unbindOperation)
  {
    Message message = ERR_PLUGIN_TYPE_NOT_SUPPORTED.
@@ -1308,7 +1341,7 @@
   *
   * @return  Information about the result of the plugin processing.
   */
  public IntermediateResponsePluginResult
  public PluginResult.IntermediateResponse
              processIntermediateResponse(
                   IntermediateResponse intermediateResponse)
  {
opends/src/server/org/opends/server/api/plugin/IntermediateResponsePluginResult.java
File was deleted
opends/src/server/org/opends/server/api/plugin/LDIFPluginResult.java
File was deleted
opends/src/server/org/opends/server/api/plugin/PluginResult.java
New file
@@ -0,0 +1,1477 @@
/*
 * 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
 *
 *
 *      Copyright 2006-2008 Sun Microsystems, Inc.
 */
package org.opends.server.api.plugin;
import org.opends.messages.Message;
import org.opends.server.types.ResultCode;
import org.opends.server.types.DN;
import org.opends.server.types.DisconnectReason;
import java.util.List;
/**
 * This class defines a data structure that holds information about
 * the result of processing by a plugin.
 */
@org.opends.server.types.PublicAPI(
    stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
    mayInstantiate=true,
    mayExtend=false,
    mayInvoke=true)
public final class PluginResult
{
  /**
   * Defines a startup plugin result consisting of either continue
   * skip further plugins, or stop startup with an error message.
   */
  public static final class Startup
  {
    // Whether to continue startup.
    private final boolean continueProcessing;
    // Whether to invoke the rest of the plugins.
    private final boolean continuePluginProcessing;
    // An message explaining why startup should stop.
    private final Message errorMessage;
    private static Startup DEFAULT_RESULT =
        new Startup(true, true, null);
    /**
     * Construct a new startup plugin result.
     *
     * @param continueProcessing Whether to continue startup.
     * @param continuePluginProcessing Whether to invoke the rest
     * of the plugins.
     * @param errorMessage An message explaining why startup should
     * stop.
     */
    private Startup(boolean continueProcessing,
                    boolean continuePluginProcessing,
                    Message errorMessage)
    {
      this.continueProcessing = continueProcessing;
      this.errorMessage = errorMessage;
      this.continuePluginProcessing = continuePluginProcessing;
    }
    /**
     * Defines a continue processing startup plugin result.
     *
     * @return a continue processing startup plugin result.
     */
    public static Startup continueStartup()
    {
      return DEFAULT_RESULT;
    }
    /**
     * Defines a skip further plugin processing startup plugin result.
     *
     * @return  a skip further plugin processing startup plugin
     * result.
     */
    public static Startup skipFurtherPluginProcesssing()
    {
      return new Startup(true, false, null);
    }
    /**
     * Defines a new stop processing startup plugin result.
     *
     * @param errorMessage An message explaining why processing
     * should stop for the given entry.
     *
     * @return a new stop processing startup plugin result.
     */
    public static Startup stopStartup(Message errorMessage)
    {
      return new Startup(false, false, errorMessage);
    }
    /**
     * Whether to continue startup.
     *
     * @return <code>true</code> if processing should continue
     * or <code>false</code> otherwise.
     */
    public boolean continueProcessing()
    {
      return continueProcessing;
    }
    /**
     * Whether to invoke the rest of the plugins.
     *
     * @return <code>true</code> if the rest of the plugins should
     * be invoked for <code>false</code> to skip the rest of the
     * plugins.
     */
    public boolean continuePluginProcessing()
    {
      return continuePluginProcessing;
    }
    /**
     * Retrieves the error message if <code>continueProcessing</code>
     * returned <code>false</code>.
     *
     * @return An error message explaining why processing should
     * stop or <code>null</code> if none is provided.
     */
    public Message getErrorMessage()
    {
      return errorMessage;
    }
  }
  /**
   * Defines a pre parse plugin result for core server operation
   * processing consisting of either continue, skip further
   * plugins, or stop operation processing with a result code,
   * matched DN, referral URLs, and error message.
   */
  public static final class PreParse
  {
    // Whether to continue operation processing.
    private final boolean continueProcessing;
    // Whether to invoke the rest of the plugins.
    private final boolean continuePluginProcessing;
    // An message explaining why processing should stop.
    private final Message errorMessage;
    // The matched DN for this result.
    private final DN matchedDN;
    // The set of referral URLs for this result.
    private final List<String> referralURLs;
    // The result code for this result.
    private final ResultCode resultCode;
    private static PreParse DEFAULT_RESULT =
        new PreParse(true, true, null, null, null, null);
    /**
     * Construct a new pre parse plugin result.
     *
     * @param continueProcessing Whether to continue startup.
     * @param continuePluginProcessing Whether to invoke the rest
     * of the plugins.
     * @param errorMessage An message explaining why processing
     * should stop.
     * @param resultCode The result code for this result.
     * @param matchedDN The matched DN for this result.
     * @param referralURLs The set of referral URLs for this result.
     * stop.
     */
    private PreParse (boolean continueProcessing,
                      boolean continuePluginProcessing,
                      Message errorMessage,
                      ResultCode resultCode, DN matchedDN,
                      List<String> referralURLs)
    {
      this.continueProcessing = continueProcessing;
      this.errorMessage = errorMessage;
      this.continuePluginProcessing = continuePluginProcessing;
      this.resultCode = resultCode;
      this.matchedDN = matchedDN;
      this.referralURLs = referralURLs;
    }
    /**
     * Defines a continue processing pre parse plugin result.
     *
     * @return a continue processing pre parse plugin result.
     */
    public static PreParse continueOperationProcessing()
    {
      return DEFAULT_RESULT;
    }
    /**
     * Defines a skip further plugin processing pre parse plugin
     * result.
     *
     * @return  a skip further plugin processing pre parse plugin
     * result.
     */
    public static PreParse skipFurtherPluginProcesssing()
    {
      return new PreParse(true, false, null, null, null, null);
    }
    /**
     * Defines a new stop processing pre parse plugin result.
     *
     * @param resultCode The result code for this result.
     * @param errorMessage An message explaining why processing
     * should stop.
     * @param matchedDN The matched DN for this result.
     * @param referralURLs The set of referral URLs for this result.
     *
     * @return a new stop processing pre parse plugin result.
     */
    public static PreParse stopProcessing(ResultCode resultCode,
                                          Message errorMessage,
                                          DN matchedDN,
                                          List<String> referralURLs)
    {
      return new PreParse(false, false, errorMessage, resultCode,
          matchedDN, referralURLs);
    }
    /**
     * Contrust a new stop processing pre parse plugin result.
     *
     * @param resultCode The result code for this result.
     * @param errorMessage An message explaining why processing
     * should stop.
     *
     * @return a new stop processing pre parse plugin result.
     */
    public static PreParse stopProcessing(ResultCode resultCode,
                                          Message errorMessage)
    {
      return new PreParse(false, false, errorMessage, resultCode,
          null, null);
    }
    /**
     * Whether to continue operation processing.
     *
     * @return <code>true</code> if processing should continue
     * or <code>false</code> otherwise.
     */
    public boolean continueProcessing()
    {
      return continueProcessing;
    }
    /**
     * Whether to invoke the rest of the plugins.
     *
     * @return <code>true</code> if the rest of the plugins should
     * be invoked for <code>false</code> to skip the rest of the
     * plugins.
     */
    public boolean continuePluginProcessing()
    {
      return continuePluginProcessing;
    }
    /**
     * Retrieves the error message if <code>continueProcessing</code>
     * returned <code>false</code>.
     *
     * @return An error message explaining why processing should
     * stop or <code>null</code> if none is provided.
     */
    public Message getErrorMessage()
    {
      return errorMessage;
    }
    /**
     * Retrieves the result code for the operation
     * if <code>continueProcessing</code> returned <code>false</code>.
     *
     * @return the result code for the operation or <code>null</code>
     * if none is provided.
     */
    public ResultCode getResultCode()
    {
      return resultCode;
    }
    /**
     * Retrieves the matched DN for the operation
     * if <code>continueProcessing</code> returned <code>false</code>.
     *
     * @return the matched DN for the operation or <code>null</code>
     * if none is provided.
     */
    public DN getMatchedDN()
    {
      return matchedDN;
    }
    /**
     * Retrieves the referral URLs for the operation
     * if <code>continueProcessing</code> returned <code>false</code>.
     *
     * @return the refferal URLs for the operation or
     * <code>null</code> if none is provided.
     */
    public List<String> getReferralURLs()
    {
      return referralURLs;
    }
  }
  /**
   * Defines a pre operation plugin result for core server operation
   * processing consisting of either continue, skip further
   * plugins, or stop operation processing with a result code,
   * matched DN, referral URLs, and error message.
   */
  public static final class PreOperation
  {
    // Whether to continue operation processing.
    private final boolean continueProcessing;
    // Whether to invoke the rest of the plugins.
    private final boolean continuePluginProcessing;
    // An message explaining why processing should stop.
    private final Message errorMessage;
    // The matched DN for this result.
    private final DN matchedDN;
    // The set of referral URLs for this result.
    private final List<String> referralURLs;
    // The result code for this result.
    private final ResultCode resultCode;
    private static PreOperation DEFAULT_RESULT =
        new PreOperation(true, true, null, null, null, null);
    /**
     * Construct a new pre operation plugin result.
     *
     * @param continueProcessing Whether to continue startup.
     * @param continuePluginProcessing Whether to invoke the rest
     * of the plugins.
     * @param errorMessage An message explaining why processing
     * should stop.
     * @param resultCode The result code for this result.
     * @param matchedDN The matched DN for this result.
     * @param referralURLs The set of referral URLs for this result.
     * stop.
     */
    private PreOperation (boolean continueProcessing,
                          boolean continuePluginProcessing,
                          Message errorMessage,
                          ResultCode resultCode, DN matchedDN,
                          List<String> referralURLs)
    {
      this.continueProcessing = continueProcessing;
      this.errorMessage = errorMessage;
      this.continuePluginProcessing = continuePluginProcessing;
      this.resultCode = resultCode;
      this.matchedDN = matchedDN;
      this.referralURLs = referralURLs;
    }
    /**
     * Defines a continue processing pre operation plugin result.
     *
     * @return a continue processing pre operation plugin result.
     */
    public static PreOperation continueOperationProcessing()
    {
      return DEFAULT_RESULT;
    }
    /**
     * Defines a skip further plugin processing pre operation plugin
     * result.
     *
     * @return  a skip further plugin processing pre operation plugin
     * result.
     */
    public static PreOperation skipFurtherPluginProcesssing()
    {
      return new PreOperation(true, false, null, null, null, null);
    }
    /**
     * Defines a new stop processing pre operation plugin result.
     *
     * @param resultCode The result code for this result.
     * @param errorMessage An message explaining why processing
     * should stop.
     * @param matchedDN The matched DN for this result.
     * @param referralURLs The set of referral URLs for this result.
     *
     * @return a new stop processing pre operation plugin result.
     */
    public static PreOperation stopProcessing(
        ResultCode resultCode, Message errorMessage, DN matchedDN,
        List<String> referralURLs)
    {
      return new PreOperation(false, false, errorMessage, resultCode,
          matchedDN, referralURLs);
    }
    /**
     * Contrust a new stop processing pre operation plugin result.
     *
     * @param resultCode The result code for this result.
     * @param errorMessage An message explaining why processing
     * should stop.
     *
     * @return a new stop processing pre operation plugin result.
     */
    public static PreOperation stopProcessing(ResultCode resultCode,
                                              Message errorMessage)
    {
      return new PreOperation(false, false, errorMessage, resultCode,
          null, null);
    }
    /**
     * Whether to continue operation processing.
     *
     * @return <code>true</code> if processing should continue
     * or <code>false</code> otherwise.
     */
    public boolean continueProcessing()
    {
      return continueProcessing;
    }
    /**
     * Whether to invoke the rest of the plugins.
     *
     * @return <code>true</code> if the rest of the plugins should
     * be invoked for <code>false</code> to skip the rest of the
     * plugins.
     */
    public boolean continuePluginProcessing()
    {
      return continuePluginProcessing;
    }
    /**
     * Retrieves the error message if <code>continueProcessing</code>
     * returned <code>false</code>.
     *
     * @return An error message explaining why processing should
     * stop or <code>null</code> if none is provided.
     */
    public Message getErrorMessage()
    {
      return errorMessage;
    }
    /**
     * Retrieves the result code for the operation
     * if <code>continueProcessing</code> returned <code>false</code>.
     *
     * @return the result code for the operation or <code>null</code>
     * if none is provided.
     */
    public ResultCode getResultCode()
    {
      return resultCode;
    }
    /**
     * Retrieves the matched DN for the operation
     * if <code>continueProcessing</code> returned <code>false</code>.
     *
     * @return the matched DN for the operation or <code>null</code>
     * if none is provided.
     */
    public DN getMatchedDN()
    {
      return matchedDN;
    }
    /**
     * Retrieves the referral URLs for the operation
     * if <code>continueProcessing</code> returned <code>false</code>.
     *
     * @return the refferal URLs for the operation or
     * <code>null</code> if none is provided.
     */
    public List<String> getReferralURLs()
    {
      return referralURLs;
    }
  }
  /**
   * Defines a post operation plugin result for core server operation
   * processing consisting of either continue, skip further
   * plugins, or stop operation processing with a result code,
   * matched DN, referral URLs, and error message.
   */
  public static final class PostOperation
  {
    // Whether to continue operation processing.
    private final boolean continueProcessing;
    // An message explaining why processing should stop.
    private final Message errorMessage;
    // The matched DN for this result.
    private final DN matchedDN;
    // The set of referral URLs for this result.
    private final List<String> referralURLs;
    // The result code for this result.
    private final ResultCode resultCode;
    private static PostOperation DEFAULT_RESULT =
        new PostOperation(true, null, null, null, null);
    /**
     * Constructs a new post operation plugin result.
     *
     * @param continueProcessing Whether to continue startup.
     * @param errorMessage An message explaining why processing
     * should stop.
     * @param resultCode The result code for this result.
     * @param matchedDN The matched DN for this result.
     * @param referralURLs The set of referral URLs for this result.
     */
    private PostOperation(boolean continueProcessing,
                          Message errorMessage,
                          ResultCode resultCode, DN matchedDN,
                          List<String> referralURLs)
    {
      this.continueProcessing = continueProcessing;
      this.errorMessage = errorMessage;
      this.resultCode = resultCode;
      this.matchedDN = matchedDN;
      this.referralURLs = referralURLs;
    }
    /**
     * Defines a continue processing post operation plugin result.
     *
     * @return a continue processing post operation plugin result.
     */
    public static PostOperation continueOperationProcessing()
    {
      return DEFAULT_RESULT;
    }
    /**
     * Defines a new stop processing post operation plugin result.
     *
     * @param resultCode The result code for this result.
     * @param errorMessage An message explaining why processing
     * should stop.
     * @param matchedDN The matched DN for this result.
     * @param referralURLs The set of referral URLs for this result.
     *
     * @return a new stop processing post operation plugin result.
     */
    public static PostOperation stopProcessing(
        ResultCode resultCode, Message errorMessage, DN matchedDN,
        List<String> referralURLs)
    {
      return new PostOperation(false, errorMessage, resultCode,
          matchedDN, referralURLs);
    }
    /**
     * Contrust a new stop processing post operation plugin result.
     *
     * @param resultCode The result code for this result.
     * @param errorMessage An message explaining why processing
     * should stop.
     *
     * @return a new stop processing post operation plugin result.
     */
    public static PostOperation stopProcessing(ResultCode resultCode,
                                               Message errorMessage)
    {
      return new PostOperation(false, errorMessage, resultCode, null,
          null);
    }
    /**
     * Whether to continue operation processing.
     *
     * @return <code>true</code> if processing should continue
     * or <code>false</code> otherwise.
     */
    public boolean continueProcessing()
    {
      return continueProcessing;
    }
    /**
     * Retrieves the error message if <code>continueProcessing</code>
     * returned <code>false</code>.
     *
     * @return An error message explaining why processing should
     * stop or <code>null</code> if none is provided.
     */
    public Message getErrorMessage()
    {
      return errorMessage;
    }
    /**
     * Retrieves the result code for the operation
     * if <code>continueProcessing</code> returned <code>false</code>.
     *
     * @return the result code for the operation or <code>null</code>
     * if none is provided.
     */
    public ResultCode getResultCode()
    {
      return resultCode;
    }
    /**
     * Retrieves the matched DN for the operation
     * if <code>continueProcessing</code> returned <code>false</code>.
     *
     * @return the matched DN for the operation or <code>null</code>
     * if none is provided.
     */
    public DN getMatchedDN()
    {
      return matchedDN;
    }
    /**
     * Retrieves the referral URLs for the operation
     * if <code>continueProcessing</code> returned <code>false</code>.
     *
     * @return the refferal URLs for the operation or
     * <code>null</code> if none is provided.
     */
    public List<String> getReferralURLs()
    {
      return referralURLs;
    }
  }
  /**
   * Defines a post response plugin result for core server operation
   * processing consisting of either continue or skip further
   * plugins.
   */
  public static final class PostResponse
  {
    // Whether to invoke the rest of the plugins.
    private final boolean continuePluginProcessing;
    private static PostResponse DEFAULT_RESULT =
        new PostResponse(true);
    /**
     * Constructs a new post response plugin result.
     *
     * @param continuePluginProcessing Whether to invoke the rest
     * of the plugins.
     */
    private PostResponse (boolean continuePluginProcessing)
    {
      this.continuePluginProcessing = continuePluginProcessing;
    }
    /**
     * Defines a continue processing post response plugin result.
     *
     * @return a continue processing post response plugin result.
     */
    public static PostResponse continueOperationProcessing()
    {
      return DEFAULT_RESULT;
    }
    /**
     * Defines a skip further plugin processing post response plugin
     *  result.
     *
     * @return  a skip further plugin processing post response plugin
     *  result.
     */
    public static PostResponse skipFurtherPluginProcesssing()
    {
      return new PostResponse(false);
    }
    /**
     * Whether to invoke the rest of the plugins.
     *
     * @return <code>true</code> if the rest of the plugins should
     * be invoked for <code>false</code> to skip the rest of the
     * plugins.
     */
    public boolean continuePluginProcessing()
    {
      return continuePluginProcessing;
    }
  }
  /**
   * Defines a LDIF plugin result for import from LDIF
   * processing consisting of either continue, skip further
   * plugins, or stop processing with an error message.
   */
  public static final class ImportLDIF
  {
    // Whether to continue operation processing.
    private final boolean continueProcessing;
    // Whether to invoke the rest of the plugins.
    private final boolean continuePluginProcessing;
    // An message explaining why processing should stop.
    private final Message errorMessage;
    private static ImportLDIF DEFAULT_RESULT =
        new ImportLDIF(true, true, null);
    /**
     * Construct a new import LDIF plugin result.
     *
     * @param continueProcessing Whether to continue startup.
     * @param continuePluginProcessing Whether to invoke the rest
     * of the plugins.
     * @param errorMessage An message explaining why startup should
     * stop.
     */
    private ImportLDIF(boolean continueProcessing,
                       boolean continuePluginProcessing,
                       Message errorMessage)
    {
      this.continueProcessing = continueProcessing;
      this.errorMessage = errorMessage;
      this.continuePluginProcessing = continuePluginProcessing;
    }
    /**
     * Defines a continue processing LDIF import plugin result.
     *
     * @return a continue processing LDIF import plugin result.
     */
    public static ImportLDIF continueEntryProcessing()
    {
      return DEFAULT_RESULT;
    }
    /**
     * Defines a skip further plugin processing LDIF import plugin
     *  result.
     *
     * @return  a skip further plugin processing LDIF import plugin
     *  result.
     */
    public static ImportLDIF skipFurtherPluginProcesssing()
    {
      return new ImportLDIF(true, false, null);
    }
    /**
     * Defines a new stop processing LDIF import plugin result.
     *
     * @param errorMessage An message explaining why processing
     * should stop for the given entry.
     *
     * @return a new stop processing LDIF import plugin result.
     */
    public static ImportLDIF stopEntryProcessing(Message errorMessage)
    {
      return new ImportLDIF(false, false, errorMessage);
    }
    /**
     * Whether to continue operation processing.
     *
     * @return <code>true</code> if processing should continue
     * or <code>false</code> otherwise.
     */
    public boolean continueProcessing()
    {
      return continueProcessing;
    }
    /**
     * Whether to invoke the rest of the plugins.
     *
     * @return <code>true</code> if the rest of the plugins should
     * be invoked for <code>false</code> to skip the rest of the
     * plugins.
     */
    public boolean continuePluginProcessing()
    {
      return continuePluginProcessing;
    }
    /**
     * Retrieves the error message if <code>continueProcessing</code>
     * returned <code>false</code>.
     *
     * @return An error message explaining why processing should
     * stop or <code>null</code> if none is provided.
     */
    public Message getErrorMessage()
    {
      return errorMessage;
    }
  }
  /**
   * Defines a subordinate modify DN plugin result for core server
   * operation processing consisting of either continue, skip further
   * plugins, or stop operation processing with a result code,
   * matched DN, referral URLs, and error message.
   */
  public static final class SubordinateModifyDN
  {
    // Whether to continue operation processing.
    private final boolean continueProcessing;
    // Whether to invoke the rest of the plugins.
    private final boolean continuePluginProcessing;
    // An message explaining why processing should stop.
    private final Message errorMessage;
    // The matched DN for this result.
    private final DN matchedDN;
    // The set of referral URLs for this result.
    private final List<String> referralURLs;
    // The result code for this result.
    private final ResultCode resultCode;
    private static SubordinateModifyDN DEFAULT_RESULT =
        new SubordinateModifyDN(true, true, null, null, null, null);
    /**
     * Construct a new subordinate modify DN plugin result.
     *
     * @param continueProcessing Whether to continue startup.
     * @param continuePluginProcessing Whether to invoke the rest
     * of the plugins.
     * @param errorMessage An message explaining why processing
     * should stop.
     * @param resultCode The result code for this result.
     * @param matchedDN The matched DN for this result.
     * @param referralURLs The set of referral URLs for this result.
     * stop.
     */
    private SubordinateModifyDN(boolean continueProcessing,
                                boolean continuePluginProcessing,
                                Message errorMessage,
                                ResultCode resultCode, DN matchedDN,
                                List<String> referralURLs)
    {
      this.continueProcessing = continueProcessing;
      this.errorMessage = errorMessage;
      this.continuePluginProcessing = continuePluginProcessing;
      this.resultCode = resultCode;
      this.matchedDN = matchedDN;
      this.referralURLs = referralURLs;
    }
    /**
     * Defines a continue processing subordinate modify DN plugin
     *  result.
     *
     * @return a continue processing subordinate modify DN plugin
     *  result.
     */
    public static SubordinateModifyDN continueOperationProcessing()
    {
      return DEFAULT_RESULT;
    }
    /**
     * Defines a skip further plugin processing subordinate modify DN
     * plugin result.
     *
     * @return  a skip further plugin processing subordinate modify DN
     * plugin result.
     */
    public static SubordinateModifyDN skipFurtherPluginProcesssing()
    {
      return new SubordinateModifyDN(true, false, null, null, null,
          null);
    }
    /**
     * Defines a new stop processing subordinate modify DN plugin
     * result.
     *
     * @param resultCode The result code for this result.
     * @param errorMessage An message explaining why processing
     * should stop.
     * @param matchedDN The matched DN for this result.
     * @param referralURLs The set of referral URLs for this result.
     *
     * @return a new stop processing subordinate modify DN plugin
     * result.
     */
    public static SubordinateModifyDN stopProcessing(
        ResultCode resultCode, Message errorMessage, DN matchedDN,
        List<String> referralURLs)
    {
      return new SubordinateModifyDN(false, false, errorMessage,
          resultCode, matchedDN, referralURLs);
    }
    /**
     * Contrust a new stop processing subordinate modify DN plugin
     * result.
     *
     * @param resultCode The result code for this result.
     * @param errorMessage An message explaining why processing
     * should stop.
     *
     * @return a new stop processing subordinate modify DN plugin
     * result.
     */
    public static SubordinateModifyDN stopProcessing(
        ResultCode resultCode, Message errorMessage)
    {
      return new SubordinateModifyDN(false, false, errorMessage,
          resultCode, null, null);
    }
    /**
     * Whether to continue operation processing.
     *
     * @return <code>true</code> if processing should continue
     * or <code>false</code> otherwise.
     */
    public boolean continueProcessing()
    {
      return continueProcessing;
    }
    /**
     * Whether to invoke the rest of the plugins.
     *
     * @return <code>true</code> if the rest of the plugins should
     * be invoked for <code>false</code> to skip the rest of the
     * plugins.
     */
    public boolean continuePluginProcessing()
    {
      return continuePluginProcessing;
    }
    /**
     * Retrieves the error message if <code>continueProcessing</code>
     * returned <code>false</code>.
     *
     * @return An error message explaining why processing should
     * stop or <code>null</code> if none is provided.
     */
    public Message getErrorMessage()
    {
      return errorMessage;
    }
    /**
     * Retrieves the result code for the operation
     * if <code>continueProcessing</code> returned <code>false</code>.
     *
     * @return the result code for the operation or <code>null</code>
     * if none is provided.
     */
    public ResultCode getResultCode()
    {
      return resultCode;
    }
    /**
     * Retrieves the matched DN for the operation
     * if <code>continueProcessing</code> returned <code>false</code>.
     *
     * @return the matched DN for the operation or <code>null</code>
     * if none is provided.
     */
    public DN getMatchedDN()
    {
      return matchedDN;
    }
    /**
     * Retrieves the referral URLs for the operation
     * if <code>continueProcessing</code> returned <code>false</code>.
     *
     * @return the refferal URLs for the operation or
     * <code>null</code> if none is provided.
     */
    public List<String> getReferralURLs()
    {
      return referralURLs;
    }
  }
  /**
   * Defines an intermediate response plugin result for core server
   *  operation processing consisting of either continue, skip further
   * plugins, or stop operation processing with a result code,
   * matched DN, referral URLs, and error message.
   */
  public static final class IntermediateResponse
  {
    // Whether to continue operation processing.
    private final boolean continueProcessing;
    // Whether to invoke the rest of the plugins.
    private final boolean continuePluginProcessing;
    // Whether to send the intermediate response to the client.
    private final boolean sendResponse;
    // An message explaining why processing should stop.
    private final Message errorMessage;
    // The matched DN for this result.
    private final DN matchedDN;
    // The set of referral URLs for this result.
    private final List<String> referralURLs;
    // The result code for this result.
    private final ResultCode resultCode;
    private static IntermediateResponse DEFAULT_RESULT =
        new IntermediateResponse(true, true, true, null, null, null,
            null);
    /**
     * Construct a new intermediate response plugin result.
     *
     * @param continueProcessing Whether to continue startup.
     * @param continuePluginProcessing Whether to invoke the rest
     * of the plugins.
     * @param sendResponse Whether to send the intermediate response
     * to the client.
     * @param errorMessage An message explaining why processing
     * should stop.
     * @param resultCode The result code for this result.
     * @param matchedDN The matched DN for this result.
     * @param referralURLs The set of referral URLs for this result.
     * stop.
     */
    private IntermediateResponse(boolean continueProcessing,
                                 boolean continuePluginProcessing,
                                 boolean sendResponse,
                                 Message errorMessage,
                                 ResultCode resultCode, DN matchedDN,
                                 List<String> referralURLs)
    {
      this.continueProcessing = continueProcessing;
      this.errorMessage = errorMessage;
      this.continuePluginProcessing = continuePluginProcessing;
      this.resultCode = resultCode;
      this.matchedDN = matchedDN;
      this.referralURLs = referralURLs;
      this.sendResponse = sendResponse;
    }
    /**
     * Defines a continue processing intermediate response plugin
     * result.
     *
     * @param sendResponse Whether to send the intermediate response
     * to the client.
     * @return a continue processing intermediate response plugin
     * result.
     */
    public static IntermediateResponse
    continueOperationProcessing(boolean sendResponse)
    {
      if(sendResponse)
      {
        return DEFAULT_RESULT;
      }
      else
      {
        return new IntermediateResponse(true, true, sendResponse,
            null, null, null, null);
      }
    }
    /**
     * Defines a skip further plugin processing intermediate response
     * plugin result.
     *
     * @param sendResponse Whether to send the intermediate response
     * to the client.
     *
     * @return  a skip further plugin processing intermediate response
     * plugin result.
     */
    public static IntermediateResponse
    skipFurtherPluginProcesssing(boolean sendResponse)
    {
      return new IntermediateResponse(true, false, sendResponse,
          null, null, null, null);
    }
    /**
     * Defines a new stop processing intermediate response plugin
     * result.
     *
     * @param sendResponse Whether to send the intermediate response
     * to the client.
     * @param resultCode The result code for this result.
     * @param errorMessage An message explaining why processing
     * should stop.
     * @param matchedDN The matched DN for this result.
     * @param referralURLs The set of referral URLs for this result.
     *
     * @return a new stop processing intermediate response plugin
     * result.
     */
    public static IntermediateResponse stopProcessing(
        boolean sendResponse, ResultCode resultCode,
        Message errorMessage, DN matchedDN, List<String> referralURLs)
    {
      return new IntermediateResponse(false, false, sendResponse,
          errorMessage, resultCode, matchedDN, referralURLs);
    }
    /**
     * Contrust a new stop processing intermediate response plugin
     * result.
     *
     * @param sendResponse Whether to send the intermediate response
     * to the client.
     * @param resultCode The result code for this result.
     * @param errorMessage An message explaining why processing
     * should stop.
     *
     * @return a new stop processing intermediate response plugin
     * result.
     */
    public static IntermediateResponse stopProcessing(
        boolean sendResponse, ResultCode resultCode,
        Message errorMessage)
    {
      return new IntermediateResponse(false, false, sendResponse,
          errorMessage, resultCode, null, null);
    }
    /**
     * Whether to continue operation processing.
     *
     * @return <code>true</code> if processing should continue
     * or <code>false</code> otherwise.
     */
    public boolean continueProcessing()
    {
      return continueProcessing;
    }
    /**
     * Whether to invoke the rest of the plugins.
     *
     * @return <code>true</code> if the rest of the plugins should
     * be invoked for <code>false</code> to skip the rest of the
     * plugins.
     */
    public boolean continuePluginProcessing()
    {
      return continuePluginProcessing;
    }
    /**
     * Whether to send the intermediate response to the client.
     *
     * @return <code>true</code> if the intermediate response should
     * be sent to the client or <code>false</code> otherwise.
     */
    public boolean sendResponse()
    {
      return sendResponse;
    }
    /**
     * Retrieves the error message if <code>continueProcessing</code>
     * returned <code>false</code>.
     *
     * @return An error message explaining why processing should
     * stop or <code>null</code> if none is provided.
     */
    public Message getErrorMessage()
    {
      return errorMessage;
    }
    /**
     * Retrieves the result code for the operation
     * if <code>continueProcessing</code> returned <code>false</code>.
     *
     * @return the result code for the operation or <code>null</code>
     * if none is provided.
     */
    public ResultCode getResultCode()
    {
      return resultCode;
    }
    /**
     * Retrieves the matched DN for the operation
     * if <code>continueProcessing</code> returned <code>false</code>.
     *
     * @return the matched DN for the operation or <code>null</code>
     * if none is provided.
     */
    public DN getMatchedDN()
    {
      return matchedDN;
    }
    /**
     * Retrieves the referral URLs for the operation
     * if <code>continueProcessing</code> returned <code>false</code>.
     *
     * @return the refferal URLs for the operation or
     * <code>null</code> if none is provided.
     */
    public List<String> getReferralURLs()
    {
      return referralURLs;
    }
  }
  /**
   * Defines a post connect plugin result for client connection
   * processing consisting of either continue, skip further
   * plugins, or stop.
   */
  public static final class PostConnect
  {
    // Whether to continue connection processing.
    private final boolean continueProcessing;
    // Whether to invoke the rest of the plugins.
    private final boolean continuePluginProcessing;
    // An message explaining why processing should stop.
    private final Message errorMessage;
    // The disconnect reason that provides the generic cause for the
    // disconnect.
    private final DisconnectReason disconnectReason;
    // Whether to send a disconnect notification to the client.
    private final boolean sendDisconnectNotification;
    private static PostConnect DEFAULT_RESULT =
        new PostConnect(true, true, null, null, false);
    /**
     * Construct a new post connect plugin result.
     *
     * @param continueProcessing Whether to continue startup.
     * @param continuePluginProcessing Whether to invoke the rest
     * of the plugins.
     * @param errorMessage An message explaining why processing
     * should stop.
     * @param disconnectReason The generic cause for the disconnect.
     * @param sendDisconnectNotification Whether to send a disconnect
     * notification to the client.
     */
    private PostConnect(boolean continueProcessing,
                        boolean continuePluginProcessing,
                        Message errorMessage,
                        DisconnectReason disconnectReason,
                        boolean sendDisconnectNotification)
    {
      this.continueProcessing = continueProcessing;
      this.errorMessage = errorMessage;
      this.continuePluginProcessing = continuePluginProcessing;
      this.disconnectReason = disconnectReason;
      this.sendDisconnectNotification = sendDisconnectNotification;
    }
    /**
     * Defines a continue processing post connect plugin result.
     *
     * @return a continue processing post connect plugin result.
     */
    public static PostConnect continueConnectProcessing()
    {
      return DEFAULT_RESULT;
    }
    /**
     * Defines a skip further plugin processing post connect plugin
     * result.
     *
     * @return  a skip further plugin processing post connect plugin
     * result.
     */
    public static PostConnect skipFurtherPluginProcesssing()
    {
      return new PostConnect(true, false, null, null, false);
    }
    /**
     * Defines a new stop processing post connect plugin result.
     *
     * @param disconnectReason The generic cause for the disconnect.
     * @param sendDisconnectNotification Whether to send a disconnect
     * notification to the client.
     * @param errorMessage An message explaining why processing
     * should stop for the given entry.
     *
     * @return a new stop processing post connect plugin result.
     */
    public static PostConnect disconnectClient(
        DisconnectReason disconnectReason,
        boolean sendDisconnectNotification, Message errorMessage)
    {
      return new PostConnect(false, false, errorMessage,
          disconnectReason, sendDisconnectNotification);
    }
    /**
     * Whether to continue operation processing.
     *
     * @return <code>true</code> if processing should continue
     * or <code>false</code> otherwise.
     */
    public boolean continueProcessing()
    {
      return continueProcessing;
    }
    /**
     * Whether to invoke the rest of the plugins.
     *
     * @return <code>true</code> if the rest of the plugins should
     * be invoked for <code>false</code> to skip the rest of the
     * plugins.
     */
    public boolean continuePluginProcessing()
    {
      return continuePluginProcessing;
    }
    /**
     * Retrieves the error message if <code>continueProcessing</code>
     * returned <code>false</code>.
     *
     * @return An error message explaining why processing should
     * stop or <code>null</code> if none is provided.
     */
    public Message getErrorMessage()
    {
      return errorMessage;
    }
    /**
     * The disconnect reason that provides the generic cause for the
     * disconnect.
     *
     * @return the generic cause for the disconnect.
     */
    public DisconnectReason getDisconnectReason()
    {
      return disconnectReason;
    }
    /**
     * Indicates whether to try to provide notification to the client
     * that the connection will be closed.
     *
     * @return <code>true</code> if notification should be provided or
     * <code>false</code> otherwise.
     */
    public boolean sendDisconnectNotification()
    {
      return sendDisconnectNotification;
    }
  }
  /**
   * Defines a post disconnect plugin result for client connection
   * processing consisting of either continue or skip further
   * plugins.
   */
  public static final class PostDisconnect
  {
    // Whether to invoke the rest of the plugins.
    private final boolean continuePluginProcessing;
    private static PostDisconnect DEFAULT_RESULT =
        new PostDisconnect(true);
    /**
     * Construct a new post disconnect plugin result.
     *
     * @param continuePluginProcessing Whether to invoke the rest
     * of the plugins.
     */
    private PostDisconnect(boolean continuePluginProcessing)
    {
      this.continuePluginProcessing = continuePluginProcessing;
    }
    /**
     * Defines a continue processing post disconnect plugin result.
     *
     * @return a continue processing post disconnect plugin result.
     */
    public static PostDisconnect continueDisconnectProcessing()
    {
      return DEFAULT_RESULT;
    }
    /**
     * Defines a skip further plugin processing post disconnect
     * plugin result.
     *
     * @return  a skip further plugin processing post disconnect
     * plugin result.
     */
    public static PostDisconnect skipFurtherPluginProcesssing()
    {
      return new PostDisconnect(false);
    }
    /**
     * Whether to invoke the rest of the plugins.
     *
     * @return <code>true</code> if the rest of the plugins should
     * be invoked for <code>false</code> to skip the rest of the
     * plugins.
     */
    public boolean continuePluginProcessing()
    {
      return continuePluginProcessing;
    }
  }
}
opends/src/server/org/opends/server/api/plugin/PostConnectPluginResult.java
File was deleted
opends/src/server/org/opends/server/api/plugin/PostDisconnectPluginResult.java
File was deleted
opends/src/server/org/opends/server/api/plugin/PostOperationPluginResult.java
File was deleted
opends/src/server/org/opends/server/api/plugin/PostResponsePluginResult.java
File was deleted
opends/src/server/org/opends/server/api/plugin/PreOperationPluginResult.java
File was deleted
opends/src/server/org/opends/server/api/plugin/PreParsePluginResult.java
File was deleted
opends/src/server/org/opends/server/api/plugin/SearchEntryPluginResult.java
File was deleted
opends/src/server/org/opends/server/api/plugin/SearchReferencePluginResult.java
File was deleted
opends/src/server/org/opends/server/api/plugin/StartupPluginResult.java
File was deleted
opends/src/server/org/opends/server/api/plugin/SubordinateModifyDNPluginResult.java
File was deleted
opends/src/server/org/opends/server/backends/RootDSEBackend.java
@@ -965,8 +965,7 @@
   */
  @Override()
  public void search(SearchOperation searchOperation)
         throws DirectoryException, CancelledOperationException
  {
         throws DirectoryException, CanceledOperationException {
    DN baseDN = searchOperation.getBaseDN();
    if (! baseDN.isNullDN())
    {
@@ -1002,11 +1001,7 @@
        for (DN subBase : baseMap.keySet())
        {
          CancelRequest cancelRequest = searchOperation.getCancelRequest();
          if (cancelRequest != null)
          {
            throw new CancelledOperationException(CancelResult.CANCELED);
          }
          searchOperation.checkIfCanceled(false);
          Backend b = baseMap.get(subBase);
          Entry subBaseEntry = b.getEntry(subBase);
@@ -1033,11 +1028,7 @@
        {
          for (DN subBase : baseMap.keySet())
          {
            CancelRequest cancelRequest = searchOperation.getCancelRequest();
            if (cancelRequest != null)
            {
              throw new CancelledOperationException(CancelResult.CANCELED);
            }
            searchOperation.checkIfCanceled(false);
            Backend b = baseMap.get(subBase);
            searchOperation.setBaseDN(subBase);
opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
@@ -916,8 +916,7 @@
  @Override()
  public void renameEntry(DN currentDN, Entry entry,
                          ModifyDNOperation modifyDNOperation)
      throws DirectoryException, CancelledOperationException
  {
      throws DirectoryException, CanceledOperationException {
    writerBegin();
    EntryContainer currentContainer;
opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
@@ -33,7 +33,7 @@
import org.opends.server.api.Backend;
import org.opends.server.api.EntryCache;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.plugin.SubordinateModifyDNPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.core.AddOperation;
import org.opends.server.core.DeleteOperation;
import org.opends.server.core.DirectoryServer;
@@ -2994,7 +2994,7 @@
   * @throws org.opends.server.types.DirectoryException
   *          If a problem occurs while trying to perform
   *          the rename.
   * @throws org.opends.server.types.CancelledOperationException
   * @throws org.opends.server.types.CanceledOperationException
   *          If this backend noticed and reacted
   *          to a request to cancel or abandon the
   *          modify DN operation.
@@ -3004,8 +3004,7 @@
  public void renameEntry(DN currentDN, Entry entry,
                          ModifyDNOperation modifyDNOperation)
      throws DatabaseException, JebException, DirectoryException,
      CancelledOperationException
  {
      CanceledOperationException {
    TransactedOperation operation =
        new RenameEntryTransaction(currentDN, entry, modifyDNOperation);
@@ -3503,12 +3502,11 @@
             DirectoryServer.getPluginConfigManager();
        List<Modification> modifications =
             Collections.unmodifiableList(new ArrayList<Modification>(0));
        SubordinateModifyDNPluginResult pluginResult =
        PluginResult.SubordinateModifyDN pluginResult =
             pluginManager.invokeSubordinateModifyDNPlugins(
                  modifyDNOperation, oldEntry, newEntry, modifications);
        if (pluginResult.connectionTerminated() ||
            pluginResult.abortModifyDNOperation())
        if (!pluginResult.continueProcessing())
        {
          Message message = ERR_JEB_MODIFYDN_ABORTED_BY_SUBORDINATE_PLUGIN.get(
                  oldDN.toString(), newDN.toString());
@@ -3634,12 +3632,11 @@
             DirectoryServer.getPluginConfigManager();
        List<Modification> modifications =
             Collections.unmodifiableList(new ArrayList<Modification>(0));
        SubordinateModifyDNPluginResult pluginResult =
        PluginResult.SubordinateModifyDN pluginResult =
             pluginManager.invokeSubordinateModifyDNPlugins(
                  modifyDNOperation, oldEntry, newEntry, modifications);
        if (pluginResult.connectionTerminated() ||
            pluginResult.abortModifyDNOperation())
        if (!pluginResult.continueProcessing())
        {
          Message message = ERR_JEB_MODIFYDN_ABORTED_BY_SUBORDINATE_PLUGIN.get(
                  oldDN.toString(), newDN.toString());
opends/src/server/org/opends/server/backends/task/TaskBackend.java
@@ -55,7 +55,7 @@
import org.opends.server.types.AttributeValue;
import org.opends.server.types.BackupConfig;
import org.opends.server.types.BackupDirectory;
import org.opends.server.types.CancelledOperationException;
import org.opends.server.types.CanceledOperationException;
import org.opends.server.types.ConditionResult;
import org.opends.server.types.ConfigChangeResult;
import org.opends.server.types.DebugLogLevel;
@@ -838,8 +838,7 @@
   */
  @Override()
  public void search(SearchOperation searchOperation)
         throws DirectoryException, CancelledOperationException
  {
         throws DirectoryException, CanceledOperationException {
    // Look at the base DN and scope for the search operation to decide which
    // entries we need to look at.
    boolean searchRoot            = false;
opends/src/server/org/opends/server/controls/ProxiedAuthV1Control.java
@@ -371,8 +371,7 @@
      // FIXME -- We should provide some mechanism for enabling debug
      // processing.
      PasswordPolicyState pwpState = new PasswordPolicyState(userEntry, false,
                                                             false);
      PasswordPolicyState pwpState = new PasswordPolicyState(userEntry, false);
      if (pwpState.isDisabled() || pwpState.isAccountExpired() ||
          pwpState.lockedDueToFailures() ||
          pwpState.lockedDueToIdleInterval() ||
opends/src/server/org/opends/server/controls/ProxiedAuthV2Control.java
@@ -305,7 +305,7 @@
          // FIXME -- We should provide some mechanism for enabling debug
          // processing.
          PasswordPolicyState pwpState =
               new PasswordPolicyState(userEntry, false, false);
               new PasswordPolicyState(userEntry, false);
          if (pwpState.isDisabled() || pwpState.isAccountExpired() ||
              pwpState.lockedDueToFailures() ||
              pwpState.lockedDueToIdleInterval() ||
@@ -358,7 +358,7 @@
        // FIXME -- We should provide some mechanism for enabling debug
        // processing.
        PasswordPolicyState pwpState =
             new PasswordPolicyState(userEntry, false, false);
             new PasswordPolicyState(userEntry, false);
        if (pwpState.isDisabled() || pwpState.isAccountExpired() ||
            pwpState.lockedDueToFailures() ||
            pwpState.lockedDueToIdleInterval() ||
opends/src/server/org/opends/server/core/AbandonOperationBasis.java
@@ -38,16 +38,10 @@
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.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.*;
import org.opends.server.types.operation.PostOperationAbandonOperation;
import org.opends.server.types.operation.PreParseAbandonOperation;
@@ -95,6 +89,8 @@
    this.idToAbandon = idToAbandon;
    this.cancelResult = new CancelResult(ResultCode.CANNOT_CANCEL,
        ERR_CANNOT_CANCEL_ABANDON.get());
  }
@@ -129,20 +125,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
@@ -239,53 +221,31 @@
  {
    setResultCode(ResultCode.UNDEFINED);
    // Start the processing timer.
    setProcessingStartTime();
    // Log the abandon request message.
    logAbandonRequest(this);
    // 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 =
      PluginResult.PreParse preParseResult =
           pluginConfigManager.invokePreParseAbandonPlugins(this);
      if (preParseResult.connectionTerminated())
      if (!preParseResult.continueProcessing())
      {
        // There's no point in continuing.  Log the request and result and
        // return.
        setResultCode(ResultCode.CANCELED);
        appendErrorMessage(ERR_CANCELED_BY_PREPARSE_DISCONNECT.get());
        setProcessingStopTime();
        logAbandonRequest(this);
        logAbandonResult(this);
        return;
      }
      else if (preParseResult.sendResponseImmediately())
      {
        skipPostOperation = true;
        setResultCode(preParseResult.getResultCode());
        appendErrorMessage(preParseResult.getErrorMessage());
        setMatchedDN(preParseResult.getMatchedDN());
        setReferralURLs(preParseResult.getReferralURLs());
        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
@@ -306,20 +266,22 @@
        // configurable option in the server.
        boolean notifyRequestor = DirectoryServer.notifyAbandonedOperations();
        Message cancelReason = INFO_CANCELED_BY_ABANDON_REQUEST.get(messageID);
        MessageBuilder cancelResponse = new MessageBuilder();
        CancelResult result =
             operation.cancel(new CancelRequest(notifyRequestor, cancelReason,
                                                cancelResponse));
             operation.cancel(new CancelRequest(notifyRequestor, cancelReason));
        setResultCode(result.getResultCode());
        setErrorMessage(cancelResponse);
        appendErrorMessage(result.getResponseMessage());
      }
    }
    // Invoke the post-operation abandon plugins.
    if (! skipPostOperation)
    {
      pluginConfigManager.invokePostOperationAbandonPlugins(this);
      PluginResult.PostOperation postOpResult =
          pluginConfigManager.invokePostOperationAbandonPlugins(this);
      if (!postOpResult.continueProcessing())
      {
        setResultCode(preParseResult.getResultCode());
        appendErrorMessage(preParseResult.getErrorMessage());
        setMatchedDN(preParseResult.getMatchedDN());
        setReferralURLs(preParseResult.getReferralURLs());
        break abandonProcessing;
      }
    }
@@ -337,41 +299,6 @@
   * {@inheritDoc}
   */
  @Override()
  public final CancelResult cancel(CancelRequest cancelRequest)
  {
    cancelRequest.addResponseMessage(ERR_CANNOT_CANCEL_ABANDON.get());
    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=");
opends/src/server/org/opends/server/core/AddOperationBasis.java
@@ -52,30 +52,12 @@
import java.util.Map;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.plugin.PreParsePluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.loggers.debug.DebugLogger;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.protocols.ldap.LDAPAttribute;
import org.opends.server.types.Entry;
import org.opends.server.types.LDAPException;
import org.opends.server.types.AbstractOperation;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeType;
import org.opends.server.types.AttributeValue;
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.DN;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.DisconnectReason;
import org.opends.server.types.ObjectClass;
import org.opends.server.types.Operation;
import org.opends.server.types.OperationType;
import org.opends.server.types.RawAttribute;
import org.opends.server.types.ResultCode;
import org.opends.server.types.*;
import org.opends.server.types.operation.PostResponseAddOperation;
import org.opends.server.types.operation.PreParseAddOperation;
import org.opends.server.workflowelement.localbackend.LocalBackendAddOperation;
@@ -105,9 +87,6 @@
  // not be a valid DN.
  private ByteString rawEntryDN;
  // The cancel request that has been issued for this add operation.
  private CancelRequest cancelRequest;
  // The processed DN of the entry to add.
  private DN entryDN;
@@ -562,19 +541,6 @@
  }
  /**
   * {@inheritDoc}
   */
  public final void disconnectClient(DisconnectReason disconnectReason,
                                     boolean sendNotification, Message message
  )
  {
    clientConnection.disconnect(disconnectReason, sendNotification,
            message);
  }
  /**
   * {@inheritDoc}
   */
@@ -694,67 +660,6 @@
  }
  /**
   * {@inheritDoc}
   */
  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}
   */
  public final CancelRequest getCancelRequest()
  {
    return cancelRequest;
  }
  /**
   * {@inheritDoc}
   */
  public
  boolean setCancelRequest(CancelRequest cancelRequest)
  {
    this.cancelRequest = cancelRequest;
    return true;
  }
  /**
   * {@inheritDoc}
@@ -783,81 +688,50 @@
   */
  public final void run()
  {
    // Start the processing timer.
    setProcessingStartTime();
    setResultCode(ResultCode.UNDEFINED);
    // Start the processing timer.
    setProcessingStartTime();
    // Check for and handle a request to cancel this operation.
    if (cancelRequest != null)
    {
      indicateCancelled(cancelRequest);
      setProcessingStopTime();
      return;
    }
    // Log the add request message.
    logAddRequest(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.
addProcessing:
    try
    {
      // Check for and handle a request to cancel this operation.
      checkIfCanceled(false);
      // Invoke the pre-parse add plugins.
      PreParsePluginResult preParseResult =
      PluginResult.PreParse preParseResult =
        pluginConfigManager.invokePreParseAddPlugins(this);
      if (preParseResult.connectionTerminated())
      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();
        logAddRequest(this);
        logAddResponse(this);
        pluginConfigManager.invokePostResponseAddPlugins(this);
        setResultCode(preParseResult.getResultCode());
        appendErrorMessage(preParseResult.getErrorMessage());
        setMatchedDN(preParseResult.getMatchedDN());
        setReferralURLs(preParseResult.getReferralURLs());
        return;
      }
      else if (preParseResult.sendResponseImmediately())
      {
        logAddRequest(this);
        break addProcessing;
      }
      else if (preParseResult.skipCoreProcessing())
      {
        break addProcessing;
      }
      // Log the add request message.
      logAddRequest(this);
      // Check for a request to cancel this operation.
      if (cancelRequest != null)
      {
        break addProcessing;
      }
      // Check for and handle a request to cancel this operation.
      checkIfCanceled(false);
      // Process the entry DN and set of attributes to convert them from their
      // raw forms as provided by the client to the forms required for the rest
      // of the add processing.
      DN entryDN = getEntryDN();
      if (entryDN == null){
        break addProcessing;
        return;
      }
      // Retrieve the network group attached to the client connection
      // and get a workflow to process the operation.
      NetworkGroup ng = getClientConnection().getNetworkGroup();
@@ -867,61 +741,54 @@
        // We have found no workflow for the requested base DN, just return
        // a no such entry result code and stop the processing.
        updateOperationErrMsgAndResCode();
        break addProcessing;
        return;
      }
      workflow.execute(this);
      workflowExecuted = true;
    } // end of processing block
    // Check for a terminated connection.
    if (getCancelResult() == CancelResult.CANCELED)
    {
      // Stop the processing timer.
      setProcessingStopTime();
      // Log the add response message.
      logAddResponse(this);
      return;
    }
    // Check for and handle a request to cancel this operation.
    if (cancelRequest != null)
    catch(CanceledOperationException coe)
    {
      indicateCancelled(cancelRequest);
      if (debugEnabled())
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, coe);
      }
      setResultCode(ResultCode.CANCELED);
      cancelResult = new CancelResult(ResultCode.CANCELED, null);
      appendErrorMessage(coe.getCancelRequest().getCancelReason());
    }
    finally
    {
      // Stop the processing timer.
      setProcessingStopTime();
      if(cancelRequest == null || cancelResult == null ||
          cancelResult.getResultCode() != ResultCode.CANCELED ||
          cancelRequest.notifyOriginalRequestor() ||
          DirectoryServer.notifyAbandonedOperations())
      {
        clientConnection.sendResponse(this);
      }
      // Log the add response message.
      logAddResponse(this);
      // Notifies any persistent searches that might be registered with the
      // server.
      notifyPersistentSearches(workflowExecuted);
      // Invoke the post-response add 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 add response to the client.
    clientConnection.sendResponse(this);
    // Log the add response message.
    logAddResponse(this);
    // Notifies any persistent searches that might be registered with the
    // server.
    notifyPersistentSearches(workflowExecuted);
    // Invoke the post-response add plugins.
    invokePostResponsePlugins(workflowExecuted);
  }
opends/src/server/org/opends/server/core/BindOperationBasis.java
@@ -47,25 +47,11 @@
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.loggers.debug.DebugLogger;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.types.AbstractOperation;
import org.opends.server.types.AuthenticationInfo;
import org.opends.server.types.AuthenticationType;
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.DN;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.Entry;
import org.opends.server.types.Operation;
import org.opends.server.types.OperationType;
import org.opends.server.types.ResultCode;
import org.opends.server.types.DisconnectReason;
import org.opends.server.types.*;
import org.opends.server.types.operation.PreParseBindOperation;
import org.opends.server.workflowelement.localbackend.*;
@@ -184,6 +170,9 @@
    responseControls         = new ArrayList<Control>(0);
    authFailureReason        = null;
    saslAuthUserEntry        = null;
    cancelResult = new CancelResult(ResultCode.CANNOT_CANCEL,
        ERR_CANNOT_CANCEL_BIND.get());
  }
@@ -233,6 +222,9 @@
    responseControls       = new ArrayList<Control>(0);
    authFailureReason      = null;
    saslAuthUserEntry      = null;
    cancelResult = new CancelResult(ResultCode.CANNOT_CANCEL,
        ERR_CANNOT_CANCEL_BIND.get());
  }
@@ -288,6 +280,9 @@
    authFailureReason        = null;
    saslAuthUserEntry        = null;
    userEntryDN              = null;
    cancelResult = new CancelResult(ResultCode.CANNOT_CANCEL,
        ERR_CANNOT_CANCEL_BIND.get());
  }
@@ -336,6 +331,9 @@
    authFailureReason      = null;
    saslAuthUserEntry      = null;
    userEntryDN            = null;
    cancelResult = new CancelResult(ResultCode.CANNOT_CANCEL,
        ERR_CANNOT_CANCEL_BIND.get());
  }
@@ -551,18 +549,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
@@ -681,35 +667,6 @@
    responseControls.remove(control);
  }
  /**
   * {@inheritDoc}
   */
  @Override()
  public final CancelResult cancel(CancelRequest cancelRequest)
  {
    cancelRequest.addResponseMessage(ERR_CANNOT_CANCEL_BIND.get());
    return CancelResult.CANNOT_CANCEL;
  }
  /**
   * {@inheritDoc}
   */
  @Override()
  public final CancelRequest getCancelRequest()
  {
    return null;
  }
  /**
   * {@inheritDoc}
   */
  @Override()
  public
  boolean setCancelRequest(CancelRequest cancelRequest)
  {
    // Bind operations cannot be canceled.
    return false;
  }
  /**
   * {@inheritDoc}
@@ -761,12 +718,16 @@
   */
  public final void run()
  {
    setResultCode(ResultCode.UNDEFINED);
    // Start the processing timer and initially set the result to indicate that
    // the result is unknown.
    setProcessingStartTime();
    ClientConnection clientConnection = getClientConnection();
    setResultCode(ResultCode.UNDEFINED);
    // Log the bind request message.
    logBindRequest(this);
    ClientConnection clientConnection = getClientConnection();
    // Set a flag to indicate that a bind operation is in progress.  This should
    // ensure that no new operations will be accepted for this client until the
@@ -785,53 +746,33 @@
    // Get the plugin config manager that will be used for invoking plugins.
    PluginConfigManager pluginConfigManager =
      DirectoryServer.getPluginConfigManager();
        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.
bindProcessing:
    try
    {
      // Invoke the pre-parse bind plugins.
      PreParsePluginResult preParseResult =
        pluginConfigManager.invokePreParseBindPlugins(this);
      if (preParseResult.connectionTerminated())
      PluginResult.PreParse preParseResult =
          pluginConfigManager.invokePreParseBindPlugins(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();
        logBindRequest(this);
        logBindResponse(this);
        clientConnection.setBindInProgress(false);
        setResultCode(preParseResult.getResultCode());
        appendErrorMessage(preParseResult.getErrorMessage());
        setMatchedDN(preParseResult.getMatchedDN());
        setReferralURLs(preParseResult.getReferralURLs());
        return;
      }
      else if (preParseResult.sendResponseImmediately())
      {
        logBindRequest(this);
        break bindProcessing;
      }
      else if (preParseResult.skipCoreProcessing())
      {
        break bindProcessing;
      }
      // Log the bind request message.
      logBindRequest(this);
      // Process the bind DN to convert it from the raw form as provided by the
      // client into the form required for the rest of the bind processing.
      DN bindDN = getBindDN();
      if (bindDN == null){
        break bindProcessing;
        return;
      }
      // If this is a simple bind
@@ -840,12 +781,12 @@
      // for that user.
      switch (getAuthenticationType())
      {
      case SIMPLE:
        DN actualRootDN = DirectoryServer.getActualRootBindDN(bindDN);
        if (actualRootDN != null)
        {
          bindDN = actualRootDN;
        }
        case SIMPLE:
          DN actualRootDN = DirectoryServer.getActualRootBindDN(bindDN);
          if (actualRootDN != null)
          {
            bindDN = actualRootDN;
          }
      }
@@ -858,43 +799,45 @@
        // We have found no workflow for the requested base DN, just return
        // a no such entry result code and stop the processing.
        updateOperationErrMsgAndResCode();
        break bindProcessing;
        return;
      }
      workflow.execute(this);
      workflowExecuted = true;
    } // end of processing block
    // Check for a terminated connection.
    if (getCancelResult() == CancelResult.CANCELED)
    }
    catch(CanceledOperationException coe)
    {
      // This shouldn't happen for bind operations. Just cancel anyways
      if (debugEnabled())
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, coe);
      }
      setResultCode(ResultCode.CANCELED);
      appendErrorMessage(cancelRequest.getCancelReason());
    }
    finally
    {
      // If the bind processing is finished, then unset the "bind in progress"
      // flag to allow other operations to be processed on the connection.
      if (getResultCode() != ResultCode.SASL_BIND_IN_PROGRESS)
      {
        clientConnection.setBindInProgress(false);
      }
      // Stop the processing timer.
      setProcessingStopTime();
      // Log the bind response message.
      // Send the bind response to the client.
      clientConnection.sendResponse(this);
      // Log the bind response.
      logBindResponse(this);
      return;
      // Invoke the post-response bind plugins.
      invokePostResponsePlugins(workflowExecuted);
    }
    // If the bind processing is finished, then unset the "bind in progress"
    // flag to allow other operations to be processed on the connection.
    if (getResultCode() != ResultCode.SASL_BIND_IN_PROGRESS)
    {
      clientConnection.setBindInProgress(false);
    }
    // Stop the processing timer.
    setProcessingStopTime();
    // Send the bind response to the client.
    clientConnection.sendResponse(this);
    // Log the bind response.
    logBindResponse(this);
    // Invoke the post-response bind plugins.
    invokePostResponsePlugins(workflowExecuted);
  }
opends/src/server/org/opends/server/core/CompareOperationBasis.java
@@ -25,7 +25,6 @@
 *      Copyright 2007-2008 Sun Microsystems, Inc.
 */
package org.opends.server.core;
import org.opends.messages.Message;
import org.opends.messages.MessageBuilder;
import static org.opends.server.core.CoreConstants.*;
@@ -38,24 +37,11 @@
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.loggers.debug.DebugLogger;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.types.AbstractOperation;
import org.opends.server.types.AttributeType;
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.DN;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.DisconnectReason;
import org.opends.server.types.Entry;
import org.opends.server.types.Operation;
import org.opends.server.types.OperationType;
import org.opends.server.types.ResultCode;
import org.opends.server.types.*;
import org.opends.server.types.operation.PostResponseCompareOperation;
import org.opends.server.types.operation.PreParseCompareOperation;
import org.opends.server.workflowelement.localbackend.
@@ -86,9 +72,6 @@
  // The raw, unprocessed entry DN as included in the client request.
  private ByteString rawEntryDN;
  // The cancel request that has been issued for this compare operation.
  private CancelRequest cancelRequest;
  // The DN of the entry for the compare operation.
  private DN entryDN;
@@ -287,20 +270,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
@@ -456,63 +425,36 @@
    // Start the processing timer.
    setProcessingStartTime();
    // Check for and handle a request to cancel this operation.
    if (cancelRequest != null)
    {
      indicateCancelled(cancelRequest);
      setProcessingStopTime();
      return;
    }
    // Log the compare request message.
    logCompareRequest(this);
    // Get the plugin config manager that will be used for invoking plugins.
    PluginConfigManager pluginConfigManager =
         DirectoryServer.getPluginConfigManager();
        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.
compareProcessing:
    try
    {
      // Check for and handle a request to cancel this operation.
      checkIfCanceled(false);
      // Invoke the pre-parse compare plugins.
      PreParsePluginResult preParseResult =
           pluginConfigManager.invokePreParseComparePlugins(this);
      if (preParseResult.connectionTerminated())
      PluginResult.PreParse preParseResult =
          pluginConfigManager.invokePreParseComparePlugins(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();
        logCompareRequest(this);
        logCompareResponse(this);
        pluginConfigManager.invokePostResponseComparePlugins(this);
        setResultCode(preParseResult.getResultCode());
        appendErrorMessage(preParseResult.getErrorMessage());
        setMatchedDN(preParseResult.getMatchedDN());
        setReferralURLs(preParseResult.getReferralURLs());
        return;
      }
      else if (preParseResult.sendResponseImmediately())
      {
        logCompareRequest(this);
        break compareProcessing;
      }
      else if (preParseResult.skipCoreProcessing())
      {
        break compareProcessing;
      }
      // Log the compare request message.
      logCompareRequest(this);
      // Check for a request to cancel this operation.
      if (cancelRequest != null)
      {
        break compareProcessing;
      }
      checkIfCanceled(false);
      // Process the entry DN to convert it from the raw form to the form
@@ -534,7 +476,7 @@
        setResultCode(de.getResultCode());
        appendErrorMessage(de.getMessageObject());
        break compareProcessing;
        return;
      }
@@ -547,58 +489,50 @@
        // We have found no workflow for the requested base DN, just return
        // a no such entry result code and stop the processing.
        updateOperationErrMsgAndResCode();
        break compareProcessing;
        return;
      }
      workflow.execute(this);
      workflowExecuted = true;
    } // end of processing block
    // Check for a terminated connection.
    if (getCancelResult() == CancelResult.CANCELED)
    {
      // Stop the processing timer.
      setProcessingStopTime();
      // Log the add response message.
      logCompareResponse(this);
      return;
    }
    // Check for and handle a request to cancel this operation.
    if (cancelRequest != null)
    catch(CanceledOperationException coe)
    {
      indicateCancelled(cancelRequest);
      if (debugEnabled())
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, coe);
      }
      setResultCode(ResultCode.CANCELED);
      cancelResult = new CancelResult(ResultCode.CANCELED, null);
      appendErrorMessage(coe.getCancelRequest().getCancelReason());
    }
    finally
    {
      // Stop the processing timer.
      setProcessingStopTime();
      if(cancelRequest == null || cancelResult == null ||
          cancelResult.getResultCode() != ResultCode.CANCELED ||
          cancelRequest.notifyOriginalRequestor() ||
          DirectoryServer.notifyAbandonedOperations())
      {
        clientConnection.sendResponse(this);
      }
      // Log the compare response message.
      logCompareResponse(this);
      // Invoke the post-response compare 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 compare response to the client.
    clientConnection.sendResponse(this);
    // Log the compare response message.
    logCompareResponse(this);
    // Invoke the post-response compare plugins.
    invokePostResponsePlugins(workflowExecuted);
  }
@@ -658,70 +592,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}
opends/src/server/org/opends/server/core/DeleteOperationBasis.java
@@ -47,23 +47,11 @@
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.loggers.debug.DebugLogger;
import org.opends.server.loggers.debug.DebugTracer;
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.DN;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.DisconnectReason;
import org.opends.server.types.Entry;
import org.opends.server.types.Operation;
import org.opends.server.types.OperationType;
import org.opends.server.types.ResultCode;
import org.opends.server.types.*;
import org.opends.server.types.operation.PostResponseDeleteOperation;
import org.opends.server.types.operation.PreParseDeleteOperation;
import org.opends.server.workflowelement.localbackend.*;
@@ -88,9 +76,6 @@
  // The raw, unprocessed entry DN as included in the client request.
  private ByteString rawEntryDN;
  // The cancel request that has been issued for this delete operation.
  private CancelRequest cancelRequest;
  // The DN of the entry for the delete operation.
  private DN entryDN;
@@ -235,18 +220,6 @@
    return OperationType.DELETE;
  }
  /**
   * {@inheritDoc}
   */
  @Override()
  public final void disconnectClient(DisconnectReason disconnectReason,
                                     boolean sendNotification, Message message
  )
  {
    clientConnection.disconnect(disconnectReason, sendNotification,
            message);
  }
  /**
   * {@inheritDoc}
@@ -369,66 +342,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("DeleteOperation(connID=");
@@ -454,74 +367,43 @@
  {
    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 delete request message.
    logDeleteRequest(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.
deleteProcessing:
    try
    {
      // Invoke the pre-parse delete plugins.
      PreParsePluginResult preParseResult =
           pluginConfigManager.invokePreParseDeletePlugins(this);
      if (preParseResult.connectionTerminated())
      PluginResult.PreParse preParseResult =
          pluginConfigManager.invokePreParseDeletePlugins(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();
        logDeleteRequest(this);
        logDeleteResponse(this);
        pluginConfigManager.invokePostResponseDeletePlugins(this);
        setResultCode(preParseResult.getResultCode());
        appendErrorMessage(preParseResult.getErrorMessage());
        setMatchedDN(preParseResult.getMatchedDN());
        setReferralURLs(preParseResult.getReferralURLs());
        return;
      }
      else if (preParseResult.sendResponseImmediately())
      {
        logDeleteRequest(this);
        break deleteProcessing;
      }
      else if (preParseResult.skipCoreProcessing())
      {
        break deleteProcessing;
      }
      // Log the delete request message.
      logDeleteRequest(this);
      // Check for a request to cancel this operation.
      if (cancelRequest != null)
      {
        break deleteProcessing;
      }
      checkIfCanceled(false);
      // Process the entry DN to convert it from its raw form as provided by the
      // client to the form required for the rest of the delete processing.
      DN entryDN = getEntryDN();
      if (entryDN == null){
        break deleteProcessing;
        return;
      }
@@ -534,61 +416,54 @@
        // We have found no workflow for the requested base DN, just return
        // a no such entry result code and stop the processing.
        updateOperationErrMsgAndResCode();
        break deleteProcessing;
        return;
      }
      workflow.execute(this);
      workflowExecuted = true;
    } // end of processing block
    // Check for a terminated connection.
    if (getCancelResult() == CancelResult.CANCELED)
    {
      // Stop the processing timer.
      setProcessingStopTime();
      // Log the add response message.
      logDeleteResponse(this);
      return;
    }
    // Check for and handle a request to cancel this operation.
    if (cancelRequest != null)
    catch(CanceledOperationException coe)
    {
      indicateCancelled(cancelRequest);
      if (debugEnabled())
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, coe);
      }
      setResultCode(ResultCode.CANCELED);
      cancelResult = new CancelResult(ResultCode.CANCELED, null);
      appendErrorMessage(coe.getCancelRequest().getCancelReason());
    }
    finally
    {
      // Stop the processing timer.
      setProcessingStopTime();
      // Log the delete response message.
      if(cancelRequest == null || cancelResult == null ||
          cancelResult.getResultCode() != ResultCode.CANCELED ||
          cancelRequest.notifyOriginalRequestor() ||
          DirectoryServer.notifyAbandonedOperations())
      {
        clientConnection.sendResponse(this);
      }
      // Log the delete response.
      logDeleteResponse(this);
      // Notifies any persistent searches that might be registered with the
      // server.
      notifyPersistentSearches(workflowExecuted);
      // Invoke the post-response delete 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 delete response to the client.
    getClientConnection().sendResponse(this);
    // Log the delete response.
    logDeleteResponse(this);
    // Notifies any persistent searches that might be registered with the
    // server.
    notifyPersistentSearches(workflowExecuted);
    // Invoke the post-response delete plugins.
    invokePostResponsePlugins(workflowExecuted);
  }
opends/src/server/org/opends/server/core/DirectoryServer.java
@@ -71,7 +71,7 @@
import org.opends.server.api.WorkQueue;
import org.opends.server.api.AccessControlHandler;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.StartupPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.backends.RootDSEBackend;
import static org.opends.server.config.ConfigConstants.DN_MONITOR_ROOT;
import static org.opends.server.config.ConfigConstants.ENV_VAR_INSTANCE_ROOT;
@@ -1414,9 +1414,9 @@
      workQueue = new WorkQueueConfigManager().initializeWorkQueue();
      StartupPluginResult startupPluginResult =
      PluginResult.Startup startupPluginResult =
           pluginConfigManager.invokeStartupPlugins();
      if (! startupPluginResult.continueStartup())
      if (! startupPluginResult.continueProcessing())
      {
        Message message = ERR_STARTUP_PLUGIN_ERROR.
            get(startupPluginResult.getErrorMessage(),
opends/src/server/org/opends/server/core/ExtendedOperationBasis.java
@@ -25,7 +25,6 @@
 *      Copyright 2006-2008 Sun Microsystems, Inc.
 */
package org.opends.server.core;
import org.opends.messages.Message;
import org.opends.messages.MessageBuilder;
@@ -35,18 +34,8 @@
import org.opends.server.api.ClientConnection;
import org.opends.server.api.ExtendedOperationHandler;
import org.opends.server.api.plugin.PostOperationPluginResult;
import org.opends.server.api.plugin.PreOperationPluginResult;
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.CancelRequest;
import org.opends.server.types.CancelResult;
import org.opends.server.types.Control;
import org.opends.server.types.DisconnectReason;
import org.opends.server.types.DN;
import org.opends.server.types.OperationType;
import org.opends.server.types.ResultCode;
import org.opends.server.types.operation.PostOperationExtendedOperation;
import org.opends.server.types.operation.PostResponseExtendedOperation;
import org.opends.server.types.operation.PreOperationExtendedOperation;
@@ -58,7 +47,7 @@
import org.opends.server.loggers.debug.DebugLogger;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.*;
import static org.opends.messages.CoreMessages.*;
import static org.opends.server.util.ServerConstants.*;
@@ -90,9 +79,6 @@
  // Indicates whether a response has yet been sent for this operation.
  private boolean responseSent;
  // The cancel request that has been issued for this extended operation.
  private CancelRequest cancelRequest;
  // The set of response controls for this extended operation.
  private List<Control> responseControls;
@@ -134,6 +120,17 @@
    responseControls = new ArrayList<Control>();
    cancelRequest    = null;
    responseSent     = false;
    if (requestOID.equals(OID_CANCEL_REQUEST))
    {
      cancelResult = new CancelResult(ResultCode.CANNOT_CANCEL,
          ERR_CANNOT_CANCEL_CANCEL.get());
    }
    if(requestOID.equals(OID_START_TLS_REQUEST))
    {
      cancelResult = new CancelResult(ResultCode.CANNOT_CANCEL,
          ERR_CANNOT_CANCEL_START_TLS.get());
    }
  }
@@ -243,20 +240,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
@@ -384,82 +367,36 @@
  {
    setResultCode(ResultCode.UNDEFINED);
    // Start the processing timer.
    setProcessingStartTime();
    // Log the extended request message.
    logExtendedRequest(this);
    // Get the plugin config manager that will be used for invoking plugins.
    PluginConfigManager pluginConfigManager =
         DirectoryServer.getPluginConfigManager();
    boolean skipPostOperation = false;
    // Start the processing timer.
    setProcessingStartTime();
    // Check for and handle a request to cancel this operation.
    if (cancelRequest != null)
    try
    {
      if (! (requestOID.equals(OID_CANCEL_REQUEST) ||
             requestOID.equals(OID_START_TLS_REQUEST)))
      {
        indicateCancelled(cancelRequest);
        setProcessingStopTime();
        return;
      }
    }
    // Create a labeled block of code that we can break out of if a problem is
    // detected.
extendedProcessing:
    {
      // Invoke the pre-parse extended plugins.
      PreParsePluginResult preParseResult =
           pluginConfigManager.invokePreParseExtendedPlugins(this);
      if (preParseResult.connectionTerminated())
      {
        // 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();
        logExtendedRequest(this);
        logExtendedResponse(this);
        pluginConfigManager.invokePostResponseExtendedPlugins(this);
        return;
      }
      else if (preParseResult.sendResponseImmediately())
      {
        skipPostOperation = true;
        logExtendedRequest(this);
        break extendedProcessing;
      }
      else if (preParseResult.skipCoreProcessing())
      {
        skipPostOperation = false;
        break extendedProcessing;
      }
      // Log the extended request message.
      logExtendedRequest(this);
      // Check for and handle a request to cancel this operation.
      if (cancelRequest != null)
      checkIfCanceled(false);
      // Invoke the pre-parse extended plugins.
      PluginResult.PreParse preParseResult =
           pluginConfigManager.invokePreParseExtendedPlugins(this);
      if(!preParseResult.continueProcessing())
      {
        if (! (requestOID.equals(OID_CANCEL_REQUEST) ||
               requestOID.equals(OID_START_TLS_REQUEST)))
        {
          indicateCancelled(cancelRequest);
          setProcessingStopTime();
          pluginConfigManager.invokePostResponseExtendedPlugins(this);
          return;
        }
        setResultCode(preParseResult.getResultCode());
        appendErrorMessage(preParseResult.getErrorMessage());
        setMatchedDN(preParseResult.getMatchedDN());
        setReferralURLs(preParseResult.getReferralURLs());
        return;
      }
      checkIfCanceled(false);
      // Get the extended operation handler for the request OID.  If there is
      // none, then fail.
@@ -470,7 +407,7 @@
        setResultCode(ResultCode.UNWILLING_TO_PERFORM);
        appendErrorMessage(ERR_EXTENDED_NO_HANDLER.get(
                String.valueOf(requestOID)));
        break extendedProcessing;
        return;
      }
@@ -488,8 +425,7 @@
            appendErrorMessage(ERR_CONTROL_INSUFFICIENT_ACCESS_RIGHTS.get(
                    c.getOID()));
            skipPostOperation=true;
            break extendedProcessing;
            return;
          }
          if (! c.isCritical())
          {
@@ -504,7 +440,7 @@
                    String.valueOf(requestOID),
                    c.getOID()));
            break extendedProcessing;
            return;
          }
        }
      }
@@ -523,102 +459,77 @@
        appendErrorMessage(ERR_EXTENDED_AUTHZ_INSUFFICIENT_ACCESS_RIGHTS.get(
                String.valueOf(requestOID)));
        skipPostOperation = true;
        break extendedProcessing;
      }
      // Invoke the pre-operation extended plugins.
      PreOperationPluginResult preOpResult =
           pluginConfigManager.invokePreOperationExtendedPlugins(this);
      if (preOpResult.connectionTerminated())
      {
        // There's no point in continuing with anything.  Log the result
        // and return.
        setResultCode(ResultCode.CANCELED);
        appendErrorMessage(ERR_CANCELED_BY_PREOP_DISCONNECT.get());
        setProcessingStopTime();
        logExtendedResponse(this);
        pluginConfigManager.invokePostResponseExtendedPlugins(this);
        return;
      }
      else if (preOpResult.sendResponseImmediately())
      {
        skipPostOperation = true;
        break extendedProcessing;
      }
      else if (preOpResult.skipCoreProcessing())
      {
        skipPostOperation = false;
        break extendedProcessing;
      }
      // Check for and handle a request to cancel this operation.
      if (cancelRequest != null)
      try
      {
        if (! (requestOID.equals(OID_CANCEL_REQUEST) ||
               requestOID.equals(OID_START_TLS_REQUEST)))
        // Invoke the pre-operation extended plugins.
        PluginResult.PreOperation preOpResult =
            pluginConfigManager.invokePreOperationExtendedPlugins(this);
        if(!preOpResult.continueProcessing())
        {
          indicateCancelled(cancelRequest);
          setProcessingStopTime();
          pluginConfigManager.invokePostResponseExtendedPlugins(this);
          setResultCode(preParseResult.getResultCode());
          appendErrorMessage(preParseResult.getErrorMessage());
          setMatchedDN(preParseResult.getMatchedDN());
          setReferralURLs(preParseResult.getReferralURLs());
          return;
        }
        checkIfCanceled(false);
        // Actually perform the processing for this operation.
        handler.processExtendedOperation(this);
      }
      finally
      {
        pluginConfigManager.invokePostOperationExtendedPlugins(this);
      }
    }
    catch(CanceledOperationException coe)
    {
      if (debugEnabled())
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, coe);
      }
      setResultCode(ResultCode.CANCELED);
      cancelResult = new CancelResult(ResultCode.CANCELED, null);
      appendErrorMessage(coe.getCancelRequest().getCancelReason());
    }
    finally
    {
      // Stop the processing timer.
      setProcessingStopTime();
      // Send the response to the client, if it has not already been sent.
      if (! responseSent)
      {
        responseSent = true;
        if(cancelRequest == null || cancelResult == null ||
            cancelResult.getResultCode() != ResultCode.CANCELED ||
            cancelRequest.notifyOriginalRequestor() ||
            DirectoryServer.notifyAbandonedOperations())
        {
          clientConnection.sendResponse(this);
        }
      }
      // Log the extended response.
      logExtendedResponse(this);
      // Actually perform the processing for this operation.
      handler.processExtendedOperation(this);
    }
      // Invoke the post-response extended plugins.
      pluginConfigManager.invokePostResponseExtendedPlugins(this);
    // Indicate that it is now too late to attempt to cancel the operation.
    setCancelResult(CancelResult.TOO_LATE);
    // Invoke the post-operation extended plugins.
    if (! skipPostOperation)
    {
      PostOperationPluginResult postOpResult =
           pluginConfigManager.invokePostOperationExtendedPlugins(this);
      if (postOpResult.connectionTerminated())
      // If no cancel result, set it
      if(cancelResult == null)
      {
        // There's no point in continuing with anything.  Log the result and
        // return.
        setResultCode(ResultCode.CANCELED);
        appendErrorMessage(ERR_CANCELED_BY_PREOP_DISCONNECT.get());
        setProcessingStopTime();
        logExtendedResponse(this);
        pluginConfigManager.invokePostResponseExtendedPlugins(this);
        return;
        cancelResult = new CancelResult(ResultCode.TOO_LATE, null);
      }
    }
    // Stop the processing timer.
    setProcessingStopTime();
    // Send the response to the client, if it has not already been sent.
    if (! responseSent)
    {
      responseSent = true;
      clientConnection.sendResponse(this);
    }
    // Log the extended response.
    logExtendedResponse(this);
    // Invoke the post-response extended plugins.
    pluginConfigManager.invokePostResponseExtendedPlugins(this);
  }
@@ -652,73 +563,6 @@
    this.responseSent = true;
  }
  /**
   * {@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}
   */
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=");
opends/src/server/org/opends/server/core/ModifyOperationBasis.java
@@ -48,29 +48,13 @@
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.loggers.debug.DebugLogger;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.protocols.ldap.LDAPAttribute;
import org.opends.server.types.LDAPException;
import org.opends.server.protocols.ldap.LDAPModification;
import org.opends.server.types.AttributeValue;
import org.opends.server.types.Entry;
import org.opends.server.types.Operation;
import org.opends.server.types.RawModification;
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.DN;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.DisconnectReason;
import org.opends.server.types.Modification;
import org.opends.server.types.OperationType;
import org.opends.server.types.ResultCode;
import org.opends.server.types.*;
import org.opends.server.types.operation.PostResponseModifyOperation;
import org.opends.server.types.operation.PreParseModifyOperation;
import org.opends.server.workflowelement.localbackend.*;
@@ -111,9 +95,6 @@
  // The set of modifications for this modify operation.
  private List<Modification> modifications;
  // The cancel request that has been issued for this modify operation.
  CancelRequest cancelRequest;
  // The change number that has been assigned to this operation.
  private long changeNumber;
@@ -295,17 +276,6 @@
  /**
   * {@inheritDoc}
   */
  public final void disconnectClient(DisconnectReason disconnectReason,
                                     boolean sendNotification, Message message
  )
  {
    clientConnection.disconnect(disconnectReason, sendNotification,
            message);
  }
  /**
   * {@inheritDoc}
   */
  public final OperationType getOperationType()
  {
    // Note that no debugging will be done in this method because it is a likely
@@ -429,62 +399,6 @@
  /**
   * {@inheritDoc}
   */
  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}
   */
  public final CancelRequest getCancelRequest()
  {
    return cancelRequest;
  }
  /**
   * {@inheritDoc}
   */
  public boolean setCancelRequest(CancelRequest cancelRequest)
  {
    this.cancelRequest = cancelRequest;
    return true;
  }
  /**
   * {@inheritDoc}
   */
  public final void toString(StringBuilder buffer)
  {
    buffer.append("ModifyOperation(connID=");
@@ -526,73 +440,47 @@
  {
    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 request message.
    logModifyRequest(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.
modifyProcessing:
    try
    {
      // Check for and handle a request to cancel this operation.
      checkIfCanceled(false);
      // Invoke the pre-parse modify plugins.
      PreParsePluginResult preParseResult =
           pluginConfigManager.invokePreParseModifyPlugins(this);
      if (preParseResult.connectionTerminated())
      PluginResult.PreParse preParseResult =
          pluginConfigManager.invokePreParseModifyPlugins(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();
        logModifyRequest(this);
        logModifyResponse(this);
        pluginConfigManager.invokePostResponseModifyPlugins(this);
        setResultCode(preParseResult.getResultCode());
        appendErrorMessage(preParseResult.getErrorMessage());
        setMatchedDN(preParseResult.getMatchedDN());
        setReferralURLs(preParseResult.getReferralURLs());
        return;
      }
      else if (preParseResult.sendResponseImmediately())
      {
        logModifyRequest(this);
        break modifyProcessing;
      }
      else if (preParseResult.skipCoreProcessing())
      {
        break modifyProcessing;
      }
      // Log the modify request message.
      logModifyRequest(this);
      // Check for a request to cancel this operation.
      if (getCancelRequest() != null)
      {
        break modifyProcessing;
      }
      // Check for and handle a request to cancel this operation.
      checkIfCanceled(false);
      // Process the entry DN to convert it from the raw form to the form
      // required for the rest of the modify processing.
      DN entryDN = getEntryDN();
      if (entryDN == null){
        break modifyProcessing;
        return;
      }
@@ -605,61 +493,53 @@
        // We have found no workflow for the requested base DN, just return
        // a no such entry result code and stop the processing.
        updateOperationErrMsgAndResCode();
        break modifyProcessing;
        return;
      }
      workflow.execute(this);
      workflowExecuted = true;
    } // end of processing block
    // Check for a terminated connection.
    if (getCancelResult() == CancelResult.CANCELED)
    {
      // Stop the processing timer.
      setProcessingStopTime();
      // Log the add response message.
      logModifyResponse(this);
      return;
    }
    // Check for and handle a request to cancel this operation.
    if (cancelRequest != null)
    catch(CanceledOperationException coe)
    {
      indicateCancelled(cancelRequest);
      if (debugEnabled())
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, coe);
      }
      setResultCode(ResultCode.CANCELED);
      cancelResult = new CancelResult(ResultCode.CANCELED, null);
      appendErrorMessage(coe.getCancelRequest().getCancelReason());
    }
    finally
    {
      // Stop the processing timer.
      setProcessingStopTime();
      // Log the modify response message.
      if(cancelRequest == null || cancelResult == null ||
          cancelResult.getResultCode() != ResultCode.CANCELED ||
          cancelRequest.notifyOriginalRequestor() ||
          DirectoryServer.notifyAbandonedOperations())
      {
        clientConnection.sendResponse(this);
      }
      // Log the modify response.
      logModifyResponse(this);
      // Invoke the post-response modify plugins.
      // Notifies any persistent searches that might be registered with the
      // server.
      notifyPersistentSearches(workflowExecuted);
      // Invoke the post-response add 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 response to the client.
    getClientConnection().sendResponse(this);
    // Log the modify response.
    logModifyResponse(this);
    // Notifies any persistent searches that might be registered with the
    // server.
    notifyPersistentSearches(workflowExecuted);
    // Invoke the post-response modify plugins.
    invokePostResponsePlugins(workflowExecuted);
  }
opends/src/server/org/opends/server/core/OperationWrapper.java
@@ -33,16 +33,7 @@
import java.util.Map;
import org.opends.server.api.ClientConnection;
import org.opends.server.types.CancelRequest;
import org.opends.server.types.CancelResult;
import org.opends.server.types.Control;
import org.opends.server.types.DN;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.DisconnectReason;
import org.opends.server.types.Entry;
import org.opends.server.types.Operation;
import org.opends.server.types.OperationType;
import org.opends.server.types.ResultCode;
import org.opends.server.types.*;
/**
@@ -108,6 +99,14 @@
  /**
   * {@inheritDoc}
   */
  public void abort(CancelRequest cancelRequest)
  {
    operation.abort(cancelRequest);
  }
  /**
   * {@inheritDoc}
   */
  public void disconnectClient(
          DisconnectReason disconnectReason,
          boolean sendNotification,
@@ -329,14 +328,6 @@
  /**
   * {@inheritDoc}
   */
  public void indicateCancelled(CancelRequest cancelRequest)
  {
    operation.indicateCancelled(cancelRequest);
  }
  /**
   * {@inheritDoc}
   */
  public boolean isInternalOperation()
  {
    return operation.isInternalOperation();
@@ -417,22 +408,6 @@
  /**
   * {@inheritDoc}
   */
  public boolean setCancelRequest(CancelRequest cancelRequest)
  {
    return operation.setCancelRequest(cancelRequest);
  }
  /**
   * {@inheritDoc}
   */
  public void setCancelResult(CancelResult cancelResult)
  {
    operation.setCancelResult(cancelResult);
  }
  /**
   * {@inheritDoc}
   */
  public void setDontSynchronize(boolean dontSynchronize)
  {
    operation.setDontSynchronize(dontSynchronize);
@@ -465,22 +440,6 @@
  /**
   * {@inheritDoc}
   */
  public void setProcessingStartTime()
  {
    operation.setProcessingStartTime();
  }
  /**
   * {@inheritDoc}
   */
  public void setProcessingStopTime()
  {
    operation.setProcessingStopTime();
  }
  /**
   * {@inheritDoc}
   */
  public void setReferralURLs(List<String> referralURLs)
  {
    operation.setReferralURLs(referralURLs);
@@ -518,5 +477,12 @@
    operation.toString(buffer);
  }
  /**
   * {@inheritDoc}
   */
  public synchronized final void checkIfCanceled(boolean signalTooLate)
      throws CanceledOperationException {
    operation.checkIfCanceled(signalTooLate);
  }
}
opends/src/server/org/opends/server/core/PasswordPolicyState.java
@@ -104,10 +104,6 @@
  // should be stored as modifications.
  private final boolean updateEntry;
  // Indicates whether to debug password policy processing performed wth this
  // state object.
  private final boolean debug;
  // The string representation of the user's DN.
  private final String userDNString;
@@ -187,18 +183,15 @@
   * @param  updateEntry  Indicates whether changes should update the provided
   *                      user entry directly or whether they should be
   *                      collected as a set of modifications.
   * @param  debug        Indicates whether to enable debugging for the
   *                      operations performed.
   *
   * @throws  DirectoryException  If a problem occurs while attempting to
   *                              determine the password policy for the user or
   *                              perform any other state initialization.
   */
  public PasswordPolicyState(Entry userEntry, boolean updateEntry,
                             boolean debug)
  public PasswordPolicyState(Entry userEntry, boolean updateEntry)
       throws DirectoryException
  {
    this(userEntry, updateEntry, TimeThread.getTime(), false, debug);
    this(userEntry, updateEntry, TimeThread.getTime(), false);
  }
@@ -219,26 +212,22 @@
   * @param  useDefaultOnError  Indicates whether the server should fall back to
   *                            using the default password policy if there is a
   *                            problem with the configured policy for the user.
   * @param  debug              Indicates whether to enable debugging for the
   *                            operations performed.
   *
   * @throws  DirectoryException  If a problem occurs while attempting to
   *                              determine the password policy for the user or
   *                              perform any other state initialization.
   */
  public PasswordPolicyState(Entry userEntry, boolean updateEntry,
                             long currentTime, boolean useDefaultOnError,
                             boolean debug)
                             long currentTime, boolean useDefaultOnError)
       throws DirectoryException
  {
    this.userEntry   = userEntry;
    this.updateEntry = updateEntry;
    this.debug       = debug;
    this.currentTime = currentTime;
    userDNString     = userEntry.getDN().toString();
    passwordPolicy   = getPasswordPolicyInternal(this.userEntry,
                                                 useDefaultOnError, this.debug);
                                                 useDefaultOnError);
    // Get the password changed time for the user.
    AttributeType type
@@ -266,7 +255,7 @@
      {
        passwordChangedTime = 0;
        if (debug)
        if (debugEnabled())
        {
          TRACER.debugWarning("Could not determine password changed time for " +
              "user %s.", userDNString);
@@ -287,8 +276,6 @@
   * @param  useDefaultOnError  Indicates whether the server should fall back to
   *                            using the default password policy if there is a
   *                            problem with the configured policy for the user.
   * @param  debug              Indicates whether to enable debugging for the
   *                            operations performed.
   *
   * @return  The password policy for the user.
   *
@@ -296,7 +283,7 @@
   *                              determine the password policy for the user.
   */
  private static PasswordPolicy getPasswordPolicyInternal(Entry userEntry,
                                     boolean useDefaultOnError, boolean debug)
                                     boolean useDefaultOnError)
       throws DirectoryException
  {
    String userDNString = userEntry.getDN().toString();
@@ -323,7 +310,7 @@
            TRACER.debugCaught(DebugLogLevel.ERROR, e);
          }
          if (debug)
          if (debugEnabled())
          {
            TRACER.debugError("Could not parse password policy subentry " +
                "DN %s for user %s: %s",
@@ -348,7 +335,7 @@
        PasswordPolicy policy = DirectoryServer.getPasswordPolicy(subentryDN);
        if (policy == null)
        {
          if (debug)
          if (debugEnabled())
          {
            TRACER.debugError("Password policy subentry %s for user %s " +
                 "is not defined in the Directory Server.",
@@ -369,27 +356,21 @@
          }
        }
        if (debug)
        if (debugEnabled())
        {
            if (debugEnabled())
            {
              TRACER.debugInfo("Using password policy subentry %s for user %s.",
                        String.valueOf(subentryDN), userDNString);
            }
          }
          TRACER.debugInfo("Using password policy subentry %s for user %s.",
              String.valueOf(subentryDN), userDNString);
        }
        return policy;
      }
    }
    // There is no policy subentry defined: use the default.
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Using the default password policy for user %s",
                  userDNString);
      }
      TRACER.debugInfo("Using the default password policy for user %s",
          userDNString);
    }
    return DirectoryServer.getDefaultPasswordPolicy();
@@ -421,24 +402,21 @@
      }
    }
    if (debug)
    if (stringValue == null)
    {
      if (stringValue == null)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning null because attribute %s does not " +
              "exist in user entry %s",
                    attributeType.getNameOrOID(), userDNString);
        }
        TRACER.debugInfo("Returning null because attribute %s does not " +
            "exist in user entry %s",
            attributeType.getNameOrOID(), userDNString);
      }
      else
    }
    else
    {
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning value %s for user %s",
                    stringValue, userDNString);
        }
        TRACER.debugInfo("Returning value %s for user %s",
            stringValue, userDNString);
      }
    }
@@ -482,14 +460,11 @@
          if (debugEnabled())
          {
            TRACER.debugCaught(DebugLogLevel.ERROR, e);
          }
          if (debug)
          {
            TRACER.debugWarning("Unable to decode value %s for attribute %s " +
                 "in user entry %s: %s",
                         v.getStringValue(), attributeType.getNameOrOID(),
                         userDNString, stackTraceToSingleLineString(e));
                "in user entry %s: %s",
                v.getStringValue(), attributeType.getNameOrOID(),
                userDNString, stackTraceToSingleLineString(e));
          }
          Message message = ERR_PWPSTATE_CANNOT_DECODE_GENERALIZED_TIME.
@@ -502,19 +477,16 @@
      }
    }
    if (debug)
    if (timeValue == -1)
    {
      if (timeValue == -1)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning -1 because attribute %s does not " +
              "exist in user entry %s",
                    attributeType.getNameOrOID(), userDNString);
        }
        TRACER.debugInfo("Returning -1 because attribute %s does not " +
            "exist in user entry %s",
            attributeType.getNameOrOID(), userDNString);
      }
      // FIXME: else to be consistent...
    }
    // FIXME: else to be consistent...
    return timeValue;
  }
@@ -556,14 +528,11 @@
            if (debugEnabled())
            {
              TRACER.debugCaught(DebugLogLevel.ERROR, e);
            }
            if (debug)
            {
              TRACER.debugWarning("Unable to decode value %s for attribute %s" +
                   "in user entry %s: %s",
                           v.getStringValue(), attributeType.getNameOrOID(),
                           userDNString, stackTraceToSingleLineString(e));
                  "in user entry %s: %s",
                  v.getStringValue(), attributeType.getNameOrOID(),
                  userDNString, stackTraceToSingleLineString(e));
            }
            Message message = ERR_PWPSTATE_CANNOT_DECODE_GENERALIZED_TIME.
@@ -576,16 +545,13 @@
      }
    }
    if (debug)
    if (timeValues.isEmpty())
    {
      if (timeValues.isEmpty())
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning an empty list because attribute %s " +
              "does not exist in user entry %s",
                    attributeType.getNameOrOID(), userDNString);
        }
        TRACER.debugInfo("Returning an empty list because attribute %s " +
            "does not exist in user entry %s",
            attributeType.getNameOrOID(), userDNString);
      }
    }
    return timeValues;
@@ -622,13 +588,10 @@
        if (valueString.equals("true") || valueString.equals("yes") ||
            valueString.equals("on") || valueString.equals("1"))
        {
          if (debug)
          if (debugEnabled())
          {
            if (debugEnabled())
            {
              TRACER.debugInfo("Attribute %s resolves to true for user entry " +
                  "%s", attributeType.getNameOrOID(), userDNString);
            }
            TRACER.debugInfo("Attribute %s resolves to true for user entry " +
                "%s", attributeType.getNameOrOID(), userDNString);
          }
          return ConditionResult.TRUE;
@@ -637,42 +600,36 @@
        if (valueString.equals("false") || valueString.equals("no") ||
                 valueString.equals("off") || valueString.equals("0"))
        {
          if (debug)
          if (debugEnabled())
          {
            if (debugEnabled())
            {
              TRACER.debugInfo("Attribute %s resolves to false for user " +
                  "entry %s", attributeType.getNameOrOID(), userDNString);
            }
            TRACER.debugInfo("Attribute %s resolves to false for user " +
                "entry %s", attributeType.getNameOrOID(), userDNString);
          }
          return ConditionResult.FALSE;
        }
        if (debug)
        if(debugEnabled())
        {
            TRACER.debugError("Unable to resolve value %s for attribute %s " +
                 "in user entry %s as a Boolean.",
                       valueString, attributeType.getNameOrOID(),
                       userDNString);
          TRACER.debugError("Unable to resolve value %s for attribute %s " +
              "in user entry %s as a Boolean.",
              valueString, attributeType.getNameOrOID(),
              userDNString);
        }
        Message message = ERR_PWPSTATE_CANNOT_DECODE_BOOLEAN.get(
            valueString, attributeType.getNameOrOID(), userDNString);
        throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX,
                                     message);
            message);
      }
    }
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Returning %s because attribute %s does not exist " +
             "in user entry %s",
                  ConditionResult.UNDEFINED.toString(),
                  attributeType.getNameOrOID(), userDNString);
      }
      TRACER.debugInfo("Returning %s because attribute %s does not exist " +
          "in user entry %s",
          ConditionResult.UNDEFINED.toString(),
          attributeType.getNameOrOID(), userDNString);
    }
    return ConditionResult.UNDEFINED;
@@ -759,13 +716,10 @@
   */
  public void setPasswordChangedTime(long passwordChangedTime)
  {
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Setting password changed time for user %s to " +
            "current time of %d", userDNString, currentTime);
      }
      TRACER.debugInfo("Setting password changed time for user %s to " +
          "current time of %d", userDNString, currentTime);
    }
    // passwordChangedTime is computed in the constructor from values in the
@@ -811,13 +765,10 @@
   */
  public void clearPasswordChangedTime()
  {
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Clearing password changed time for user %s",
                         userDNString);
      }
      TRACER.debugInfo("Clearing password changed time for user %s",
          userDNString);
    }
    AttributeType type =
@@ -865,13 +816,10 @@
  {
    if (isDisabled != ConditionResult.UNDEFINED)
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning stored result of %b for user %s",
                    (isDisabled == ConditionResult.TRUE), userDNString);
        }
        TRACER.debugInfo("Returning stored result of %b for user %s",
            (isDisabled == ConditionResult.TRUE), userDNString);
      }
      return isDisabled == ConditionResult.TRUE;
@@ -891,7 +839,7 @@
      }
      isDisabled = ConditionResult.TRUE;
      if (debug)
      if (debugEnabled())
      {
          TRACER.debugWarning("User %s is considered administratively " +
              "disabled because an error occurred while attempting to make " +
@@ -905,26 +853,20 @@
    if (isDisabled == ConditionResult.UNDEFINED)
    {
      isDisabled = ConditionResult.FALSE;
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("User %s is not administratively disabled since " +
              "the attribute \"%s\" is not present in the entry.",
                     userDNString, OP_ATTR_ACCOUNT_DISABLED);
        }
        TRACER.debugInfo("User %s is not administratively disabled since " +
            "the attribute \"%s\" is not present in the entry.",
            userDNString, OP_ATTR_ACCOUNT_DISABLED);
      }
      return false;
    }
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("User %s %s administratively disabled.",
                  userDNString,
                  ((isDisabled == ConditionResult.TRUE) ? " is" : " is not"));
      }
      TRACER.debugInfo("User %s %s administratively disabled.",
          userDNString,
          ((isDisabled == ConditionResult.TRUE) ? " is" : " is not"));
    }
    return isDisabled == ConditionResult.TRUE;
@@ -941,13 +883,10 @@
   */
  public void setDisabled(boolean isDisabled)
  {
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Updating user %s to set the disabled flag to %b",
                  userDNString, isDisabled);
      }
      TRACER.debugInfo("Updating user %s to set the disabled flag to %b",
          userDNString, isDisabled);
    }
@@ -1006,13 +945,10 @@
  {
    if (isAccountExpired != ConditionResult.UNDEFINED)
    {
      if(debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning stored result of %b for user %s",
                    (isAccountExpired == ConditionResult.TRUE), userDNString);
        }
        TRACER.debugInfo("Returning stored result of %b for user %s",
            (isAccountExpired == ConditionResult.TRUE), userDNString);
      }
      return isAccountExpired == ConditionResult.TRUE;
@@ -1034,7 +970,7 @@
      }
      isAccountExpired = ConditionResult.TRUE;
      if (debug)
      if (debugEnabled())
      {
          TRACER.debugWarning("User %s is considered to have an expired " +
               "account because an error occurred while attempting to make " +
@@ -1049,26 +985,20 @@
    {
      // The user does have an expiration time, but it hasn't arrived yet.
      isAccountExpired = ConditionResult.FALSE;
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("The account for user %s is not expired because " +
              "the expiration time has not yet arrived.", userDNString);
        }
        TRACER.debugInfo("The account for user %s is not expired because " +
            "the expiration time has not yet arrived.", userDNString);
      }
    }
    else if (accountExpirationTime >= 0)
    {
      // The user does have an expiration time, and it is in the past.
      isAccountExpired = ConditionResult.TRUE;
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("The account for user %s is expired because the " +
              "expiration time in that account has passed.", userDNString);
        }
        TRACER.debugInfo("The account for user %s is expired because the " +
            "expiration time in that account has passed.", userDNString);
      }
    }
    else
@@ -1076,14 +1006,11 @@
      // The user doesn't have an expiration time in their entry, so it
      // can't be expired.
      isAccountExpired = ConditionResult.FALSE;
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("The account for user %s is not expired because " +
              "there is no expiration time in the user's entry.",
          userDNString);
        }
        TRACER.debugInfo("The account for user %s is not expired because " +
            "there is no expiration time in the user's entry.",
            userDNString);
      }
    }
@@ -1126,13 +1053,10 @@
    {
      String timeStr = GeneralizedTimeSyntax.format(accountExpirationTime);
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Setting account expiration time for user %s to %s",
                    userDNString, timeStr);
        }
        TRACER.debugInfo("Setting account expiration time for user %s to %s",
            userDNString, timeStr);
      }
      this.accountExpirationTime = accountExpirationTime;
@@ -1167,13 +1091,10 @@
   */
  public void clearAccountExpirationTime()
  {
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Clearing account expiration time for user %s",
                  userDNString);
      }
      TRACER.debugInfo("Clearing account expiration time for user %s",
          userDNString);
    }
    accountExpirationTime = -1;
@@ -1209,14 +1130,11 @@
  {
    if (authFailureTimes != null)
    {
      if(debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning stored auth failure time list of %d " +
              "elements for user %s" +
              authFailureTimes.size(), userDNString);
        }
        TRACER.debugInfo("Returning stored auth failure time list of %d " +
            "elements for user %s" +
            authFailureTimes.size(), userDNString);
      }
      return authFailureTimes;
@@ -1241,7 +1159,7 @@
        TRACER.debugCaught(DebugLogLevel.ERROR, e);
      }
      if (debug)
      if (debugEnabled())
      {
        TRACER.debugWarning("Error while processing auth failure times " +
             "for user %s: %s",
@@ -1265,14 +1183,11 @@
    if (authFailureTimes.isEmpty())
    {
      if (debug)
      if (debugEnabled())
      {
       if (debugEnabled())
        {
          TRACER.debugInfo("Returning an empty auth failure time list for " +
              "user %s because the attribute is absent from the entry.",
                    userDNString);
        }
        TRACER.debugInfo("Returning an empty auth failure time list for " +
            "user %s because the attribute is absent from the entry.",
            userDNString);
      }
      return authFailureTimes;
@@ -1291,13 +1206,10 @@
        long l = iterator.next();
        if (l < expirationTime)
        {
          if (debug)
          if (debugEnabled())
          {
            if (debugEnabled())
            {
              TRACER.debugInfo("Removing expired auth failure time %d for " +
                  "user %s", l, userDNString);
            }
            TRACER.debugInfo("Removing expired auth failure time %d for " +
                "user %s", l, userDNString);
          }
          iterator.remove();
@@ -1345,13 +1257,10 @@
      }
    }
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Returning auth failure time list of %d elements " +
            "for user %s", authFailureTimes.size(), userDNString);
      }
      TRACER.debugInfo("Returning auth failure time list of %d elements " +
          "for user %s", authFailureTimes.size(), userDNString);
    }
    return authFailureTimes;
@@ -1371,13 +1280,10 @@
      return;
    }
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Updating authentication failure times for user %s",
                  userDNString);
      }
      TRACER.debugInfo("Updating authentication failure times for user %s",
          userDNString);
    }
@@ -1440,13 +1346,10 @@
    if ((lockoutCount > 0) && (lockoutCount <= authFailureTimes.size()))
    {
      setFailureLockedTime(highestFailureTime);
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Locking user account %s due to too many failures.",
                    userDNString);
        }
        TRACER.debugInfo("Locking user account %s due to too many failures.",
            userDNString);
      }
    }
  }
@@ -1507,13 +1410,10 @@
    if ((lockoutCount > 0) && (lockoutCount <= authFailureTimes.size()))
    {
      setFailureLockedTime(highestFailureTime);
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Locking user account %s due to too many failures.",
                    userDNString);
        }
        TRACER.debugInfo("Locking user account %s due to too many failures.",
            userDNString);
      }
    }
  }
@@ -1526,13 +1426,10 @@
   */
  private void clearAuthFailureTimes()
  {
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Clearing authentication failure times for user %s",
                  userDNString);
      }
      TRACER.debugInfo("Clearing authentication failure times for user %s",
          userDNString);
    }
    List<Long> failureTimes = getAuthFailureTimes();
@@ -1596,7 +1493,7 @@
      }
      failureLockedTime = currentTime;
      if (debug)
      if (debugEnabled())
      {
        TRACER.debugWarning("Returning current time for user %s because an " +
            "error occurred: %s",
@@ -1659,13 +1556,10 @@
   */
  private void clearFailureLockedTime()
  {
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Clearing failure lockout time for user %s.",
                         userDNString);
      }
      TRACER.debugInfo("Clearing failure lockout time for user %s.",
          userDNString);
    }
    if (-1L == getFailureLockedTime())
@@ -1719,13 +1613,10 @@
    final int maxFailures = passwordPolicy.getLockoutFailureCount();
    if (maxFailures <= 0)
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning false for user %s because lockout due " +
              "to failures is not enabled.", userDNString);
        }
        TRACER.debugInfo("Returning false for user %s because lockout due " +
            "to failures is not enabled.", userDNString);
      }
      return false;
@@ -1750,13 +1641,10 @@
      // failure times might have accumulated to trigger a lockout.
      if (getAuthFailureTimes().size() < maxFailures)
      {
        if (debug)
        if (debugEnabled())
        {
          if (debugEnabled())
          {
            TRACER.debugInfo("Returning false for user %s because there is " +
                "no locked time.", userDNString);
          }
          TRACER.debugInfo("Returning false for user %s because there is " +
              "no locked time.", userDNString);
        }
        return false;
@@ -1765,14 +1653,11 @@
      // The account isn't locked but should be, so do so now.
      setFailureLockedTime(currentTime);// FIXME: set to max(failureTimes)?
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Locking user %s because there were enough " +
              "existing failures even though there was no account locked time.",
                    userDNString);
        }
        TRACER.debugInfo("Locking user %s because there were enough " +
            "existing failures even though there was no account locked time.",
            userDNString);
      }
      // Fall through...
    }
@@ -1786,14 +1671,11 @@
      {
        secondsUntilUnlock = (int) ((unlockTime - currentTime) / 1000);
        if (debug)
        if (debugEnabled())
        {
          if (debugEnabled())
          {
            TRACER.debugInfo("Returning true for user %s because there is a " +
                "locked time and the lockout duration has not been reached.",
                      userDNString);
          }
          TRACER.debugInfo("Returning true for user %s because there is a " +
              "locked time and the lockout duration has not been reached.",
              userDNString);
        }
        return true;
@@ -1802,27 +1684,21 @@
      // The lockout in the entry has expired...
      clearFailureLockout();
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning false for user %s " +
               "because the existing lockout has expired.", userDNString);
        }
        TRACER.debugInfo("Returning false for user %s " +
            "because the existing lockout has expired.", userDNString);
      }
      assert -1L == getFailureLockedTime();
      return false;
    }
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Returning true for user %s " +
             "because there is a locked time and no lockout duration.",
                  userDNString);
      }
      TRACER.debugInfo("Returning true for user %s " +
          "because there is a locked time and no lockout duration.",
          userDNString);
    }
    assert -1L <= getFailureLockedTime();
@@ -1875,13 +1751,10 @@
  {
    if (lastLoginTime != Long.MIN_VALUE)
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning stored last login time of %d for " +
              "user %s.", lastLoginTime, userDNString);
        }
        TRACER.debugInfo("Returning stored last login time of %d for " +
            "user %s.", lastLoginTime, userDNString);
      }
      return lastLoginTime;
@@ -1895,13 +1768,10 @@
    if ((type == null) || (format == null))
    {
      lastLoginTime = -1;
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning -1 for user %s because no last login " +
              "time will be maintained.", userDNString);
        }
        TRACER.debugInfo("Returning -1 for user %s because no last login " +
            "time will be maintained.", userDNString);
      }
      return lastLoginTime;
@@ -1923,14 +1793,11 @@
          SimpleDateFormat dateFormat = new SimpleDateFormat(format);
          lastLoginTime = dateFormat.parse(valueString).getTime();
          if (debug)
          if (debugEnabled())
          {
            if (debugEnabled())
            {
              TRACER.debugInfo("Returning last login time of %d for user %s" +
                   "decoded using current last login time format.",
                        lastLoginTime, userDNString);
              }
            TRACER.debugInfo("Returning last login time of %d for user %s" +
                "decoded using current last login time format.",
                lastLoginTime, userDNString);
          }
          return lastLoginTime;
@@ -1951,14 +1818,11 @@
              SimpleDateFormat dateFormat = new SimpleDateFormat(f);
              lastLoginTime = dateFormat.parse(valueString).getTime();
              if (debug)
              if (debugEnabled())
              {
                if (debugEnabled())
                {
                  TRACER.debugInfo("Returning last login time of %d for " +
                      "user %s decoded using previous last login time format " +
                      "of %s.", lastLoginTime, userDNString, f);
                }
                TRACER.debugInfo("Returning last login time of %d for " +
                    "user %s decoded using previous last login time format " +
                    "of %s.", lastLoginTime, userDNString, f);
              }
              return lastLoginTime;
@@ -1973,7 +1837,7 @@
          }
          assert lastLoginTime == -1;
          if (debug)
          if (debugEnabled())
          {
              TRACER.debugWarning("Returning -1 for user %s because the " +
                  "last login time value %s could not be parsed using any " +
@@ -1986,13 +1850,10 @@
    }
    assert lastLoginTime == -1;
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Returning %d for user %s because no last " +
            "login time value exists.", lastLoginTime, userDNString);
      }
      TRACER.debugInfo("Returning %d for user %s because no last " +
          "login time value exists.", lastLoginTime, userDNString);
    }
    return lastLoginTime;
@@ -2041,7 +1902,7 @@
        TRACER.debugCaught(DebugLogLevel.ERROR, e);
      }
      if (debug)
      if (debugEnabled())
      {
        TRACER.debugWarning("Unable to set last login time for user %s " +
            "because an error occurred: %s",
@@ -2055,14 +1916,11 @@
    String existingTimestamp = getValue(type);
    if ((existingTimestamp != null) && timestamp.equals(existingTimestamp))
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Not updating last login time for user %s " +
              "because the new value matches the existing value.",
                           userDNString);
        }
        TRACER.debugInfo("Not updating last login time for user %s " +
            "because the new value matches the existing value.",
            userDNString);
      }
      return;
@@ -2085,13 +1943,10 @@
      modifications.add(new Modification(ModificationType.REPLACE, a, true));
    }
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Updated the last login time for user %s to %s",
                  userDNString, timestamp);
      }
      TRACER.debugInfo("Updated the last login time for user %s to %s",
          userDNString, timestamp);
    }
  }
@@ -2103,12 +1958,9 @@
   */
  public void clearLastLoginTime()
  {
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Clearing last login time for user %s", userDNString);
      }
      TRACER.debugInfo("Clearing last login time for user %s", userDNString);
    }
    lastLoginTime = -1;
@@ -2140,13 +1992,10 @@
  {
    if (isIdleLocked != ConditionResult.UNDEFINED)
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning stored result of %b for user %s",
                    (isIdleLocked == ConditionResult.TRUE), userDNString);
        }
        TRACER.debugInfo("Returning stored result of %b for user %s",
            (isIdleLocked == ConditionResult.TRUE), userDNString);
      }
      return isIdleLocked == ConditionResult.TRUE;
@@ -2158,15 +2007,11 @@
    {
      isIdleLocked = ConditionResult.FALSE;
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning false for user %s because no idle " +
              "lockout interval is defined.", userDNString);
        }
        TRACER.debugInfo("Returning false for user %s because no idle " +
            "lockout interval is defined.", userDNString);
      }
      return false;
    }
@@ -2178,44 +2023,38 @@
    if (lastLoginTime > lockTime || passwordChangedTime > lockTime)
    {
      isIdleLocked = ConditionResult.FALSE;
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        StringBuilder reason = new StringBuilder();
        if(lastLoginTime > lockTime)
        {
          StringBuilder reason = new StringBuilder();
          if(lastLoginTime > lockTime)
          {
            reason.append("the last login time is in an acceptable window");
          }
          else
          {
            if(lastLoginTime < 0)
            {
              reason.append("there is no last login time, but ");
            }
            reason.append(
                 "the password changed time is in an acceptable window");
          }
          TRACER.debugInfo("Returning false for user %s because %s.",
                    userDNString, reason.toString());
          reason.append("the last login time is in an acceptable window");
        }
        else
        {
          if(lastLoginTime < 0)
          {
            reason.append("there is no last login time, but ");
          }
          reason.append(
              "the password changed time is in an acceptable window");
        }
        TRACER.debugInfo("Returning false for user %s because %s.",
            userDNString, reason.toString());
      }
    }
    else
    {
      isIdleLocked = ConditionResult.TRUE;
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          String reason = (lastLoginTime < 0)
             ? "there is no last login time and the password " +
                  "changed time is not in an acceptable window"
             : "neither last login time nor password " +
                  "changed time are in an acceptable window";
          TRACER.debugInfo("Returning true for user %s because %s.",
                    userDNString, reason);
        }
        String reason = (lastLoginTime < 0)
            ? "there is no last login time and the password " +
            "changed time is not in an acceptable window"
            : "neither last login time nor password " +
            "changed time are in an acceptable window";
        TRACER.debugInfo("Returning true for user %s because %s.",
            userDNString, reason);
      }
    }
@@ -2235,13 +2074,10 @@
  {
    if(mustChangePassword != ConditionResult.UNDEFINED)
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning stored result of %b for user %s.",
                    (mustChangePassword == ConditionResult.TRUE), userDNString);
        }
        TRACER.debugInfo("Returning stored result of %b for user %s.",
            (mustChangePassword == ConditionResult.TRUE), userDNString);
      }
      return mustChangePassword == ConditionResult.TRUE;
@@ -2258,16 +2094,13 @@
               || passwordPolicy.forceChangeOnReset())))
    {
      mustChangePassword = ConditionResult.FALSE;
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning false for user %s because neither " +
               "force change on add nor force change on reset is enabled, " +
               "or users are not allowed to self-modify passwords.",
                    userDNString);
        TRACER.debugInfo("Returning false for user %s because neither " +
            "force change on add nor force change on reset is enabled, " +
            "or users are not allowed to self-modify passwords.",
            userDNString);
        }
      }
      return false;
@@ -2290,41 +2123,33 @@
      if (debugEnabled())
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, e);
      }
      mustChangePassword = ConditionResult.TRUE;
      if (debug)
      {
        TRACER.debugWarning("Returning true for user %s because an error " +
            "occurred: %s", userDNString, stackTraceToSingleLineString(e));
      }
      mustChangePassword = ConditionResult.TRUE;
      return true;
    }
    if(mustChangePassword == ConditionResult.UNDEFINED)
    {
      mustChangePassword = ConditionResult.FALSE;
      if(debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning %b for user since the attribute \"%s\"" +
               " is not present in the entry.",
                    false, userDNString, OP_ATTR_PWPOLICY_RESET_REQUIRED);
        }
        TRACER.debugInfo("Returning %b for user since the attribute \"%s\"" +
            " is not present in the entry.",
            false, userDNString, OP_ATTR_PWPOLICY_RESET_REQUIRED);
      }
      return false;
    }
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Returning %b for user %s.",
                  (mustChangePassword == ConditionResult.TRUE), userDNString);
      }
      TRACER.debugInfo("Returning %b for user %s.",
          (mustChangePassword == ConditionResult.TRUE), userDNString);
    }
    return mustChangePassword == ConditionResult.TRUE;
@@ -2341,13 +2166,10 @@
*/
  public void setMustChangePassword(boolean mustChangePassword)
  {
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Updating user %s to set the reset flag to %b",
                  userDNString, mustChangePassword);
      }
      TRACER.debugInfo("Updating user %s to set the reset flag to %b",
          userDNString, mustChangePassword);
    }
    if (mustChangePassword == mustChangePassword())
@@ -2416,13 +2238,10 @@
    // attribute.
    if (passwordPolicy.getMaximumPasswordResetAge() <= 0)
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning false for user %s because there is no " +
              "maximum reset age.", userDNString);
        }
        TRACER.debugInfo("Returning false for user %s because there is no " +
            "maximum reset age.", userDNString);
      }
      return false;
@@ -2430,13 +2249,10 @@
    if (! mustChangePassword())
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning false for user %s because the user's " +
              "password has not been reset.", userDNString);
        }
        TRACER.debugInfo("Returning false for user %s because the user's " +
            "password has not been reset.", userDNString);
      }
      return false;
@@ -2446,13 +2262,10 @@
        (1000L * passwordPolicy.getMaximumPasswordResetAge());
    boolean locked = (maxResetTime < currentTime);
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Returning %b for user %s after comparing the " +
            "current and max reset times.", locked, userDNString);
      }
      TRACER.debugInfo("Returning %b for user %s after comparing the " +
          "current and max reset times.", locked, userDNString);
    }
    return locked;
@@ -2642,13 +2455,10 @@
      }
    }
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Returning password expiration time of %d for user " +
            "%s.", passwordExpirationTime, userDNString);
      }
      TRACER.debugInfo("Returning password expiration time of %d for user " +
          "%s.", passwordExpirationTime, userDNString);
    }
    return passwordExpirationTime;
@@ -2691,12 +2501,9 @@
    if (minAge <= 0)
    {
      // There is no minimum age, so the user isn't in it.
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning false because there is no minimum age.");
        }
        TRACER.debugInfo("Returning false because there is no minimum age.");
      }
      return false;
@@ -2704,13 +2511,10 @@
    else if ((passwordChangedTime + (minAge*1000L)) < currentTime)
    {
      // It's been long enough since the user changed their password.
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning false because the minimum age has " +
              "expired.");
        }
        TRACER.debugInfo("Returning false because the minimum age has " +
            "expired.");
      }
      return false;
@@ -2718,13 +2522,10 @@
    else if (mustChangePassword())
    {
      // The user is in a must-change mode, so the minimum age doesn't apply.
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning false because the account is in a " +
              "must-change state.");
        }
        TRACER.debugInfo("Returning false because the account is in a " +
            "must-change state.");
      }
      return false;
@@ -2732,12 +2533,9 @@
    else
    {
      // The user is within the minimum age.
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning true.");
        }
        TRACER.debugInfo("Returning true.");
      }
      return true;
@@ -2849,13 +2647,10 @@
  {
    if (requiredChangeTime != Long.MIN_VALUE)
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning stored required change time of %d for " +
              "user %s", requiredChangeTime, userDNString);
        }
        TRACER.debugInfo("Returning stored required change time of %d for " +
            "user %s", requiredChangeTime, userDNString);
      }
      return requiredChangeTime;
@@ -2876,7 +2671,7 @@
      }
      requiredChangeTime = -1;
      if (debug)
      if (debugEnabled())
      {
        TRACER.debugWarning("Returning %d for user %s because an error " +
            "occurred: %s", requiredChangeTime, userDNString,
@@ -2886,13 +2681,10 @@
      return requiredChangeTime;
    }
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Returning required change time of %d for user %s",
                  requiredChangeTime, userDNString);
      }
      TRACER.debugInfo("Returning required change time of %d for user %s",
          requiredChangeTime, userDNString);
    }
    return requiredChangeTime;
@@ -2924,13 +2716,10 @@
   */
  public void setRequiredChangeTime(long requiredChangeTime)
  {
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Updating required change time for user %s",
                         userDNString);
      }
      TRACER.debugInfo("Updating required change time for user %s",
          userDNString);
    }
    if (getRequiredChangeTime() != requiredChangeTime)
@@ -2968,13 +2757,10 @@
   */
  public void clearRequiredChangeTime()
  {
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Clearing required change time for user %s",
                         userDNString);
      }
      TRACER.debugInfo("Clearing required change time for user %s",
          userDNString);
    }
    AttributeType type = DirectoryServer.getAttributeType(
@@ -3016,7 +2802,7 @@
          TRACER.debugCaught(DebugLogLevel.ERROR, e);
        }
        if (debug)
        if (debugEnabled())
        {
          TRACER.debugWarning("Unable to decode the warned time for user %s: " +
              "%s", userDNString, stackTraceToSingleLineString(e));
@@ -3027,13 +2813,10 @@
    }
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Returning a warned time of %d for user %s",
                  warnedTime, userDNString);
      }
      TRACER.debugInfo("Returning a warned time of %d for user %s",
          warnedTime, userDNString);
    }
    return warnedTime;
@@ -3063,14 +2846,11 @@
    long warnTime = getWarnedTime();
    if (warnTime == warnedTime)
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Not updating warned time for user %s because " +
              "the warned time is the same as the specified time.",
              userDNString);
        }
        TRACER.debugInfo("Not updating warned time for user %s because " +
            "the warned time is the same as the specified time.",
            userDNString);
      }
      return;
@@ -3096,12 +2876,9 @@
      modifications.add(new Modification(ModificationType.REPLACE, a, true));
    }
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Updated the warned time for user %s", userDNString);
      }
      TRACER.debugInfo("Updated the warned time for user %s", userDNString);
    }
  }
@@ -3112,12 +2889,9 @@
   */
  public void clearWarnedTime()
  {
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Clearing warned time for user %s", userDNString);
      }
      TRACER.debugInfo("Clearing warned time for user %s", userDNString);
    }
    if (getWarnedTime() < 0)
@@ -3138,12 +2912,9 @@
      modifications.add(new Modification(ModificationType.REPLACE, a, true));
    }
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Cleared the warned time for user %s", userDNString);
      }
      TRACER.debugInfo("Cleared the warned time for user %s", userDNString);
    }
  }
@@ -3179,7 +2950,7 @@
          TRACER.debugCaught(DebugLogLevel.ERROR, e);
        }
        if (debug)
        if (debugEnabled())
        {
          TRACER.debugWarning("Error while processing grace login times " +
               "for user %s: %s",
@@ -3201,13 +2972,10 @@
    }
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Returning grace login times for user %s",
                         userDNString);
      }
      TRACER.debugInfo("Returning grace login times for user %s",
          userDNString);
    }
    return graceLoginTimes;
@@ -3241,16 +3009,12 @@
   */
  public void updateGraceLoginTimes()
  {
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Updating grace login times for user %s",
                         userDNString);
      }
      TRACER.debugInfo("Updating grace login times for user %s",
          userDNString);
    }
    List<Long> graceTimes = getGraceLoginTimes();
    long highestGraceTime = -1;
    for (Long l : graceTimes)
@@ -3321,17 +3085,12 @@
      return;
    }
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Updating grace login times for user %s",
                         userDNString);
      }
      TRACER.debugInfo("Updating grace login times for user %s",
          userDNString);
    }
    AttributeType type =
         DirectoryServer.getAttributeType(OP_ATTR_PWPOLICY_GRACE_LOGIN_TIME_LC,
                                          true);
@@ -3364,13 +3123,10 @@
   */
  public void clearGraceLoginTimes()
  {
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Clearing grace login times for user %s",
                         userDNString);
      }
      TRACER.debugInfo("Clearing grace login times for user %s",
          userDNString);
    }
    List<Long> graceTimes = getGraceLoginTimes();
@@ -3450,7 +3206,7 @@
                    : DirectoryServer.getPasswordStorageScheme(schemeName);
          if (scheme == null)
          {
            if (debug)
            if (debugEnabled())
            {
              TRACER.debugWarning("User entry %s contains a password with " +
                  "scheme %s that is not defined in the server.",
@@ -3478,7 +3234,7 @@
            TRACER.debugCaught(DebugLogLevel.ERROR, e);
          }
          if (debug)
          if (debugEnabled())
          {
            TRACER.debugWarning("Cannot get clear password value foruser %s: " +
                "%s", userDNString, e);
@@ -3507,14 +3263,11 @@
         userEntry.getAttribute(passwordPolicy.getPasswordAttribute());
    if ((attrList == null) || attrList.isEmpty())
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning false because user %s does not have " +
              "any values for password attribute %s", userDNString,
                    passwordPolicy.getPasswordAttribute().getNameOrOID());
        }
        TRACER.debugInfo("Returning false because user %s does not have " +
            "any values for password attribute %s", userDNString,
            passwordPolicy.getPasswordAttribute().getNameOrOID());
      }
      return false;
@@ -3551,7 +3304,7 @@
                     : DirectoryServer.getPasswordStorageScheme(schemeName);
          if (scheme == null)
          {
            if (debug)
            if (debugEnabled())
            {
              TRACER.debugWarning("User entry %s contains a password with " +
                  "scheme %s that is not defined in the server.",
@@ -3569,14 +3322,11 @@
                               new ASN1OctetString(pwComponents[1].toString()));
          if (passwordMatches)
          {
            if (debug)
            if (debugEnabled())
            {
              if (debugEnabled())
              {
                TRACER.debugInfo("Returning true for user %s because the " +
                    "provided password matches a value encoded with scheme %s",
                          userDNString, schemeName);
              }
              TRACER.debugInfo("Returning true for user %s because the " +
                  "provided password matches a value encoded with scheme %s",
                  userDNString, schemeName);
            }
            return true;
@@ -3589,7 +3339,7 @@
            TRACER.debugCaught(DebugLogLevel.ERROR, e);
          }
          if (debug)
          if (debugEnabled())
          {
            TRACER.debugWarning("An error occurred while attempting to " +
                "process a password value for user %s: %s",
@@ -3600,14 +3350,11 @@
    }
    // If we've gotten here, then we couldn't find a match.
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Returning false because the provided password does " +
            "not match any of the stored password values for user %s",
                  userDNString);
      }
      TRACER.debugInfo("Returning false because the provided password does " +
          "not match any of the stored password values for user %s",
          userDNString);
    }
    return false;
@@ -3706,28 +3453,22 @@
      if (! validator.passwordIsAcceptable(newPassword, currentPasswords,
                                           operation, userEntry, invalidReason))
      {
        if (debug)
        if (debugEnabled())
        {
          if (debugEnabled())
          {
            TRACER.debugInfo("The password provided for user %s failed " +
                "the %s password validator.",
                             userDNString, validatorDN.toString());
          }
          TRACER.debugInfo("The password provided for user %s failed " +
              "the %s password validator.",
              userDNString, validatorDN.toString());
        }
        return false;
      }
      else
      {
        if (debug)
        if (debugEnabled())
        {
          if (debugEnabled())
          {
            TRACER.debugInfo("The password provided for user %s passed " +
                "the %s password validator.",
                             userDNString, validatorDN.toString());
          }
          TRACER.debugInfo("The password provided for user %s passed " +
              "the %s password validator.",
              userDNString, validatorDN.toString());
        }
      }
    }
@@ -3748,13 +3489,10 @@
  {
    if (passwordPolicy.getDefaultStorageSchemes().isEmpty())
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Doing nothing for user %s because no " +
              "deprecated storage schemes have been defined.", userDNString);
        }
        TRACER.debugInfo("Doing nothing for user %s because no " +
            "deprecated storage schemes have been defined.", userDNString);
      }
      return;
@@ -3765,13 +3503,10 @@
    List<Attribute> attrList = userEntry.getAttribute(type);
    if ((attrList == null) || attrList.isEmpty())
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Doing nothing for entry %s because no password " +
              "values were found.", userDNString);
        }
        TRACER.debugInfo("Doing nothing for entry %s because no password " +
            "values were found.", userDNString);
      }
      return;
@@ -3818,7 +3553,7 @@
                    : DirectoryServer.getPasswordStorageScheme(schemeName);
          if (scheme == null)
          {
            if (debug)
            if (debugEnabled())
            {
              TRACER.debugWarning("Skipping password value for user %s " +
                  "because the associated storage scheme %s is not " +
@@ -3843,13 +3578,10 @@
            }
            else if (passwordPolicy.isDeprecatedStorageScheme(schemeName))
            {
              if (debug)
              if (debugEnabled())
              {
                if (debugEnabled())
                {
                  TRACER.debugInfo("Marking password with scheme %s for " +
                      "removal from user entry %s.", schemeName, userDNString);
                }
                TRACER.debugInfo("Marking password with scheme %s for " +
                    "removal from user entry %s.", schemeName, userDNString);
              }
              iterator.remove();
@@ -3866,14 +3598,11 @@
          if (debugEnabled())
          {
            TRACER.debugCaught(DebugLogLevel.ERROR, e);
          }
          if (debug)
          {
            TRACER.debugWarning("Skipping password value for user %s because " +
                "an error occurred while attempting to decode it based on " +
                "the user password syntax: %s",
                         userDNString, stackTraceToSingleLineString(e));
                userDNString, stackTraceToSingleLineString(e));
          }
        }
      }
@@ -3881,13 +3610,10 @@
    if (removedValues.isEmpty())
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("User entry %s does not have any password values " +
              "encoded using deprecated schemes.", userDNString);
        }
        TRACER.debugInfo("User entry %s does not have any password values " +
            "encoded using deprecated schemes.", userDNString);
      }
      return;
@@ -3917,7 +3643,7 @@
            TRACER.debugCaught(DebugLogLevel.ERROR, e);
          }
          if (debug)
          if (debugEnabled())
          {
            TRACER.debugWarning("Unable to encode password for user %s using " +
                 "default scheme %s: %s",
@@ -3930,7 +3656,7 @@
    if (updatedValues.isEmpty())
    {
      if (debug)
      if (debugEnabled())
      {
        TRACER.debugWarning("Not updating user entry %s because removing " +
             "deprecated schemes would leave the user without a password.",
@@ -3958,14 +3684,11 @@
      }
    }
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Updating user entry %s to replace password values " +
            "encoded with deprecated schemes with values encoded " +
            "with the default schemes.", userDNString);
      }
      TRACER.debugInfo("Updating user entry %s to replace password values " +
          "encoded with deprecated schemes with values encoded " +
          "with the default schemes.", userDNString);
    }
  }
@@ -4000,13 +3723,10 @@
  {
    if (! maintainHistory())
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning false because password history " +
                           "checking is disabled.");
        }
        TRACER.debugInfo("Returning false because password history " +
            "checking is disabled.");
      }
      // Password history checking is disabled, so we don't care if it is in the
@@ -4019,13 +3739,10 @@
    // passwords.  If so, then we'll consider it to be in the history.
    if (passwordMatches(password))
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning true because the provided password " +
                           "is currently in use.");
        }
        TRACER.debugInfo("Returning true because the provided password " +
            "is currently in use.");
      }
      return true;
@@ -4073,13 +3790,10 @@
    {
      if (historyValueMatches(password, v))
      {
        if (debug)
        if (debugEnabled())
        {
          if (debugEnabled())
          {
            TRACER.debugInfo("Returning true because the password is in " +
                             "the history.");
          }
          TRACER.debugInfo("Returning true because the password is in " +
              "the history.");
        }
        return true;
@@ -4088,13 +3802,10 @@
    // If we've gotten here, then the password isn't in the history.
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Returning false because the password isn't in the " +
                         "history.");
      }
      TRACER.debugInfo("Returning false because the password isn't in the " +
          "history.");
    }
    return false;
@@ -4128,14 +3839,11 @@
          int    hashPos = histStr.indexOf('#');
          if (hashPos <= 0)
          {
            if (debug)
            if (debugEnabled())
            {
              if (debugEnabled())
              {
                TRACER.debugInfo("Found value " + histStr + " in the " +
                                 "history with no timestamp.  Marking it " +
                                 "for removal.");
              }
              TRACER.debugInfo("Found value " + histStr + " in the " +
                  "history with no timestamp.  Marking it " +
                  "for removal.");
            }
            LinkedHashSet<AttributeValue> values =
@@ -4162,12 +3870,9 @@
              {
                TRACER.debugCaught(DebugLogLevel.ERROR, e);
                if (debug)
                {
                  TRACER.debugInfo("Could not decode the timestamp in " +
                                   "history value " + histStr + " -- " + e +
                                   ".  Marking it for removal.");
                }
                TRACER.debugInfo("Could not decode the timestamp in " +
                    "history value " + histStr + " -- " + e +
                    ".  Marking it for removal.");
              }
              LinkedHashSet<AttributeValue> values =
@@ -4212,13 +3917,10 @@
      int    hashPos1 = histStr.indexOf('#');
      if (hashPos1 <= 0)
      {
        if (debug)
        if (debugEnabled())
        {
          if (debugEnabled())
          {
            TRACER.debugInfo("Returning false because the password history " +
                             "value didn't include any hash characters.");
          }
          TRACER.debugInfo("Returning false because the password history " +
              "value didn't include any hash characters.");
        }
        return false;
@@ -4227,13 +3929,10 @@
      int hashPos2 = histStr.indexOf('#', hashPos1+1);
      if (hashPos2 < 0)
      {
        if (debug)
        if (debugEnabled())
        {
          if (debugEnabled())
          {
            TRACER.debugInfo("Returning false because the password history " +
                             "value only had one hash character.");
          }
          TRACER.debugInfo("Returning false because the password history " +
              "value only had one hash character.");
        }
        return false;
@@ -4251,26 +3950,20 @@
        if (scheme.authPasswordMatches(password, authPWComponents[1].toString(),
                                       authPWComponents[2].toString()))
        {
          if (debug)
          if (debugEnabled())
          {
            if (debugEnabled())
            {
              TRACER.debugInfo("Returning true because the auth password " +
                               "history value matched.");
            }
            TRACER.debugInfo("Returning true because the auth password " +
                "history value matched.");
          }
          return true;
        }
        else
        {
          if (debug)
          if (debugEnabled())
          {
            if (debugEnabled())
            {
              TRACER.debugInfo("Returning false because the auth password " +
                               "history value did not match.");
            }
            TRACER.debugInfo("Returning false because the auth password " +
                "history value did not match.");
          }
          return false;
@@ -4286,26 +3979,20 @@
        if (scheme.passwordMatches(password,
                                   new ASN1OctetString(userPWComponents[1])))
        {
          if (debug)
          if (debugEnabled())
          {
            if (debugEnabled())
            {
              TRACER.debugInfo("Returning true because the user password " +
                               "history value matched.");
            }
            TRACER.debugInfo("Returning true because the user password " +
                "history value matched.");
          }
          return true;
        }
        else
        {
          if (debug)
          if (debugEnabled())
          {
            if (debugEnabled())
            {
              TRACER.debugInfo("Returning false because the user password " +
                               "history value did not match.");
            }
            TRACER.debugInfo("Returning false because the user password " +
                "history value did not match.");
          }
          return false;
@@ -4313,14 +4000,11 @@
      }
      else
      {
        if (debug)
        if (debugEnabled())
        {
          if (debugEnabled())
          {
            TRACER.debugInfo("Returning false because the syntax OID " +
                             syntaxOID + " didn't match for either the auth " +
                             "or user password syntax.");
          }
          TRACER.debugInfo("Returning false because the syntax OID " +
              syntaxOID + " didn't match for either the auth " +
              "or user password syntax.");
        }
        return false;
@@ -4332,7 +4016,7 @@
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, e);
        if (debug)
        if (debugEnabled())
        {
          TRACER.debugInfo("Returning false because of an exception:  " +
                           stackTraceToSingleLineString(e));
@@ -4380,13 +4064,10 @@
  {
    if (! maintainHistory())
    {
      if (debug)
      if (debugEnabled())
      {
        if (debugEnabled())
        {
          TRACER.debugInfo("Not doing anything because password history " +
                           "maintenance is disabled.");
        }
        TRACER.debugInfo("Not doing anything because password history " +
            "maintenance is disabled.");
      }
      return;
@@ -4419,13 +4100,10 @@
        iterator.remove();
        numToDelete--;
        if (debug)
        if (debugEnabled())
        {
          if (debugEnabled())
          {
            TRACER.debugInfo("Removing history value " + v.getStringValue() +
                             " to preserve the history count.");
          }
          TRACER.debugInfo("Removing history value " + v.getStringValue() +
              " to preserve the history count.");
        }
      }
@@ -4455,13 +4133,10 @@
          removeValues.add(v);
          iterator.remove();
          if (debug)
          if (debugEnabled())
          {
            if (debugEnabled())
            {
              TRACER.debugInfo("Removing history value " + v.getStringValue() +
                               " to preserve the history duration.");
            }
            TRACER.debugInfo("Removing history value " + v.getStringValue() +
                " to preserve the history duration.");
          }
        }
        else
@@ -4497,12 +4172,9 @@
         new Attribute(historyType, historyType.getPrimaryName(),
                       newHistValues);
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Going to add history value " + newHistStr);
      }
      TRACER.debugInfo("Going to add history value " + newHistStr);
    }
@@ -4567,12 +4239,9 @@
   */
  public void clearPasswordHistory()
  {
    if (debug)
    if (debugEnabled())
    {
      if (debugEnabled())
      {
        TRACER.debugInfo("Clearing password history for user %s", userDNString);
      }
      TRACER.debugInfo("Clearing password history for user %s", userDNString);
    }
    AttributeType type = DirectoryServer.getAttributeType(
@@ -4605,7 +4274,7 @@
    PasswordGenerator generator = passwordPolicy.getPasswordGenerator();
    if (generator == null)
    {
      if (debug)
      if (debugEnabled())
      {
        TRACER.debugWarning("Unable to generate a new password for user " +
            "%s because no password generator has been defined in the " +
opends/src/server/org/opends/server/core/PluginConfigManager.java
@@ -52,79 +52,11 @@
import org.opends.server.admin.std.server.PluginRootCfg;
import org.opends.server.admin.std.server.RootCfg;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.IntermediateResponsePluginResult;
import org.opends.server.api.plugin.LDIFPluginResult;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.PostConnectPluginResult;
import org.opends.server.api.plugin.PostDisconnectPluginResult;
import org.opends.server.api.plugin.PostOperationPluginResult;
import org.opends.server.api.plugin.PostResponsePluginResult;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.PreParsePluginResult;
import org.opends.server.api.plugin.SearchEntryPluginResult;
import org.opends.server.api.plugin.SearchReferencePluginResult;
import org.opends.server.api.plugin.StartupPluginResult;
import org.opends.server.api.plugin.SubordinateModifyDNPluginResult;
import org.opends.server.api.plugin.*;
import org.opends.server.config.ConfigException;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.ConfigChangeResult;
import org.opends.server.types.DisconnectReason;
import org.opends.server.types.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.InitializationException;
import org.opends.server.types.IntermediateResponse;
import org.opends.server.types.LDIFExportConfig;
import org.opends.server.types.LDIFImportConfig;
import org.opends.server.types.Operation;
import org.opends.server.types.ResultCode;
import org.opends.server.types.SearchResultEntry;
import org.opends.server.types.SearchResultReference;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.Modification;
import org.opends.server.types.operation.PostOperationAbandonOperation;
import org.opends.server.types.operation.PostOperationAddOperation;
import org.opends.server.types.operation.PostOperationBindOperation;
import org.opends.server.types.operation.PostOperationCompareOperation;
import org.opends.server.types.operation.PostOperationDeleteOperation;
import org.opends.server.types.operation.PostOperationExtendedOperation;
import org.opends.server.types.operation.PostOperationModifyDNOperation;
import org.opends.server.types.operation.PostOperationModifyOperation;
import org.opends.server.types.operation.PostOperationSearchOperation;
import org.opends.server.types.operation.PostOperationUnbindOperation;
import org.opends.server.types.operation.PostResponseAddOperation;
import org.opends.server.types.operation.PostResponseBindOperation;
import org.opends.server.types.operation.PostResponseCompareOperation;
import org.opends.server.types.operation.PostResponseDeleteOperation;
import org.opends.server.types.operation.PostResponseExtendedOperation;
import org.opends.server.types.operation.PostResponseModifyDNOperation;
import org.opends.server.types.operation.PostResponseModifyOperation;
import org.opends.server.types.operation.PostResponseSearchOperation;
import org.opends.server.types.operation.PostSynchronizationAddOperation;
import org.opends.server.types.operation.PostSynchronizationDeleteOperation;
import org.opends.server.types.operation.PostSynchronizationModifyOperation;
import org.opends.server.types.operation.PostSynchronizationModifyDNOperation;
import org.opends.server.types.operation.PreOperationAddOperation;
import org.opends.server.types.operation.PreOperationBindOperation;
import org.opends.server.types.operation.PreOperationCompareOperation;
import org.opends.server.types.operation.PreOperationDeleteOperation;
import org.opends.server.types.operation.PreOperationExtendedOperation;
import org.opends.server.types.operation.PreOperationModifyDNOperation;
import org.opends.server.types.operation.PreOperationModifyOperation;
import org.opends.server.types.operation.PreOperationSearchOperation;
import org.opends.server.types.operation.PreParseAbandonOperation;
import org.opends.server.types.operation.PreParseAddOperation;
import org.opends.server.types.operation.PreParseBindOperation;
import org.opends.server.types.operation.PreParseCompareOperation;
import org.opends.server.types.operation.PreParseDeleteOperation;
import org.opends.server.types.operation.PreParseModifyDNOperation;
import org.opends.server.types.operation.PreParseExtendedOperation;
import org.opends.server.types.operation.PreParseModifyOperation;
import org.opends.server.types.operation.PreParseSearchOperation;
import org.opends.server.types.operation.PreParseUnbindOperation;
import org.opends.server.types.operation.SearchEntrySearchOperation;
import org.opends.server.types.operation.SearchReferenceSearchOperation;
import org.opends.server.types.operation.SubordinateModifyDNOperation;
import org.opends.server.types.*;
import org.opends.server.types.operation.*;
import org.opends.server.workflowelement.localbackend.*;
import static org.opends.messages.ConfigMessages.*;
@@ -211,6 +143,16 @@
               DirectoryServerPlugin<? extends PluginCfg>>
                    registeredPlugins;
  // The mapping between an operation and a set of post operation plugins
  // it should skip. This pairs up pre and post operation plugin processing
  // such that only plugins that successfully execute its pre op plugin will
  // have its post op plugin executed on a per operation basis. If an
  // operation is not registered on this list then all all pre op plugins
  // executed successfully for this operation so all post op plugins should
  // execute.
  private ConcurrentHashMap<PluginOperation, ArrayList<DirectoryServerPlugin>>
      skippedPreOperationPlugins;
  // The plugin root configuration read at server startup.
  private PluginRootCfg pluginRootConfig;
@@ -280,6 +222,9 @@
    registeredPlugins                  =
         new ConcurrentHashMap<DN,
                  DirectoryServerPlugin<? extends PluginCfg>>();
    skippedPreOperationPlugins =
        new ConcurrentHashMap<PluginOperation,
                  ArrayList<DirectoryServerPlugin>>();
  }
@@ -1393,9 +1338,9 @@
   *
   * @return  The result of processing the startup plugins.
   */
  public StartupPluginResult invokeStartupPlugins()
  public PluginResult.Startup invokeStartupPlugins()
  {
    StartupPluginResult result = null;
    PluginResult.Startup result = null;
    for (DirectoryServerPlugin p : startupPlugins)
    {
@@ -1414,8 +1359,7 @@
                String.valueOf(p.getPluginEntryDN()),
                stackTraceToSingleLineString(e));
        result = new StartupPluginResult(false, false, message);
        break;
        return PluginResult.Startup.stopStartup(message);
      }
      if (result == null)
@@ -1423,27 +1367,16 @@
        Message message = ERR_PLUGIN_STARTUP_PLUGIN_RETURNED_NULL.get(
            String.valueOf(p.getPluginEntryDN()));
        logError(message);
        return new StartupPluginResult(false, false, message);
        return PluginResult.Startup.stopStartup(message);
      }
      else if (! result.completedSuccessfully())
      else if (! result.continueProcessing())
      {
        if (result.continueStartup())
        {
          Message message = ERR_PLUGIN_STARTUP_PLUGIN_FAIL_CONTINUE.
              get(String.valueOf(p.getPluginEntryDN()),
                  result.getErrorMessage(),
                  result.getErrorMessage().getDescriptor().getId());
          logError(message);
        }
        else
        {
          Message message = ERR_PLUGIN_STARTUP_PLUGIN_FAIL_ABORT.
              get(String.valueOf(p.getPluginEntryDN()),
                  result.getErrorMessage(),
                  result.getErrorMessage().getDescriptor().getId());
          logError(message);
          return result;
        }
        Message message = ERR_PLUGIN_STARTUP_PLUGIN_FAIL_ABORT.
            get(String.valueOf(p.getPluginEntryDN()),
                result.getErrorMessage(),
                result.getErrorMessage().getDescriptor().getId());
        logError(message);
        return result;
      }
    }
@@ -1451,7 +1384,7 @@
    {
      // This should only happen if there were no startup plugins registered,
      // which is fine.
      result = StartupPluginResult.SUCCESS;
      result = PluginResult.Startup.continueStartup();
    }
    return result;
@@ -1498,10 +1431,10 @@
   *
   * @return  The result of processing the post-connect plugins.
   */
  public PostConnectPluginResult invokePostConnectPlugins(ClientConnection
                                                               clientConnection)
  public PluginResult.PostConnect invokePostConnectPlugins(ClientConnection
                                                           clientConnection)
  {
    PostConnectPluginResult result = null;
    PluginResult.PostConnect result = null;
    for (DirectoryServerPlugin p : postConnectPlugins)
    {
@@ -1523,20 +1456,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        try
        {
          clientConnection.disconnect(DisconnectReason.SERVER_ERROR, true,
                  message);
        }
        catch (Exception e2)
        {
          if (debugEnabled())
          {
            TRACER.debugCaught(DebugLogLevel.ERROR, e2);
          }
        }
        return new PostConnectPluginResult(true, false);
        return PluginResult.PostConnect.disconnectClient(
            DisconnectReason.SERVER_ERROR, true, message);
      }
@@ -1548,23 +1469,10 @@
                clientConnection.getClientAddress());
        logError(message);
        try
        {
          clientConnection.disconnect(DisconnectReason.SERVER_ERROR, true,
                  message);
        }
        catch (Exception e)
        {
          if (debugEnabled())
          {
            TRACER.debugCaught(DebugLogLevel.ERROR, e);
          }
        }
        return new PostConnectPluginResult(true, false);
        return PluginResult.PostConnect.disconnectClient(
            DisconnectReason.SERVER_ERROR, true, message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -1574,7 +1482,7 @@
    {
      // This should only happen if there were no post-connect plugins
      // registered, which is fine.
      result = PostConnectPluginResult.SUCCESS;
      result = PluginResult.PostConnect.continueConnectProcessing();
    }
    return result;
@@ -1594,12 +1502,12 @@
   *
   * @return  The result of processing the post-connect plugins.
   */
  public PostDisconnectPluginResult invokePostDisconnectPlugins(
  public PluginResult.PostDisconnect invokePostDisconnectPlugins(
                                        ClientConnection clientConnection,
                                        DisconnectReason disconnectReason,
                                        Message message)
  {
    PostDisconnectPluginResult result = null;
    PluginResult.PostDisconnect result = null;
    for (DirectoryServerPlugin p : postDisconnectPlugins)
    {
@@ -1621,8 +1529,6 @@
                clientConnection.getClientAddress(),
                stackTraceToSingleLineString(e));
        logError(msg);
        return new PostDisconnectPluginResult(false);
      }
@@ -1633,8 +1539,6 @@
                clientConnection.getConnectionID(),
                clientConnection.getClientAddress());
        logError(msg);
        return new PostDisconnectPluginResult(false);
      }
      else if (! result.continuePluginProcessing())
      {
@@ -1646,7 +1550,7 @@
    {
      // This should only happen if there were no post-disconnect plugins
      // registered, which is fine.
      result = PostDisconnectPluginResult.SUCCESS;
      result = PluginResult.PostDisconnect.continueDisconnectProcessing();
    }
    return result;
@@ -1664,10 +1568,10 @@
   *
   * @return  The result of processing the LDIF import plugins.
   */
  public LDIFPluginResult invokeLDIFImportPlugins(LDIFImportConfig importConfig,
                                                  Entry entry)
  public PluginResult.ImportLDIF invokeLDIFImportPlugins(
      LDIFImportConfig importConfig, Entry entry)
  {
    LDIFPluginResult result = null;
    PluginResult.ImportLDIF result = null;
    for (DirectoryServerPlugin p : ldifImportPlugins)
    {
@@ -1687,7 +1591,7 @@
                String.valueOf(entry.getDN()), stackTraceToSingleLineString(e));
        logError(message);
        return new LDIFPluginResult(false, false, message);
        return PluginResult.ImportLDIF.stopEntryProcessing(message);
      }
      if (result == null)
@@ -1697,7 +1601,7 @@
                String.valueOf(entry.getDN()));
        logError(message);
        return new LDIFPluginResult(false, false, message);
        return PluginResult.ImportLDIF.stopEntryProcessing(message);
      }
      else if (! result.continuePluginProcessing())
      {
@@ -1709,7 +1613,7 @@
    {
      // This should only happen if there were no LDIF import plugins
      // registered, which is fine.
      result = LDIFPluginResult.SUCCESS;
      result = PluginResult.ImportLDIF.continueEntryProcessing();
    }
    return result;
@@ -1727,10 +1631,10 @@
   *
   * @return  The result of processing the LDIF export plugins.
   */
  public LDIFPluginResult invokeLDIFExportPlugins(LDIFExportConfig exportConfig,
                                                  Entry entry)
  public PluginResult.ImportLDIF invokeLDIFExportPlugins(
      LDIFExportConfig exportConfig, Entry entry)
  {
    LDIFPluginResult result = null;
    PluginResult.ImportLDIF result = null;
    for (DirectoryServerPlugin p : ldifExportPlugins)
    {
@@ -1750,7 +1654,7 @@
                String.valueOf(entry.getDN()), stackTraceToSingleLineString(e));
        logError(message);
        return new LDIFPluginResult(false, false, message);
        return PluginResult.ImportLDIF.stopEntryProcessing(message);
      }
      if (result == null)
@@ -1760,7 +1664,7 @@
                String.valueOf(entry.getDN()));
        logError(message);
        return new LDIFPluginResult(false, false, message);
        return PluginResult.ImportLDIF.stopEntryProcessing(message);
      }
      else if (! result.continuePluginProcessing())
      {
@@ -1772,7 +1676,7 @@
    {
      // This should only happen if there were no LDIF export plugins
      // registered, which is fine.
      result = LDIFPluginResult.SUCCESS;
      result = PluginResult.ImportLDIF.continueEntryProcessing();
    }
    return result;
@@ -1789,10 +1693,10 @@
   *
   * @return  The result of processing the pre-parse abandon plugins.
   */
  public PreParsePluginResult invokePreParseAbandonPlugins(
  public PluginResult.PreParse invokePreParseAbandonPlugins(
                                   PreParseAbandonOperation abandonOperation)
  {
    PreParsePluginResult result = null;
    PluginResult.PreParse result = null;
    for (DirectoryServerPlugin p : preParseAbandonPlugins)
    {
@@ -1821,11 +1725,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        abandonOperation.setResultCode(
                              DirectoryServer.getServerErrorResultCode());
        abandonOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -1837,14 +1738,10 @@
                String.valueOf(abandonOperation.getOperationID()));
        logError(message);
        abandonOperation.setResultCode(
             DirectoryServer.getServerErrorResultCode());
        abandonOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -1854,7 +1751,7 @@
    {
      // This should only happen if there were no pre-parse abandon plugins
      // registered, which is fine.
      result = PreParsePluginResult.SUCCESS;
      result = PluginResult.PreParse.continueOperationProcessing();
    }
    return result;
@@ -1870,11 +1767,13 @@
   *                       plugins.
   *
   * @return  The result of processing the pre-parse add plugins.
   *
   * @throws CanceledOperationException if the operation should be canceled.
   */
  public PreParsePluginResult invokePreParseAddPlugins(
  public PluginResult.PreParse invokePreParseAddPlugins(
      PreParseAddOperation addOperation)
  {
    PreParsePluginResult result = null;
      throws CanceledOperationException {
    PluginResult.PreParse result = null;
    for (DirectoryServerPlugin p : preParseAddPlugins)
    {
@@ -1888,6 +1787,10 @@
      {
        result = p.doPreParse(addOperation);
      }
      catch (CanceledOperationException coe)
      {
        throw coe;
      }
      catch (Exception e)
      {
        if (debugEnabled())
@@ -1902,10 +1805,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        addOperation.setResultCode(DirectoryServer.getServerErrorResultCode());
        addOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -1917,13 +1818,10 @@
                String.valueOf(addOperation.getOperationID()));
        logError(message);
        addOperation.setResultCode(DirectoryServer.getServerErrorResultCode());
        addOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -1933,7 +1831,7 @@
    {
      // This should only happen if there were no pre-parse add plugins
      // registered, which is fine.
      result = PreParsePluginResult.SUCCESS;
      result = PluginResult.PreParse.continueOperationProcessing();
    }
    return result;
@@ -1950,10 +1848,10 @@
   *
   * @return  The result of processing the pre-parse bind plugins.
   */
  public PreParsePluginResult invokePreParseBindPlugins(
  public PluginResult.PreParse invokePreParseBindPlugins(
                                   PreParseBindOperation bindOperation)
  {
    PreParsePluginResult result = null;
    PluginResult.PreParse result = null;
    for (DirectoryServerPlugin p : preParseBindPlugins)
    {
@@ -1981,10 +1879,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        bindOperation.setResultCode(DirectoryServer.getServerErrorResultCode());
        bindOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -1996,13 +1892,10 @@
                String.valueOf(bindOperation.getOperationID()));
        logError(message);
        bindOperation.setResultCode(DirectoryServer.getServerErrorResultCode());
        bindOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -2012,7 +1905,7 @@
    {
      // This should only happen if there were no pre-parse bind plugins
      // registered, which is fine.
      result = PreParsePluginResult.SUCCESS;
      result = PluginResult.PreParse.continueOperationProcessing();
    }
    return result;
@@ -2028,11 +1921,13 @@
   *                           pre-parse plugins.
   *
   * @return  The result of processing the pre-parse compare plugins.
   *
   * @throws CanceledOperationException if the operation should be canceled.
   */
  public PreParsePluginResult invokePreParseComparePlugins(
    PreParseCompareOperation compareOperation)
  {
    PreParsePluginResult result = null;
  public PluginResult.PreParse invokePreParseComparePlugins(
      PreParseCompareOperation compareOperation)
      throws CanceledOperationException {
    PluginResult.PreParse result = null;
    for (DirectoryServerPlugin p : preParseComparePlugins)
    {
@@ -2046,6 +1941,10 @@
      {
        result = p.doPreParse(compareOperation);
      }
      catch (CanceledOperationException coe)
      {
        throw coe;
      }
      catch (Exception e)
      {
        if (debugEnabled())
@@ -2061,11 +1960,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        compareOperation.setResultCode(
                              DirectoryServer.getServerErrorResultCode());
        compareOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -2077,14 +1973,10 @@
                String.valueOf(compareOperation.getOperationID()));
        logError(message);
        compareOperation.setResultCode(
                              DirectoryServer.getServerErrorResultCode());
        compareOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -2094,7 +1986,7 @@
    {
      // This should only happen if there were no pre-parse compare plugins
      // registered, which is fine.
      result = PreParsePluginResult.SUCCESS;
      result = PluginResult.PreParse.continueOperationProcessing();
    }
    return result;
@@ -2110,11 +2002,13 @@
   *                          pre-parse plugins.
   *
   * @return  The result of processing the pre-parse delete plugins.
   *
   * @throws CanceledOperationException if the operation should be canceled.
   */
  public PreParsePluginResult invokePreParseDeletePlugins(
  public PluginResult.PreParse invokePreParseDeletePlugins(
                              PreParseDeleteOperation deleteOperation)
  {
    PreParsePluginResult result = null;
      throws CanceledOperationException {
    PluginResult.PreParse result = null;
    for (DirectoryServerPlugin p : preParseDeletePlugins)
    {
@@ -2128,6 +2022,10 @@
      {
        result = p.doPreParse(deleteOperation);
      }
      catch (CanceledOperationException coe)
      {
        throw coe;
      }
      catch (Exception e)
      {
        if (debugEnabled())
@@ -2143,11 +2041,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        deleteOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        deleteOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -2159,14 +2054,10 @@
                String.valueOf(deleteOperation.getOperationID()));
        logError(message);
        deleteOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        deleteOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -2176,7 +2067,7 @@
    {
      // This should only happen if there were no pre-parse delete plugins
      // registered, which is fine.
      result = PreParsePluginResult.SUCCESS;
      result = PluginResult.PreParse.continueOperationProcessing();
    }
    return result;
@@ -2192,11 +2083,13 @@
   *                            pre-parse plugins.
   *
   * @return  The result of processing the pre-parse extended plugins.
   *
   * @throws CanceledOperationException if the operation should be canceled.
   */
  public PreParsePluginResult invokePreParseExtendedPlugins(
  public PluginResult.PreParse invokePreParseExtendedPlugins(
                                   PreParseExtendedOperation extendedOperation)
  {
    PreParsePluginResult result = null;
      throws CanceledOperationException {
    PluginResult.PreParse result = null;
    for (DirectoryServerPlugin p : preParseExtendedPlugins)
    {
@@ -2210,6 +2103,10 @@
      {
        result = p.doPreParse(extendedOperation);
      }
      catch (CanceledOperationException coe)
      {
        throw coe;
      }
      catch (Exception e)
      {
        if (debugEnabled())
@@ -2225,11 +2122,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        extendedOperation.setResultCode(
                               DirectoryServer.getServerErrorResultCode());
        extendedOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -2241,14 +2135,10 @@
                String.valueOf(extendedOperation.getOperationID()));
        logError(message);
        extendedOperation.setResultCode(
                               DirectoryServer.getServerErrorResultCode());
        extendedOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -2258,7 +2148,7 @@
    {
      // This should only happen if there were no pre-parse extended plugins
      // registered, which is fine.
      result = PreParsePluginResult.SUCCESS;
      result = PluginResult.PreParse.continueOperationProcessing();
    }
    return result;
@@ -2274,11 +2164,13 @@
   *                          pre-parse plugins.
   *
   * @return  The result of processing the pre-parse modify plugins.
   *
   * @throws CanceledOperationException if the operation should be canceled.
   */
  public PreParsePluginResult invokePreParseModifyPlugins(
  public PluginResult.PreParse invokePreParseModifyPlugins(
                                   PreParseModifyOperation modifyOperation)
  {
    PreParsePluginResult result = null;
      throws CanceledOperationException {
    PluginResult.PreParse result = null;
    for (DirectoryServerPlugin p : preParseModifyPlugins)
    {
@@ -2292,6 +2184,10 @@
      {
        result = p.doPreParse(modifyOperation);
      }
      catch (CanceledOperationException coe)
      {
        throw coe;
      }
      catch (Exception e)
      {
        if (debugEnabled())
@@ -2307,11 +2203,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        modifyOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        modifyOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -2323,14 +2216,10 @@
                String.valueOf(modifyOperation.getOperationID()));
        logError(message);
        modifyOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        modifyOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -2340,7 +2229,7 @@
    {
      // This should only happen if there were no pre-parse modify plugins
      // registered, which is fine.
      result = PreParsePluginResult.SUCCESS;
      result = PluginResult.PreParse.continueOperationProcessing();
    }
    return result;
@@ -2356,11 +2245,13 @@
   *                            pre-parse plugins.
   *
   * @return  The result of processing the pre-parse modify DN plugins.
   *
   * @throws CanceledOperationException if the operation should be canceled.
   */
  public PreParsePluginResult invokePreParseModifyDNPlugins(
  public PluginResult.PreParse invokePreParseModifyDNPlugins(
                                   PreParseModifyDNOperation modifyDNOperation)
  {
    PreParsePluginResult result = null;
      throws CanceledOperationException {
    PluginResult.PreParse result = null;
    for (DirectoryServerPlugin p : preParseModifyDNPlugins)
    {
@@ -2374,6 +2265,10 @@
      {
        result = p.doPreParse(modifyDNOperation);
      }
      catch (CanceledOperationException coe)
      {
        throw coe;
      }
      catch (Exception e)
      {
        if (debugEnabled())
@@ -2389,11 +2284,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        modifyDNOperation.setResultCode(
                               DirectoryServer.getServerErrorResultCode());
        modifyDNOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -2405,14 +2297,10 @@
                String.valueOf(modifyDNOperation.getOperationID()));
        logError(message);
        modifyDNOperation.setResultCode(
                               DirectoryServer.getServerErrorResultCode());
        modifyDNOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -2422,7 +2310,7 @@
    {
      // This should only happen if there were no pre-parse modify DN plugins
      // registered, which is fine.
      result = PreParsePluginResult.SUCCESS;
      result = PluginResult.PreParse.continueOperationProcessing();
    }
    return result;
@@ -2438,11 +2326,13 @@
   *                          pre-parse plugins.
   *
   * @return  The result of processing the pre-parse search plugins.
   *
   * @throws CanceledOperationException if the operation should be canceled.
   */
  public PreParsePluginResult invokePreParseSearchPlugins(
  public PluginResult.PreParse invokePreParseSearchPlugins(
                                   PreParseSearchOperation searchOperation)
  {
    PreParsePluginResult result = null;
      throws CanceledOperationException {
    PluginResult.PreParse result = null;
    for (DirectoryServerPlugin p : preParseSearchPlugins)
    {
@@ -2456,6 +2346,10 @@
      {
        result = p.doPreParse(searchOperation);
      }
      catch (CanceledOperationException coe)
      {
        throw coe;
      }
      catch (Exception e)
      {
        if (debugEnabled())
@@ -2471,11 +2365,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        searchOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        searchOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -2487,14 +2378,10 @@
                String.valueOf(searchOperation.getOperationID()));
        logError(message);
        searchOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        searchOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -2504,7 +2391,7 @@
    {
      // This should only happen if there were no pre-parse search plugins
      // registered, which is fine.
      result = PreParsePluginResult.SUCCESS;
      result = PluginResult.PreParse.continueOperationProcessing();
    }
    return result;
@@ -2521,10 +2408,10 @@
   *
   * @return  The result of processing the pre-parse unbind plugins.
   */
  public PreParsePluginResult invokePreParseUnbindPlugins(
  public PluginResult.PreParse invokePreParseUnbindPlugins(
                                   PreParseUnbindOperation unbindOperation)
  {
    PreParsePluginResult result = null;
    PluginResult.PreParse result = null;
    for (DirectoryServerPlugin p : preParseUnbindPlugins)
    {
@@ -2553,11 +2440,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        unbindOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        unbindOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -2569,14 +2453,10 @@
                String.valueOf(unbindOperation.getOperationID()));
        logError(message);
        unbindOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        unbindOperation.appendErrorMessage(message);
        return new PreParsePluginResult(false, false, true);
        return PluginResult.PreParse.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -2586,7 +2466,7 @@
    {
      // This should only happen if there were no pre-parse unbind plugins
      // registered, which is fine.
      result = PreParsePluginResult.SUCCESS;
      result = PluginResult.PreParse.continueOperationProcessing();
    }
    return result;
@@ -2602,14 +2482,17 @@
   *                       pre-operation plugins.
   *
   * @return  The result of processing the pre-operation add plugins.
   *
   * @throws CanceledOperationException if the operation should be canceled.
   */
  public PreOperationPluginResult invokePreOperationAddPlugins(
  public PluginResult.PreOperation invokePreOperationAddPlugins(
                                       PreOperationAddOperation addOperation)
  {
    PreOperationPluginResult result = null;
      throws CanceledOperationException {
    PluginResult.PreOperation result = null;
    for (DirectoryServerPlugin p : preOperationAddPlugins)
    for (int i = 0; i < preOperationAddPlugins.length; i++)
    {
      DirectoryServerPlugin p = preOperationAddPlugins[i];
      if (addOperation.isInternalOperation() &&
          (! p.invokeForInternalOperations()))
      {
@@ -2620,6 +2503,10 @@
      {
        result = p.doPreOperation(addOperation);
      }
      catch (CanceledOperationException coe)
      {
        throw coe;
      }
      catch (Exception e)
      {
        if (debugEnabled())
@@ -2634,10 +2521,11 @@
                stackTraceToSingleLineString(e));
        logError(message);
        addOperation.setResultCode(DirectoryServer.getServerErrorResultCode());
        addOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationAddPlugins,
            addOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -2648,14 +2536,16 @@
                addOperation.getConnectionID(), addOperation.getOperationID());
        logError(message);
        addOperation.setResultCode(DirectoryServer.getServerErrorResultCode());
        addOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationAddPlugins,
            addOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        registerSkippedPreOperationPlugins(i, preOperationAddPlugins,
            addOperation);
        return result;
      }
    }
@@ -2664,7 +2554,7 @@
    {
      // This should only happen if there were no pre-operation add plugins
      // registered, which is fine.
      result = PreOperationPluginResult.SUCCESS;
      result = PluginResult.PreOperation.continueOperationProcessing();
    }
    return result;
@@ -2681,13 +2571,14 @@
   *
   * @return  The result of processing the pre-operation bind plugins.
   */
  public PreOperationPluginResult invokePreOperationBindPlugins(
  public PluginResult.PreOperation invokePreOperationBindPlugins(
                                       PreOperationBindOperation bindOperation)
  {
    PreOperationPluginResult result = null;
    PluginResult.PreOperation result = null;
    for (DirectoryServerPlugin p : preOperationBindPlugins)
    for (int i = 0; i < preOperationBindPlugins.length; i++)
    {
      DirectoryServerPlugin p = preOperationBindPlugins[i];
      if (bindOperation.isInternalOperation() &&
          (! p.invokeForInternalOperations()))
      {
@@ -2712,10 +2603,11 @@
                stackTraceToSingleLineString(e));
        logError(message);
        bindOperation.setResultCode(DirectoryServer.getServerErrorResultCode());
        bindOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationBindPlugins,
            bindOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -2727,23 +2619,26 @@
                bindOperation.getOperationID());
        logError(message);
        bindOperation.setResultCode(DirectoryServer.getServerErrorResultCode());
        bindOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationBindPlugins,
            bindOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        registerSkippedPreOperationPlugins(i, preOperationBindPlugins,
            bindOperation);
        return result;
      }
    }
    if (result == null)
    {
      // This should only happen if there were no pre-operation bind plugins
      // This should only happen if there were no pre-operation add plugins
      // registered, which is fine.
      result = PreOperationPluginResult.SUCCESS;
      result = PluginResult.PreOperation.continueOperationProcessing();
    }
    return result;
@@ -2759,14 +2654,17 @@
   *                           pre-operation plugins.
   *
   * @return  The result of processing the pre-operation compare plugins.
   *
   * @throws CanceledOperationException if the operation should be canceled.
   */
  public PreOperationPluginResult invokePreOperationComparePlugins(
  public PluginResult.PreOperation invokePreOperationComparePlugins(
     PreOperationCompareOperation compareOperation)
  {
    PreOperationPluginResult result = null;
      throws CanceledOperationException {
    PluginResult.PreOperation result = null;
    for (DirectoryServerPlugin p : preOperationComparePlugins)
    for (int i = 0; i < preOperationComparePlugins.length; i++)
    {
      DirectoryServerPlugin p = preOperationComparePlugins[i];
      if (compareOperation.isInternalOperation() &&
          (! p.invokeForInternalOperations()))
      {
@@ -2777,6 +2675,10 @@
      {
        result = p.doPreOperation(compareOperation);
      }
      catch (CanceledOperationException coe)
      {
        throw coe;
      }
      catch (Exception e)
      {
        if (debugEnabled())
@@ -2792,11 +2694,11 @@
                stackTraceToSingleLineString(e));
        logError(message);
        compareOperation.setResultCode(
                              DirectoryServer.getServerErrorResultCode());
        compareOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationComparePlugins,
            compareOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -2808,14 +2710,13 @@
                compareOperation.getOperationID());
        logError(message);
        compareOperation.setResultCode(
                              DirectoryServer.getServerErrorResultCode());
        compareOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationComparePlugins,
            compareOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -2823,9 +2724,9 @@
    if (result == null)
    {
      // This should only happen if there were no pre-operation compare plugins
      // This should only happen if there were no pre-operation add plugins
      // registered, which is fine.
      result = PreOperationPluginResult.SUCCESS;
      result = PluginResult.PreOperation.continueOperationProcessing();
    }
    return result;
@@ -2841,14 +2742,17 @@
   *                          pre-operation plugins.
   *
   * @return  The result of processing the pre-operation delete plugins.
   *
   * @throws CanceledOperationException if the operation should be canceled.
   */
  public PreOperationPluginResult invokePreOperationDeletePlugins(
  public PluginResult.PreOperation invokePreOperationDeletePlugins(
                                  PreOperationDeleteOperation deleteOperation)
  {
    PreOperationPluginResult result = null;
      throws CanceledOperationException {
    PluginResult.PreOperation result = null;
    for (DirectoryServerPlugin p : preOperationDeletePlugins)
    for (int i = 0; i < preOperationDeletePlugins.length; i++)
    {
      DirectoryServerPlugin p = preOperationDeletePlugins[i];
      if (deleteOperation.isInternalOperation() &&
          (! p.invokeForInternalOperations()))
      {
@@ -2859,6 +2763,10 @@
      {
        result = p.doPreOperation(deleteOperation);
      }
      catch (CanceledOperationException coe)
      {
        throw coe;
      }
      catch (Exception e)
      {
        if (debugEnabled())
@@ -2874,11 +2782,11 @@
                stackTraceToSingleLineString(e));
        logError(message);
        deleteOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        deleteOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationDeletePlugins,
            deleteOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -2890,24 +2798,26 @@
                deleteOperation.getOperationID());
        logError(message);
        deleteOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        deleteOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationDeletePlugins,
            deleteOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        registerSkippedPreOperationPlugins(i, preOperationDeletePlugins,
            deleteOperation);
        return result;
      }
    }
    if (result == null)
    {
      // This should only happen if there were no pre-operation delete plugins
      // This should only happen if there were no pre-operation add plugins
      // registered, which is fine.
      result = PreOperationPluginResult.SUCCESS;
      result = PluginResult.PreOperation.continueOperationProcessing();
    }
    return result;
@@ -2923,17 +2833,21 @@
   *                            pre-operation plugins.
   *
   * @return  The result of processing the pre-operation extended plugins.
   *
   * @throws CanceledOperationException if the operation should be canceled.
   */
  public PreOperationPluginResult invokePreOperationExtendedPlugins(
  public PluginResult.PreOperation invokePreOperationExtendedPlugins(
                               PreOperationExtendedOperation extendedOperation)
  {
    PreOperationPluginResult result = null;
      throws CanceledOperationException {
    PluginResult.PreOperation result = null;
    for (DirectoryServerPlugin p : preOperationExtendedPlugins)
    for (int i = 0; i < preOperationExtendedPlugins.length; i++)
    {
      DirectoryServerPlugin p = preOperationExtendedPlugins[i];
      if (extendedOperation.isInternalOperation() &&
          (! p.invokeForInternalOperations()))
      {
        registerSkippedPreOperationPlugin(p, extendedOperation);
        continue;
      }
@@ -2941,6 +2855,10 @@
      {
        result = p.doPreOperation(extendedOperation);
      }
      catch (CanceledOperationException coe)
      {
        throw coe;
      }
      catch (Exception e)
      {
        if (debugEnabled())
@@ -2956,11 +2874,11 @@
                stackTraceToSingleLineString(e));
        logError(message);
        extendedOperation.setResultCode(
                               DirectoryServer.getServerErrorResultCode());
        extendedOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationExtendedPlugins,
            extendedOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -2972,24 +2890,26 @@
                extendedOperation.getOperationID());
        logError(message);
        extendedOperation.setResultCode(
                               DirectoryServer.getServerErrorResultCode());
        extendedOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationExtendedPlugins,
            extendedOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        registerSkippedPreOperationPlugins(i, preOperationExtendedPlugins,
            extendedOperation);
        return result;
      }
    }
    if (result == null)
    {
      // This should only happen if there were no pre-operation extended plugins
      // This should only happen if there were no pre-operation add plugins
      // registered, which is fine.
      result = PreOperationPluginResult.SUCCESS;
      result = PluginResult.PreOperation.continueOperationProcessing();
    }
    return result;
@@ -3005,14 +2925,17 @@
   *                          pre-operation plugins.
   *
   * @return  The result of processing the pre-operation modify plugins.
   *
   * @throws CanceledOperationException if the operation should be canceled.
   */
  public PreOperationPluginResult invokePreOperationModifyPlugins(
  public PluginResult.PreOperation invokePreOperationModifyPlugins(
                                  PreOperationModifyOperation modifyOperation)
  {
    PreOperationPluginResult result = null;
      throws CanceledOperationException {
    PluginResult.PreOperation result = null;
    for (DirectoryServerPlugin p : preOperationModifyPlugins)
    for (int i = 0; i < preOperationModifyPlugins.length; i++)
    {
      DirectoryServerPlugin p = preOperationModifyPlugins[i];
      if (modifyOperation.isInternalOperation() &&
          (! p.invokeForInternalOperations()))
      {
@@ -3023,6 +2946,10 @@
      {
        result = p.doPreOperation(modifyOperation);
      }
      catch (CanceledOperationException coe)
      {
        throw coe;
      }
      catch (Exception e)
      {
        if (debugEnabled())
@@ -3038,11 +2965,11 @@
                stackTraceToSingleLineString(e));
        logError(message);
        modifyOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        modifyOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationModifyPlugins,
            modifyOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -3054,24 +2981,26 @@
                modifyOperation.getOperationID());
        logError(message);
        modifyOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        modifyOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationModifyPlugins,
            modifyOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        registerSkippedPreOperationPlugins(i, preOperationModifyPlugins,
            modifyOperation);
        return result;
      }
    }
    if (result == null)
    {
      // This should only happen if there were no pre-operation modify plugins
      // This should only happen if there were no pre-operation add plugins
      // registered, which is fine.
      result = PreOperationPluginResult.SUCCESS;
      result = PluginResult.PreOperation.continueOperationProcessing();
    }
    return result;
@@ -3087,14 +3016,17 @@
   *                            pre-operation plugins.
   *
   * @return  The result of processing the pre-operation modify DN plugins.
   *
   * @throws CanceledOperationException if the operation should be canceled.
   */
  public PreOperationPluginResult invokePreOperationModifyDNPlugins(
  public PluginResult.PreOperation invokePreOperationModifyDNPlugins(
                              PreOperationModifyDNOperation modifyDNOperation)
  {
    PreOperationPluginResult result = null;
      throws CanceledOperationException {
    PluginResult.PreOperation result = null;
    for (DirectoryServerPlugin p : preOperationModifyDNPlugins)
    for (int i = 0; i < preOperationModifyDNPlugins.length; i++)
    {
      DirectoryServerPlugin p = preOperationModifyDNPlugins[i];
      if (modifyDNOperation.isInternalOperation() &&
          (! p.invokeForInternalOperations()))
      {
@@ -3105,6 +3037,10 @@
      {
        result = p.doPreOperation(modifyDNOperation);
      }
      catch (CanceledOperationException coe)
      {
        throw coe;
      }
      catch (Exception e)
      {
        if (debugEnabled())
@@ -3120,11 +3056,11 @@
                stackTraceToSingleLineString(e));
        logError(message);
        modifyDNOperation.setResultCode(
                               DirectoryServer.getServerErrorResultCode());
        modifyDNOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationModifyDNPlugins,
            modifyDNOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -3136,24 +3072,26 @@
                modifyDNOperation.getOperationID());
        logError(message);
        modifyDNOperation.setResultCode(
                               DirectoryServer.getServerErrorResultCode());
        modifyDNOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationModifyDNPlugins,
            modifyDNOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        registerSkippedPreOperationPlugins(i, preOperationModifyDNPlugins,
            modifyDNOperation);
        return result;
      }
    }
    if (result == null)
    {
      // This should only happen if there were no pre-operation modify DN
      // plugins registered, which is fine.
      result = PreOperationPluginResult.SUCCESS;
      // This should only happen if there were no pre-operation add plugins
      // registered, which is fine.
      result = PluginResult.PreOperation.continueOperationProcessing();
    }
    return result;
@@ -3169,14 +3107,17 @@
   *                          pre-operation plugins.
   *
   * @return  The result of processing the pre-operation search plugins.
   *
   * @throws CanceledOperationException if the operation should be canceled.
   */
  public PreOperationPluginResult invokePreOperationSearchPlugins(
  public PluginResult.PreOperation invokePreOperationSearchPlugins(
                                  PreOperationSearchOperation searchOperation)
  {
    PreOperationPluginResult result = null;
      throws CanceledOperationException {
    PluginResult.PreOperation result = null;
    for (DirectoryServerPlugin p : preOperationSearchPlugins)
    for (int i = 0; i < preOperationSearchPlugins.length; i++)
    {
      DirectoryServerPlugin p = preOperationSearchPlugins[i];
      if (searchOperation.isInternalOperation() &&
          (! p.invokeForInternalOperations()))
      {
@@ -3187,6 +3128,10 @@
      {
        result = p.doPreOperation(searchOperation);
      }
      catch (CanceledOperationException coe)
      {
        throw coe;
      }
      catch (Exception e)
      {
        if (debugEnabled())
@@ -3202,11 +3147,11 @@
                stackTraceToSingleLineString(e));
        logError(message);
        searchOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        searchOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationSearchPlugins,
             searchOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -3218,24 +3163,26 @@
                searchOperation.getOperationID());
        logError(message);
        searchOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        searchOperation.appendErrorMessage(message);
        registerSkippedPreOperationPlugins(i, preOperationSearchPlugins,
             searchOperation);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        registerSkippedPreOperationPlugins(i, preOperationSearchPlugins,
             searchOperation);
        return result;
      }
    }
    if (result == null)
    {
      // This should only happen if there were no pre-operation search plugins
      // This should only happen if there were no pre-operation add plugins
      // registered, which is fine.
      result = PreOperationPluginResult.SUCCESS;
      result = PluginResult.PreOperation.continueOperationProcessing();
    }
    return result;
@@ -3252,10 +3199,11 @@
   *
   * @return  The result of processing the post-operation abandon plugins.
   */
  public PostOperationPluginResult invokePostOperationAbandonPlugins(
  public PluginResult.PostOperation invokePostOperationAbandonPlugins(
                              PostOperationAbandonOperation abandonOperation)
  {
    PostOperationPluginResult result = null;
    PluginResult.PostOperation result = null;
    PluginResult.PostOperation finalResult = null;
    for (DirectoryServerPlugin p : postOperationAbandonPlugins)
    {
@@ -3283,12 +3231,6 @@
                abandonOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        abandonOperation.setResultCode(
                              DirectoryServer.getServerErrorResultCode());
        abandonOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      if (result == null)
@@ -3299,28 +3241,31 @@
                abandonOperation.getConnectionID(),
                abandonOperation.getOperationID());
        logError(message);
        abandonOperation.setResultCode(
                              DirectoryServer.getServerErrorResultCode());
        abandonOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continueProcessing())
      {
        return result;
        // This plugin requested operation processing to stop. However, we
        // still have to invoke all the post op plugins that successfully
        // invoked its pre op plugins. We will just take this plugin's
        // results as the final result.
        finalResult = result;
      }
    }
    if (result == null)
    {
      // This should only happen if there were no post-operation abandon plugins
      // This should only happen if there were no post-operation add plugins
      // registered, which is fine.
      result = PostOperationPluginResult.SUCCESS;
      finalResult = PluginResult.PostOperation.continueOperationProcessing();
    }
    else if(finalResult == null)
    {
      // None of the plugins requested processing to stop so all results
      // have equal priority. Just return the last one.
      finalResult = result;
    }
    return result;
    return finalResult;
  }
@@ -3334,10 +3279,11 @@
   *
   * @return  The result of processing the post-operation add plugins.
   */
  public PostOperationPluginResult invokePostOperationAddPlugins(
  public PluginResult.PostOperation invokePostOperationAddPlugins(
                                        PostOperationAddOperation addOperation)
  {
    PostOperationPluginResult result = null;
    PluginResult.PostOperation result = null;
    PluginResult.PostOperation finalResult = null;
    for (DirectoryServerPlugin p : postOperationAddPlugins)
    {
@@ -3347,6 +3293,13 @@
        continue;
      }
      ArrayList<DirectoryServerPlugin> skippedPlugins =
          skippedPreOperationPlugins.remove(addOperation);
      if(skippedPlugins != null && skippedPlugins.contains(p))
      {
        continue;
      }
      try
      {
        result = p.doPostOperation(addOperation);
@@ -3364,11 +3317,6 @@
                addOperation.getConnectionID(), addOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        addOperation.setResultCode(DirectoryServer.getServerErrorResultCode());
        addOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      if (result == null)
@@ -3378,16 +3326,14 @@
                String.valueOf(p.getPluginEntryDN()),
                addOperation.getConnectionID(), addOperation.getOperationID());
        logError(message);
        addOperation.setResultCode(DirectoryServer.getServerErrorResultCode());
        addOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continueProcessing())
      {
        return result;
        // This plugin requested operation processing to stop. However, we
        // still have to invoke all the post op plugins that successfully
        // invoked its pre op plugins. We will just take this plugin's
        // results as the final result.
        finalResult = result;
      }
    }
@@ -3395,10 +3341,16 @@
    {
      // This should only happen if there were no post-operation add plugins
      // registered, which is fine.
      result = PostOperationPluginResult.SUCCESS;
      finalResult = PluginResult.PostOperation.continueOperationProcessing();
    }
    else if(finalResult == null)
    {
      // None of the plugins requested processing to stop so all results
      // have equal priority. Just return the last one.
      finalResult = result;
    }
    return result;
    return finalResult;
  }
@@ -3412,10 +3364,11 @@
   *
   * @return  The result of processing the post-operation bind plugins.
   */
  public PostOperationPluginResult invokePostOperationBindPlugins(
  public PluginResult.PostOperation invokePostOperationBindPlugins(
                                   PostOperationBindOperation bindOperation)
  {
    PostOperationPluginResult result = null;
    PluginResult.PostOperation result = null;
    PluginResult.PostOperation finalResult = null;
    for (DirectoryServerPlugin p : postOperationBindPlugins)
    {
@@ -3425,6 +3378,13 @@
        continue;
      }
      ArrayList<DirectoryServerPlugin> skippedPlugins =
          skippedPreOperationPlugins.remove(bindOperation);
      if(skippedPlugins != null && skippedPlugins.contains(p))
      {
        continue;
      }
      try
      {
        result = p.doPostOperation(bindOperation);
@@ -3442,11 +3402,6 @@
                bindOperation.getConnectionID(), bindOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        bindOperation.setResultCode(DirectoryServer.getServerErrorResultCode());
        bindOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      if (result == null)
@@ -3457,27 +3412,31 @@
                bindOperation.getConnectionID(),
                bindOperation.getOperationID());
        logError(message);
        bindOperation.setResultCode(DirectoryServer.getServerErrorResultCode());
        bindOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continueProcessing())
      {
        return result;
        // This plugin requested operation processing to stop. However, we
        // still have to invoke all the post op plugins that successfully
        // invoked its pre op plugins. We will just take this plugin's
        // results as the final result.
        finalResult = result;
      }
    }
    if (result == null)
    {
      // This should only happen if there were no post-operation bind plugins
      // This should only happen if there were no post-operation add plugins
      // registered, which is fine.
      result = PostOperationPluginResult.SUCCESS;
      finalResult = PluginResult.PostOperation.continueOperationProcessing();
    }
    else if(finalResult == null)
    {
      // None of the plugins requested processing to stop so all results
      // have equal priority. Just return the last one.
      finalResult = result;
    }
    return result;
    return finalResult;
  }
@@ -3491,10 +3450,11 @@
   *
   * @return  The result of processing the post-operation compare plugins.
   */
  public PostOperationPluginResult invokePostOperationComparePlugins(
  public PluginResult.PostOperation invokePostOperationComparePlugins(
      PostOperationCompareOperation compareOperation)
  {
    PostOperationPluginResult result = null;
    PluginResult.PostOperation result = null;
    PluginResult.PostOperation finalResult = null;
    for (DirectoryServerPlugin p : postOperationComparePlugins)
    {
@@ -3504,6 +3464,13 @@
        continue;
      }
      ArrayList<DirectoryServerPlugin> skippedPlugins =
          skippedPreOperationPlugins.remove(compareOperation);
      if(skippedPlugins != null && skippedPlugins.contains(p))
      {
        continue;
      }
      try
      {
        result = p.doPostOperation(compareOperation);
@@ -3522,12 +3489,6 @@
                compareOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        compareOperation.setResultCode(
                              DirectoryServer.getServerErrorResultCode());
        compareOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      if (result == null)
@@ -3538,28 +3499,31 @@
                compareOperation.getConnectionID(),
                compareOperation.getOperationID());
        logError(message);
        compareOperation.setResultCode(
                              DirectoryServer.getServerErrorResultCode());
        compareOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continueProcessing())
      {
        return result;
        // This plugin requested operation processing to stop. However, we
        // still have to invoke all the post op plugins that successfully
        // invoked its pre op plugins. We will just take this plugin's
        // results as the final result.
        finalResult = result;
      }
    }
    if (result == null)
    {
      // This should only happen if there were no post-operation compare plugins
      // This should only happen if there were no post-operation add plugins
      // registered, which is fine.
      result = PostOperationPluginResult.SUCCESS;
      finalResult = PluginResult.PostOperation.continueOperationProcessing();
    }
    else if(finalResult == null)
    {
      // None of the plugins requested processing to stop so all results
      // have equal priority. Just return the last one.
      finalResult = result;
    }
    return result;
    return finalResult;
  }
@@ -3573,10 +3537,11 @@
   *
   * @return  The result of processing the post-operation delete plugins.
   */
  public PostOperationPluginResult invokePostOperationDeletePlugins(
  public PluginResult.PostOperation invokePostOperationDeletePlugins(
                                   PostOperationDeleteOperation deleteOperation)
  {
    PostOperationPluginResult result = null;
    PluginResult.PostOperation result = null;
    PluginResult.PostOperation finalResult = null;
    for (DirectoryServerPlugin p : postOperationDeletePlugins)
    {
@@ -3586,6 +3551,13 @@
        continue;
      }
      ArrayList<DirectoryServerPlugin> skippedPlugins =
          skippedPreOperationPlugins.remove(deleteOperation);
      if(skippedPlugins != null && skippedPlugins.contains(p))
      {
        continue;
      }
      try
      {
        result = p.doPostOperation(deleteOperation);
@@ -3604,12 +3576,6 @@
                deleteOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        deleteOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        deleteOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      if (result == null)
@@ -3620,28 +3586,31 @@
                deleteOperation.getConnectionID(),
                deleteOperation.getOperationID());
        logError(message);
        deleteOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        deleteOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continueProcessing())
      {
        return result;
        // This plugin requested operation processing to stop. However, we
        // still have to invoke all the post op plugins that successfully
        // invoked its pre op plugins. We will just take this plugin's
        // results as the final result.
        finalResult = result;
      }
    }
    if (result == null)
    {
      // This should only happen if there were no post-operation delete plugins
      // This should only happen if there were no post-operation add plugins
      // registered, which is fine.
      result = PostOperationPluginResult.SUCCESS;
      finalResult = PluginResult.PostOperation.continueOperationProcessing();
    }
    else if(finalResult == null)
    {
      // None of the plugins requested processing to stop so all results
      // have equal priority. Just return the last one.
      finalResult = result;
    }
    return result;
    return finalResult;
  }
@@ -3655,10 +3624,11 @@
   *
   * @return  The result of processing the post-operation extended plugins.
   */
  public PostOperationPluginResult invokePostOperationExtendedPlugins(
  public PluginResult.PostOperation invokePostOperationExtendedPlugins(
                             PostOperationExtendedOperation extendedOperation)
  {
    PostOperationPluginResult result = null;
    PluginResult.PostOperation result = null;
    PluginResult.PostOperation finalResult = null;
    for (DirectoryServerPlugin p : postOperationExtendedPlugins)
    {
@@ -3668,6 +3638,13 @@
        continue;
      }
      ArrayList<DirectoryServerPlugin> skippedPlugins =
          skippedPreOperationPlugins.remove(extendedOperation);
      if(skippedPlugins != null && skippedPlugins.contains(p))
      {
        continue;
      }
      try
      {
        result = p.doPostOperation(extendedOperation);
@@ -3686,12 +3663,6 @@
                extendedOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        extendedOperation.setResultCode(
                               DirectoryServer.getServerErrorResultCode());
        extendedOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      if (result == null)
@@ -3702,28 +3673,31 @@
                extendedOperation.getConnectionID(),
                extendedOperation.getOperationID());
        logError(message);
        extendedOperation.setResultCode(
                               DirectoryServer.getServerErrorResultCode());
        extendedOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continueProcessing())
      {
        return result;
        // This plugin requested operation processing to stop. However, we
        // still have to invoke all the post op plugins that successfully
        // invoked its pre op plugins. We will just take this plugin's
        // results as the final result.
        finalResult = result;
      }
    }
    if (result == null)
    {
      // This should only happen if there were no post-operation extended
      // plugins registered, which is fine.
      result = PostOperationPluginResult.SUCCESS;
      // This should only happen if there were no post-operation add plugins
      // registered, which is fine.
      finalResult = PluginResult.PostOperation.continueOperationProcessing();
    }
    else if(finalResult == null)
    {
      // None of the plugins requested processing to stop so all results
      // have equal priority. Just return the last one.
      finalResult = result;
    }
    return result;
    return finalResult;
  }
@@ -3737,10 +3711,11 @@
   *
   * @return  The result of processing the post-operation modify plugins.
   */
  public PostOperationPluginResult invokePostOperationModifyPlugins(
  public PluginResult.PostOperation invokePostOperationModifyPlugins(
                                   PostOperationModifyOperation modifyOperation)
  {
    PostOperationPluginResult result = null;
    PluginResult.PostOperation result = null;
    PluginResult.PostOperation finalResult = null;
    for (DirectoryServerPlugin p : postOperationModifyPlugins)
    {
@@ -3750,6 +3725,13 @@
        continue;
      }
      ArrayList<DirectoryServerPlugin> skippedPlugins =
          skippedPreOperationPlugins.remove(modifyOperation);
      if(skippedPlugins != null && skippedPlugins.contains(p))
      {
        continue;
      }
      try
      {
        result = p.doPostOperation(modifyOperation);
@@ -3768,12 +3750,6 @@
                modifyOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        modifyOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        modifyOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      if (result == null)
@@ -3784,28 +3760,30 @@
                modifyOperation.getConnectionID(),
                modifyOperation.getOperationID());
        logError(message);
        modifyOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        modifyOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continueProcessing())
      {
        return result;
        // This plugin requested operation processing to stop. However, we
        // still have to invoke all the post op plugins that successfully
        // invoked its pre op plugins. We will just take this plugin's
        // results as the final result.
        finalResult = result;
      }
    }
    if (result == null)
    {
      // This should only happen if there were no post-operation modify plugins
      // This should only happen if there were no post-operation add plugins
      // registered, which is fine.
      result = PostOperationPluginResult.SUCCESS;
      finalResult = PluginResult.PostOperation.continueOperationProcessing();
    }
    return result;
    else if(finalResult == null)
    {
      // None of the plugins requested processing to stop so all results
      // have equal priority. Just return the last one.
      finalResult = result;
    }
    return finalResult;
  }
@@ -3819,10 +3797,11 @@
   *
   * @return  The result of processing the post-operation modify DN plugins.
   */
  public PostOperationPluginResult invokePostOperationModifyDNPlugins(
  public PluginResult.PostOperation invokePostOperationModifyDNPlugins(
                             PostOperationModifyDNOperation modifyDNOperation)
  {
    PostOperationPluginResult result = null;
    PluginResult.PostOperation result = null;
    PluginResult.PostOperation finalResult = null;
    for (DirectoryServerPlugin p : postOperationModifyDNPlugins)
    {
@@ -3832,6 +3811,13 @@
        continue;
      }
      ArrayList<DirectoryServerPlugin> skippedPlugins =
          skippedPreOperationPlugins.remove(modifyDNOperation);
      if(skippedPlugins != null && skippedPlugins.contains(p))
      {
        continue;
      }
      try
      {
        result = p.doPostOperation(modifyDNOperation);
@@ -3850,12 +3836,6 @@
                modifyDNOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        modifyDNOperation.setResultCode(
                               DirectoryServer.getServerErrorResultCode());
        modifyDNOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      if (result == null)
@@ -3866,28 +3846,31 @@
                modifyDNOperation.getConnectionID(),
                modifyDNOperation.getOperationID());
        logError(message);
        modifyDNOperation.setResultCode(
                               DirectoryServer.getServerErrorResultCode());
        modifyDNOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continueProcessing())
      {
        return result;
        // This plugin requested operation processing to stop. However, we
        // still have to invoke all the post op plugins that successfully
        // invoked its pre op plugins. We will just take this plugin's
        // results as the final result.
        finalResult = result;
      }
    }
    if (result == null)
    {
      // This should only happen if there were no post-operation modify DN
      // plugins registered, which is fine.
      result = PostOperationPluginResult.SUCCESS;
      // This should only happen if there were no post-operation add plugins
      // registered, which is fine.
      finalResult = PluginResult.PostOperation.continueOperationProcessing();
    }
    else if(finalResult == null)
    {
      // None of the plugins requested processing to stop so all results
      // have equal priority. Just return the last one.
      finalResult = result;
    }
    return result;
    return finalResult;
  }
@@ -3901,10 +3884,11 @@
   *
   * @return  The result of processing the post-operation search plugins.
   */
  public PostOperationPluginResult invokePostOperationSearchPlugins(
  public PluginResult.PostOperation invokePostOperationSearchPlugins(
                                   PostOperationSearchOperation searchOperation)
  {
    PostOperationPluginResult result = null;
    PluginResult.PostOperation result = null;
    PluginResult.PostOperation finalResult = null;
    for (DirectoryServerPlugin p : postOperationSearchPlugins)
    {
@@ -3914,6 +3898,13 @@
        continue;
      }
      ArrayList<DirectoryServerPlugin> skippedPlugins =
          skippedPreOperationPlugins.remove(searchOperation);
      if(skippedPlugins != null && skippedPlugins.contains(p))
      {
        continue;
      }
      try
      {
        result = p.doPostOperation(searchOperation);
@@ -3932,12 +3923,6 @@
                searchOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        searchOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        searchOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      if (result == null)
@@ -3948,28 +3933,31 @@
                searchOperation.getConnectionID(),
                searchOperation.getOperationID());
        logError(message);
        searchOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        searchOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continueProcessing())
      {
        return result;
        // This plugin requested operation processing to stop. However, we
        // still have to invoke all the post op plugins that successfully
        // invoked its pre op plugins. We will just take this plugin's
        // results as the final result.
        finalResult = result;
      }
    }
    if (result == null)
    {
      // This should only happen if there were no post-operation search plugins
      // This should only happen if there were no post-operation add plugins
      // registered, which is fine.
      result = PostOperationPluginResult.SUCCESS;
      finalResult = PluginResult.PostOperation.continueOperationProcessing();
    }
    else if(finalResult == null)
    {
      // None of the plugins requested processing to stop so all results
      // have equal priority. Just return the last one.
      finalResult = result;
    }
    return result;
    return finalResult;
  }
@@ -3983,10 +3971,11 @@
   *
   * @return  The result of processing the post-operation unbind plugins.
   */
  public PostOperationPluginResult invokePostOperationUnbindPlugins(
  public PluginResult.PostOperation invokePostOperationUnbindPlugins(
                                 PostOperationUnbindOperation unbindOperation)
  {
    PostOperationPluginResult result = null;
    PluginResult.PostOperation result = null;
    PluginResult.PostOperation finalResult = null;
    for (DirectoryServerPlugin p : postOperationUnbindPlugins)
    {
@@ -3996,6 +3985,13 @@
        continue;
      }
      ArrayList<DirectoryServerPlugin> skippedPlugins =
          skippedPreOperationPlugins.remove(unbindOperation);
      if(skippedPlugins != null && skippedPlugins.contains(p))
      {
        continue;
      }
      try
      {
        result = p.doPostOperation(unbindOperation);
@@ -4014,12 +4010,6 @@
                unbindOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        unbindOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        unbindOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      if (result == null)
@@ -4030,28 +4020,31 @@
                unbindOperation.getConnectionID(),
                unbindOperation.getOperationID());
        logError(message);
        unbindOperation.setResultCode(
                             DirectoryServer.getServerErrorResultCode());
        unbindOperation.appendErrorMessage(message);
        return new PostOperationPluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continueProcessing())
      {
        return result;
        // This plugin requested operation processing to stop. However, we
        // still have to invoke all the post op plugins that successfully
        // invoked its pre op plugins. We will just take this plugin's
        // results as the final result.
        finalResult = result;
      }
    }
    if (result == null)
    {
      // This should only happen if there were no post-operation unbind plugins
      // This should only happen if there were no post-operation add plugins
      // registered, which is fine.
      result = PostOperationPluginResult.SUCCESS;
      finalResult = PluginResult.PostOperation.continueOperationProcessing();
    }
    else if(finalResult == null)
    {
      // None of the plugins requested processing to stop so all results
      // have equal priority. Just return the last one.
      finalResult = result;
    }
    return result;
    return finalResult;
  }
@@ -4065,10 +4058,10 @@
   *
   * @return  The result of processing the post-response add plugins.
   */
  public PostResponsePluginResult invokePostResponseAddPlugins(
  public PluginResult.PostResponse invokePostResponseAddPlugins(
                                       PostResponseAddOperation addOperation)
  {
    PostResponsePluginResult result = null;
    PluginResult.PostResponse result = null;
    for (DirectoryServerPlugin p : postResponseAddPlugins)
    {
@@ -4095,8 +4088,6 @@
                addOperation.getConnectionID(), addOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      if (result == null)
@@ -4106,11 +4097,8 @@
                String.valueOf(p.getPluginEntryDN()),
                addOperation.getConnectionID(), addOperation.getOperationID());
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -4120,7 +4108,7 @@
    {
      // This should only happen if there were no post-response add plugins
      // registered, which is fine.
      result = PostResponsePluginResult.SUCCESS;
      result = PluginResult.PostResponse.continueOperationProcessing();
    }
    return result;
@@ -4137,10 +4125,10 @@
   *
   * @return  The result of processing the post-response bind plugins.
   */
  public PostResponsePluginResult invokePostResponseBindPlugins(
  public PluginResult.PostResponse invokePostResponseBindPlugins(
                                       PostResponseBindOperation bindOperation)
  {
    PostResponsePluginResult result = null;
    PluginResult.PostResponse result = null;
    for (DirectoryServerPlugin p : postResponseBindPlugins)
    {
@@ -4167,8 +4155,6 @@
                bindOperation.getConnectionID(), bindOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      if (result == null)
@@ -4179,11 +4165,8 @@
                bindOperation.getConnectionID(),
                bindOperation.getOperationID());
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -4191,9 +4174,9 @@
    if (result == null)
    {
      // This should only happen if there were no post-response bind plugins
      // This should only happen if there were no post-response add plugins
      // registered, which is fine.
      result = PostResponsePluginResult.SUCCESS;
      result = PluginResult.PostResponse.continueOperationProcessing();
    }
    return result;
@@ -4210,10 +4193,10 @@
   *
   * @return  The result of processing the post-response compare plugins.
   */
  public PostResponsePluginResult invokePostResponseComparePlugins(
  public PluginResult.PostResponse invokePostResponseComparePlugins(
      PostResponseCompareOperation compareOperation)
  {
    PostResponsePluginResult result = null;
    PluginResult.PostResponse result = null;
    for (DirectoryServerPlugin p : postResponseComparePlugins)
    {
@@ -4241,8 +4224,6 @@
                compareOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      if (result == null)
@@ -4253,11 +4234,8 @@
                compareOperation.getConnectionID(),
                compareOperation.getOperationID());
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -4265,9 +4243,9 @@
    if (result == null)
    {
      // This should only happen if there were no post-response compare plugins
      // This should only happen if there were no post-response add plugins
      // registered, which is fine.
      result = PostResponsePluginResult.SUCCESS;
      result = PluginResult.PostResponse.continueOperationProcessing();
    }
    return result;
@@ -4284,10 +4262,10 @@
   *
   * @return  The result of processing the post-response delete plugins.
   */
  public PostResponsePluginResult invokePostResponseDeletePlugins(
  public PluginResult.PostResponse invokePostResponseDeletePlugins(
                          PostResponseDeleteOperation deleteOperation)
  {
    PostResponsePluginResult result = null;
    PluginResult.PostResponse result = null;
    for (DirectoryServerPlugin p : postResponseDeletePlugins)
    {
@@ -4315,8 +4293,6 @@
                deleteOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      if (result == null)
@@ -4327,11 +4303,8 @@
                deleteOperation.getConnectionID(),
                deleteOperation.getOperationID());
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -4339,11 +4312,10 @@
    if (result == null)
    {
      // This should only happen if there were no post-response delete plugins
      // This should only happen if there were no post-response add plugins
      // registered, which is fine.
      result = PostResponsePluginResult.SUCCESS;
      result = PluginResult.PostResponse.continueOperationProcessing();
    }
    return result;
  }
@@ -4358,10 +4330,10 @@
   *
   * @return  The result of processing the post-response extended plugins.
   */
  public PostResponsePluginResult invokePostResponseExtendedPlugins(
  public PluginResult.PostResponse invokePostResponseExtendedPlugins(
                              PostResponseExtendedOperation extendedOperation)
  {
    PostResponsePluginResult result = null;
    PluginResult.PostResponse result = null;
    for (DirectoryServerPlugin p : postResponseExtendedPlugins)
    {
@@ -4389,8 +4361,6 @@
                extendedOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      if (result == null)
@@ -4401,11 +4371,8 @@
                extendedOperation.getConnectionID(),
                extendedOperation.getOperationID());
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -4413,9 +4380,9 @@
    if (result == null)
    {
      // This should only happen if there were no post-response extended plugins
      // This should only happen if there were no post-response add plugins
      // registered, which is fine.
      result = PostResponsePluginResult.SUCCESS;
      result = PluginResult.PostResponse.continueOperationProcessing();
    }
    return result;
@@ -4432,10 +4399,10 @@
   *
   * @return  The result of processing the post-response modify plugins.
   */
  public PostResponsePluginResult invokePostResponseModifyPlugins(
  public PluginResult.PostResponse invokePostResponseModifyPlugins(
                                  PostResponseModifyOperation modifyOperation)
  {
    PostResponsePluginResult result = null;
    PluginResult.PostResponse result = null;
    for (DirectoryServerPlugin p : postResponseModifyPlugins)
    {
@@ -4463,8 +4430,6 @@
                modifyOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      if (result == null)
@@ -4475,11 +4440,8 @@
                modifyOperation.getConnectionID(),
                modifyOperation.getOperationID());
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -4487,9 +4449,9 @@
    if (result == null)
    {
      // This should only happen if there were no post-response modify plugins
      // This should only happen if there were no post-response add plugins
      // registered, which is fine.
      result = PostResponsePluginResult.SUCCESS;
      result = PluginResult.PostResponse.continueOperationProcessing();
    }
    return result;
@@ -4506,10 +4468,10 @@
   *
   * @return  The result of processing the post-response modify DN plugins.
   */
  public PostResponsePluginResult invokePostResponseModifyDNPlugins(
  public PluginResult.PostResponse invokePostResponseModifyDNPlugins(
                               PostResponseModifyDNOperation modifyDNOperation)
  {
    PostResponsePluginResult result = null;
    PluginResult.PostResponse result = null;
    for (DirectoryServerPlugin p : postResponseModifyDNPlugins)
    {
@@ -4537,8 +4499,6 @@
                modifyDNOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      if (result == null)
@@ -4549,11 +4509,8 @@
                modifyDNOperation.getConnectionID(),
                modifyDNOperation.getOperationID());
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -4561,9 +4518,9 @@
    if (result == null)
    {
      // This should only happen if there were no post-response modify DN
      // plugins registered, which is fine.
      result = PostResponsePluginResult.SUCCESS;
      // This should only happen if there were no post-response add plugins
      // registered, which is fine.
      result = PluginResult.PostResponse.continueOperationProcessing();
    }
    return result;
@@ -4580,10 +4537,10 @@
   *
   * @return  The result of processing the post-response search plugins.
   */
  public PostResponsePluginResult invokePostResponseSearchPlugins(
  public PluginResult.PostResponse invokePostResponseSearchPlugins(
                                  PostResponseSearchOperation searchOperation)
  {
    PostResponsePluginResult result = null;
    PluginResult.PostResponse result = null;
    for (DirectoryServerPlugin p : postResponseSearchPlugins)
    {
@@ -4611,8 +4568,6 @@
                searchOperation.getOperationID(),
                stackTraceToSingleLineString(e));
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      if (result == null)
@@ -4623,11 +4578,8 @@
                searchOperation.getConnectionID(),
                searchOperation.getOperationID());
        logError(message);
        return new PostResponsePluginResult(false, false);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (!result.continuePluginProcessing())
      {
        return result;
      }
@@ -4635,9 +4587,9 @@
    if (result == null)
    {
      // This should only happen if there were no post-response search plugins
      // This should only happen if there were no post-response add plugins
      // registered, which is fine.
      result = PostResponsePluginResult.SUCCESS;
      result = PluginResult.PostResponse.continueOperationProcessing();
    }
    return result;
@@ -4798,11 +4750,11 @@
   *
   * @return  The result of processing the search result entry plugins.
   */
  public SearchEntryPluginResult invokeSearchResultEntryPlugins(
  public PluginResult.IntermediateResponse invokeSearchResultEntryPlugins(
                                 LocalBackendSearchOperation searchOperation,
                                 SearchResultEntry searchEntry)
  {
    SearchEntryPluginResult result = null;
    PluginResult.IntermediateResponse result = null;
    for (DirectoryServerPlugin p : searchResultEntryPlugins)
    {
@@ -4831,7 +4783,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        return new SearchEntryPluginResult(false, false, false, false);
        return PluginResult.IntermediateResponse.stopProcessing(false,
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -4843,10 +4796,10 @@
                String.valueOf(searchEntry.getDN()));
        logError(message);
        return new SearchEntryPluginResult(false, false, false, false);
        return PluginResult.IntermediateResponse.stopProcessing(false,
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (! result.continuePluginProcessing())
      {
        return result;
      }
@@ -4856,7 +4809,8 @@
    {
      // This should only happen if there were no search result entry plugins
      // registered, which is fine.
      result = SearchEntryPluginResult.SUCCESS;
      result = PluginResult.IntermediateResponse.
          continueOperationProcessing(true);
    }
    return result;
@@ -4874,11 +4828,11 @@
   *
   * @return  The result of processing the search result entry plugins.
   */
  public SearchEntryPluginResult invokeSearchResultEntryPlugins(
  public PluginResult.IntermediateResponse invokeSearchResultEntryPlugins(
      SearchEntrySearchOperation searchOperation,
      SearchResultEntry searchEntry)
  {
    SearchEntryPluginResult result = null;
    PluginResult.IntermediateResponse result = null;
    for (DirectoryServerPlugin p : searchResultEntryPlugins)
    {
@@ -4913,7 +4867,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        return new SearchEntryPluginResult(false, false, false, false);
        return PluginResult.IntermediateResponse.stopProcessing(false,
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -4925,10 +4880,10 @@
                String.valueOf(searchEntry.getDN()));
        logError(message);
        return new SearchEntryPluginResult(false, false, false, false);
        return PluginResult.IntermediateResponse.stopProcessing(false,
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (! result.continuePluginProcessing())
      {
        return result;
      }
@@ -4938,7 +4893,8 @@
    {
      // This should only happen if there were no search result entry plugins
      // registered, which is fine.
      result = SearchEntryPluginResult.SUCCESS;
      result =
          PluginResult.IntermediateResponse.continueOperationProcessing(true);
    }
    return result;
@@ -4956,11 +4912,11 @@
   *
   * @return  The result of processing the search result reference plugins.
   */
  public SearchReferencePluginResult invokeSearchResultReferencePlugins(
  public PluginResult.IntermediateResponse invokeSearchResultReferencePlugins(
                                   LocalBackendSearchOperation searchOperation,
                                   SearchResultReference searchReference)
  {
    SearchReferencePluginResult result = null;
    PluginResult.IntermediateResponse result = null;
    for (DirectoryServerPlugin p : searchResultReferencePlugins)
    {
@@ -4989,7 +4945,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        return new SearchReferencePluginResult(false, false, false, false);
        return PluginResult.IntermediateResponse.stopProcessing(false,
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -5001,10 +4958,10 @@
                searchReference.getReferralURLString());
        logError(message);
        return new SearchReferencePluginResult(false, false, false, false);
        return PluginResult.IntermediateResponse.stopProcessing(false,
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (! result.continuePluginProcessing())
      {
        return result;
      }
@@ -5014,7 +4971,8 @@
    {
      // This should only happen if there were no search result reference
      // plugins registered, which is fine.
      result = SearchReferencePluginResult.SUCCESS;
      result =
          PluginResult.IntermediateResponse.continueOperationProcessing(true);
    }
    return result;
@@ -5032,11 +4990,11 @@
   *
   * @return  The result of processing the search result reference plugins.
   */
  public SearchReferencePluginResult invokeSearchResultReferencePlugins(
  public PluginResult.IntermediateResponse invokeSearchResultReferencePlugins(
      SearchReferenceSearchOperation searchOperation,
      SearchResultReference searchReference)
  {
    SearchReferencePluginResult result = null;
    PluginResult.IntermediateResponse result = null;
    for (DirectoryServerPlugin p : searchResultReferencePlugins)
    {
@@ -5065,7 +5023,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        return new SearchReferencePluginResult(false, false, false, false);
        return PluginResult.IntermediateResponse.stopProcessing(false,
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -5077,10 +5036,10 @@
                searchReference.getReferralURLString());
        logError(message);
        return new SearchReferencePluginResult(false, false, false, false);
        return PluginResult.IntermediateResponse.stopProcessing(false,
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (! result.continuePluginProcessing())
      {
        return result;
      }
@@ -5090,7 +5049,8 @@
    {
      // This should only happen if there were no search result reference
      // plugins registered, which is fine.
      result = SearchReferencePluginResult.SUCCESS;
      result =
          PluginResult.IntermediateResponse.continueOperationProcessing(true);
    }
    return result;
@@ -5113,11 +5073,11 @@
   *
   * @return  The result of processing the subordinate modify DN plugins.
   */
  public SubordinateModifyDNPluginResult invokeSubordinateModifyDNPlugins(
  public PluginResult.SubordinateModifyDN invokeSubordinateModifyDNPlugins(
              SubordinateModifyDNOperation modifyDNOperation, Entry oldEntry,
              Entry newEntry, List<Modification> modifications)
  {
    SubordinateModifyDNPluginResult result = null;
    PluginResult.SubordinateModifyDN result = null;
    for (DirectoryServerPlugin p : subordinateModifyDNPlugins)
    {
@@ -5140,26 +5100,32 @@
        {
          TRACER.debugCaught(DebugLogLevel.ERROR, e);
        }
        logError(ERR_PLUGIN_SUBORDINATE_MODIFY_DN_PLUGIN_EXCEPTION.get(
        Message message =
            ERR_PLUGIN_SUBORDINATE_MODIFY_DN_PLUGIN_EXCEPTION.get(
                String.valueOf(p.getPluginEntryDN()),
                modifyDNOperation.getConnectionID(),
                modifyDNOperation.getOperationID(),
                stackTraceToSingleLineString(e)));
                stackTraceToSingleLineString(e));
        logError(message);
        return new SubordinateModifyDNPluginResult(false, false, true);
        return PluginResult.SubordinateModifyDN.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
      {
        logError(ERR_PLUGIN_SUBORDINATE_MODIFY_DN_PLUGIN_RETURNED_NULL.get(
        Message message =
            ERR_PLUGIN_SUBORDINATE_MODIFY_DN_PLUGIN_RETURNED_NULL.get(
                        String.valueOf(p.getPluginEntryDN()),
                        modifyDNOperation.getConnectionID(),
                        String.valueOf(modifyDNOperation.getOperationID())));
                        String.valueOf(modifyDNOperation.getOperationID()));
        logError(message);
        return new SubordinateModifyDNPluginResult(false, false, true);
        return PluginResult.SubordinateModifyDN.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (! result.continuePluginProcessing())
      {
        return result;
      }
@@ -5169,7 +5135,7 @@
    {
      // This should only happen if there were no subordinate modify DN plugins
      // registered, which is fine.
      result = SubordinateModifyDNPluginResult.SUCCESS;
      result = PluginResult.SubordinateModifyDN.continueOperationProcessing();
    }
    return result;
@@ -5186,11 +5152,11 @@
   *
   * @return  The result of processing the intermediate response plugins.
   */
  public IntermediateResponsePluginResult
  public PluginResult.IntermediateResponse
              invokeIntermediateResponsePlugins(
                   IntermediateResponse intermediateResponse)
  {
    IntermediateResponsePluginResult result = null;
    PluginResult.IntermediateResponse result = null;
    Operation operation = intermediateResponse.getOperation();
    for (DirectoryServerPlugin p : intermediateResponsePlugins)
@@ -5212,7 +5178,8 @@
                stackTraceToSingleLineString(e));
        logError(message);
        return new IntermediateResponsePluginResult(false, false, false, false);
        return PluginResult.IntermediateResponse.stopProcessing
            (false, DirectoryServer.getServerErrorResultCode(), message);
      }
      if (result == null)
@@ -5222,10 +5189,10 @@
                operation.getConnectionID(), operation.getOperationID());
        logError(message);
        return new IntermediateResponsePluginResult(false, false, false, false);
        return PluginResult.IntermediateResponse.stopProcessing
            (false, DirectoryServer.getServerErrorResultCode(), message);
      }
      else if (result.connectionTerminated() ||
               (! result.continuePluginProcessing()))
      else if (! result.continuePluginProcessing())
      {
        return result;
      }
@@ -5235,7 +5202,8 @@
    {
      // This should only happen if there were no intermediate response plugins
      // registered, which is fine.
      result = IntermediateResponsePluginResult.SUCCESS;
      result =
          PluginResult.IntermediateResponse.continueOperationProcessing(true);
    }
    return result;
@@ -5478,5 +5446,31 @@
    return new ConfigChangeResult(resultCode, adminActionRequired, messages);
  }
  private void registerSkippedPreOperationPlugins(int i,
                                                DirectoryServerPlugin[] plugins,
                                                 PluginOperation operation)
  {
    ArrayList<DirectoryServerPlugin> skippedPlugins =
        new ArrayList<DirectoryServerPlugin>(plugins.length - i);
    for(int j = i; j < plugins.length; j++)
    {
      skippedPlugins.add(plugins[j]);
    }
    skippedPreOperationPlugins.put(operation, skippedPlugins);
  }
  private void registerSkippedPreOperationPlugin(DirectoryServerPlugin plugin,
                                                 PluginOperation operation)
  {
    ArrayList<DirectoryServerPlugin> existingList =
        skippedPreOperationPlugins.get(operation);
    if(existingList == null)
    {
      existingList = new ArrayList<DirectoryServerPlugin>();
    }
    existingList.add(plugin);
    skippedPreOperationPlugins.put(operation, existingList);
  }
}
opends/src/server/org/opends/server/core/RootDseWorkflowTopology.java
@@ -27,10 +27,7 @@
package org.opends.server.core;
import org.opends.server.types.DN;
import org.opends.server.types.Operation;
import org.opends.server.types.OperationType;
import org.opends.server.types.SearchScope;
import org.opends.server.types.*;
/**
@@ -70,11 +67,12 @@
   * Executes an operation on the root DSE entry.
   *
   * @param operation the operation to execute
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public void execute(
      Operation operation
      )
  {
  public void execute(Operation operation)
      throws CanceledOperationException {
    // Execute the operation.
    OperationType operationType = operation.getOperationType();
    if (operationType != OperationType.SEARCH)
@@ -94,11 +92,12 @@
   * Executes a search operation on the the root DSE entry.
   *
   * @param searchOp the operation to execute
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  private void executeSearch(
      SearchOperation searchOp
      )
  {
  private void executeSearch(SearchOperation searchOp)
      throws CanceledOperationException {
    // Keep a the original search scope because we will alter it in the
    // operation.
    SearchScope originalScope = searchOp.getScope();
opends/src/server/org/opends/server/core/SearchOperationBasis.java
@@ -36,37 +36,14 @@
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.plugin.PreParsePluginResult;
import org.opends.server.api.plugin.SearchEntryPluginResult;
import org.opends.server.api.plugin.SearchReferencePluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.controls.AccountUsableResponseControl;
import org.opends.server.controls.MatchedValuesControl;
import org.opends.server.loggers.debug.DebugLogger;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.protocols.ldap.LDAPFilter;
import org.opends.server.types.AbstractOperation;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeType;
import org.opends.server.types.AttributeValue;
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.DN;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DereferencePolicy;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.DisconnectReason;
import org.opends.server.types.Entry;
import org.opends.server.types.FilterType;
import org.opends.server.types.OperationType;
import org.opends.server.types.RawFilter;
import org.opends.server.types.ResultCode;
import org.opends.server.types.SearchFilter;
import org.opends.server.types.SearchResultEntry;
import org.opends.server.types.SearchResultReference;
import org.opends.server.types.SearchScope;
import org.opends.server.types.*;
import org.opends.server.types.operation.PostResponseSearchOperation;
import org.opends.server.types.operation.PreParseSearchOperation;
import org.opends.server.types.operation.SearchEntrySearchOperation;
@@ -122,9 +99,6 @@
  // The raw, unprocessed base DN as included in the request from the client.
  private ByteString rawBaseDN;
  // The cancel request that has been issued for this search operation.
  private CancelRequest cancelRequest;
  // The dereferencing policy for the search operation.
  private DereferencePolicy derefPolicy;
@@ -694,8 +668,7 @@
      try
      {
        // FIXME -- Need a way to enable PWP debugging.
        PasswordPolicyState pwpState = new PasswordPolicyState(entry, false,
                                                               false);
        PasswordPolicyState pwpState = new PasswordPolicyState(entry, false);
        boolean isInactive           = pwpState.isDisabled() ||
                                       pwpState.isAccountExpired();
@@ -997,23 +970,12 @@
        .getAccessControlHandler().filterEntry(this, searchEntry);
    // Invoke any search entry plugins that may be registered with the server.
    SearchEntryPluginResult pluginResult =
    PluginResult.IntermediateResponse pluginResult =
         DirectoryServer.getPluginConfigManager().
              invokeSearchResultEntryPlugins(this, searchEntry);
    if (pluginResult.connectionTerminated())
    {
      // We won't attempt to send this entry, and we won't continue with
      // any processing.  Just update the operation to indicate that it was
      // cancelled and return false.
      setResultCode(ResultCode.CANCELED);
      appendErrorMessage(ERR_CANCELED_BY_SEARCH_ENTRY_DISCONNECT.get(
              String.valueOf(entry.getDN())));
      return false;
    }
    // Send the entry to the client.
    if (pluginResult.sendEntry())
    if (pluginResult.sendResponse())
    {
      try
      {
@@ -1035,7 +997,7 @@
      }
    }
    return pluginResult.continueSearch();
    return pluginResult.continueProcessing();
  }
  /**
@@ -1080,26 +1042,15 @@
    // Invoke any search reference plugins that may be registered with the
    // server.
    SearchReferencePluginResult pluginResult =
    PluginResult.IntermediateResponse pluginResult =
         DirectoryServer.getPluginConfigManager().
              invokeSearchResultReferencePlugins(this, reference);
    if (pluginResult.connectionTerminated())
    {
      // We won't attempt to send this entry, and we won't continue with
      // any processing.  Just update the operation to indicate that it was
      // cancelled and return false.
      setResultCode(ResultCode.CANCELED);
      appendErrorMessage(ERR_CANCELED_BY_SEARCH_REF_DISCONNECT.get(
              String.valueOf(reference.getReferralURLString())));
      return false;
    }
    // Send the reference to the client.  Note that this could throw an
    // exception, which would indicate that the associated client can't handle
    // referrals.  If that't the case, then set a flag so we'll know not to try
    // to send any more.
    if (pluginResult.sendReference())
    if (pluginResult.sendResponse())
    {
      try
      {
@@ -1130,7 +1081,7 @@
      }
    }
    return pluginResult.continueSearch();
    return pluginResult.continueProcessing();
  }
  /**
@@ -1171,17 +1122,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
@@ -1323,71 +1263,27 @@
    responseControls.remove(control);
  }
  /**
   * {@inheritDoc}
   */
  @Override()
  public final CancelResult cancel(CancelRequest cancelRequest)
  public void abort(CancelRequest cancelRequest)
  {
    this.cancelRequest = cancelRequest;
    if (persistentSearch != null)
    if(cancelResult == null && this.cancelRequest == null)
    {
      DirectoryServer.deregisterPersistentSearch(persistentSearch);
      persistentSearch = null;
    }
      this.cancelRequest = cancelRequest;
    CancelResult cancelResult = getCancelResult();
    long stopWaitingTime = System.currentTimeMillis() + 5000;
    while ((cancelResult == null) &&
           (System.currentTimeMillis() < stopWaitingTime))
    {
      try
      if (persistentSearch != null)
      {
        Thread.sleep(50);
        DirectoryServer.deregisterPersistentSearch(persistentSearch);
        persistentSearch = null;
      }
      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}
@@ -1600,15 +1496,19 @@
  public final void run()
  {
    setResultCode(ResultCode.UNDEFINED);
    // Start the processing timer.
    setProcessingStartTime();
    // Log the search request message.
    logSearchRequest(this);
    setSendResponse(true);
    // Get the plugin config manager that will be used for invoking plugins.
    PluginConfigManager pluginConfigManager =
      DirectoryServer.getPluginConfigManager();
        DirectoryServer.getPluginConfigManager();
    // Start the processing timer.
    setProcessingStartTime();
    int timeLimit = getTimeLimit();
    Long timeLimitExpiration;
    if (timeLimit <= 0)
@@ -1619,69 +1519,36 @@
    {
      // FIXME -- Factor in the user's effective time limit.
      timeLimitExpiration =
        getProcessingStartTime() + (1000L * timeLimit);
          getProcessingStartTime() + (1000L * timeLimit);
    }
    setTimeLimitExpiration(timeLimitExpiration);
    // Check for and handle a request to cancel this operation.
    if (cancelRequest != null)
    try
    {
      indicateCancelled(cancelRequest);
      setProcessingStopTime();
      logSearchResultDone(this);
      return;
    }
      // Check for and handle a request to cancel this operation.
      checkIfCanceled(false);
      PluginResult.PreParse preParseResult =
          pluginConfigManager.invokePreParseSearchPlugins(this);
    // Create a labeled block of code that we can break out of if a problem is
    // detected.
searchProcessing:
    {
      PreParsePluginResult preParseResult =
        pluginConfigManager.invokePreParseSearchPlugins(this);
      if (preParseResult.connectionTerminated())
      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();
        logSearchRequest(this);
        logSearchResultDone(this);
        pluginConfigManager.invokePostResponseSearchPlugins(this);
        setResultCode(preParseResult.getResultCode());
        appendErrorMessage(preParseResult.getErrorMessage());
        setMatchedDN(preParseResult.getMatchedDN());
        setReferralURLs(preParseResult.getReferralURLs());
        return;
      }
      else if (preParseResult.sendResponseImmediately())
      {
        logSearchRequest(this);
        break searchProcessing;
      }
      else if (preParseResult.skipCoreProcessing())
      {
        break searchProcessing;
      }
      // Log the search request message.
      logSearchRequest(this);
      // Check for and handle a request to cancel this operation.
      if (cancelRequest != null)
      {
        break searchProcessing;
      }
      checkIfCanceled(false);
      // Process the search base and filter to convert them from their raw forms
      // as provided by the client to the forms required for the rest of the
      // search processing.
      DN baseDN = getBaseDN();
      if (baseDN == null){
        break searchProcessing;
        return;
      }
@@ -1694,61 +1561,56 @@
        // We have found no workflow for the requested base DN, just return
        // a no such entry result code and stop the processing.
        updateOperationErrMsgAndResCode();
        break searchProcessing;
        return;
      }
      workflow.execute(this);
    }
    catch(CanceledOperationException coe)
    {
      if (debugEnabled())
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, coe);
      }
      setResultCode(ResultCode.CANCELED);
      cancelResult = new CancelResult(ResultCode.CANCELED, null);
    // Check for a terminated connection.
    if (getCancelResult() == CancelResult.CANCELED)
      appendErrorMessage(coe.getCancelRequest().getCancelReason());
    }
    finally
    {
      // Stop the processing timer.
      setProcessingStopTime();
      // Log the add response message.
      logSearchResultDone(this);
      if(cancelRequest == null || cancelResult == null ||
          cancelResult.getResultCode() != ResultCode.CANCELED)
      {
        // If everything is successful to this point and it is not a persistent
        // search, then send the search result done message to the client.
        // Otherwise, we'll want to make the size and time limit values
        // unlimited to ensure that the remainder of the persistent search
        // isn't subject to those restrictions.
        if (isSendResponse())
        {
          sendSearchResultDone();
        }
        else
        {
          setSizeLimit(0);
          setTimeLimit(0);
        }
      }
      else if(cancelRequest.notifyOriginalRequestor() ||
          DirectoryServer.notifyAbandonedOperations())
      {
        sendSearchResultDone();
      }
      return;
    }
    // Check for and handle a request to cancel this operation.
    if (cancelRequest != null)
    {
      indicateCancelled(cancelRequest);
      // Stop the processing timer.
      setProcessingStopTime();
      // Log the search response message.
      logSearchResultDone(this);
      // Invoke the post-response search plugins.
      invokePostResponsePlugins();
      return;
    }
    // Indicate that it is now too late to attempt to cancel the operation.
    setCancelResult(CancelResult.TOO_LATE);
    // Stop the processing timer.
    setProcessingStopTime();
    // If everything is successful to this point and it is not a persistent
    // search, then send the search result done message to the client.
    // Otherwise, we'll want to make the size and time limit values unlimited
    // to ensure that the remainder of the persistent search isn't subject to
    // those restrictions.
    if (isSendResponse())
    {
      sendSearchResultDone();
    }
    else
    {
      setSizeLimit(0);
      setTimeLimit(0);
      // If no cancel result, set it
      if(cancelResult == null)
      {
        cancelResult = new CancelResult(ResultCode.TOO_LATE, null);
      }
    }
  }
opends/src/server/org/opends/server/core/UnbindOperationBasis.java
@@ -25,8 +25,6 @@
 *      Copyright 2006-2008 Sun Microsystems, Inc.
 */
package org.opends.server.core;
import org.opends.messages.Message;
import java.util.ArrayList;
@@ -35,12 +33,7 @@
import org.opends.server.api.ClientConnection;
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.*;
import org.opends.server.types.operation.PostOperationUnbindOperation;
import org.opends.server.types.operation.PreParseUnbindOperation;
@@ -78,6 +71,8 @@
  {
    super(clientConnection, operationID, messageID, requestControls);
    cancelResult = new CancelResult(ResultCode.CANNOT_CANCEL,
        ERR_CANNOT_CANCEL_UNBIND.get());
  }
@@ -100,19 +95,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
@@ -186,7 +168,6 @@
    // Get the plugin config manager that will be used for invoking plugins.
    PluginConfigManager pluginConfigManager =
         DirectoryServer.getPluginConfigManager();
    boolean skipPostOperation = false;
    setProcessingStartTime();
@@ -221,41 +202,6 @@
   * {@inheritDoc}
   */
  @Override()
  public final CancelResult cancel(CancelRequest cancelRequest)
  {
    cancelRequest.addResponseMessage(ERR_CANNOT_CANCEL_UNBIND.get());
    return CancelResult.CANNOT_CANCEL;
  }
  /**
   * {@inheritDoc}
   */
  @Override()
  public final CancelRequest getCancelRequest()
  {
    return null;
  }
  /**
   * {@inheritDoc}
   */
  @Override()
  public boolean setCancelRequest(CancelRequest cancelRequest)
  {
    // Unbind operations cannot be canceled.
    return false;
  }
  /**
   * {@inheritDoc}
   */
  @Override()
  public final void toString(StringBuilder buffer)
  {
    buffer.append("UnbindOperation(connID=");
opends/src/server/org/opends/server/core/Workflow.java
@@ -29,6 +29,7 @@
import org.opends.server.types.DN;
import org.opends.server.types.Operation;
import org.opends.server.types.CanceledOperationException;
/**
@@ -68,6 +69,10 @@
   * operation.
   *
   * @param operation  the operation to execute
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public void execute(Operation operation);
  public void execute(Operation operation)
      throws CanceledOperationException;
}
opends/src/server/org/opends/server/core/WorkflowImpl.java
@@ -33,10 +33,7 @@
import java.util.Collection;
import java.util.TreeMap;
import org.opends.server.types.DN;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.Operation;
import org.opends.server.types.ResultCode;
import org.opends.server.types.*;
import org.opends.server.workflowelement.WorkflowElement;
@@ -159,11 +156,11 @@
   * operation.
   *
   * @param operation  the operation to execute
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public void execute(
      Operation operation
      )
  {
  public void execute(Operation operation) throws CanceledOperationException {
    rootWorkflowElement.execute(operation);
  }
opends/src/server/org/opends/server/core/WorkflowTopologyNode.java
@@ -29,10 +29,7 @@
import java.util.ArrayList;
import org.opends.server.types.DN;
import org.opends.server.types.Operation;
import org.opends.server.types.OperationType;
import org.opends.server.types.SearchScope;
import org.opends.server.types.*;
import org.opends.server.workflowelement.WorkflowElement;
@@ -93,11 +90,12 @@
   * workflow node base DN.
   *
   * @param operation the operation to execute
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public void execute(
      Operation operation
      )
  {
  public void execute(Operation operation)
      throws CanceledOperationException {
    // Execute the operation
    getWorkflowImpl().execute(operation);
@@ -114,11 +112,12 @@
   * Executes a search operation on the subordinate workflows.
   *
   * @param searchOp the search operation to execute
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  private void executeSearchOnSubordinates(
      SearchOperation searchOp
      )
  {
  private void executeSearchOnSubordinates(SearchOperation searchOp)
      throws CanceledOperationException {
    // If the scope of the search is 'base' then it's useless to search
    // in the subordinate workflows.
    SearchScope originalScope = searchOp.getScope();
opends/src/server/org/opends/server/extensions/CRAMMD5SASLMechanismHandler.java
@@ -443,7 +443,7 @@
    try
    {
      PasswordPolicyState pwPolicyState =
           new PasswordPolicyState(userEntry, false, false);
           new PasswordPolicyState(userEntry, false);
      clearPasswords = pwPolicyState.getClearPasswords();
      if ((clearPasswords == null) || clearPasswords.isEmpty())
      {
opends/src/server/org/opends/server/extensions/CancelExtendedOperation.java
@@ -29,7 +29,6 @@
import org.opends.messages.Message;
import org.opends.messages.MessageBuilder;
import org.opends.server.admin.std.server.CancelExtendedOperationHandlerCfg;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.ExtendedOperationHandler;
@@ -171,9 +170,7 @@
    // Create the cancel request for the target operation.
    Message cancelReason =
        INFO_EXTOP_CANCEL_REASON.get(operation.getMessageID());
    MessageBuilder cancelResultMessage = new MessageBuilder();
    CancelRequest cancelRequest = new CancelRequest(true, cancelReason,
                                                    cancelResultMessage);
    CancelRequest cancelRequest = new CancelRequest(true, cancelReason);
    // Get the client connection and attempt the cancel.
@@ -184,7 +181,7 @@
    // Update the result of the extended operation and return.
    operation.setResultCode(cancelResult.getResultCode());
    operation.setErrorMessage(cancelResultMessage);
    operation.appendErrorMessage(cancelResult.getResponseMessage());
  }
}
opends/src/server/org/opends/server/extensions/DigestMD5SASLMechanismHandler.java
@@ -1020,7 +1020,7 @@
    try
    {
      PasswordPolicyState pwPolicyState =
           new PasswordPolicyState(userEntry, false, false);
           new PasswordPolicyState(userEntry, false);
      clearPasswords = pwPolicyState.getClearPasswords();
      if ((clearPasswords == null) || clearPasswords.isEmpty())
      {
opends/src/server/org/opends/server/extensions/PasswordModifyExtendedOperation.java
@@ -486,7 +486,7 @@
      PasswordPolicyState pwPolicyState;
      try
      {
        pwPolicyState = new PasswordPolicyState(userEntry, false, false);
        pwPolicyState = new PasswordPolicyState(userEntry, false);
      }
      catch (DirectoryException de)
      {
opends/src/server/org/opends/server/extensions/PasswordPolicyStateExtendedOperation.java
@@ -645,7 +645,7 @@
    PasswordPolicy      policy;
    try
    {
      pwpState = new PasswordPolicyState(userEntry, false, false);
      pwpState = new PasswordPolicyState(userEntry, false);
      policy   = pwpState.getPolicy();
    }
    catch (DirectoryException de)
opends/src/server/org/opends/server/extensions/PlainSASLMechanismHandler.java
@@ -510,7 +510,7 @@
    try
    {
      PasswordPolicyState pwPolicyState =
           new PasswordPolicyState(userEntry, false, false);
           new PasswordPolicyState(userEntry, false);
      if (! pwPolicyState.passwordMatches(new ASN1OctetString(password)))
      {
        bindOperation.setResultCode(ResultCode.INVALID_CREDENTIALS);
opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java
@@ -46,7 +46,6 @@
import org.opends.server.monitors.TraditionalWorkQueueMonitor;
import org.opends.server.types.AbstractOperation;
import org.opends.server.types.CancelRequest;
import org.opends.server.types.CancelResult;
import org.opends.server.types.ConfigChangeResult;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DirectoryException;
@@ -231,8 +230,7 @@
        // The operation has no chance of responding to the cancel
        // request so avoid waiting for a cancel response.
        if (o.getCancelResult() == null) {
          o.setCancelResult(CancelResult.CANCELED);
          o.cancel(cancelRequest);
          o.abort(cancelRequest);
        }
      }
      catch (Exception e)
opends/src/server/org/opends/server/extensions/TraditionalWorkerThread.java
@@ -35,7 +35,6 @@
import org.opends.server.core.DirectoryServer;
import org.opends.server.types.AbstractOperation;
import org.opends.server.types.CancelRequest;
import org.opends.server.types.CancelResult;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DisconnectReason;
@@ -159,19 +158,9 @@
        else
        {
          // The operation is not null, so process it.  Make sure that when
          // processing is complete the cancel status is properly set.
          try
          {
            operation.run();
            operation.operationCompleted();
          }
          finally
          {
            if (operation.getCancelResult() == null)
            {
              operation.setCancelResult(CancelResult.TOO_LATE);
            }
          }
          // processing is complete.
          operation.run();
          operation.operationCompleted();
        }
      }
      catch (Throwable t)
opends/src/server/org/opends/server/plugins/EntryUUIDPlugin.java
@@ -41,10 +41,7 @@
import org.opends.server.admin.std.meta.PluginCfgDefn;
import org.opends.server.admin.std.server.EntryUUIDPluginCfg;
import org.opends.server.admin.std.server.PluginCfg;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.LDIFPluginResult;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.*;
import org.opends.server.config.ConfigException;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeType;
@@ -172,15 +169,15 @@
   * {@inheritDoc}
   */
  @Override()
  public final LDIFPluginResult doLDIFImport(LDIFImportConfig importConfig,
                                             Entry entry)
  public final PluginResult.ImportLDIF
               doLDIFImport(LDIFImportConfig importConfig, Entry entry)
  {
    // See if the entry being imported already contains an entryUUID attribute.
    // If so, then leave it alone.
    List<Attribute> uuidList = entry.getAttribute(entryUUIDType);
    if (uuidList != null)
    {
      return LDIFPluginResult.SUCCESS;
      return PluginResult.ImportLDIF.continueEntryProcessing();
    }
@@ -201,7 +198,7 @@
    // We shouldn't ever need to return a non-success result.
    return LDIFPluginResult.SUCCESS;
    return PluginResult.ImportLDIF.continueEntryProcessing();
  }
@@ -210,8 +207,8 @@
   * {@inheritDoc}
   */
  @Override()
  public final PreOperationPluginResult
       doPreOperation(PreOperationAddOperation addOperation)
  public final PluginResult.PreOperation
               doPreOperation(PreOperationAddOperation addOperation)
  {
    // See if the entry being added already contains an entryUUID attribute.
    // It shouldn't, since it's NO-USER-MODIFICATION, but if it does then leave
@@ -221,7 +218,7 @@
    List<Attribute> uuidList = operationalAttributes.get(entryUUIDType);
    if (uuidList != null)
    {
      return PreOperationPluginResult.SUCCESS;
      return PluginResult.PreOperation.continueOperationProcessing();
    }
@@ -239,7 +236,7 @@
    // Add the attribute to the entry and return.
    addOperation.setAttribute(entryUUIDType, uuidList);
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
opends/src/server/org/opends/server/plugins/LDAPADListPlugin.java
@@ -38,7 +38,7 @@
import org.opends.server.admin.std.server.PluginCfg;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.PreParsePluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.config.ConfigException;
import org.opends.server.types.AttributeType;
import org.opends.server.types.ConfigChangeResult;
@@ -145,8 +145,8 @@
   * {@inheritDoc}
   */
  @Override()
  public final PreParsePluginResult
       doPreParse(PreParseSearchOperation searchOperation)
  public final PluginResult.PreParse
               doPreParse(PreParseSearchOperation searchOperation)
  {
    // Iterate through the requested attributes to see if any of them start with
    // an "@" symbol.  If not, then we don't need to do anything.  If so, then
@@ -207,7 +207,7 @@
    }
    return PreParsePluginResult.SUCCESS;
    return PluginResult.PreParse.continueOperationProcessing();
  }
opends/src/server/org/opends/server/plugins/LastModPlugin.java
@@ -40,7 +40,7 @@
import org.opends.server.admin.std.server.PluginCfg;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.config.ConfigException;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.Attribute;
@@ -172,8 +172,8 @@
   * {@inheritDoc}
   */
  @Override()
  public final PreOperationPluginResult
       doPreOperation(PreOperationAddOperation addOperation)
  public final PluginResult.PreOperation
               doPreOperation(PreOperationAddOperation addOperation)
  {
    // Create the attribute list for the creatorsName attribute, if appropriate.
    DN creatorDN = addOperation.getAuthorizationDN();
@@ -212,7 +212,7 @@
    // We shouldn't ever need to return a non-success result.
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -221,7 +221,7 @@
   * {@inheritDoc}
   */
  @Override()
  public final PreOperationPluginResult
  public final PluginResult.PreOperation
       doPreOperation(PreOperationModifyOperation modifyOperation)
  {
    // Create the modifiersName attribute.
@@ -255,9 +255,8 @@
      }
      // This should never happen.
      modifyOperation.setResultCode(DirectoryConfig.getServerErrorResultCode());
      modifyOperation.appendErrorMessage(de.getMessageObject());
      return new PreOperationPluginResult(false, false, true);
      return PluginResult.PreOperation.stopProcessing(
          DirectoryConfig.getServerErrorResultCode(), de.getMessageObject());
    }
@@ -282,14 +281,13 @@
      }
      // This should never happen.
      modifyOperation.setResultCode(DirectoryConfig.getServerErrorResultCode());
      modifyOperation.appendErrorMessage(de.getMessageObject());
      return new PreOperationPluginResult(false, false, true);
      return PluginResult.PreOperation.stopProcessing(
          DirectoryConfig.getServerErrorResultCode(), de.getMessageObject());
    }
    // We shouldn't ever need to return a non-success result.
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -298,7 +296,7 @@
   * {@inheritDoc}
   */
  @Override()
  public final PreOperationPluginResult
  public final PluginResult.PreOperation
       doPreOperation(PreOperationModifyDNOperation modifyDNOperation)
  {
    // Create the modifiersName attribute.
@@ -336,7 +334,7 @@
    // We shouldn't ever need to return a non-success result.
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
opends/src/server/org/opends/server/plugins/PasswordPolicyImportPlugin.java
@@ -46,8 +46,8 @@
import org.opends.server.api.ImportTaskListener;
import org.opends.server.api.PasswordStorageScheme;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.LDIFPluginResult;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.config.ConfigException;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.PasswordPolicy;
@@ -335,8 +335,8 @@
   * {@inheritDoc}
   */
  @Override()
  public final LDIFPluginResult doLDIFImport(LDIFImportConfig importConfig,
                                             Entry entry)
  public final PluginResult.ImportLDIF
               doLDIFImport(LDIFImportConfig importConfig, Entry entry)
  {
    // Create a list that we will use to hold new encoded values.
    ArrayList<ByteString> encodedValueList = new ArrayList<ByteString>();
@@ -384,7 +384,7 @@
          attrList = entry.getAttribute(policy.getPasswordAttribute());
          if (attrList == null)
          {
            return LDIFPluginResult.SUCCESS;
            return PluginResult.ImportLDIF.continueEntryProcessing();
          }
          for (Attribute a : attrList)
@@ -470,7 +470,7 @@
            }
          }
          return LDIFPluginResult.SUCCESS;
          return PluginResult.ImportLDIF.continueEntryProcessing();
        }
      }
    }
@@ -592,7 +592,7 @@
    }
    return LDIFPluginResult.SUCCESS;
    return PluginResult.ImportLDIF.continueEntryProcessing();
  }
opends/src/server/org/opends/server/plugins/ReferentialIntegrityPlugin.java
@@ -51,10 +51,7 @@
import org.opends.server.api.Backend;
import org.opends.server.api.DirectoryThread;
import org.opends.server.api.ServerShutdownListener;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.PostOperationPluginResult;
import org.opends.server.api.plugin.SubordinateModifyDNPluginResult;
import org.opends.server.api.plugin.*;
import org.opends.server.config.ConfigException;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.ModifyOperation;
@@ -377,7 +374,7 @@
   * {@inheritDoc}
   */
  @SuppressWarnings("unchecked")
  public PostOperationPluginResult
  public PluginResult.PostOperation
         doPostOperation(PostOperationModifyDNOperation
          modifyDNOperation)
  {
@@ -385,7 +382,7 @@
    // nothing changed.
    if (modifyDNOperation.getResultCode() != ResultCode.SUCCESS)
    {
      return PostOperationPluginResult.SUCCESS;
      return PluginResult.PostOperation.continueOperationProcessing();
    }
    if (modifyDNOperation.getNewSuperior() == null)
@@ -406,7 +403,7 @@
      processModifyDN(modDNmap, (interval != 0));
    }
    return PostOperationPluginResult.SUCCESS;
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -414,25 +411,25 @@
  /**
   * {@inheritDoc}
   */
  public PostOperationPluginResult doPostOperation(
  public PluginResult.PostOperation doPostOperation(
              PostOperationDeleteOperation deleteOperation)
  {
    // If the operation itself failed, then we don't need to do anything because
    // nothing changed.
    if (deleteOperation.getResultCode() != ResultCode.SUCCESS)
    {
      return PostOperationPluginResult.SUCCESS;
      return PluginResult.PostOperation.continueOperationProcessing();
    }
    processDelete(deleteOperation.getEntryDN(), (interval != 0));
    return  PostOperationPluginResult.SUCCESS;
    return PluginResult.PostOperation.continueOperationProcessing();
  }
  /**
   * {@inheritDoc}
   */
  @SuppressWarnings("unchecked")
  public SubordinateModifyDNPluginResult processSubordinateModifyDN(
  public PluginResult.SubordinateModifyDN processSubordinateModifyDN(
          SubordinateModifyDNOperation modifyDNOperation, Entry oldEntry,
          Entry newEntry, List<Modification> modifications)
  {
@@ -448,7 +445,7 @@
      modifyDNOperation.setAttachment(MODIFYDN_DNS, modDNmap);
    }
    modDNmap.put(oldEntry.getDN(), newEntry.getDN());
    return SubordinateModifyDNPluginResult.SUCCESS;
    return PluginResult.SubordinateModifyDN.continueOperationProcessing();
  }
opends/src/server/org/opends/server/plugins/SevenBitCleanPlugin.java
@@ -36,10 +36,7 @@
import org.opends.server.admin.std.meta.PluginCfgDefn;
import org.opends.server.admin.std.server.SevenBitCleanPluginCfg;
import org.opends.server.admin.std.server.PluginCfg;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.LDIFPluginResult;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.PreParsePluginResult;
import org.opends.server.api.plugin.*;
import org.opends.server.config.ConfigException;
import org.opends.server.core.DirectoryServer;
import org.opends.server.types.Attribute;
@@ -81,15 +78,6 @@
  /**
   * The result that should be returned if a pre-parse operation fails the 7-bit
   * clean check.
   */
  private static final PreParsePluginResult PRE_PARSE_FAILURE_RESULT =
       new PreParsePluginResult(false, false, false, true);
  // The current configuration for this plugin.
  private SevenBitCleanPluginCfg currentConfig;
@@ -157,8 +145,8 @@
   * {@inheritDoc}
   */
  @Override()
  public final LDIFPluginResult doLDIFImport(LDIFImportConfig importConfig,
                                             Entry entry)
  public final PluginResult.ImportLDIF
               doLDIFImport(LDIFImportConfig importConfig, Entry entry)
  {
    // Get the current configuration for this plugin.
    SevenBitCleanPluginCfg config = currentConfig;
@@ -184,7 +172,7 @@
      if (! found)
      {
        // The entry is out of scope, so we won't process it.
        return LDIFPluginResult.SUCCESS;
        return PluginResult.ImportLDIF.continueEntryProcessing();
      }
    }
@@ -204,7 +192,7 @@
              Message rejectMessage =
                   ERR_PLUGIN_7BIT_IMPORT_ATTR_NOT_CLEAN.get(
                        a.getNameWithOptions());
              return new LDIFPluginResult(false, false, rejectMessage);
              return PluginResult.ImportLDIF.stopEntryProcessing(rejectMessage);
            }
          }
        }
@@ -213,7 +201,7 @@
    // If we've gotten here, then everything is acceptable.
    return LDIFPluginResult.SUCCESS;
    return PluginResult.ImportLDIF.continueEntryProcessing();
  }
@@ -222,8 +210,8 @@
   * {@inheritDoc}
   */
  @Override()
  public final PreParsePluginResult
                    doPreParse(PreParseAddOperation addOperation)
  public final PluginResult.PreParse
               doPreParse(PreParseAddOperation addOperation)
  {
    // Get the current configuration for this plugin.
    SevenBitCleanPluginCfg config = currentConfig;
@@ -238,9 +226,8 @@
    }
    catch (DirectoryException de)
    {
      addOperation.appendErrorMessage(
           ERR_PLUGIN_7BIT_CANNOT_DECODE_DN.get(de.getMessageObject()));
      return PRE_PARSE_FAILURE_RESULT;
      return PluginResult.PreParse.stopProcessing(de.getResultCode(),
          ERR_PLUGIN_7BIT_CANNOT_DECODE_DN.get(de.getMessageObject()));
    }
    if (isInScope(config, entryDN))
@@ -254,9 +241,10 @@
        }
        catch (LDAPException le)
        {
          addOperation.appendErrorMessage(
               ERR_PLUGIN_7BIT_CANNOT_DECODE_DN.get(le.getMessageObject()));
          return PRE_PARSE_FAILURE_RESULT;
          return PluginResult.PreParse.stopProcessing(
              ResultCode.valueOf(le.getResultCode()),
              ERR_PLUGIN_7BIT_CANNOT_DECODE_ATTR.get(
                  rawAttr.getAttributeType(), le.getErrorMessage()));
        }
        if (! config.getAttributeType().contains(a.getAttributeType()))
@@ -268,10 +256,10 @@
        {
          if (! is7BitClean(v.getValue()))
          {
            addOperation.appendErrorMessage(
                 ERR_PLUGIN_7BIT_ADD_ATTR_NOT_CLEAN.get(
                      rawAttr.getAttributeType()));
            return PRE_PARSE_FAILURE_RESULT;
            return PluginResult.PreParse.stopProcessing(
                ResultCode.CONSTRAINT_VIOLATION,
                ERR_PLUGIN_7BIT_MODIFYDN_ATTR_NOT_CLEAN.get(
                    rawAttr.getAttributeType()));
          }
        }
      }
@@ -279,7 +267,7 @@
    // If we've gotten here, then everything is acceptable.
    return PreParsePluginResult.SUCCESS;
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -288,7 +276,7 @@
   * {@inheritDoc}
   */
  @Override()
  public final PreParsePluginResult
  public final PluginResult.PreParse
                    doPreParse(PreParseModifyOperation modifyOperation)
  {
    // Get the current configuration for this plugin.
@@ -304,9 +292,8 @@
    }
    catch (DirectoryException de)
    {
      modifyOperation.appendErrorMessage(
           ERR_PLUGIN_7BIT_CANNOT_DECODE_DN.get(de.getMessageObject()));
      return PRE_PARSE_FAILURE_RESULT;
      return PluginResult.PreParse.stopProcessing(de.getResultCode(),
          ERR_PLUGIN_7BIT_CANNOT_DECODE_DN.get(de.getMessageObject()));
    }
    if (isInScope(config, entryDN))
@@ -332,9 +319,10 @@
        }
        catch (LDAPException le)
        {
          modifyOperation.appendErrorMessage(
               ERR_PLUGIN_7BIT_CANNOT_DECODE_DN.get(le.getMessageObject()));
          return PRE_PARSE_FAILURE_RESULT;
          return PluginResult.PreParse.stopProcessing(
              ResultCode.valueOf(le.getResultCode()),
              ERR_PLUGIN_7BIT_CANNOT_DECODE_ATTR.get(
                  rawAttr.getAttributeType(), le.getErrorMessage()));
        }
        if (! config.getAttributeType().contains(a.getAttributeType()))
@@ -346,10 +334,10 @@
        {
          if (! is7BitClean(v.getValue()))
          {
            modifyOperation.appendErrorMessage(
                 ERR_PLUGIN_7BIT_MODIFY_ATTR_NOT_CLEAN.get(
                      rawAttr.getAttributeType()));
            return PRE_PARSE_FAILURE_RESULT;
            return PluginResult.PreParse.stopProcessing(
                ResultCode.CONSTRAINT_VIOLATION,
                ERR_PLUGIN_7BIT_MODIFYDN_ATTR_NOT_CLEAN.get(
                    rawAttr.getAttributeType()));
          }
        }
      }
@@ -357,7 +345,7 @@
    // If we've gotten here, then everything is acceptable.
    return PreParsePluginResult.SUCCESS;
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -366,7 +354,7 @@
   * {@inheritDoc}
   */
  @Override()
  public final PreParsePluginResult
  public final PluginResult.PreParse
                    doPreParse(PreParseModifyDNOperation modifyDNOperation)
  {
    // Get the current configuration for this plugin.
@@ -382,9 +370,8 @@
    }
    catch (DirectoryException de)
    {
      modifyDNOperation.appendErrorMessage(
           ERR_PLUGIN_7BIT_CANNOT_DECODE_DN.get(de.getMessageObject()));
      return PRE_PARSE_FAILURE_RESULT;
      return PluginResult.PreParse.stopProcessing(de.getResultCode(),
          ERR_PLUGIN_7BIT_CANNOT_DECODE_DN.get(de.getMessageObject()));
    }
    if (isInScope(config, entryDN))
@@ -398,9 +385,8 @@
      }
      catch (DirectoryException de)
      {
        modifyDNOperation.appendErrorMessage(
             ERR_PLUGIN_7BIT_CANNOT_DECODE_NEW_RDN.get(de.getMessageObject()));
        return PRE_PARSE_FAILURE_RESULT;
        return PluginResult.PreParse.stopProcessing(de.getResultCode(),
            ERR_PLUGIN_7BIT_CANNOT_DECODE_NEW_RDN.get(de.getMessageObject()));
      }
      int numValues = newRDN.getNumValues();
@@ -413,17 +399,17 @@
        if (! is7BitClean(newRDN.getAttributeValue(i).getValue()))
        {
          modifyDNOperation.appendErrorMessage(
               ERR_PLUGIN_7BIT_MODIFYDN_ATTR_NOT_CLEAN.get(
                    newRDN.getAttributeName(i)));
          return PRE_PARSE_FAILURE_RESULT;
          return PluginResult.PreParse.stopProcessing(
              ResultCode.CONSTRAINT_VIOLATION,
              ERR_PLUGIN_7BIT_MODIFYDN_ATTR_NOT_CLEAN.get(
                  newRDN.getAttributeName(i)));
        }
      }
    }
    // If we've gotten here, then everything is acceptable.
    return PreParsePluginResult.SUCCESS;
    return PluginResult.PreParse.continueOperationProcessing();
  }
opends/src/server/org/opends/server/plugins/UniqueAttributePlugin.java
@@ -43,7 +43,7 @@
import org.opends.server.api.Backend;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.config.ConfigException;
import org.opends.server.core.DirectoryServer;
import org.opends.server.loggers.debug.DebugTracer;
@@ -101,15 +101,6 @@
  /**
   * The pre-operation plugin result that should be returned if an operation
   * would have resulted in a unique attribute conflict.
   */
  private static final PreOperationPluginResult FAILED_PREOP_RESULT =
       new PreOperationPluginResult(false, false, false, true);
  /**
   * The set of attributes that will be requested when performing internal
   * search operations.  This indicates that no attributes should be returned.
   */
@@ -200,7 +191,7 @@
   * {@inheritDoc}
   */
  @Override()
  public final PreOperationPluginResult
  public final PluginResult.PreOperation
               doPreOperation(PreOperationAddOperation addOperation)
  {
    UniqueAttributePluginCfg config = currentConfiguration;
@@ -210,7 +201,7 @@
    if (baseDNs == null)
    {
      // The entry is outside the scope of this plugin.
      return PreOperationPluginResult.SUCCESS;
      return PluginResult.PreOperation.continueOperationProcessing();
    }
    for (AttributeType t : config.getType())
@@ -228,11 +219,11 @@
                                                    config, v);
              if (conflictDN != null)
              {
                addOperation.appendErrorMessage(
                     ERR_PLUGIN_UNIQUEATTR_ATTR_NOT_UNIQUE.get(t.getNameOrOID(),
                          v.getStringValue(), conflictDN.toString()));
                addOperation.setResultCode(ResultCode.CONSTRAINT_VIOLATION);
                return FAILED_PREOP_RESULT;
                Message msg = ERR_PLUGIN_UNIQUEATTR_ATTR_NOT_UNIQUE.get(
                    t.getNameOrOID(), v.getStringValue(),
                    conflictDN.toString());
                return PluginResult.PreOperation.stopProcessing(
                    ResultCode.CONSTRAINT_VIOLATION, msg);
              }
            }
            catch (DirectoryException de)
@@ -246,17 +237,15 @@
                               de.getResultCode().toString(),
                               de.getMessageObject());
              addOperation.setResultCode(
                   DirectoryServer.getServerErrorResultCode());
              addOperation.appendErrorMessage(m);
              return FAILED_PREOP_RESULT;
              return PluginResult.PreOperation.stopProcessing(
                    DirectoryServer.getServerErrorResultCode(), m);
            }
          }
        }
      }
    }
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -265,7 +254,7 @@
   * {@inheritDoc}
   */
  @Override()
  public final PreOperationPluginResult
  public final PluginResult.PreOperation
               doPreOperation(PreOperationModifyOperation modifyOperation)
  {
    UniqueAttributePluginCfg config = currentConfiguration;
@@ -275,7 +264,7 @@
    if (baseDNs == null)
    {
      // The entry is outside the scope of this plugin.
      return PreOperationPluginResult.SUCCESS;
      return PluginResult.PreOperation.continueOperationProcessing();
    }
    for (Modification m : modifyOperation.getModifications())
@@ -300,11 +289,11 @@
                                                    v);
              if (conflictDN != null)
              {
                modifyOperation.appendErrorMessage(
                     ERR_PLUGIN_UNIQUEATTR_ATTR_NOT_UNIQUE.get(t.getNameOrOID(),
                          v.getStringValue(), conflictDN.toString()));
                modifyOperation.setResultCode(ResultCode.CONSTRAINT_VIOLATION);
                return FAILED_PREOP_RESULT;
                Message msg = ERR_PLUGIN_UNIQUEATTR_ATTR_NOT_UNIQUE.get(
                    t.getNameOrOID(), v.getStringValue(),
                    conflictDN.toString());
                return PluginResult.PreOperation.stopProcessing(
                    ResultCode.CONSTRAINT_VIOLATION, msg);
              }
            }
            catch (DirectoryException de)
@@ -318,10 +307,8 @@
                                     de.getResultCode().toString(),
                                     de.getMessageObject());
              modifyOperation.setResultCode(
                   DirectoryServer.getServerErrorResultCode());
              modifyOperation.appendErrorMessage(message);
              return FAILED_PREOP_RESULT;
              return PluginResult.PreOperation.stopProcessing(
                    DirectoryServer.getServerErrorResultCode(), message);
            }
          }
          break;
@@ -349,13 +336,11 @@
                                                        config, v);
                  if (conflictDN != null)
                  {
                    modifyOperation.appendErrorMessage(
                         ERR_PLUGIN_UNIQUEATTR_ATTR_NOT_UNIQUE.get(
                              t.getNameOrOID(), v.getStringValue(),
                              conflictDN.toString()));
                    modifyOperation.setResultCode(
                         ResultCode.CONSTRAINT_VIOLATION);
                    return FAILED_PREOP_RESULT;
                    Message msg = ERR_PLUGIN_UNIQUEATTR_ATTR_NOT_UNIQUE.get(
                        t.getNameOrOID(), v.getStringValue(),
                        conflictDN.toString());
                    return PluginResult.PreOperation.stopProcessing(
                        ResultCode.CONSTRAINT_VIOLATION, msg);
                  }
                }
                catch (DirectoryException de)
@@ -369,10 +354,8 @@
                                         de.getResultCode().toString(),
                                         de.getMessageObject());
                  modifyOperation.setResultCode(
                       DirectoryServer.getServerErrorResultCode());
                  modifyOperation.appendErrorMessage(message);
                  return FAILED_PREOP_RESULT;
                  return PluginResult.PreOperation.stopProcessing(
                      DirectoryServer.getServerErrorResultCode(), message);
                }
              }
            }
@@ -386,7 +369,7 @@
      }
    }
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -395,7 +378,7 @@
   * {@inheritDoc}
   */
  @Override()
  public final PreOperationPluginResult doPreOperation(
  public final PluginResult.PreOperation doPreOperation(
                    PreOperationModifyDNOperation modifyDNOperation)
  {
    UniqueAttributePluginCfg config = currentConfiguration;
@@ -405,7 +388,7 @@
    if (baseDNs == null)
    {
      // The entry is outside the scope of this plugin.
      return PreOperationPluginResult.SUCCESS;
      return PluginResult.PreOperation.continueOperationProcessing();
    }
    RDN newRDN = modifyDNOperation.getNewRDN();
@@ -422,14 +405,14 @@
      {
        AttributeValue v = newRDN.getAttributeValue(i);
        DN conflictDN = getConflictingEntryDN(baseDNs,
                             modifyDNOperation.getEntryDN(), config, v);
            modifyDNOperation.getEntryDN(), config, v);
        if (conflictDN != null)
        {
          modifyDNOperation.appendErrorMessage(
               ERR_PLUGIN_UNIQUEATTR_ATTR_NOT_UNIQUE.get(t.getNameOrOID(),
                    v.getStringValue(), conflictDN.toString()));
          modifyDNOperation.setResultCode(ResultCode.CONSTRAINT_VIOLATION);
          return FAILED_PREOP_RESULT;
          Message msg = ERR_PLUGIN_UNIQUEATTR_ATTR_NOT_UNIQUE.get(
              t.getNameOrOID(), v.getStringValue(),
              conflictDN.toString());
          return PluginResult.PreOperation.stopProcessing(
              ResultCode.CONSTRAINT_VIOLATION, msg);
        }
      }
      catch (DirectoryException de)
@@ -443,14 +426,12 @@
                         de.getResultCode().toString(),
                         de.getMessageObject());
        modifyDNOperation.setResultCode(
             DirectoryServer.getServerErrorResultCode());
        modifyDNOperation.appendErrorMessage(m);
        return FAILED_PREOP_RESULT;
        return PluginResult.PreOperation.stopProcessing(
            DirectoryServer.getServerErrorResultCode(), m);
      }
    }
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
opends/src/server/org/opends/server/plugins/profiler/ProfilerPlugin.java
@@ -40,7 +40,7 @@
import org.opends.server.admin.std.server.ProfilerPluginCfg;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.StartupPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.config.ConfigException;
import org.opends.server.types.ConfigChangeResult;
import org.opends.server.types.DirectoryConfig;
@@ -223,7 +223,7 @@
   * {@inheritDoc}
   */
  @Override()
  public final StartupPluginResult doStartup()
  public final PluginResult.Startup doStartup()
  {
    ProfilerPluginCfg config = currentConfig;
@@ -234,7 +234,7 @@
      profilerThread.start();
    }
    return StartupPluginResult.SUCCESS;
    return PluginResult.Startup.continueStartup();
  }
opends/src/server/org/opends/server/protocols/internal/InternalClientConnection.java
@@ -2964,7 +2964,9 @@
                                      CancelRequest cancelRequest)
  {
    // Internal operations cannot be cancelled.
    return CancelResult.CANNOT_CANCEL;
    // TODO: i18n
    return new CancelResult(ResultCode.CANNOT_CANCEL,
        Message.raw("Internal operations cannot be cancelled"));
  }
opends/src/server/org/opends/server/protocols/jmx/JmxClientConnection.java
@@ -1158,7 +1158,9 @@
                                      CancelRequest cancelRequest)
  {
    // Jmx operations cannot be cancelled.
    return CancelResult.CANNOT_CANCEL;
    // TODO: i18n
    return new CancelResult(ResultCode.CANNOT_CANCEL,
        Message.raw("Jmx operations cannot be cancelled"));
  }
opends/src/server/org/opends/server/protocols/jmx/RmiAuthenticator.java
@@ -32,7 +32,7 @@
import javax.management.remote.JMXAuthenticator;
import javax.security.auth.Subject;
import org.opends.server.api.plugin.PostConnectPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.core.BindOperationBasis;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.PluginConfigManager;
@@ -199,11 +199,22 @@
    // invoke the post-connect plugins.
    PluginConfigManager pluginManager = DirectoryServer
        .getPluginConfigManager();
    PostConnectPluginResult pluginResult = pluginManager
    PluginResult.PostConnect pluginResult = pluginManager
        .invokePostConnectPlugins(jmxClientConnection);
    if (pluginResult.connectionTerminated())
    if (!pluginResult.continueProcessing())
    {
      SecurityException se = new SecurityException(pluginResult.toString());
      jmxClientConnection.disconnect(pluginResult.getDisconnectReason(),
          pluginResult.sendDisconnectNotification(),
          pluginResult.getErrorMessage());
      if (debugEnabled())
      {
        TRACER.debugVerbose("Disconnect result from post connect plugins: " +
            "%s: %s ", pluginResult.getDisconnectReason(),
            pluginResult.getErrorMessage());
      }
      SecurityException se = new SecurityException();
      throw se;
    }
opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
@@ -975,8 +975,11 @@
    // Indicate that this connection is no longer valid.
    connectionValid = false;
    cancelAllOperations(new CancelRequest(true, message));
    MessageBuilder msgBuilder = new MessageBuilder();
    msgBuilder.append(disconnectReason.getClosureMessage());
    msgBuilder.append(": ");
    msgBuilder.append(message);
    cancelAllOperations(new CancelRequest(true, msgBuilder.toMessage()));
    finalizeConnectionInternal();
@@ -1271,7 +1274,8 @@
          CancelResult cancelResult =
               ps.getSearchOperation().cancel(cancelRequest);
          if (keepStats && (cancelResult == CancelResult.CANCELED))
          if (keepStats && (cancelResult.getResultCode() ==
              ResultCode.CANCELED))
          {
            statTracker.updateAbandonedOperation();
          }
@@ -1280,12 +1284,12 @@
        }
      }
      return CancelResult.NO_SUCH_OPERATION;
      return new CancelResult(ResultCode.NO_SUCH_OPERATION, null);
    }
    else
    {
      CancelResult cancelResult = op.cancel(cancelRequest);
      if (keepStats && (cancelResult == CancelResult.CANCELED))
      if (keepStats && (cancelResult.getResultCode() == ResultCode.CANCELED))
      {
        statTracker.updateAbandonedOperation();
      }
@@ -1313,16 +1317,10 @@
        {
          try
          {
            CancelResult cancelResult = o.getCancelResult();
            if (cancelResult == null) {
              // Before calling cancelling the operation, we need to
              // mark this operation as cancelled so that the attempt to
              // cancel it later won't cause an unnecessary delay.
              o.setCancelResult(CancelResult.CANCELED);
              cancelResult = o.cancel(cancelRequest);
            }
              o.abort(cancelRequest);
            if (keepStats && (cancelResult == CancelResult.CANCELED))
            // TODO: Assume its cancelled?
            if (keepStats)
            {
              statTracker.updateAbandonedOperation();
            }
@@ -1391,8 +1389,10 @@
          {
            try
            {
              CancelResult cancelResult = o.cancel(cancelRequest);
              if (keepStats && (cancelResult == CancelResult.CANCELED))
              o.abort(cancelRequest);
              // TODO: Assume its cancelled?
              if (keepStats)
              {
                statTracker.updateAbandonedOperation();
              }
opends/src/server/org/opends/server/protocols/ldap/LDAPConnectionHandler.java
@@ -61,7 +61,7 @@
import org.opends.server.api.ConnectionHandler;
import org.opends.server.api.ConnectionSecurityProvider;
import org.opends.server.api.ServerShutdownListener;
import org.opends.server.api.plugin.PostConnectPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.config.ConfigException;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.PluginConfigManager;
@@ -1000,9 +1000,14 @@
                  try {
                    PluginConfigManager pluginManager = DirectoryServer
                        .getPluginConfigManager();
                    PostConnectPluginResult pluginResult = pluginManager
                    PluginResult.PostConnect pluginResult = pluginManager
                        .invokePostConnectPlugins(clientConnection);
                    if (pluginResult.connectionTerminated()) {
                    if (!pluginResult.continueProcessing()) {
                      clientConnection.disconnect(
                          pluginResult.getDisconnectReason(),
                          pluginResult.sendDisconnectNotification(),
                          pluginResult.getErrorMessage());
                      iterator.remove();
                      continue;
                    }
opends/src/server/org/opends/server/replication/plugin/MultimasterReplication.java
@@ -387,7 +387,7 @@
    ReplicationDomain domain =
      findDomain(modifyOperation.getEntryDN(), modifyOperation);
    if (domain == null)
      return new SynchronizationProviderResult(true);
      return new SynchronizationProviderResult.ContinueProcessing();
    return domain.handleConflictResolution(modifyOperation);
  }
@@ -402,7 +402,7 @@
    ReplicationDomain domain =
      findDomain(addOperation.getEntryDN(), addOperation);
    if (domain == null)
      return new SynchronizationProviderResult(true);
      return new SynchronizationProviderResult.ContinueProcessing();
    return domain.handleConflictResolution(addOperation);
  }
@@ -417,7 +417,7 @@
    ReplicationDomain domain =
      findDomain(deleteOperation.getEntryDN(), deleteOperation);
    if (domain == null)
      return new SynchronizationProviderResult(true);
      return new SynchronizationProviderResult.ContinueProcessing();
    return domain.handleConflictResolution(deleteOperation);
  }
@@ -432,7 +432,7 @@
    ReplicationDomain domain =
      findDomain(modifyDNOperation.getEntryDN(), modifyDNOperation);
    if (domain == null)
      return new SynchronizationProviderResult(true);
      return new SynchronizationProviderResult.ContinueProcessing();
    return domain.handleConflictResolution(modifyDNOperation);
  }
@@ -448,7 +448,7 @@
    ReplicationDomain domain = findDomain(operationDN, modifyOperation);
    if ((domain == null) || (!domain.solveConflict()))
      return new SynchronizationProviderResult(true);
      return new SynchronizationProviderResult.ContinueProcessing();
    Historical historicalInformation = (Historical)
                            modifyOperation.getAttachment(
@@ -463,7 +463,7 @@
    historicalInformation.generateState(modifyOperation);
    return new SynchronizationProviderResult(true);
    return new SynchronizationProviderResult.ContinueProcessing();
  }
  /**
@@ -473,7 +473,7 @@
  public SynchronizationProviderResult doPreOperation(
         PreOperationDeleteOperation deleteOperation) throws DirectoryException
  {
    return new SynchronizationProviderResult(true);
    return new SynchronizationProviderResult.ContinueProcessing();
  }
  /**
@@ -484,7 +484,7 @@
         PreOperationModifyDNOperation modifyDNOperation)
         throws DirectoryException
  {
    return new SynchronizationProviderResult(true);
    return new SynchronizationProviderResult.ContinueProcessing();
  }
  /**
@@ -497,12 +497,12 @@
    ReplicationDomain domain =
      findDomain(addOperation.getEntryDN(), addOperation);
    if (domain == null)
      return new SynchronizationProviderResult(true);
      return new SynchronizationProviderResult.ContinueProcessing();
    if (!addOperation.isSynchronizationOperation())
      domain.doPreOperation(addOperation);
    return new SynchronizationProviderResult(true);
    return new SynchronizationProviderResult.ContinueProcessing();
  }
opends/src/server/org/opends/server/replication/plugin/ReplicationDomain.java
@@ -522,7 +522,9 @@
    if ((!deleteOperation.isSynchronizationOperation())
        && (!brokerIsConnected(deleteOperation)))
    {
      return new SynchronizationProviderResult(false);
      Message msg = ERR_REPLICATION_COULD_NOT_CONNECT.get(baseDN.toString());
      return new SynchronizationProviderResult.StopProcessing(
          ResultCode.UNWILLING_TO_PERFORM, msg);
    }
    DeleteContext ctx =
@@ -551,8 +553,8 @@
         * operation will try to find the correct entry and restart a new
         * operation.
         */
        deleteOperation.setResultCode(ResultCode.NO_SUCH_OBJECT);
        return new SynchronizationProviderResult(false);
        return new SynchronizationProviderResult.StopProcessing(
            ResultCode.NO_SUCH_OBJECT, null);
      }
    }
    else
@@ -564,7 +566,7 @@
      ctx = new DeleteContext(changeNumber, modifiedEntryUUID);
      deleteOperation.setAttachment(SYNCHROCONTEXT, ctx);
    }
    return new SynchronizationProviderResult(true);
    return new SynchronizationProviderResult.ContinueProcessing();
  }
  /**
@@ -580,7 +582,9 @@
    if ((!addOperation.isSynchronizationOperation())
        && (!brokerIsConnected(addOperation)))
    {
      return new SynchronizationProviderResult(false);
      Message msg = ERR_REPLICATION_COULD_NOT_CONNECT.get(baseDN.toString());
      return new SynchronizationProviderResult.StopProcessing(
          ResultCode.UNWILLING_TO_PERFORM, msg);
    }
    if (addOperation.isSynchronizationOperation())
@@ -593,8 +597,8 @@
      String uuid = ctx.getEntryUid();
      if (findEntryDN(uuid) != null)
      {
        addOperation.setResultCode(ResultCode.CANCELED);
        return new SynchronizationProviderResult(false);
        return new SynchronizationProviderResult.StopProcessing(
            ResultCode.CANCELED, null);
      }
      /* The parent entry may have been renamed here since the change was done
@@ -616,8 +620,8 @@
          // The parent does not exist with the specified unique id
          // stop the operation with NO_SUCH_OBJECT and let the
          // conflict resolution or the dependency resolution solve this.
          addOperation.setResultCode(ResultCode.NO_SUCH_OBJECT);
          return new SynchronizationProviderResult(false);
          return new SynchronizationProviderResult.StopProcessing(
              ResultCode.NO_SUCH_OBJECT, null);
        }
        else
        {
@@ -629,13 +633,13 @@
            // parentEntry has been renamed
            // replication name conflict resolution is expected to fix that
            // later in the flow
            addOperation.setResultCode(ResultCode.NO_SUCH_OBJECT);
            return new SynchronizationProviderResult(false);
            return new SynchronizationProviderResult.StopProcessing(
                ResultCode.NO_SUCH_OBJECT, null);
          }
        }
      }
    }
    return new SynchronizationProviderResult(true);
    return new SynchronizationProviderResult.ContinueProcessing();
  }
  /**
@@ -645,7 +649,7 @@
   * If not set the ResultCode and the response message,
   * interrupt the operation, and return false
   *
   * @param   Operation  The Operation that needs to be checked.
   * @param   op  The Operation that needs to be checked.
   *
   * @return  true when it OK to process the Operation, false otherwise.
   *          When false is returned the resultCode and the reponse message
@@ -662,21 +666,7 @@
    {
      // this isolation policy specifies that the updates are denied
      // when the broker is not connected.
      if (broker.isConnected())
      {
        return true;
      }
      else
      {
        Message msg = ERR_REPLICATION_COULD_NOT_CONNECT.get(baseDN.toString());
        DirectoryException result =
          new DirectoryException(
              ResultCode.UNWILLING_TO_PERFORM, msg);
        op.setResponseData(result);
        return false;
      }
      return broker.isConnected();
    }
    // we should never get there as the only possible policies are
    // ACCEPT_ALL_UPDATES and REJECT_ALL_UPDATES
@@ -697,7 +687,9 @@
    if ((!modifyDNOperation.isSynchronizationOperation())
        && (!brokerIsConnected(modifyDNOperation)))
    {
      return new SynchronizationProviderResult(false);
      Message msg = ERR_REPLICATION_COULD_NOT_CONNECT.get(baseDN.toString());
      return new SynchronizationProviderResult.StopProcessing(
          ResultCode.UNWILLING_TO_PERFORM, msg);
    }
    ModifyDnContext ctx =
@@ -724,8 +716,8 @@
         * operation will try to find the correct entry and restart a new
         * operation.
         */
        modifyDNOperation.setResultCode(ResultCode.NO_SUCH_OBJECT);
        return new SynchronizationProviderResult(false);
        return new SynchronizationProviderResult.StopProcessing(
            ResultCode.NO_SUCH_OBJECT, null);
      }
      if (modifyDNOperation.getNewSuperior() != null)
      {
@@ -737,8 +729,8 @@
        if ((newParentId != null) &&
            (!newParentId.equals(ctx.getNewParentId())))
        {
          modifyDNOperation.setResultCode(ResultCode.NO_SUCH_OBJECT);
          return new SynchronizationProviderResult(false);
        return new SynchronizationProviderResult.StopProcessing(
            ResultCode.NO_SUCH_OBJECT, null);
        }
      }
    }
@@ -758,7 +750,7 @@
      ctx = new ModifyDnContext(changeNumber, modifiedEntryUUID, newParentId);
      modifyDNOperation.setAttachment(SYNCHROCONTEXT, ctx);
    }
    return new SynchronizationProviderResult(true);
    return new SynchronizationProviderResult.ContinueProcessing();
  }
  /**
@@ -774,7 +766,9 @@
    if ((!modifyOperation.isSynchronizationOperation())
        && (!brokerIsConnected(modifyOperation)))
    {
      return new SynchronizationProviderResult(false);
      Message msg = ERR_REPLICATION_COULD_NOT_CONNECT.get(baseDN.toString());
      return new SynchronizationProviderResult.StopProcessing(
          ResultCode.UNWILLING_TO_PERFORM, msg);
    }
    ModifyContext ctx =
@@ -813,8 +807,8 @@
         * operation will try to find the correct entry and restart a new
         * operation.
         */
        modifyOperation.setResultCode(ResultCode.NO_SUCH_OBJECT);
        return new SynchronizationProviderResult(false);
         return new SynchronizationProviderResult.StopProcessing(
              ResultCode.NO_SUCH_OBJECT, null);
      }
      /*
@@ -835,11 +829,11 @@
         * This operation becomes a no-op due to conflict resolution
         * stop the processing and send an OK result
         */
        modifyOperation.setResultCode(ResultCode.SUCCESS);
        return new SynchronizationProviderResult(false);
        return new SynchronizationProviderResult.StopProcessing(
            ResultCode.SUCCESS, null);
      }
    }
    return new SynchronizationProviderResult(true);
    return new SynchronizationProviderResult.ContinueProcessing();
  }
  /**
opends/src/server/org/opends/server/tools/VerifyIndex.java
@@ -30,6 +30,7 @@
import org.opends.server.api.Backend;
import org.opends.server.api.ErrorLogPublisher;
import org.opends.server.api.DebugLogPublisher;
import org.opends.server.backends.jeb.BackendImpl;
import org.opends.server.backends.jeb.VerifyConfig;
import org.opends.server.config.ConfigException;
@@ -40,6 +41,8 @@
import org.opends.server.loggers.ThreadFilterTextErrorLogPublisher;
import org.opends.server.loggers.TextWriter;
import org.opends.server.loggers.ErrorLogger;
import org.opends.server.loggers.debug.TextDebugLogPublisher;
import org.opends.server.loggers.debug.DebugLogger;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.DN;
import org.opends.server.types.InitializationException;
@@ -73,6 +76,7 @@
public class VerifyIndex
{
  private static ErrorLogPublisher errorLogPublisher = null;
  private static DebugLogPublisher debugLogPublisher = null;
  /**
   * Processes the command-line arguments and invokes the verify process.
   *
@@ -86,6 +90,10 @@
    {
      ErrorLogger.removeErrorLogPublisher(errorLogPublisher);
    }
    if(debugLogPublisher != null)
    {
      DebugLogger.removeDebugLogPublisher(debugLogPublisher);
    }
    if(retCode != 0)
    {
@@ -388,6 +396,11 @@
                                                  new TextWriter.STREAM(out));
        ErrorLogger.addErrorLogPublisher(errorLogPublisher);
        debugLogPublisher =
          TextDebugLogPublisher.getStartupTextDebugPublisher(
              new TextWriter.STDOUT());
        DebugLogger.addDebugLogPublisher(debugLogPublisher);
      }
      catch(Exception e)
      {
opends/src/server/org/opends/server/types/AbstractOperation.java
@@ -39,6 +39,10 @@
import org.opends.server.types.operation.PostResponseOperation;
import org.opends.server.types.operation.PreParseOperation;
import org.opends.server.core.DirectoryServer;
import static org.opends.server.loggers.debug.
    DebugLogger.debugEnabled;
import static org.opends.server.loggers.debug.DebugLogger.getTracer;
import org.opends.server.loggers.debug.DebugTracer;
/**
@@ -61,6 +65,11 @@
                  Runnable
{
  /**
   * The tracer object for the debug logger.
   */
  private static final DebugTracer TRACER = getTracer();
  /**
   * The set of response controls that will always be returned for
   * an abandon operation.
   */
@@ -93,6 +102,16 @@
  protected final boolean useNanoTime;
  /**
   * The cancel request for this operation.
   */
  protected CancelRequest cancelRequest;
  /**
   * The cancel result for this operation.
   */
  protected CancelResult cancelResult;
  // Indicates whether this is an internal operation triggered within
  // the server itself rather than requested by an external client.
@@ -102,9 +121,6 @@
  // synchronization processing.
  private boolean isSynchronizationOperation;
  // The cancel result for this operation.
  private CancelResult cancelResult;
  // The matched DN for this operation.
  private DN matchedDN;
@@ -223,10 +239,13 @@
   *                           may be {@code null} if no notification
   *                           is to be sent.
   */
  public abstract void disconnectClient(
          DisconnectReason disconnectReason,
          boolean sendNotification,
          Message message);
  public void disconnectClient(DisconnectReason disconnectReason,
                               boolean sendNotification,
                               Message message)
  {
    clientConnection.disconnect(disconnectReason, sendNotification,
            message);
  }
@@ -911,94 +930,91 @@
   * @return  A code providing information on the result of the
   *          cancellation.
   */
  public abstract CancelResult cancel(CancelRequest cancelRequest);
  /**
   * Sets the cancel request for this operation, if applicable.  This
   * should only be used for testing purposes (e.g., for ensuring a
   * cancel request is submitted before processing begins on an
   * operation, or to allow for cancelling an internal operation).  It
   * must not be used for any other purpose.
   *
   * @param  cancelRequest  The cancel request to set for this
   *                        operation.
   *
   * @return  {@code true} if the cancel request was set, or
   *          {@code false} if it was not for some reason (e.g., the
   *          specified operation cannot be cancelled).
   */
  public abstract boolean setCancelRequest(CancelRequest
      cancelRequest);
  /**
   * Retrieves the cancel request that has been issued for this
   * operation, if there is one.  This method should not be called by
   * post-operation or post-response plugins.
   *
   * @return  The cancel request that has been issued for this
   *          operation, or {@code null} if there has not been any
   *          request to cancel.
   */
  public abstract CancelRequest getCancelRequest();
  /**
   * Retrieves the cancel result for this operation.
   *
   * @return  The cancel result for this operation.  It will be
   *          {@code null} if the operation has not seen and reacted
   *          to a cancel request.
   */
  public final CancelResult getCancelResult()
  public CancelResult cancel(CancelRequest cancelRequest)
  {
    abort(cancelRequest);
    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);
        }
      }
    }
    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 = new CancelResult(ResultCode.CANNOT_CANCEL, null);
    }
    return cancelResult;
  }
  /**
   * Specifies the cancel result for this operation.
   * Attempts to cancel this operation before processing has
   * completed without waiting for a cancel result.
   *
   * @param  cancelResult  The cancel result for this operation.
   * @param  cancelRequest  Information about the way in which the
   *                        operation should be canceled.
   */
  public final void setCancelResult(CancelResult cancelResult)
  public synchronized void abort(CancelRequest cancelRequest)
  {
    this.cancelResult = cancelResult;
    if(cancelResult == null && this.cancelRequest == null)
    {
      this.cancelRequest = cancelRequest;
    }
  }
  /**
   * Indicates that this operation has been cancelled.  If
   * appropriate, it will send a response to the client to indicate
   * that.  This method must not be called by abandon, bind, or unbind
   * operations under any circumstances, nor by extended operations if
   * the request OID is that of the cancel or the StartTLS operation.
   *
   * @param  cancelRequest  The request to cancel this operation.
   * {@inheritDoc}
   */
  public final void indicateCancelled(CancelRequest cancelRequest)
  {
    setCancelResult(CancelResult.CANCELED);
    if (cancelRequest.notifyOriginalRequestor() ||
        DirectoryServer.notifyAbandonedOperations())
  public synchronized final void
    checkIfCanceled(boolean signalTooLate)
      throws CanceledOperationException {
    if(cancelRequest != null)
    {
      setResultCode(ResultCode.CANCELED);
      Message cancelReason = cancelRequest.getCancelReason();
      if (cancelReason != null)
      {
        appendErrorMessage(cancelReason);
      }
      clientConnection.sendResponse(this);
      throw new CanceledOperationException(cancelRequest);
    }
    if(signalTooLate && cancelResult != null)
    {
      cancelResult = new CancelResult(ResultCode.TOO_LATE, null);
    }
  }
  /**
   * {@inheritDoc}
   */
  public final CancelRequest getCancelRequest()
  {
    return cancelRequest;
  }
  /**
   * {@inheritDoc}
   */
  public final CancelResult getCancelResult()
  {
    return cancelResult;
  }
opends/src/server/org/opends/server/types/CancelRequest.java
@@ -27,9 +27,6 @@
package org.opends.server.types;
import org.opends.messages.Message;
import org.opends.messages.MessageBuilder;
/**
 * This class defines a data structure that can be used to hold
 * information about a request to cancel or abandon an operation in
@@ -50,10 +47,6 @@
  // included in the response to the original requestor).
  private final Message cancelReason;
  // A buffer to hold a human-readable response that the server
  // provided for the result of the cancellation.
  private MessageBuilder responseMessage;
  /**
@@ -71,32 +64,6 @@
  {
    this.notifyOriginalRequestor = notifyOriginalRequestor;
    this.cancelReason            = cancelReason;
    this.responseMessage         = new MessageBuilder();
  }
  /**
   * Creates a new cancel request with the provided information.
   *
   * @param  notifyOriginalRequestor  Indicates whether the original
   *                                  requestor should receive a
   *                                  response if the operation is
   *                                  canceled.
   * @param  cancelReason             A message that explains the
   *                                  purpose for this cancellation.
   * @param  responseMessage          A buffer to hold a
   *                                  human-readable response that the
   *                                  server provided for the result
   *                                  of the cancellation.
   */
  public CancelRequest(boolean notifyOriginalRequestor,
                       Message cancelReason,
                       MessageBuilder responseMessage)
  {
    this.notifyOriginalRequestor = notifyOriginalRequestor;
    this.cancelReason            = cancelReason;
    this.responseMessage         = responseMessage;
  }
@@ -127,35 +94,5 @@
  {
    return cancelReason;
  }
  /**
   * Retrieves the buffer that is used to hold a human-readable
   * response that the server provided for the result of the
   * cancellation.  The caller may alter the contents of this buffer.
   *
   * @return  The buffer that is used to hold a human-readable
   *          response that the server provided for the result of this
   *          cancellation.
   */
  public MessageBuilder getResponseMessage()
  {
    return responseMessage;
  }
  /**
   * Appends the provided message to the buffer used to hold
   * information about the result of the cancellation.
   *
   * @param  message  The message to append to the response message
   *                  buffer.
   */
  public void addResponseMessage(Message message)
  {
    responseMessage.append(message);
  }
}
opends/src/server/org/opends/server/types/CancelResult.java
@@ -26,6 +26,7 @@
 */
package org.opends.server.types;
import org.opends.messages.Message;
/**
@@ -38,59 +39,29 @@
     mayInstantiate=false,
     mayExtend=false,
     mayInvoke=true)
public enum CancelResult
public class CancelResult
{
  /**
   * The cancel result that indicates that the target operation was
   * canceled successfully and in a manner that should have no
   * permanent effects on the server or the data it contains.
   */
  CANCELED(ResultCode.CANCELED),
  /**
   * The cancel result that indicates that the target operation could
   * not be found, which may mean that it either does not exist or has
   * already completed.
   */
  NO_SUCH_OPERATION(ResultCode.NO_SUCH_OPERATION),
  /**
   * The cancel result that indicates that processing on the target
   * operation had already progressed to a point in which it was too
   * late to be able to cancel.
   */
  TOO_LATE(ResultCode.TOO_LATE),
  /**
   * The cancel result that indicates that the operation exists but
   * cannot be canceled for some reason (e.g., it is an abandon, bind,
   * cancel, or unbind operation, or if it is one that would impact
   * the security of the underlying connection).
   */
  CANNOT_CANCEL(ResultCode.CANNOT_CANCEL);
  // The result code associated with this cancel result.
  private final ResultCode resultCode;
  // A human-readable response that the server
  // provided for the result of the cancellation.
  private final Message responseMessage;
  /**
   * Creates a new cancel result with the provided result code.
   *
   * @param  resultCode  The result code associated with this cancel
   *                     result.
   *
   * @param  responseMessage A human-readable response that the
   *                         server provided for the result
   *                         of the cancellation.
   */
  private CancelResult(ResultCode resultCode)
  public CancelResult(ResultCode resultCode, Message responseMessage)
  {
    this.resultCode = resultCode;
    this.responseMessage = responseMessage;
  }
@@ -105,7 +76,19 @@
    return resultCode;
  }
  /**
   * Retrieves the human-readable response that the server provided
   * for the result of the cancellation.  The caller may alter the
   * contents of this buffer.
   *
   * @return  The buffer that is used to hold a human-readable
   *          response that the server provided for the result of this
   *          cancellation.
   */
  public Message getResponseMessage()
  {
    return responseMessage;
  }
  /**
   * Retrieves a string representation of this cancel result.
opends/src/server/org/opends/server/types/CanceledOperationException.java
File was renamed from opends/src/server/org/opends/server/types/CancelledOperationException.java
@@ -39,8 +39,8 @@
     mayInstantiate=true,
     mayExtend=false,
     mayInvoke=true)
public final class CancelledOperationException
       extends IdentifiedException
public final class CanceledOperationException
    extends IdentifiedException
{
  /**
   * The serial version identifier required to satisfy the compiler
@@ -55,7 +55,7 @@
  // The cancel result that provides information about the status of
  // the cancellation.
  private final CancelResult cancelResult;
  private final CancelRequest cancelRequest;
@@ -63,14 +63,14 @@
   * Creates a new cancelled operation exception with the provided
   * result and no additional message.
   *
   * @param  cancelResult  The result of the cancel processing.
   * @param  cancelRequest  The result of the cancel processing.
   */
  public CancelledOperationException(CancelResult cancelResult)
  public CanceledOperationException(CancelRequest cancelRequest)
  {
    super();
    this.cancelResult = cancelResult;
    this.cancelRequest = cancelRequest;
  }
@@ -79,32 +79,32 @@
   * Creates a new cancelled operation exception with the provided
   * information.
   *
   * @param  cancelResult  The result of the cancel processing.
   * @param  cancelRequest The request of the cancel processing.
   * @param  message       The message providing additional
   *                       information about the cancel processing, or
   *                       <CODE>null</CODE> if there is no message.
   */
  public CancelledOperationException(CancelResult cancelResult,
  public CanceledOperationException(CancelRequest cancelRequest,
                                     Message message)
  {
    super(message);
    this.cancelResult = cancelResult;
    this.cancelRequest = cancelRequest;
  }
  /**
   * Retrieves the cancel result for this cancelled operation
   * Retrieves the cancel request for this cancelled operation
   * exception.
   *
   * @return  The cancel result for this cancelled operation
   * @return  The cancel request for this cancelled operation
   *          exception.
   */
  public CancelResult getCancelResult()
  public CancelRequest getCancelRequest()
  {
    return cancelResult;
    return cancelRequest;
  }
}
opends/src/server/org/opends/server/types/Entry.java
@@ -47,7 +47,7 @@
import org.opends.server.api.AttributeValueDecoder;
import org.opends.server.api.CompressedSchema;
import org.opends.server.api.ProtocolElement;
import org.opends.server.api.plugin.LDIFPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.PluginConfigManager;
import org.opends.server.protocols.asn1.ASN1Element;
@@ -5646,10 +5646,10 @@
    {
      PluginConfigManager pluginConfigManager =
           DirectoryServer.getPluginConfigManager();
      LDIFPluginResult pluginResult =
      PluginResult.ImportLDIF pluginResult =
           pluginConfigManager.invokeLDIFExportPlugins(exportConfig,
                                                    this);
      if (! pluginResult.continueEntryProcessing())
      if (! pluginResult.continueProcessing())
      {
        return false;
      }
opends/src/server/org/opends/server/types/Operation.java
@@ -543,21 +543,14 @@
  public abstract CancelResult cancel(CancelRequest cancelRequest);
  /**
   * Sets the cancel request for this operation, if applicable.  This
   * should only be used for testing purposes (e.g., for ensuring a
   * cancel request is submitted before processing begins on an
   * operation, or to allow for cancelling an internal operation).  It
   * must not be used for any other purpose.
   * Attempts to abort this operation before processing has
   * completed.
   *
   * @param  cancelRequest  The cancel request to set for this
   *                        operation.
   *
   * @return  {@code true} if the cancel request was set, or
   *          {@code false} if it was not for some reason (e.g., the
   *          specified operation cannot be cancelled).
   * @param  cancelRequest  Information about the way in which the
   *                        operation should be canceled.
   */
  public abstract boolean setCancelRequest(CancelRequest
      cancelRequest);
  public abstract void abort(CancelRequest cancelRequest);
  /**
   * Retrieves the cancel request that has been issued for this
@@ -580,24 +573,6 @@
  public abstract CancelResult getCancelResult();
  /**
   * Specifies the cancel result for this operation.
   *
   * @param  cancelResult  The cancel result for this operation.
   */
  public abstract void setCancelResult(CancelResult cancelResult);
  /**
   * Indicates that this operation has been cancelled.  If
   * appropriate, it will send a response to the client to indicate
   * that.  This method must not be called by abandon, bind, or unbind
   * operations under any circumstances, nor by extended operations if
   * the request OID is that of the cancel or the StartTLS operation.
   *
   * @param  cancelRequest  The request to cancel this operation.
   */
  public abstract void indicateCancelled(CancelRequest cancelRequest);
  /**
   * Retrieves a string representation of this operation.
   *
   * @return  A string representation of this operation.
@@ -624,18 +599,6 @@
  public abstract boolean dontSynchronize();
  /**
   * Set the time at which the processing stopped for this operation.
   * This will actually hold a time immediately before the response
   * was sent to the client.
   */
  public abstract void setProcessingStopTime();
  /**
   * Set the time at which the processing started for this operation.
   */
  public abstract void setProcessingStartTime();
  /**
   * Set the attachments to the operation.
   *
   * @param attachments - Attachments to register within the
@@ -644,5 +607,20 @@
  public abstract void setAttachments(Map<String,
      Object> attachments);
  /**
   * Checks to see if this operation requested to cancel in which case
   * CanceledOperationException will be thrown.
   *
   * @param signalTooLate <code>true</code> to signal that any further
   *                      cancel requests will be too late after
   *                      return from this call or <code>false</code>
   *                      otherwise.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public void checkIfCanceled(boolean signalTooLate)
      throws CanceledOperationException;
}
opends/src/server/org/opends/server/types/SynchronizationProviderResult.java
@@ -26,39 +26,22 @@
 */
package org.opends.server.types;
import org.opends.messages.Message;
import java.util.List;
/**
 * This class defines a data structure that holds information about
 * the result of processing by a synchronization provider.
 */
@org.opends.server.types.PublicAPI(
     stability=org.opends.server.types.StabilityLevel.VOLATILE,
     mayInstantiate=false,
     mayExtend=false,
     mayInvoke=true)
public final class SynchronizationProviderResult
    stability=org.opends.server.types.StabilityLevel.VOLATILE,
    mayInstantiate=false,
    mayExtend=false,
    mayInvoke=true)
public interface SynchronizationProviderResult
{
  // Indicates whether processing should continue on the operation.
  private boolean continueOperationProcessing;
  /**
   * Creates a new synchronization provider result with the provided
   * information.
   *
   * @param  continueOperationProcessing  Indicates whether processing
   *                                      should continue on the
   *                                      associated operation.
   */
  public SynchronizationProviderResult(
              boolean continueOperationProcessing)
  {
    this.continueOperationProcessing = continueOperationProcessing;
  }
  /**
   * Indicates whether processing on the associated operation should
   * continue.
@@ -67,58 +50,182 @@
   *          operation should continue, or <CODE>false</CODE> if it
   *          should stop.
   */
  public boolean continueOperationProcessing()
  {
    return continueOperationProcessing;
  }
  public boolean continueProcessing();
  /**
   * Specifies whether processing on the associated operation should
   * continue.
   * Retrieves the error message if <code>continueProcessing</code>
   * returned <code>false</code>.
   *
   * @param  continueOperationProcessing  Indicates whether processing
   *                                      should continue on the
   *                                      associated operation.
   * @return An error message explaining why processing should
   * stop or <code>null</code> if none is provided.
   */
  public void setContinueOperationProcessing(
                   boolean continueOperationProcessing)
  {
    this.continueOperationProcessing = continueOperationProcessing;
  }
  public Message getErrorMessage();
  /**
   * Retrieves a string representation of this post-response plugin
   * result.
   * Retrieves the result code for the operation
   * if <code>continueProcessing</code> returned <code>false</code>.
   *
   * @return  A string representation of this post-response plugin
   *          result.
   * @return the result code for the operation or <code>null</code>
   * if none is provided.
   */
  public String toString()
  {
    StringBuilder buffer = new StringBuilder();
    toString(buffer);
    return buffer.toString();
  }
  public ResultCode getResultCode();
  /**
   * Appends a string representation of this post-response plugin
   * result to the provided buffer.
   * Retrieves the matched DN for the operation
   * if <code>continueProcessing</code> returned <code>false</code>.
   *
   * @param  buffer  The buffer to which the information should be
   *                 appended.
   * @return the matched DN for the operation or <code>null</code>
   * if none is provided.
   */
  public void toString(StringBuilder buffer)
  public DN getMatchedDN();
  /**
   * Retrieves the referral URLs for the operation
   * if <code>continueProcessing</code> returned <code>false</code>.
   *
   * @return the refferal URLs for the operation or
   * <code>null</code> if none is provided.
   */
  public List<String> getReferralURLs();
  /**
   * Defines a continue processing synchronization provider result.
   */
  public class ContinueProcessing
      implements SynchronizationProviderResult
  {
    buffer.append("SynchronizationProviderResult(" +
                  "continueOperationProcessing=");
    buffer.append(continueOperationProcessing);
    buffer.append(")");
    /**
     * {@inheritDoc}
     */
    public ResultCode getResultCode()
    {
      return null;
    }
    /**
     * {@inheritDoc}
     */
    public DN getMatchedDN()
    {
      return null;
    }
    /**
     * {@inheritDoc}
     */
    public List<String> getReferralURLs()
    {
      return null;
    }
    /**
     * {@inheritDoc}
     */
    public boolean continueProcessing()
    {
      return true;
    }
    /**
     * {@inheritDoc}
     */
    public Message getErrorMessage()
    {
      return null;
    }
  }
  /**
   * Defines a stop processing synchronization provider result.
   */
  public class StopProcessing
      implements SynchronizationProviderResult
  {
    // The matched DN for this result.
    private final DN matchedDN;
    // The set of referral URLs for this result.
    private final List<String> referralURLs;
    // The result code for this result.
    private final ResultCode resultCode;
    private final Message errorMessage;
    /**
     * Contrust a new stop processing synchronization provider
     *  result.
     *
     * @param resultCode The result code for this result.
     * @param errorMessage An message explaining why processing
     * should stop.
     * @param matchedDN The matched DN for this result.
     * @param referralURLs The set of referral URLs for this result.
     */
    public StopProcessing(ResultCode resultCode, Message errorMessage,
                          DN matchedDN, List<String> referralURLs)
    {
      this.errorMessage = errorMessage;
      this.matchedDN = matchedDN;
      this.resultCode = resultCode;
      this.referralURLs = referralURLs;
    }
    /**
     * Contrust a new stop processing synchronization provider
     *  result.
     *
     * @param resultCode The result code for this result.
     * @param errorMessage An message explaining why processing
     * should stop.
     */
    public StopProcessing(ResultCode resultCode, Message errorMessage)
    {
      this.errorMessage = errorMessage;
      this.resultCode = resultCode;
      this.matchedDN = null;
      this.referralURLs = null;
    }
    /**
     * {@inheritDoc}
     */
    public ResultCode getResultCode()
    {
      return resultCode;
    }
    /**
     * {@inheritDoc}
     */
    public DN getMatchedDN()
    {
      return matchedDN;
    }
    /**
     * {@inheritDoc}
     */
    public List<String> getReferralURLs()
    {
      return referralURLs;
    }
    /**
     * {@inheritDoc}
     */
    public boolean continueProcessing()
    {
      return false;
    }
    /**
     * {@inheritDoc}
     */
    public Message getErrorMessage()
    {
      return errorMessage;
    }
  }
}
opends/src/server/org/opends/server/types/operation/PluginOperation.java
@@ -33,11 +33,7 @@
import java.util.Map;
import org.opends.server.api.ClientConnection;
import org.opends.server.types.CancelRequest;
import org.opends.server.types.Control;
import org.opends.server.types.DisconnectReason;
import org.opends.server.types.OperationType;
import org.opends.server.types.*;
/**
@@ -230,18 +226,6 @@
  /**
   * Retrieves the cancel request that has been issued for this
   * operation, if there is one.
   *
   * @return  The cancel request that has been issued for this
   *          operation, or <CODE>null</CODE> if there has not been
   *          any request to cancel.
   */
  public CancelRequest getCancelRequest();
  /**
   * Retrieves a string representation of this operation.
   *
   * @return  A string representation of this operation.
@@ -258,5 +242,22 @@
   *                 this operation should be appended.
   */
  public void toString(StringBuilder buffer);
  /**
   * Checks to see if this operation requested to cancel in which case
   * CanceledOperationException will be thrown.
   *
   * @param signalTooLate <code>true</code> to signal that any further
   *                      cancel requests will be too late after
   *                      return from this call or <code>false</code>
   *                      otherwise.
   *
   * @throws CanceledOperationException if this operation should
   * be cancelled.
   */
  public void checkIfCanceled(boolean signalTooLate)
      throws CanceledOperationException;
}
opends/src/server/org/opends/server/types/operation/PreOperationOperation.java
@@ -28,13 +28,8 @@
import org.opends.messages.Message;
import java.util.List;
import org.opends.server.types.Control;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.DN;
import org.opends.server.types.ResultCode;
import org.opends.messages.MessageBuilder;
@@ -76,26 +71,6 @@
  /**
   * Retrieves the result code for this operation.
   *
   * @return  The result code associated for this operation, or
   *          <CODE>UNDEFINED</CODE> if the operation has not yet
   *          completed.
   */
  public ResultCode getResultCode();
  /**
   * Specifies the result code for this operation.
   *
   * @param  resultCode  The result code for this operation.
   */
  public void setResultCode(ResultCode resultCode);
  /**
   * Retrieves the error message for this operation.  Its contents may
   * be altered by the caller.
   *
@@ -162,61 +137,6 @@
  /**
   * Retrieves the matched DN for this operation.
   *
   * @return  The matched DN for this operation, or <CODE>null</CODE>
   *          if the operation has not yet completed or does not have
   *          a matched DN.
   */
  public DN getMatchedDN();
  /**
   * Specifies the matched DN for this operation.
   *
   * @param  matchedDN  The matched DN for this operation.
   */
  public void setMatchedDN(DN matchedDN);
  /**
   * Retrieves the set of referral URLs for this operation.  Its
   * contents must not be altered by the caller.
   *
   * @return  The set of referral URLs for this operation, or
   *          <CODE>null</CODE> if the operation is not yet complete
   *          or does not have a set of referral URLs.
   */
  public List<String> getReferralURLs();
  /**
   * Specifies the set of referral URLs for this operation.
   *
   * @param  referralURLs  The set of referral URLs for this
   *                       operation.
   */
  public void setReferralURLs(List<String> referralURLs);
  /**
   * Sets the response elements for this operation based on the
   * information contained in the provided
   * <CODE>DirectoryException</CODE> object.
   *
   * @param  directoryException  The exception containing the
   *                             information to use for the response
   *                             elements.
   */
  public void setResponseData(DirectoryException directoryException);
  /**
   * Retrieves the authorization DN for this operation.  In many
   * cases, it will be the same as the DN of the authenticated user
   * for the underlying connection, or the null DN if no
opends/src/server/org/opends/server/types/operation/PreParseOperation.java
@@ -29,12 +29,7 @@
import java.util.List;
import org.opends.server.types.Control;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.DN;
import org.opends.server.types.ResultCode;
import org.opends.server.types.*;
import org.opends.messages.MessageBuilder;
@@ -98,26 +93,6 @@
  /**
   * Retrieves the result code for this operation.
   *
   * @return  The result code associated for this operation, or
   *          <CODE>UNDEFINED</CODE> if the operation has not yet
   *          completed.
   */
  public ResultCode getResultCode();
  /**
   * Specifies the result code for this operation.
   *
   * @param  resultCode  The result code for this operation.
   */
  public void setResultCode(ResultCode resultCode);
  /**
   * Retrieves the error message for this operation.  Its contents may
   * be altered by the caller.
   *
@@ -180,60 +155,5 @@
   *                  additional log information for this operation.
   */
  public void appendAdditionalLogMessage(Message message);
  /**
   * Retrieves the matched DN for this operation.
   *
   * @return  The matched DN for this operation, or <CODE>null</CODE>
   *          if the operation has not yet completed or does not have
   *          a matched DN.
   */
  public DN getMatchedDN();
  /**
   * Specifies the matched DN for this operation.
   *
   * @param  matchedDN  The matched DN for this operation.
   */
  public void setMatchedDN(DN matchedDN);
  /**
   * Retrieves the set of referral URLs for this operation.  Its
   * contents must not be altered by the caller.
   *
   * @return  The set of referral URLs for this operation, or
   *          <CODE>null</CODE> if the operation is not yet complete
   *          or does not have a set of referral URLs.
   */
  public List<String> getReferralURLs();
  /**
   * Specifies the set of referral URLs for this operation.
   *
   * @param  referralURLs  The set of referral URLs for this
   *                       operation.
   */
  public void setReferralURLs(List<String> referralURLs);
  /**
   * Sets the response elements for this operation based on the
   * information contained in the provided
   * <CODE>DirectoryException</CODE> object.
   *
   * @param  directoryException  The exception containing the
   *                             information to use for the response
   *                             elements.
   */
  public void setResponseData(DirectoryException directoryException);
}
opends/src/server/org/opends/server/util/LDIFReader.java
@@ -48,7 +48,6 @@
import java.util.LinkedList;
import java.util.List;
import org.opends.server.api.plugin.LDIFPluginResult;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.PluginConfigManager;
import org.opends.server.protocols.asn1.ASN1OctetString;
@@ -69,6 +68,7 @@
import org.opends.server.types.ObjectClass;
import org.opends.server.types.RawModification;
import org.opends.server.types.RDN;
import org.opends.server.api.plugin.PluginResult;
/**
@@ -299,12 +299,12 @@
      // If we should invoke import plugins, then do so.
      if (importConfig.invokeImportPlugins())
      {
        LDIFPluginResult pluginResult =
        PluginResult.ImportLDIF pluginResult =
             pluginConfigManager.invokeLDIFImportPlugins(importConfig, entry);
        if (! pluginResult.continueEntryProcessing())
        if (! pluginResult.continueProcessing())
        {
          Message m;
          Message rejectMessage = pluginResult.getRejectMessage();
          Message rejectMessage = pluginResult.getErrorMessage();
          if (rejectMessage == null)
          {
            m = ERR_LDIF_REJECTED_BY_PLUGIN_NOMESSAGE.get(
opends/src/server/org/opends/server/workflowelement/WorkflowElement.java
@@ -41,6 +41,7 @@
import org.opends.server.types.Entry;
import org.opends.server.types.Operation;
import org.opends.server.types.SearchResultReference;
import org.opends.server.types.CanceledOperationException;
/**
@@ -170,8 +171,12 @@
   * Executes the workflow element for an operation.
   *
   * @param operation the operation to execute
   *
   * @throws CanceledOperationException if this operation should be
   * cancelled
   */
  public abstract void execute(Operation operation);
  public abstract void execute(Operation operation)
      throws CanceledOperationException;
  /**
opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendAddOperation.java
@@ -46,8 +46,7 @@
import org.opends.server.api.PasswordStorageScheme;
import org.opends.server.api.PasswordValidator;
import org.opends.server.api.SynchronizationProvider;
import org.opends.server.api.plugin.PostOperationPluginResult;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.controls.LDAPAssertionRequestControl;
import org.opends.server.controls.LDAPPostReadRequestControl;
import org.opends.server.controls.LDAPPostReadResponseControl;
@@ -70,8 +69,7 @@
import org.opends.server.types.AttributeType;
import org.opends.server.types.AttributeValue;
import org.opends.server.types.ByteString;
import org.opends.server.types.CancelledOperationException;
import org.opends.server.types.CancelResult;
import org.opends.server.types.CanceledOperationException;
import org.opends.server.types.Control;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DirectoryException;
@@ -123,9 +121,6 @@
  // Indicates whether the request includes the LDAP no-op control.
  private boolean noOp;
  // Indicates whether to skip post-operation plugin processing.
  private boolean skipPostOperation;
  // The DN of the entry to be added.
  private DN entryDN;
@@ -181,22 +176,22 @@
   *
   * @param  backend  The backend in which the add operation should be
   *                  processed.
   *
   * @throws CanceledOperationException if this operation should be
   * cancelled
   */
  void processLocalAdd(Backend backend)
  {
  void processLocalAdd(Backend backend) throws CanceledOperationException {
    boolean executePostOpPlugins = false;
    this.backend = backend;
    ClientConnection clientConnection = getClientConnection();
    // Get the plugin config manager that will be used for invoking plugins.
    PluginConfigManager pluginConfigManager =
         DirectoryServer.getPluginConfigManager();
    skipPostOperation = false;
    // Check for a request to cancel this operation.
    if (cancelIfRequested())
    {
      return;
    }
    checkIfCanceled(false);
    // Create a labeled block of code that we can break out of if a problem is
    // detected.
@@ -222,10 +217,7 @@
      }
      // Check for a request to cancel this operation.
      if (cancelIfRequested())
      {
        return;
      }
      checkIfCanceled(false);
      // Grab a read lock on the parent entry, if there is one.  We need to do
@@ -254,10 +246,7 @@
      try
      {
        // Check for a request to cancel this operation.
        if (cancelIfRequested())
        {
          return;
        }
        checkIfCanceled(false);
        // Grab a write lock on the target entry.  We'll need to do this
@@ -280,7 +269,6 @@
          appendErrorMessage(ERR_ADD_CANNOT_LOCK_ENTRY.get(
                                  String.valueOf(entryDN)));
          skipPostOperation = true;
          break addProcessing;
        }
@@ -293,9 +281,13 @@
          try
          {
            SynchronizationProviderResult result =
                 provider.handleConflictResolution(this);
            if (! result.continueOperationProcessing())
                provider.handleConflictResolution(this);
            if (! result.continueProcessing())
            {
              setResultCode(result.getResultCode());
              appendErrorMessage(result.getErrorMessage());
              setMatchedDN(result.getMatchedDN());
              setReferralURLs(result.getReferralURLs());
              break addProcessing;
            }
          }
@@ -591,50 +583,32 @@
          setResultCode(ResultCode.INSUFFICIENT_ACCESS_RIGHTS);
          appendErrorMessage(ERR_ADD_AUTHZ_INSUFFICIENT_ACCESS_RIGHTS.get(
                                  String.valueOf(entryDN)));
          skipPostOperation = true;
          break addProcessing;
        }
        // Check for a request to cancel this operation.
        if (cancelIfRequested())
        {
          return;
        }
        checkIfCanceled(false);
        // If the operation is not a synchronization operation,
        // Invoke the pre-operation add plugins.
        if (! isSynchronizationOperation())
        {
          PreOperationPluginResult preOpResult =
          executePostOpPlugins = true;
          PluginResult.PreOperation preOpResult =
            pluginConfigManager.invokePreOperationAddPlugins(this);
          if (preOpResult.connectionTerminated())
          if (!preOpResult.continueProcessing())
          {
            // There's no point in continuing with anything.  Log the result
            // and return.
            setResultCode(ResultCode.CANCELED);
            appendErrorMessage(ERR_CANCELED_BY_PREOP_DISCONNECT.get());
            return;
          }
          else if (preOpResult.sendResponseImmediately())
          {
            skipPostOperation = true;
            break addProcessing;
          }
          else if (preOpResult.skipCoreProcessing())
          {
            skipPostOperation = false;
            setResultCode(preOpResult.getResultCode());
            appendErrorMessage(preOpResult.getErrorMessage());
            setMatchedDN(preOpResult.getMatchedDN());
            setReferralURLs(preOpResult.getReferralURLs());
            break addProcessing;
          }
        }
        // Check for a request to cancel this operation.
        if (cancelIfRequested())
        {
          return;
        }
        checkIfCanceled(true);
        // If it is not a private backend, then check to see if the server or
@@ -696,9 +670,13 @@
              try
              {
                SynchronizationProviderResult result =
                     provider.doPreOperation(this);
                if (! result.continueOperationProcessing())
                    provider.doPreOperation(this);
                if (! result.continueProcessing())
                {
                  setResultCode(result.getResultCode());
                  appendErrorMessage(result.getErrorMessage());
                  setMatchedDN(result.getMatchedDN());
                  setReferralURLs(result.getReferralURLs());
                  break addProcessing;
                }
              }
@@ -740,26 +718,6 @@
          setResponseData(de);
          break addProcessing;
        }
        catch (CancelledOperationException coe)
        {
          if (debugEnabled())
          {
            TRACER.debugCaught(DebugLogLevel.ERROR, coe);
          }
          CancelResult cancelResult = coe.getCancelResult();
          setCancelResult(cancelResult);
          setResultCode(cancelResult.getResultCode());
          Message message = coe.getMessageObject();
          if ((message != null) && (message.length() > 0))
          {
            appendErrorMessage(message);
          }
          break addProcessing;
        }
      }
      finally
      {
@@ -772,35 +730,29 @@
        {
          LockManager.unlock(parentDN, parentLock);
        }
        for (SynchronizationProvider provider :
             DirectoryServer.getSynchronizationProviders())
        {
          try
          {
            provider.doPostOperation(this);
          }
          catch (DirectoryException de)
          {
            if (debugEnabled())
            {
              TRACER.debugCaught(DebugLogLevel.ERROR, de);
            }
            logError(ERR_ADD_SYNCH_POSTOP_FAILED.get(getConnectionID(),
                          getOperationID(), getExceptionMessage(de)));
            setResponseData(de);
            break;
          }
        }
      }
    }
    for (SynchronizationProvider provider :
        DirectoryServer.getSynchronizationProviders())
    {
      try
      {
        provider.doPostOperation(this);
      }
      catch (DirectoryException de)
      {
        if (debugEnabled())
        {
          TRACER.debugCaught(DebugLogLevel.ERROR, de);
        }
    // Indicate that it is now too late to attempt to cancel the operation.
    setCancelResult(CancelResult.TOO_LATE);
        logError(ERR_ADD_SYNCH_POSTOP_FAILED.get(getConnectionID(),
            getOperationID(), getExceptionMessage(de)));
        setResponseData(de);
        break;
      }
    }
    // Invoke the post-operation or post-synchronization add plugins.
    if (isSynchronizationOperation())
@@ -810,18 +762,17 @@
        pluginConfigManager.invokePostSynchronizationAddPlugins(this);
      }
    }
    else if (! skipPostOperation)
    else if (executePostOpPlugins)
    {
      // FIXME -- Should this also be done while holding the locks?
      PostOperationPluginResult postOpResult =
           pluginConfigManager.invokePostOperationAddPlugins(this);
      if (postOpResult.connectionTerminated())
      PluginResult.PostOperation postOpResult =
          pluginConfigManager.invokePostOperationAddPlugins(this);
      if(!postOpResult.continueProcessing())
      {
        // There's no point in continuing with anything.  Log the result and
        // return.
        setResultCode(ResultCode.CANCELED);
        appendErrorMessage(ERR_CANCELED_BY_POSTOP_DISCONNECT.get());
        setResultCode(postOpResult.getResultCode());
        appendErrorMessage(postOpResult.getErrorMessage());
        setMatchedDN(postOpResult.getMatchedDN());
        setReferralURLs(postOpResult.getReferralURLs());
        return;
      }
    }
@@ -855,27 +806,6 @@
  /**
   * Checks to determine whether there has been a request to cancel this
   * operation.  If so, then set the cancel result and processing stop time.
   *
   * @return  {@code true} if there was a cancel request, or {@code false} if
   *          not.
   */
  private boolean cancelIfRequested()
  {
    if (getCancelRequest() == null)
    {
      return false;
    }
    indicateCancelled(getCancelRequest());
    setProcessingStopTime();
    return true;
  }
  /**
   * Acquire a read lock on the parent of the entry to add.
   *
   * @return  The acquired read lock.
@@ -1576,7 +1506,6 @@
        if (!AccessControlConfigManager.getInstance().
                getAccessControlHandler().isAllowed(parentDN, this, c))
        {
          skipPostOperation = true;
          throw new DirectoryException(ResultCode.INSUFFICIENT_ACCESS_RIGHTS,
                         ERR_CONTROL_INSUFFICIENT_ACCESS_RIGHTS.get(oid));
        }
opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendBindOperation.java
@@ -38,8 +38,7 @@
import org.opends.server.api.Backend;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.SASLMechanismHandler;
import org.opends.server.api.plugin.PostOperationPluginResult;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.controls.AuthorizationIdentityResponseControl;
import org.opends.server.controls.PasswordExpiredControl;
import org.opends.server.controls.PasswordExpiringControl;
@@ -119,8 +118,8 @@
  // control in the bind response.
  private boolean returnAuthzID;
  // Indicates whether to skip post-operation plugin processing.
  private boolean skipPostOperation;
  // Indicates whether to execute post-operation plugins.
  private boolean executePostOpPlugins;
  // The client connection associated with this bind operation.
  private ClientConnection clientConnection;
@@ -194,7 +193,7 @@
    // Initialize a number of variables for use during the bind processing.
    clientConnection         = getClientConnection();
    returnAuthzID            = false;
    skipPostOperation        = false;
    executePostOpPlugins     = false;
    sizeLimit                = DirectoryServer.getSizeLimit();
    timeLimit                = DirectoryServer.getTimeLimit();
    lookthroughLimit         = DirectoryServer.getLookthroughLimit();
@@ -229,7 +228,6 @@
        setResultCode(ResultCode.INVALID_CREDENTIALS);
        setAuthFailureReason(ERR_BIND_AUTHZ_INSUFFICIENT_ACCESS_RIGHTS.get(
                                  String.valueOf(bindDN)));
        skipPostOperation = true;
        break bindProcessing;
      }
@@ -260,7 +258,7 @@
          {
            if (! processSimpleBind())
            {
              return;
              break bindProcessing;
            }
          }
          catch (DirectoryException de)
@@ -289,7 +287,7 @@
          {
            if (! processSASLBind())
            {
              return;
              break bindProcessing;
            }
          }
          catch (DirectoryException de)
@@ -316,7 +314,7 @@
        default:
          // Send a protocol error response to the client and disconnect.
          // NYI
          return;
          setResultCode(ResultCode.PROTOCOL_ERROR);
      }
    }
@@ -342,18 +340,16 @@
    // Invoke the post-operation bind plugins.
    if (! skipPostOperation)
    if (executePostOpPlugins)
    {
      PostOperationPluginResult postOpResult =
      PluginResult.PostOperation postOpResult =
           pluginConfigManager.invokePostOperationBindPlugins(this);
      if (postOpResult.connectionTerminated())
      if (!postOpResult.continueProcessing())
      {
        // There's no point in continuing with anything.  Log the result
        // and return.
        setResultCode(ResultCode.CANCELED);
        appendErrorMessage(ERR_CANCELED_BY_PREOP_DISCONNECT.get());
        setProcessingStopTime();
        return;
        setResultCode(postOpResult.getResultCode());
        appendErrorMessage(postOpResult.getErrorMessage());
        setMatchedDN(postOpResult.getMatchedDN());
        setReferralURLs(postOpResult.getReferralURLs());
      }
    }
@@ -421,9 +417,6 @@
        }
      }
    }
    // Stop the processing timer.
    setProcessingStopTime();
  }
@@ -448,7 +441,6 @@
        if (! AccessControlConfigManager.getInstance().
                 getAccessControlHandler(). isAllowed(bindDN, this, c))
        {
          skipPostOperation = true;
          throw new DirectoryException(ResultCode.INSUFFICIENT_ACCESS_RIGHTS,
                         ERR_CONTROL_INSUFFICIENT_ACCESS_RIGHTS.get(oid));
        }
@@ -557,7 +549,7 @@
      // Check to see if the user has a password.  If not, then fail.
      // FIXME -- We need to have a way to enable/disable debugging.
      pwPolicyState = new PasswordPolicyState(userEntry, false, false);
      pwPolicyState = new PasswordPolicyState(userEntry, false);
      policy = pwPolicyState.getPolicy();
      AttributeType  pwType = policy.getPasswordAttribute();
@@ -575,23 +567,17 @@
      // Invoke the pre-operation bind plugins.
      PreOperationPluginResult preOpResult =
           pluginConfigManager.invokePreOperationBindPlugins(this);
      if (preOpResult.connectionTerminated())
      executePostOpPlugins = true;
      PluginResult.PreOperation preOpResult =
          pluginConfigManager.invokePreOperationBindPlugins(this);
      if (!preOpResult.continueProcessing())
      {
        // There's no point in continuing with anything.  Log the result
        // and return.
        setResultCode(ResultCode.CANCELED);
        appendErrorMessage(ERR_CANCELED_BY_PREOP_DISCONNECT.get());
        setProcessingStopTime();
        setResultCode(preOpResult.getResultCode());
        appendErrorMessage(preOpResult.getErrorMessage());
        setMatchedDN(preOpResult.getMatchedDN());
        setReferralURLs(preOpResult.getReferralURLs());
        return false;
      }
      else if (preOpResult.sendResponseImmediately()  ||
               preOpResult.skipCoreProcessing())
      {
        skipPostOperation = false;
        return true;
      }
      // Determine whether the provided password matches any of the stored
@@ -719,23 +705,17 @@
    // Invoke the pre-operation bind plugins.
    PreOperationPluginResult preOpResult =
         pluginConfigManager.invokePreOperationBindPlugins(this);
    if (preOpResult.connectionTerminated())
    executePostOpPlugins = true;
    PluginResult.PreOperation preOpResult =
        pluginConfigManager.invokePreOperationBindPlugins(this);
    if (!preOpResult.continueProcessing())
    {
      // There's no point in continuing with anything.  Log the result
      // and return.
      setResultCode(ResultCode.CANCELED);
      appendErrorMessage(ERR_CANCELED_BY_PREOP_DISCONNECT.get());
      setProcessingStopTime();
      setResultCode(preOpResult.getResultCode());
      appendErrorMessage(preOpResult.getErrorMessage());
      setMatchedDN(preOpResult.getMatchedDN());
      setReferralURLs(preOpResult.getReferralURLs());
      return false;
    }
    else if (preOpResult.sendResponseImmediately() ||
             preOpResult.skipCoreProcessing())
    {
      skipPostOperation = true;
      return true;
    }
    setResultCode(ResultCode.SUCCESS);
    setAuthenticationInfo(new AuthenticationInfo());
@@ -773,23 +753,16 @@
    // Invoke the pre-operation bind plugins.
    PreOperationPluginResult preOpResult =
         pluginConfigManager.invokePreOperationBindPlugins(this);
    if (preOpResult.connectionTerminated())
    PluginResult.PreOperation preOpResult =
        pluginConfigManager.invokePreOperationBindPlugins(this);
    if (!preOpResult.continueProcessing())
    {
      // There's no point in continuing with anything.  Log the result
      // and return.
      setResultCode(ResultCode.CANCELED);
      appendErrorMessage(ERR_CANCELED_BY_PREOP_DISCONNECT.get());
      setProcessingStopTime();
      setResultCode(preOpResult.getResultCode());
      appendErrorMessage(preOpResult.getErrorMessage());
      setMatchedDN(preOpResult.getMatchedDN());
      setReferralURLs(preOpResult.getReferralURLs());
      return false;
    }
    else if (preOpResult.sendResponseImmediately() ||
             preOpResult.skipCoreProcessing())
    {
      skipPostOperation = false;
      return true;
    }
    // Actually process the SASL bind.
    saslHandler.processSASLBind(this);
@@ -822,8 +795,7 @@
    else
    {
      // FIXME -- Need to have a way to enable debugging.
      pwPolicyState = new PasswordPolicyState(saslAuthUserEntry, false,
                                              false);
      pwPolicyState = new PasswordPolicyState(saslAuthUserEntry, false);
      policy = pwPolicyState.getPolicy();
      setUserEntryDN(saslAuthUserEntry.getDN());
opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendCompareOperation.java
@@ -34,8 +34,7 @@
import org.opends.server.api.Backend;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.plugin.PostOperationPluginResult;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.controls.LDAPAssertionRequestControl;
import org.opends.server.controls.ProxiedAuthV1Control;
import org.opends.server.controls.ProxiedAuthV2Control;
@@ -45,19 +44,7 @@
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.PluginConfigManager;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeType;
import org.opends.server.types.AttributeValue;
import org.opends.server.types.Control;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.LDAPException;
import org.opends.server.types.LockManager;
import org.opends.server.types.Privilege;
import org.opends.server.types.ResultCode;
import org.opends.server.types.SearchFilter;
import org.opends.server.types.*;
import org.opends.server.types.operation.PostOperationCompareOperation;
import org.opends.server.types.operation.PostResponseCompareOperation;
import org.opends.server.types.operation.PreOperationCompareOperation;
@@ -89,9 +76,6 @@
  // The backend in which the comparison is to be performed.
  private Backend backend;
  // Indicates whether to skip post-operation processing.
  private boolean skipPostOperation;
  // The client connection for this operation.
  private ClientConnection clientConnection;
@@ -134,13 +118,16 @@
   *
   * @param  backend  The backend in which the compare operation should be
   *                  processed.
   *
   * @throws CanceledOperationException if this operation should be
   * cancelled
   */
  void processLocalCompare(Backend backend)
  {
  void processLocalCompare(Backend backend) throws CanceledOperationException {
    boolean executePostOpPlugins = false;
    this.backend = backend;
    clientConnection  = getClientConnection();
    skipPostOperation = false;
    // Get the plugin config manager that will be used for invoking plugins.
    PluginConfigManager pluginConfigManager =
@@ -152,10 +139,7 @@
    // Check for a request to cancel this operation.
    if (cancelIfRequested())
    {
      return;
    }
    checkIfCanceled(false);
    // Create a labeled block of code that we can break out of if a problem is
@@ -167,7 +151,6 @@
      entryDN = getEntryDN();
      if (entryDN == null)
      {
        skipPostOperation = true;
        break compareProcessing;
      }
@@ -179,16 +162,12 @@
      {
        appendErrorMessage(ERR_COMPARE_CONFIG_INSUFFICIENT_PRIVILEGES.get());
        setResultCode(ResultCode.INSUFFICIENT_ACCESS_RIGHTS);
        skipPostOperation = true;
        break compareProcessing;
      }
      // Check for a request to cancel this operation.
      if (cancelIfRequested())
      {
        return;
      }
      checkIfCanceled(false);
      // Grab a read lock on the entry.
@@ -208,7 +187,6 @@
        appendErrorMessage(ERR_COMPARE_CANNOT_LOCK_ENTRY.get(
                                String.valueOf(entryDN)));
        skipPostOperation = true;
        break compareProcessing;
      }
@@ -297,39 +275,25 @@
          setResultCode(ResultCode.INSUFFICIENT_ACCESS_RIGHTS);
          appendErrorMessage(ERR_COMPARE_AUTHZ_INSUFFICIENT_ACCESS_RIGHTS.get(
                                  String.valueOf(entryDN)));
          skipPostOperation = true;
          break compareProcessing;
        }
        // Check for a request to cancel this operation.
        if (cancelIfRequested())
        {
          return;
        }
        checkIfCanceled(false);
        // Invoke the pre-operation compare plugins.
        PreOperationPluginResult preOpResult =
        executePostOpPlugins = true;
        PluginResult.PreOperation preOpResult =
             pluginConfigManager.invokePreOperationComparePlugins(this);
        if (preOpResult.connectionTerminated())
        {
          // There's no point in continuing with anything.  Log the request and
          // result and return.
          setResultCode(ResultCode.CANCELED);
          appendErrorMessage(ERR_CANCELED_BY_PREOP_DISCONNECT.get());
          setProcessingStopTime();
          return;
        }
        else if (preOpResult.sendResponseImmediately())
        {
          skipPostOperation = true;
          break compareProcessing;
        }
        else if (preOpResult.skipCoreProcessing())
        {
          skipPostOperation = false;
          break compareProcessing;
        }
          if (!preOpResult.continueProcessing())
          {
            setResultCode(preOpResult.getResultCode());
            appendErrorMessage(preOpResult.getErrorMessage());
            setMatchedDN(preOpResult.getMatchedDN());
            setReferralURLs(preOpResult.getReferralURLs());
            break compareProcessing;
          }
        // Get the base attribute type and set of options.
@@ -415,22 +379,20 @@
    // Check for a request to cancel this operation.
    if (cancelIfRequested())
    {
      return;
    }
    checkIfCanceled(false);
    // Invoke the post-operation compare plugins.
    if (! skipPostOperation)
    if (executePostOpPlugins)
    {
      PostOperationPluginResult postOperationResult =
      PluginResult.PostOperation postOpResult =
           pluginConfigManager.invokePostOperationComparePlugins(this);
      if (postOperationResult.connectionTerminated())
      if (!postOpResult.continueProcessing())
      {
        setResultCode(ResultCode.CANCELED);
        appendErrorMessage(ERR_CANCELED_BY_POSTOP_DISCONNECT.get());
        return;
        setResultCode(postOpResult.getResultCode());
        appendErrorMessage(postOpResult.getErrorMessage());
        setMatchedDN(postOpResult.getMatchedDN());
        setReferralURLs(postOpResult.getReferralURLs());
      }
    }
  }
@@ -438,27 +400,6 @@
  /**
   * Checks to determine whether there has been a request to cancel this
   * operation.  If so, then set the cancel result and processing stop time.
   *
   * @return  {@code true} if there was a cancel request, or {@code false} if
   *          not.
   */
  private boolean cancelIfRequested()
  {
    if (getCancelRequest() == null)
    {
      return false;
    }
    indicateCancelled(getCancelRequest());
    setProcessingStopTime();
    return true;
  }
  /**
   * Performs any processing required for the controls included in the request.
   *
   * @throws  DirectoryException  If a problem occurs that should prevent the
@@ -478,7 +419,6 @@
        if (! AccessControlConfigManager.getInstance().
                   getAccessControlHandler().isAllowed(entryDN, this, c))
        {
          skipPostOperation = true;
          throw new DirectoryException(ResultCode.INSUFFICIENT_ACCESS_RIGHTS,
                         ERR_CONTROL_INSUFFICIENT_ACCESS_RIGHTS.get(oid));
        }
opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendDeleteOperation.java
@@ -37,8 +37,7 @@
import org.opends.server.api.ChangeNotificationListener;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.SynchronizationProvider;
import org.opends.server.api.plugin.PostOperationPluginResult;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.controls.LDAPAssertionRequestControl;
import org.opends.server.controls.LDAPPreReadRequestControl;
import org.opends.server.controls.LDAPPreReadResponseControl;
@@ -51,8 +50,7 @@
import org.opends.server.core.PluginConfigManager;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.AttributeType;
import org.opends.server.types.CancelledOperationException;
import org.opends.server.types.CancelResult;
import org.opends.server.types.CanceledOperationException;
import org.opends.server.types.Control;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DirectoryException;
@@ -101,9 +99,6 @@
  // Indicates whether the LDAP no-op control has been requested.
  private boolean noOp;
  // Indicates whether to skip post-operation processing.
  private boolean skipPostOperation;
  // The client connection on which this operation was requested.
  private ClientConnection clientConnection;
@@ -150,9 +145,13 @@
   *
   * @param  backend  The backend in which the delete operation should be
   *                  processed.
   *
   * @throws CanceledOperationException if this operation should be
   * cancelled
   */
  void processLocalDelete(Backend backend)
  {
  void processLocalDelete(Backend backend) throws CanceledOperationException {
    boolean executePostOpPlugins = false;
    this.backend = backend;
    clientConnection = getClientConnection();
@@ -160,13 +159,9 @@
    // Get the plugin config manager that will be used for invoking plugins.
    PluginConfigManager pluginConfigManager =
         DirectoryServer.getPluginConfigManager();
    skipPostOperation = false;
    // Check for a request to cancel this operation.
    if (cancelIfRequested())
    {
      return;
    }
    checkIfCanceled(false);
    // Create a labeled block of code that we can break out of if a problem is
    // detected.
@@ -256,8 +251,12 @@
          {
            SynchronizationProviderResult result =
                 provider.handleConflictResolution(this);
            if (! result.continueOperationProcessing())
            if (! result.continueProcessing())
            {
              setResultCode(result.getResultCode());
              appendErrorMessage(result.getErrorMessage());
              setMatchedDN(result.getMatchedDN());
              setReferralURLs(result.getReferralURLs());
              break deleteProcessing;
            }
          }
@@ -309,46 +308,33 @@
          setResultCode(ResultCode.INSUFFICIENT_ACCESS_RIGHTS);
          appendErrorMessage(ERR_DELETE_AUTHZ_INSUFFICIENT_ACCESS_RIGHTS.get(
                                  String.valueOf(entryDN)));
          skipPostOperation = true;
          break deleteProcessing;
        }
        // Check for a request to cancel this operation.
        if (cancelIfRequested())
        {
          return;
        }
        checkIfCanceled(false);
        // If the operation is not a synchronization operation,
        // invoke the pre-delete plugins.
        if (! isSynchronizationOperation())
        {
          PreOperationPluginResult preOpResult =
          executePostOpPlugins = true;
          PluginResult.PreOperation preOpResult =
               pluginConfigManager.invokePreOperationDeletePlugins(this);
          if (preOpResult.connectionTerminated())
          if (!preOpResult.continueProcessing())
          {
            // There's no point in continuing with anything.  Log the request
            // and result and return.
            setResultCode(ResultCode.CANCELED);
            appendErrorMessage(ERR_CANCELED_BY_PREOP_DISCONNECT.get());
            setProcessingStopTime();
            return;
          }
          else if (preOpResult.sendResponseImmediately() ||
                   preOpResult.skipCoreProcessing())
          {
            skipPostOperation = true;
            setResultCode(preOpResult.getResultCode());
            appendErrorMessage(preOpResult.getErrorMessage());
            setMatchedDN(preOpResult.getMatchedDN());
            setReferralURLs(preOpResult.getReferralURLs());
            break deleteProcessing;
          }
        }
        // Check for a request to cancel this operation.
        if (cancelIfRequested())
        {
          return;
        }
        checkIfCanceled(true);
        // Get the backend to use for the delete.  If there is none, then fail.
@@ -442,9 +428,13 @@
              try
              {
                SynchronizationProviderResult result =
                     provider.doPreOperation(this);
                if (! result.continueOperationProcessing())
                    provider.doPreOperation(this);
                if (! result.continueProcessing())
                {
                  setResultCode(result.getResultCode());
                  appendErrorMessage(result.getErrorMessage());
                  setMatchedDN(result.getMatchedDN());
                  setReferralURLs(result.getReferralURLs());
                  break deleteProcessing;
                }
              }
@@ -484,57 +474,34 @@
          setResponseData(de);
          break deleteProcessing;
        }
        catch (CancelledOperationException coe)
        {
          if (debugEnabled())
          {
            TRACER.debugCaught(DebugLogLevel.ERROR, coe);
          }
          CancelResult cancelResult = coe.getCancelResult();
          setCancelResult(cancelResult);
          setResultCode(cancelResult.getResultCode());
          Message message = coe.getMessageObject();
          if ((message != null) && (message.length() > 0))
          {
            appendErrorMessage(message);
          }
          break deleteProcessing;
        }
      }
      finally
      {
        LockManager.unlock(entryDN, entryLock);
        for (SynchronizationProvider provider :
             DirectoryServer.getSynchronizationProviders())
        {
          try
          {
            provider.doPostOperation(this);
          }
          catch (DirectoryException de)
          {
            if (debugEnabled())
            {
              TRACER.debugCaught(DebugLogLevel.ERROR, de);
            }
            logError(ERR_DELETE_SYNCH_POSTOP_FAILED.get(getConnectionID(),
                          getOperationID(), getExceptionMessage(de)));
            setResponseData(de);
            break;
          }
        }
      }
    }
    // Indicate that it is now too late to attempt to cancel the operation.
    setCancelResult(CancelResult.TOO_LATE);
    for (SynchronizationProvider provider :
        DirectoryServer.getSynchronizationProviders())
    {
      try
      {
        provider.doPostOperation(this);
      }
      catch (DirectoryException de)
      {
        if (debugEnabled())
        {
          TRACER.debugCaught(DebugLogLevel.ERROR, de);
        }
        logError(ERR_DELETE_SYNCH_POSTOP_FAILED.get(getConnectionID(),
            getOperationID(), getExceptionMessage(de)));
        setResponseData(de);
        break;
      }
    }
    // Invoke the post-operation or post-synchronization delete plugins.
    if (isSynchronizationOperation())
@@ -544,15 +511,16 @@
        pluginConfigManager.invokePostSynchronizationDeletePlugins(this);
      }
    }
    else if (! skipPostOperation)
    else if (executePostOpPlugins)
    {
      PostOperationPluginResult postOperationResult =
           pluginConfigManager.invokePostOperationDeletePlugins(this);
      if (postOperationResult.connectionTerminated())
      PluginResult.PostOperation postOpResult =
          pluginConfigManager.invokePostOperationDeletePlugins(this);
      if (!postOpResult.continueProcessing())
      {
        setResultCode(ResultCode.CANCELED);
        appendErrorMessage(ERR_CANCELED_BY_POSTOP_DISCONNECT.get());
        setProcessingStopTime();
        setResultCode(postOpResult.getResultCode());
        appendErrorMessage(postOpResult.getErrorMessage());
        setMatchedDN(postOpResult.getMatchedDN());
        setReferralURLs(postOpResult.getReferralURLs());
        return;
      }
    }
@@ -582,30 +550,6 @@
        }
      }
    }
    // Stop the processing timer.
    setProcessingStopTime();
  }
  /**
   * Checks to determine whether there has been a request to cancel this
   * operation.  If so, then set the cancel result and processing stop time.
   *
   * @return  {@code true} if there was a cancel request, or {@code false} if
   *          not.
   */
  private boolean cancelIfRequested()
  {
    if (getCancelRequest() == null)
    {
      return false;
    }
    indicateCancelled(getCancelRequest());
    setProcessingStopTime();
    return true;
  }
@@ -630,7 +574,6 @@
        if (!AccessControlConfigManager.getInstance().
                 getAccessControlHandler().isAllowed(entryDN, this, c))
        {
          skipPostOperation = true;
          throw new DirectoryException(ResultCode.INSUFFICIENT_ACCESS_RIGHTS,
                         ERR_CONTROL_INSUFFICIENT_ACCESS_RIGHTS.get(oid));
        }
opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyDNOperation.java
@@ -41,8 +41,7 @@
import org.opends.server.api.ChangeNotificationListener;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.SynchronizationProvider;
import org.opends.server.api.plugin.PostOperationPluginResult;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.controls.LDAPAssertionRequestControl;
import org.opends.server.controls.LDAPPostReadRequestControl;
import org.opends.server.controls.LDAPPostReadResponseControl;
@@ -61,8 +60,7 @@
import org.opends.server.types.AttributeType;
import org.opends.server.types.AttributeValue;
import org.opends.server.types.ByteString;
import org.opends.server.types.CancelledOperationException;
import org.opends.server.types.CancelResult;
import org.opends.server.types.CanceledOperationException;
import org.opends.server.types.Control;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DirectoryException;
@@ -115,9 +113,6 @@
  // Indicates whether the no-op control was included in the request.
  private boolean noOp;
  // Indicates whether to skip post-operation plugin processing.
  private boolean skipPostOperation;
  // The client connection on which this operation was requested.
  private ClientConnection clientConnection;
@@ -190,9 +185,13 @@
   *
   * @param  backend  The backend in which the modify DN operation should be
   *                  processed.
   *
   * @throws CanceledOperationException if this operation should be
   * cancelled
   */
  void processLocalModifyDN(Backend backend)
  {
  void processLocalModifyDN(Backend backend) throws CanceledOperationException {
    boolean executePostOpPlugins = false;
    this.backend = backend;
    clientConnection = getClientConnection();
@@ -200,13 +199,9 @@
    // Get the plugin config manager that will be used for invoking plugins.
    PluginConfigManager pluginConfigManager =
         DirectoryServer.getPluginConfigManager();
    skipPostOperation = false;
    // Check for a request to cancel this operation.
    if (cancelIfRequested())
    {
      return;
    }
    checkIfCanceled(false);
    // Create a labeled block of code that we can break out of if a problem is
    // detected.
@@ -220,7 +215,6 @@
      newRDN = getNewRDN();
      if (newRDN == null)
      {
        skipPostOperation = true;
        break modifyDNProcessing;
      }
@@ -228,7 +222,6 @@
      if ((newSuperior == null) &&
          (getRawNewSuperior() != null))
      {
        skipPostOperation = true;
        break modifyDNProcessing;
      }
@@ -283,10 +276,7 @@
      // Check for a request to cancel this operation.
      if (cancelIfRequested())
      {
        return;
      }
      checkIfCanceled(false);
      // Acquire write locks for the current and new DN.
@@ -305,7 +295,6 @@
        setResultCode(DirectoryServer.getServerErrorResultCode());
        appendErrorMessage(ERR_MODDN_CANNOT_LOCK_CURRENT_DN.get(
                                String.valueOf(entryDN)));
        skipPostOperation = true;
        break modifyDNProcessing;
      }
@@ -339,8 +328,6 @@
        appendErrorMessage(ERR_MODDN_EXCEPTION_LOCKING_NEW_DN.get(
                                String.valueOf(entryDN), String.valueOf(newDN),
                                getExceptionMessage(e)));
        skipPostOperation = true;
        break modifyDNProcessing;
      }
@@ -352,17 +339,13 @@
        appendErrorMessage(ERR_MODDN_CANNOT_LOCK_NEW_DN.get(
                                String.valueOf(entryDN),
                                String.valueOf(newDN)));
        skipPostOperation = true;
        break modifyDNProcessing;
      }
      try
      {
        // Check for a request to cancel this operation.
        if (cancelIfRequested())
        {
          return;
        }
        checkIfCanceled(false);
        // Get the current entry from the appropriate backend.  If it doesn't
@@ -424,8 +407,12 @@
          {
            SynchronizationProviderResult result =
                 provider.handleConflictResolution(this);
            if (! result.continueOperationProcessing())
            if (! result.continueProcessing())
            {
              setResultCode(result.getResultCode());
              appendErrorMessage(result.getErrorMessage());
              setMatchedDN(result.getMatchedDN());
              setReferralURLs(result.getReferralURLs());
              break modifyDNProcessing;
            }
          }
@@ -480,7 +467,6 @@
          setResultCode(ResultCode.INSUFFICIENT_ACCESS_RIGHTS);
          appendErrorMessage(ERR_MODDN_AUTHZ_INSUFFICIENT_ACCESS_RIGHTS.get(
                                  String.valueOf(entryDN)));
          skipPostOperation = true;
          break modifyDNProcessing;
        }
@@ -514,11 +500,7 @@
        // Check for a request to cancel this operation.
        if (cancelIfRequested())
        {
          return;
        }
        checkIfCanceled(false);
        // Get a count of the current number of modifications.  The
        // pre-operation plugins may alter this list, and we need to be able to
@@ -530,24 +512,15 @@
        // Invoke the pre-operation modify DN plugins.
        if (! isSynchronizationOperation())
        {
          PreOperationPluginResult preOpResult =
            pluginConfigManager.invokePreOperationModifyDNPlugins(this);
          if (preOpResult.connectionTerminated())
          executePostOpPlugins = true;
          PluginResult.PreOperation preOpResult =
              pluginConfigManager.invokePreOperationModifyDNPlugins(this);
          if (!preOpResult.continueProcessing())
          {
            // There's no point in continuing with anything.  Log the request
            // and result and return.
            setResultCode(ResultCode.CANCELED);
            appendErrorMessage(ERR_CANCELED_BY_PREOP_DISCONNECT.get());
            return;
          }
          else if (preOpResult.sendResponseImmediately())
          {
            skipPostOperation = true;
            break modifyDNProcessing;
          }
          else if (preOpResult.skipCoreProcessing())
          {
            skipPostOperation = false;
            setResultCode(preOpResult.getResultCode());
            appendErrorMessage(preOpResult.getErrorMessage());
            setMatchedDN(preOpResult.getMatchedDN());
            setReferralURLs(preOpResult.getReferralURLs());
            break modifyDNProcessing;
          }
        }
@@ -575,11 +548,7 @@
        // Check for a request to cancel this operation.
        if (cancelIfRequested())
        {
          return;
        }
        checkIfCanceled(true);
        // Actually perform the modify DN operation.
        // This should include taking
@@ -641,9 +610,13 @@
              try
              {
                SynchronizationProviderResult result =
                     provider.doPreOperation(this);
                if (! result.continueOperationProcessing())
                    provider.doPreOperation(this);
                if (! result.continueProcessing())
                {
                  setResultCode(result.getResultCode());
                  appendErrorMessage(result.getErrorMessage());
                  setMatchedDN(result.getMatchedDN());
                  setReferralURLs(result.getReferralURLs());
                  break modifyDNProcessing;
                }
              }
@@ -685,59 +658,34 @@
          setResponseData(de);
          break modifyDNProcessing;
        }
        catch (CancelledOperationException coe)
        {
          if (debugEnabled())
          {
            TRACER.debugCaught(DebugLogLevel.ERROR, coe);
          }
          CancelResult cancelResult = coe.getCancelResult();
          setCancelResult(cancelResult);
          setResultCode(cancelResult.getResultCode());
          Message message = coe.getMessageObject();
          if ((message != null) && (message.length() > 0))
          {
            appendErrorMessage(message);
          }
          break modifyDNProcessing;
        }
      }
      finally
      {
        LockManager.unlock(entryDN, currentLock);
        LockManager.unlock(newDN, newLock);
        for (SynchronizationProvider provider :
             DirectoryServer.getSynchronizationProviders())
        {
          try
          {
            provider.doPostOperation(this);
          }
          catch (DirectoryException de)
          {
            if (debugEnabled())
            {
              TRACER.debugCaught(DebugLogLevel.ERROR, de);
            }
            logError(ERR_MODDN_SYNCH_POSTOP_FAILED.get(getConnectionID(),
                          getOperationID(), getExceptionMessage(de)));
            setResponseData(de);
            break;
          }
        }
      }
    }
    for (SynchronizationProvider provider :
        DirectoryServer.getSynchronizationProviders())
    {
      try
      {
        provider.doPostOperation(this);
      }
      catch (DirectoryException de)
      {
        if (debugEnabled())
        {
          TRACER.debugCaught(DebugLogLevel.ERROR, de);
        }
    // Indicate that it is now too late to attempt to cancel the operation.
    setCancelResult(CancelResult.TOO_LATE);
        logError(ERR_MODDN_SYNCH_POSTOP_FAILED.get(getConnectionID(),
            getOperationID(), getExceptionMessage(de)));
        setResponseData(de);
        break;
      }
    }
    // Invoke the post-operation or post-synchronization modify DN plugins.
    if (isSynchronizationOperation())
@@ -747,14 +695,16 @@
        pluginConfigManager.invokePostSynchronizationModifyDNPlugins(this);
      }
    }
    else if (! skipPostOperation)
    else if (executePostOpPlugins)
    {
      PostOperationPluginResult postOperationResult =
      PluginResult.PostOperation postOpResult =
           pluginConfigManager.invokePostOperationModifyDNPlugins(this);
      if (postOperationResult.connectionTerminated())
      if (!postOpResult.continueProcessing())
      {
        setResultCode(ResultCode.CANCELED);
        appendErrorMessage(ERR_CANCELED_BY_POSTOP_DISCONNECT.get());
        setResultCode(postOpResult.getResultCode());
        appendErrorMessage(postOpResult.getErrorMessage());
        setMatchedDN(postOpResult.getMatchedDN());
        setReferralURLs(postOpResult.getReferralURLs());
        return;
      }
    }
@@ -789,27 +739,6 @@
  /**
   * Checks to determine whether there has been a request to cancel this
   * operation.  If so, then set the cancel result and processing stop time.
   *
   * @return  {@code true} if there was a cancel request, or {@code false} if
   *          not.
   */
  private boolean cancelIfRequested()
  {
    if (getCancelRequest() == null)
    {
      return false;
    }
    indicateCancelled(getCancelRequest());
    setProcessingStopTime();
    return true;
  }
  /**
   * Processes the set of controls included in the request.
   *
   * @throws  DirectoryException  If a problem occurs that should cause the
@@ -829,7 +758,6 @@
        if (! AccessControlConfigManager.getInstance().
                   getAccessControlHandler().isAllowed(entryDN,  this, c))
        {
          skipPostOperation = true;
          throw new DirectoryException(ResultCode.INSUFFICIENT_ACCESS_RIGHTS,
                         ERR_CONTROL_INSUFFICIENT_ACCESS_RIGHTS.get(oid));
        }
opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java
@@ -45,8 +45,7 @@
import org.opends.server.api.ClientConnection;
import org.opends.server.api.PasswordStorageScheme;
import org.opends.server.api.SynchronizationProvider;
import org.opends.server.api.plugin.PostOperationPluginResult;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.controls.LDAPAssertionRequestControl;
import org.opends.server.controls.LDAPPostReadRequestControl;
import org.opends.server.controls.LDAPPostReadResponseControl;
@@ -75,8 +74,7 @@
import org.opends.server.types.AttributeValue;
import org.opends.server.types.AuthenticationInfo;
import org.opends.server.types.ByteString;
import org.opends.server.types.CancelledOperationException;
import org.opends.server.types.CancelResult;
import org.opends.server.types.CanceledOperationException;
import org.opends.server.types.Control;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DirectoryException;
@@ -149,9 +147,6 @@
  // Indicates whether the password change is a self-change.
  private boolean selfChange;
  // Indicates whether to skip post-operation plugin processing.
  private boolean skipPostOperation;
  // Indicates whether the user's account was locked before this change.
  private boolean wasLocked;
@@ -299,9 +294,13 @@
   *
   * @param  backend  The backend in which the modify operation should be
   *                  performed.
   *
   * @throws CanceledOperationException if this operation should be
   * cancelled
   */
  void processLocalModify(Backend backend)
  {
  void processLocalModify(Backend backend) throws CanceledOperationException {
    boolean executePostOpPlugins = false;
    this.backend = backend;
    clientConnection = getClientConnection();
@@ -309,7 +308,9 @@
    // Get the plugin config manager that will be used for invoking plugins.
    PluginConfigManager pluginConfigManager =
      DirectoryServer.getPluginConfigManager();
    skipPostOperation = false;
    // Check for a request to cancel this operation.
    checkIfCanceled(false);
    // Create a labeled block of code that we can break out of if a problem is
    // detected.
@@ -367,10 +368,7 @@
      // Check for a request to cancel this operation.
      if (cancelIfRequested())
      {
        return;
      }
      checkIfCanceled(false);
      // Acquire a write lock on the target entry.
      Lock entryLock = null;
@@ -388,7 +386,6 @@
        setResultCode(DirectoryServer.getServerErrorResultCode());
        appendErrorMessage(ERR_MODIFY_CANNOT_LOCK_ENTRY.get(
                                String.valueOf(entryDN)));
        skipPostOperation = true;
        break modifyProcessing;
      }
@@ -396,10 +393,7 @@
      try
      {
        // Check for a request to cancel this operation.
        if (cancelIfRequested())
        {
          return;
        }
        checkIfCanceled(false);
        try
@@ -418,8 +412,7 @@
          // FIXME -- Need a way to enable debug mode.
          pwPolicyState = new PasswordPolicyState(currentEntry, false,
                                                  TimeThread.getTime(), true,
                                                  false);
                                                  TimeThread.getTime(), true);
        }
        catch (DirectoryException de)
        {
@@ -446,9 +439,13 @@
            try
            {
              SynchronizationProviderResult result =
                provider.handleConflictResolution(this);
              if (! result.continueOperationProcessing())
                  provider.handleConflictResolution(this);
              if (! result.continueProcessing())
              {
                setResultCode(result.getResultCode());
                appendErrorMessage(result.getErrorMessage());
                setMatchedDN(result.getMatchedDN());
                setReferralURLs(result.getReferralURLs());
                break modifyProcessing;
              }
            }
@@ -501,7 +498,6 @@
          setResultCode(ResultCode.INSUFFICIENT_ACCESS_RIGHTS);
          appendErrorMessage(ERR_MODIFY_AUTHZ_INSUFFICIENT_ACCESS_RIGHTS.get(
                                  String.valueOf(entryDN)));
          skipPostOperation = true;
          break modifyProcessing;
        }
@@ -558,45 +554,28 @@
        // Check for a request to cancel this operation.
        if (cancelIfRequested())
        {
          return;
        }
        checkIfCanceled(false);
        // If the operation is not a synchronization operation,
        // Invoke the pre-operation modify plugins.
        if (! isSynchronizationOperation())
        {
          PreOperationPluginResult preOpResult =
          executePostOpPlugins = true;
          PluginResult.PreOperation preOpResult =
            pluginConfigManager.invokePreOperationModifyPlugins(this);
          if (preOpResult.connectionTerminated())
          if (!preOpResult.continueProcessing())
          {
            // There's no point in continuing with anything.  Log the result
            // and return.
            setResultCode(ResultCode.CANCELED);
            appendErrorMessage(ERR_CANCELED_BY_PREOP_DISCONNECT.get());
            setProcessingStopTime();
            return;
          }
          else if (preOpResult.sendResponseImmediately())
          {
            skipPostOperation = true;
            break modifyProcessing;
          }
          else if (preOpResult.skipCoreProcessing())
          {
            skipPostOperation = false;
            setResultCode(preOpResult.getResultCode());
            appendErrorMessage(preOpResult.getErrorMessage());
            setMatchedDN(preOpResult.getMatchedDN());
            setReferralURLs(preOpResult.getReferralURLs());
            break modifyProcessing;
          }
        }
        // Check for a request to cancel this operation.
        if (cancelIfRequested())
        {
          return;
        }
        checkIfCanceled(true);
        // Actually perform the modify operation.  This should also include
        // taking care of any synchronization that might be needed.
@@ -639,9 +618,13 @@
              try
              {
                SynchronizationProviderResult result =
                     provider.doPreOperation(this);
                if (! result.continueOperationProcessing())
                    provider.doPreOperation(this);
                if (! result.continueProcessing())
                {
                  setResultCode(result.getResultCode());
                  appendErrorMessage(result.getErrorMessage());
                  setMatchedDN(result.getMatchedDN());
                  setReferralURLs(result.getReferralURLs());
                  break modifyProcessing;
                }
              }
@@ -692,53 +675,33 @@
          setResponseData(de);
          break modifyProcessing;
        }
        catch (CancelledOperationException coe)
        {
          if (debugEnabled())
          {
            TRACER.debugCaught(DebugLogLevel.ERROR, coe);
          }
          CancelResult cancelResult = coe.getCancelResult();
          setCancelResult(cancelResult);
          setResultCode(cancelResult.getResultCode());
          Message message = coe.getMessageObject();
          if (message != null)
          {
            appendErrorMessage(message);
          }
          break modifyProcessing;
        }
      }
      finally
      {
        LockManager.unlock(entryDN, entryLock);
        for (SynchronizationProvider provider :
          DirectoryServer.getSynchronizationProviders())
        {
          try
          {
            provider.doPostOperation(this);
          }
          catch (DirectoryException de)
          {
            if (debugEnabled())
            {
              TRACER.debugCaught(DebugLogLevel.ERROR, de);
            }
            logError(ERR_MODIFY_SYNCH_POSTOP_FAILED.get(getConnectionID(),
                          getOperationID(), getExceptionMessage(de)));
            setResponseData(de);
            break;
          }
        }
      }
    }
    for (SynchronizationProvider provider :
        DirectoryServer.getSynchronizationProviders())
    {
      try
      {
        provider.doPostOperation(this);
      }
      catch (DirectoryException de)
      {
        if (debugEnabled())
        {
          TRACER.debugCaught(DebugLogLevel.ERROR, de);
        }
        logError(ERR_MODIFY_SYNCH_POSTOP_FAILED.get(getConnectionID(),
            getOperationID(), getExceptionMessage(de)));
        setResponseData(de);
        break;
      }
    }
    // If the password policy request control was included, then make sure we
    // send the corresponding response control.
@@ -748,10 +711,6 @@
                                                           pwpErrorType));
    }
    // Indicate that it is now too late to attempt to cancel the operation.
    setCancelResult(CancelResult.TOO_LATE);
    // Invoke the post-operation or post-synchronization modify plugins.
    if (isSynchronizationOperation())
    {
@@ -760,18 +719,17 @@
        pluginConfigManager.invokePostSynchronizationModifyPlugins(this);
      }
    }
    else if (! skipPostOperation)
    else if (executePostOpPlugins)
    {
      // FIXME -- Should this also be done while holding the locks?
      PostOperationPluginResult postOpResult =
      PluginResult.PostOperation postOpResult =
           pluginConfigManager.invokePostOperationModifyPlugins(this);
      if (postOpResult.connectionTerminated())
      if (!postOpResult.continueProcessing())
      {
        // There's no point in continuing with anything.  Log the result and
        // return.
        setResultCode(ResultCode.CANCELED);
        appendErrorMessage(ERR_CANCELED_BY_PREOP_DISCONNECT.get());
        setProcessingStopTime();
        setResultCode(postOpResult.getResultCode());
        appendErrorMessage(postOpResult.getErrorMessage());
        setMatchedDN(postOpResult.getMatchedDN());
        setReferralURLs(postOpResult.getReferralURLs());
        return;
      }
    }
@@ -783,31 +741,6 @@
    {
      notifyChangeListeners();
    }
    // Stop the processing timer.
    setProcessingStopTime();
  }
  /**
   * Checks to determine whether there has been a request to cancel this
   * operation.  If so, then set the cancel result and processing stop time.
   *
   * @return  {@code true} if there was a cancel request, or {@code false} if
   *          not.
   */
  private boolean cancelIfRequested()
  {
    if (getCancelRequest() == null)
    {
      return false;
    }
    indicateCancelled(getCancelRequest());
    setProcessingStopTime();
    return true;
  }
@@ -878,7 +811,6 @@
        if (! AccessControlConfigManager.getInstance().
                   getAccessControlHandler().isAllowed(entryDN, this, c))
        {
          skipPostOperation = true;
          throw new DirectoryException(ResultCode.INSUFFICIENT_ACCESS_RIGHTS,
                         ERR_CONTROL_INSUFFICIENT_ACCESS_RIGHTS.get(oid));
        }
opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendSearchOperation.java
@@ -30,11 +30,9 @@
import java.util.List;
import org.opends.messages.Message;
import org.opends.server.api.Backend;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.plugin.PostOperationPluginResult;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.controls.LDAPAssertionRequestControl;
import org.opends.server.controls.MatchedValuesControl;
import org.opends.server.controls.PersistentSearchControl;
@@ -47,8 +45,7 @@
import org.opends.server.core.SearchOperationWrapper;
import org.opends.server.core.SearchOperation;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.CancelResult;
import org.opends.server.types.CancelledOperationException;
import org.opends.server.types.CanceledOperationException;
import org.opends.server.types.Control;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DirectoryException;
@@ -93,9 +90,6 @@
  // only be false if it's a persistent search with changesOnly=true.
  private boolean processSearch;
  // Indicates whether to skip post-operation plugin processing.
  private boolean skipPostOperation;
  // The client connection for the search operation.
  private ClientConnection clientConnection;
@@ -129,9 +123,13 @@
   *
   * @param  backend  The backend in which the search operation should be
   *                  performed.
   *
   * @throws CanceledOperationException if this operation should be
   * cancelled
   */
  void processLocalSearch(Backend backend)
  {
  void processLocalSearch(Backend backend) throws CanceledOperationException {
    boolean executePostOpPlugins = false;
    this.backend = backend;
    clientConnection = getClientConnection();
@@ -139,9 +137,11 @@
    // Get the plugin config manager that will be used for invoking plugins.
    PluginConfigManager pluginConfigManager =
      DirectoryServer.getPluginConfigManager();
    skipPostOperation = false;
    processSearch = true;
    // Check for a request to cancel this operation.
    checkIfCanceled(false);
    // Create a labeled block of code that we can break out of if a problem is
    // detected.
searchProcessing:
@@ -186,46 +186,29 @@
        setResultCode(ResultCode.INSUFFICIENT_ACCESS_RIGHTS);
        appendErrorMessage(ERR_SEARCH_AUTHZ_INSUFFICIENT_ACCESS_RIGHTS.get(
                                String.valueOf(baseDN)));
        skipPostOperation = true;
        break searchProcessing;
      }
      // Check for a request to cancel this operation.
      if (cancelIfRequested())
      {
        return;
      }
      checkIfCanceled(false);
      // Invoke the pre-operation search plugins.
      PreOperationPluginResult preOpResult =
           pluginConfigManager.invokePreOperationSearchPlugins(this);
      if (preOpResult.connectionTerminated())
      executePostOpPlugins = true;
      PluginResult.PreOperation preOpResult =
          pluginConfigManager.invokePreOperationSearchPlugins(this);
      if (!preOpResult.continueProcessing())
      {
        // There's no point in continuing with anything.  Log the request and
        // result and return.
        setResultCode(ResultCode.CANCELED);
        appendErrorMessage(ERR_CANCELED_BY_PREOP_DISCONNECT.get());
        setProcessingStopTime();
        return;
      }
      else if (preOpResult.sendResponseImmediately())
      {
        skipPostOperation = true;
        break searchProcessing;
      }
      else if (preOpResult.skipCoreProcessing())
      {
        skipPostOperation = false;
        setResultCode(preOpResult.getResultCode());
        appendErrorMessage(preOpResult.getErrorMessage());
        setMatchedDN(preOpResult.getMatchedDN());
        setReferralURLs(preOpResult.getReferralURLs());
        break searchProcessing;
      }
      // Check for a request to cancel this operation.
      if (cancelIfRequested())
      {
        return;
      }
      checkIfCanceled(false);
      // Get the backend that should hold the search base.  If there is none,
@@ -277,33 +260,6 @@
        break searchProcessing;
      }
      catch (CancelledOperationException coe)
      {
        if (debugEnabled())
        {
          TRACER.debugCaught(DebugLogLevel.ERROR, coe);
        }
        CancelResult cancelResult = coe.getCancelResult();
        setCancelResult(cancelResult);
        setResultCode(cancelResult.getResultCode());
        Message message = coe.getMessageObject();
        if ((message != null) && (message.length() > 0))
        {
          appendErrorMessage(message);
        }
        if (persistentSearch != null)
        {
          DirectoryServer.deregisterPersistentSearch(persistentSearch);
          setSendResponse(true);
        }
        skipPostOperation = true;
        break searchProcessing;
      }
      catch (Exception e)
      {
        if (debugEnabled())
@@ -321,57 +277,30 @@
          setSendResponse(true);
        }
        skipPostOperation = true;
        break searchProcessing;
      }
    }
    // Check for a request to cancel this operation.
    if (cancelIfRequested())
    {
      return;
    }
    checkIfCanceled(false);
    // Invoke the post-operation search plugins.
    if (! skipPostOperation)
    if (executePostOpPlugins)
    {
      PostOperationPluginResult postOperationResult =
      PluginResult.PostOperation postOpResult =
           pluginConfigManager.invokePostOperationSearchPlugins(this);
      if (postOperationResult.connectionTerminated())
      if (!postOpResult.continueProcessing())
      {
        setResultCode(ResultCode.CANCELED);
        appendErrorMessage(ERR_CANCELED_BY_POSTOP_DISCONNECT.get());
        setProcessingStopTime();
        return;
        setResultCode(postOpResult.getResultCode());
        appendErrorMessage(postOpResult.getErrorMessage());
        setMatchedDN(postOpResult.getMatchedDN());
        setReferralURLs(postOpResult.getReferralURLs());
      }
    }
  }
  /**
   * Checks to determine whether there has been a request to cancel this
   * operation.  If so, then set the cancel result and processing stop time.
   *
   * @return  {@code true} if there was a cancel request, or {@code false} if
   *          not.
   */
  private boolean cancelIfRequested()
  {
    if (getCancelRequest() == null)
    {
      return false;
    }
    indicateCancelled(getCancelRequest());
    setProcessingStopTime();
    return true;
  }
  /**
   * Handles any controls contained in the request.
   *
@@ -391,7 +320,6 @@
        if (! AccessControlConfigManager.getInstance().
                   getAccessControlHandler().isAllowed(baseDN, this, c))
        {
          skipPostOperation = true;
          throw new DirectoryException(ResultCode.INSUFFICIENT_ACCESS_RIGHTS,
                         ERR_CONTROL_INSUFFICIENT_ACCESS_RIGHTS.get(oid));
        }
opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendWorkflowElement.java
@@ -45,14 +45,7 @@
import org.opends.server.core.ModifyDNOperation;
import org.opends.server.core.ModifyOperation;
import org.opends.server.core.SearchOperation;
import org.opends.server.types.ConfigChangeResult;
import org.opends.server.types.Control;
import org.opends.server.types.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.InitializationException;
import org.opends.server.types.Operation;
import org.opends.server.types.ResultCode;
import org.opends.server.types.SearchResultReference;
import org.opends.server.types.*;
import org.opends.server.workflowelement.LeafWorkflowElement;
@@ -341,8 +334,7 @@
  /**
   * {@inheritDoc}
   */
  public void execute(Operation operation)
  {
  public void execute(Operation operation) throws CanceledOperationException {
    switch (operation.getOperationType())
    {
      case BIND:
opends/tests/unit-tests-testng/src/server/org/opends/server/api/plugin/DirectoryServerPluginTestCase.java
@@ -44,6 +44,7 @@
import org.opends.server.types.DisconnectReason;
import org.opends.server.types.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.CanceledOperationException;
import org.opends.server.types.operation.*;
import org.opends.server.TestCaseUtils;
import org.opends.messages.Message;
@@ -193,7 +194,7 @@
    sigList = new LinkedList<String>();
    sigList.add("doStartup");
    sigList.add("org.opends.server.api.plugin.StartupPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$Startup");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
@@ -204,13 +205,13 @@
    sigList = new LinkedList<String>();
    sigList.add("doPostConnect");
    sigList.add("org.opends.server.api.plugin.PostConnectPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostConnect");
    sigList.add("org.opends.server.api.ClientConnection");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostDisconnect");
    sigList.add("org.opends.server.api.plugin.PostDisconnectPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostDisconnect");
    sigList.add("org.opends.server.api.ClientConnection");
    sigList.add("org.opends.server.types.DisconnectReason");
    sigList.add("org.opends.messages.Message");
@@ -218,252 +219,266 @@
    sigList = new LinkedList<String>();
    sigList.add("doLDIFImport");
    sigList.add("org.opends.server.api.plugin.LDIFPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$ImportLDIF");
    sigList.add("org.opends.server.types.LDIFImportConfig");
    sigList.add("org.opends.server.types.Entry");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doLDIFExport");
    sigList.add("org.opends.server.api.plugin.LDIFPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$ImportLDIF");
    sigList.add("org.opends.server.types.LDIFExportConfig");
    sigList.add("org.opends.server.types.Entry");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreParse");
    sigList.add("org.opends.server.api.plugin.PreParsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreParse");
    sigList.add("org.opends.server.types.operation.PreParseAbandonOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreParse");
    sigList.add("org.opends.server.api.plugin.PreParsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreParse");
    sigList.add("org.opends.server.types.operation.PreParseModifyOperation");
    sigList.add("org.opends.server.types.CanceledOperationException");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreParse");
    sigList.add("org.opends.server.api.plugin.PreParsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreParse");
    sigList.add("org.opends.server.types.operation.PreParseAddOperation");
    sigList.add("org.opends.server.types.CanceledOperationException");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreParse");
    sigList.add("org.opends.server.api.plugin.PreParsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreParse");
    sigList.add("org.opends.server.types.operation.PreParseBindOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreParse");
    sigList.add("org.opends.server.api.plugin.PreParsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreParse");
    sigList.add("org.opends.server.types.operation.PreParseCompareOperation");
    sigList.add("org.opends.server.types.CanceledOperationException");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreParse");
    sigList.add("org.opends.server.api.plugin.PreParsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreParse");
    sigList.add("org.opends.server.types.operation.PreParseDeleteOperation");
    sigList.add("org.opends.server.types.CanceledOperationException");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreParse");
    sigList.add("org.opends.server.api.plugin.PreParsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreParse");
    sigList.add("org.opends.server.types.operation.PreParseExtendedOperation");
    sigList.add("org.opends.server.types.CanceledOperationException");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreParse");
    sigList.add("org.opends.server.api.plugin.PreParsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreParse");
    sigList.add("org.opends.server.types.operation.PreParseUnbindOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreParse");
    sigList.add("org.opends.server.api.plugin.PreParsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreParse");
    sigList.add("org.opends.server.types.operation.PreParseModifyDNOperation");
    sigList.add("org.opends.server.types.CanceledOperationException");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreParse");
    sigList.add("org.opends.server.api.plugin.PreParsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreParse");
    sigList.add("org.opends.server.types.operation.PreParseSearchOperation");
    sigList.add("org.opends.server.types.CanceledOperationException");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreOperation");
    sigList.add("org.opends.server.api.plugin.PreOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreOperation");
    sigList.add("org.opends.server.types.operation." +
                "PreOperationExtendedOperation");
    sigList.add("org.opends.server.types.CanceledOperationException");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreOperation");
    sigList.add("org.opends.server.api.plugin.PreOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreOperation");
    sigList.add("org.opends.server.types.operation." +
                "PreOperationDeleteOperation");
    sigList.add("org.opends.server.types.CanceledOperationException");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreOperation");
    sigList.add("org.opends.server.api.plugin.PreOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreOperation");
    sigList.add("org.opends.server.types.operation.PreOperationBindOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreOperation");
    sigList.add("org.opends.server.api.plugin.PreOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreOperation");
    sigList.add("org.opends.server.types.operation." +
                "PreOperationSearchOperation");
    sigList.add("org.opends.server.types.CanceledOperationException");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreOperation");
    sigList.add("org.opends.server.api.plugin.PreOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreOperation");
    sigList.add("org.opends.server.types.operation.PreOperationAddOperation");
    sigList.add("org.opends.server.types.CanceledOperationException");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreOperation");
    sigList.add("org.opends.server.api.plugin.PreOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreOperation");
    sigList.add("org.opends.server.types.operation."+
                "PreOperationCompareOperation");
    sigList.add("org.opends.server.types.CanceledOperationException");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreOperation");
    sigList.add("org.opends.server.api.plugin.PreOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreOperation");
    sigList.add("org.opends.server.types.operation." +
                "PreOperationModifyOperation");
    sigList.add("org.opends.server.types.CanceledOperationException");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPreOperation");
    sigList.add("org.opends.server.api.plugin.PreOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PreOperation");
    sigList.add("org.opends.server.types.operation." +
                "PreOperationModifyDNOperation");
    sigList.add("org.opends.server.types.CanceledOperationException");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostOperation");
    sigList.add("org.opends.server.api.plugin.PostOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostOperation");
    sigList.add("org.opends.server.types.operation." +
                "PostOperationCompareOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostOperation");
    sigList.add("org.opends.server.api.plugin.PostOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostOperation");
    sigList.add("org.opends.server.types.operation." +
                "PostOperationModifyDNOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostOperation");
    sigList.add("org.opends.server.api.plugin.PostOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostOperation");
    sigList.add("org.opends.server.types.operation." +
                "PostOperationExtendedOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostOperation");
    sigList.add("org.opends.server.api.plugin.PostOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostOperation");
    sigList.add("org.opends.server.types.operation." +
                "PostOperationBindOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostOperation");
    sigList.add("org.opends.server.api.plugin.PostOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostOperation");
    sigList.add("org.opends.server.types.operation." +
                "PostOperationAbandonOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostOperation");
    sigList.add("org.opends.server.api.plugin.PostOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostOperation");
    sigList.add("org.opends.server.types.operation." +
                "PostOperationUnbindOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostOperation");
    sigList.add("org.opends.server.api.plugin.PostOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostOperation");
    sigList.add("org.opends.server.types.operation." +
                "PostOperationModifyOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostOperation");
    sigList.add("org.opends.server.api.plugin.PostOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostOperation");
    sigList.add("org.opends.server.types.operation.PostOperationAddOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostOperation");
    sigList.add("org.opends.server.api.plugin.PostOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostOperation");
    sigList.add("org.opends.server.types.operation." +
                "PostOperationDeleteOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostOperation");
    sigList.add("org.opends.server.api.plugin.PostOperationPluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostOperation");
    sigList.add("org.opends.server.types.operation." +
                "PostOperationSearchOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostResponse");
    sigList.add("org.opends.server.api.plugin.PostResponsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostResponse");
    sigList.add("org.opends.server.types.operation." +
                "PostResponseCompareOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostResponse");
    sigList.add("org.opends.server.api.plugin.PostResponsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostResponse");
    sigList.add("org.opends.server.types.operation." +
                "PostResponseDeleteOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostResponse");
    sigList.add("org.opends.server.api.plugin.PostResponsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostResponse");
    sigList.add("org.opends.server.types.operation." +
                "PostResponseSearchOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostResponse");
    sigList.add("org.opends.server.api.plugin.PostResponsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostResponse");
    sigList.add("org.opends.server.types.operation." +
                "PostResponseExtendedOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostResponse");
    sigList.add("org.opends.server.api.plugin.PostResponsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostResponse");
    sigList.add("org.opends.server.types.operation." +
                "PostResponseModifyOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostResponse");
    sigList.add("org.opends.server.api.plugin.PostResponsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostResponse");
    sigList.add("org.opends.server.types.operation." +
                "PostResponseModifyDNOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostResponse");
    sigList.add("org.opends.server.api.plugin.PostResponsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostResponse");
    sigList.add("org.opends.server.types.operation.PostResponseAddOperation");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("doPostResponse");
    sigList.add("org.opends.server.api.plugin.PostResponsePluginResult");
    sigList.add("org.opends.server.api.plugin.PluginResult$PostResponse");
    sigList.add("org.opends.server.types.operation.PostResponseBindOperation");
    expectedPublicMethods.add(sigList);
@@ -497,14 +512,16 @@
    sigList = new LinkedList<String>();
    sigList.add("processSearchEntry");
    sigList.add("org.opends.server.api.plugin.SearchEntryPluginResult");
    sigList.add("org.opends.server.api.plugin." +
        "PluginResult$IntermediateResponse");
    sigList.add("org.opends.server.types.operation.SearchEntrySearchOperation");
    sigList.add("org.opends.server.types.SearchResultEntry");
    expectedPublicMethods.add(sigList);
    sigList = new LinkedList<String>();
    sigList.add("processSearchReference");
    sigList.add("org.opends.server.api.plugin.SearchReferencePluginResult");
    sigList.add("org.opends.server.api.plugin." +
        "PluginResult$IntermediateResponse");
    sigList.add("org.opends.server.types.operation." +
                "SearchReferenceSearchOperation");
    sigList.add("org.opends.server.types.SearchResultReference");
@@ -512,7 +529,8 @@
    sigList = new LinkedList<String>();
    sigList.add("processSubordinateModifyDN");
    sigList.add("org.opends.server.api.plugin.SubordinateModifyDNPluginResult");
    sigList.add("org.opends.server.api.plugin." +
        "PluginResult$SubordinateModifyDN");
    sigList.add("org.opends.server.types.operation." +
                "SubordinateModifyDNOperation");
    sigList.add("org.opends.server.types.Entry");
@@ -523,7 +541,7 @@
    sigList = new LinkedList<String>();
    sigList.add("processIntermediateResponse");
    sigList.add("org.opends.server.api.plugin." +
                "IntermediateResponsePluginResult");
        "PluginResult$IntermediateResponse");
    sigList.add("org.opends.server.types.IntermediateResponse");
    expectedPublicMethods.add(sigList);
@@ -984,8 +1002,7 @@
   * exception for add operations.
   */
  @Test(expectedExceptions = { UnsupportedOperationException.class })
  public void testDoPreParseAdd()
  {
  public void testDoPreParseAdd() throws CanceledOperationException {
    new NullPlugin().doPreParse((PreParseAddOperation) null);
  }
@@ -1008,8 +1025,7 @@
   * exception for compare operations.
   */
  @Test(expectedExceptions = { UnsupportedOperationException.class })
  public void testDoPreParseCompare()
  {
  public void testDoPreParseCompare() throws CanceledOperationException {
    new NullPlugin().doPreParse((PreParseCompareOperation) null);
  }
@@ -1020,8 +1036,7 @@
   * exception for delete operations.
   */
  @Test(expectedExceptions = { UnsupportedOperationException.class })
  public void testDoPreParseDelete()
  {
  public void testDoPreParseDelete() throws CanceledOperationException {
    new NullPlugin().doPreParse((PreParseDeleteOperation) null);
  }
@@ -1032,8 +1047,7 @@
   * exception for extended operations.
   */
  @Test(expectedExceptions = { UnsupportedOperationException.class })
  public void testDoPreParseExtended()
  {
  public void testDoPreParseExtended() throws CanceledOperationException {
    new NullPlugin().doPreParse((PreParseExtendedOperation) null);
  }
@@ -1044,8 +1058,7 @@
   * exception for modify operations.
   */
  @Test(expectedExceptions = { UnsupportedOperationException.class })
  public void testDoPreParseModify()
  {
  public void testDoPreParseModify() throws CanceledOperationException {
    new NullPlugin().doPreParse((PreParseModifyOperation) null);
  }
@@ -1056,8 +1069,7 @@
   * exception for modify DN operations.
   */
  @Test(expectedExceptions = { UnsupportedOperationException.class })
  public void testDoPreParseModifyDN()
  {
  public void testDoPreParseModifyDN() throws CanceledOperationException {
    new NullPlugin().doPreParse((PreParseModifyDNOperation) null);
  }
@@ -1068,8 +1080,7 @@
   * exception for search operations.
   */
  @Test(expectedExceptions = { UnsupportedOperationException.class })
  public void testDoPreParseSearch()
  {
  public void testDoPreParseSearch() throws CanceledOperationException {
    new NullPlugin().doPreParse((PreParseSearchOperation) null);
  }
@@ -1092,8 +1103,7 @@
   * exception for add operations.
   */
  @Test(expectedExceptions = { UnsupportedOperationException.class })
  public void testDoPreOperationAdd()
  {
  public void testDoPreOperationAdd() throws CanceledOperationException {
    new NullPlugin().doPreOperation((PreOperationAddOperation) null);
  }
@@ -1116,8 +1126,7 @@
   * exception for compare operations.
   */
  @Test(expectedExceptions = { UnsupportedOperationException.class })
  public void testDoPreOperationCompare()
  {
  public void testDoPreOperationCompare() throws CanceledOperationException {
    new NullPlugin().doPreOperation((PreOperationCompareOperation) null);
  }
@@ -1128,8 +1137,7 @@
   * exception for delete operations.
   */
  @Test(expectedExceptions = { UnsupportedOperationException.class })
  public void testDoPreOperationDelete()
  {
  public void testDoPreOperationDelete() throws CanceledOperationException {
    new NullPlugin().doPreOperation((PreOperationDeleteOperation) null);
  }
@@ -1140,8 +1148,7 @@
   * exception for extended operations.
   */
  @Test(expectedExceptions = { UnsupportedOperationException.class })
  public void testDoPreOperationExtended()
  {
  public void testDoPreOperationExtended() throws CanceledOperationException {
    new NullPlugin().doPreOperation((PreOperationExtendedOperation) null);
  }
@@ -1152,8 +1159,7 @@
   * exception for modify operations.
   */
  @Test(expectedExceptions = { UnsupportedOperationException.class })
  public void testDoPreOperationModify()
  {
  public void testDoPreOperationModify() throws CanceledOperationException {
    new NullPlugin().doPreOperation((PreOperationModifyOperation) null);
  }
@@ -1164,8 +1170,7 @@
   * exception for modify DN operations.
   */
  @Test(expectedExceptions = { UnsupportedOperationException.class })
  public void testDoPreOperationModifyDN()
  {
  public void testDoPreOperationModifyDN() throws CanceledOperationException {
    new NullPlugin().doPreOperation((PreOperationModifyDNOperation) null);
  }
@@ -1176,8 +1181,7 @@
   * exception for search operations.
   */
  @Test(expectedExceptions = { UnsupportedOperationException.class })
  public void testDoPreOperationSearch()
  {
  public void testDoPreOperationSearch() throws CanceledOperationException {
    new NullPlugin().doPreOperation((PreOperationSearchOperation) null);
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/api/plugin/IntermediateResponsePluginResultTestCase.java
File was deleted
opends/tests/unit-tests-testng/src/server/org/opends/server/api/plugin/LDIFPluginResultTestCase.java
File was deleted
opends/tests/unit-tests-testng/src/server/org/opends/server/api/plugin/PostConnectPluginResultTestCase.java
File was deleted
opends/tests/unit-tests-testng/src/server/org/opends/server/api/plugin/PostDisconnectPluginResultTestCase.java
File was deleted
opends/tests/unit-tests-testng/src/server/org/opends/server/api/plugin/PostOperationPluginResultTestCase.java
File was deleted
opends/tests/unit-tests-testng/src/server/org/opends/server/api/plugin/PostResponsePluginResultTestCase.java
File was deleted
opends/tests/unit-tests-testng/src/server/org/opends/server/api/plugin/PreOperationPluginResultTestCase.java
File was deleted
opends/tests/unit-tests-testng/src/server/org/opends/server/api/plugin/PreParsePluginResultTestCase.java
File was deleted
opends/tests/unit-tests-testng/src/server/org/opends/server/api/plugin/SearchEntryPluginResultTestCase.java
File was deleted
opends/tests/unit-tests-testng/src/server/org/opends/server/api/plugin/SearchReferencePluginResultTestCase.java
File was deleted
opends/tests/unit-tests-testng/src/server/org/opends/server/api/plugin/StartupPluginResultTestCase.java
File was deleted
opends/tests/unit-tests-testng/src/server/org/opends/server/core/AbandonOperationTestCase.java
@@ -148,8 +148,9 @@
    CancelRequest cancelRequest = new CancelRequest(true,
            Message.raw("Test Cancel"));
    assertEquals(abandonOperation.cancel(cancelRequest),
                 CancelResult.CANNOT_CANCEL);
    assertEquals(abandonOperation.cancel(cancelRequest).getResultCode(),
                 ResultCode.CANNOT_CANCEL);
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/core/AddOperationTestCase.java
@@ -44,34 +44,12 @@
import org.opends.server.plugins.DisconnectClientPlugin;
import org.opends.server.plugins.ShortCircuitPlugin;
import org.opends.server.plugins.UpdatePreOpPlugin;
import org.opends.server.protocols.asn1.ASN1Element;
import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.protocols.asn1.ASN1Reader;
import org.opends.server.protocols.asn1.ASN1Sequence;
import org.opends.server.protocols.asn1.ASN1Writer;
import org.opends.server.plugins.DelayPreOpPlugin;
import org.opends.server.protocols.asn1.*;
import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.protocols.ldap.AddRequestProtocolOp;
import org.opends.server.protocols.ldap.AddResponseProtocolOp;
import org.opends.server.protocols.ldap.BindRequestProtocolOp;
import org.opends.server.protocols.ldap.BindResponseProtocolOp;
import org.opends.server.protocols.ldap.LDAPAttribute;
import org.opends.server.protocols.ldap.LDAPMessage;
import org.opends.server.protocols.ldap.*;
import org.opends.server.tools.LDAPModify;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeType;
import org.opends.server.types.AttributeValue;
import org.opends.server.types.ByteString;
import org.opends.server.types.CancelRequest;
import org.opends.server.types.Control;
import org.opends.server.types.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.LockManager;
import org.opends.server.types.ObjectClass;
import org.opends.server.types.Operation;
import org.opends.server.types.RawAttribute;
import org.opends.server.types.ResultCode;
import org.opends.server.types.WritabilityMode;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.*;
import static org.testng.Assert.*;
@@ -1992,11 +1970,47 @@
    CancelRequest cancelRequest = new CancelRequest(false,
                                                    Message.raw("testCancelBeforeStartup"));
    addOperation.setCancelRequest(cancelRequest);
    addOperation.abort(cancelRequest);
    addOperation.run();
    assertEquals(addOperation.getResultCode(), ResultCode.CANCELED);
  }
  /**
   * Tests an add operation that gets canceled before startup.
   *
   * @throws  Exception  If an unexpected probem occurs.
   */
  @Test()
  public void testCancelAfterOperation()
         throws Exception
  {
    TestCaseUtils.initializeTestBackend(true);
    Entry entry = TestCaseUtils.makeEntry(
         "dn: ou=People,o=test",
         "objectClass: top",
         "objectClass: organizationalUnit",
         "ou: People");
    InternalClientConnection conn =
         InternalClientConnection.getRootConnection();
    AddOperationBasis addOperation =
         new AddOperationBasis(conn, conn.nextOperationID(), conn.nextMessageID(),
                          null, entry.getDN(), entry.getObjectClasses(),
                          entry.getUserAttributes(),
                          entry.getOperationalAttributes());
    addOperation.run();
    CancelRequest cancelRequest = new CancelRequest(false,
                                                    Message.raw("testCancelAfterOperation"));
    CancelResult cancelResult = addOperation.cancel(cancelRequest);
    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
    assertEquals(cancelResult.getResultCode(), ResultCode.TOO_LATE);
  }
  /**
opends/tests/unit-tests-testng/src/server/org/opends/server/core/BindOperationTestCase.java
@@ -53,23 +53,12 @@
import org.opends.server.protocols.ldap.LDAPResultCode;
import org.opends.server.tools.LDAPSearch;
import org.opends.server.tools.dsconfig.DSConfig;
import org.opends.server.types.Attribute;
import org.opends.server.types.AuthenticationInfo;
import org.opends.server.types.AuthenticationType;
import org.opends.server.types.ByteString;
import org.opends.server.types.Control;
import org.opends.server.types.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.Modification;
import org.opends.server.types.ModificationType;
import org.opends.server.types.Operation;
import org.opends.server.types.OperationType;
import org.opends.server.types.ResultCode;
import org.opends.server.types.*;
import static org.testng.Assert.*;
import static org.opends.server.protocols.ldap.LDAPConstants.*;
import org.opends.messages.Message;
/**
@@ -2297,5 +2286,37 @@
      );
    }
  }
  /**
   * Tests the <CODE>cancel</CODE> method to ensure that it indicates that the
   * operation cannot be cancelled.
   */
  @Test(dataProvider = "simpleBinds")
  public void testCancel(BindOperation bindOperation)
  {
    CancelRequest cancelRequest =
         new CancelRequest(false, Message.raw("Test Unbind Cancel"));
    assertEquals(bindOperation.cancel(cancelRequest).getResultCode(),
                 ResultCode.CANNOT_CANCEL);
  }
  /**
   * Tests the <CODE>getCancelRequest</CODE> method to ensure that it always
   * returns <CODE>null</CODE>.
   */
  @Test(dataProvider = "simpleBinds")
  public void testGetCancelRequest(BindOperation bindOperation)
  {
    CancelRequest cancelRequest =
         new CancelRequest(false, Message.raw("Test Unbind Cancel"));
    assertNull(bindOperation.getCancelRequest());
    assertEquals(bindOperation.cancel(cancelRequest).getResultCode(),
                 ResultCode.CANNOT_CANCEL);
    assertNull(bindOperation.getCancelRequest());
  }
}
opends/tests/unit-tests-testng/src/server/org/opends/server/core/DeleteOperationTestCase.java
@@ -51,19 +51,11 @@
import org.opends.server.protocols.ldap.DeleteRequestProtocolOp;
import org.opends.server.protocols.ldap.LDAPMessage;
import org.opends.server.tools.LDAPDelete;
import org.opends.server.types.ByteString;
import org.opends.server.types.CancelRequest;
import org.opends.server.types.Control;
import org.opends.server.types.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.LockManager;
import org.opends.server.types.Operation;
import org.opends.server.types.ResultCode;
import org.opends.server.types.WritabilityMode;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.*;
import org.opends.server.workflowelement.localbackend.LocalBackendDeleteOperation;
import static org.testng.Assert.*;
import static org.testng.Assert.assertEquals;
import static org.opends.server.protocols.ldap.LDAPConstants.*;
@@ -181,7 +173,7 @@
   * non-null, then was changed to null; because of the call to the
   * <CODE>setRawEntry<CODE> method, and becomes non-null again because
   * of the call to the <CODE>getEntryDN</CODE> again.
   *
   *
   *
   * @throws  Exception  If an unexpected problem occurs.
   */
@@ -814,11 +806,39 @@
    CancelRequest cancelRequest = new CancelRequest(false,
                                                    Message.raw("testCancelBeforeStartup"));
    deleteOperation.setCancelRequest(cancelRequest);
    deleteOperation.abort(cancelRequest);
    deleteOperation.run();
    assertEquals(deleteOperation.getResultCode(), ResultCode.CANCELED);
  }
  /**
   * Tests a delete operation that gets canceled before startup.
   *
   * @throws  Exception  If an unexpected probem occurs.
   */
  @Test()
  public void testCancelAfterOperation()
         throws Exception
  {
    TestCaseUtils.initializeTestBackend(true);
    InternalClientConnection conn =
         InternalClientConnection.getRootConnection();
    DeleteOperationBasis deleteOperation =
         new DeleteOperationBasis(conn, conn.nextOperationID(), conn.nextMessageID(),
                             null, new ASN1OctetString("o=test"));
    deleteOperation.run();
    CancelRequest cancelRequest = new CancelRequest(false,
                                                    Message.raw("testCancelAfterOperation"));
    CancelResult cancelResult = deleteOperation.cancel(cancelRequest);
    assertEquals(deleteOperation.getResultCode(), ResultCode.SUCCESS);
    assertEquals(cancelResult.getResultCode(), ResultCode.TOO_LATE);
  }
  /**
opends/tests/unit-tests-testng/src/server/org/opends/server/core/ModifyOperationTestCase.java
@@ -630,7 +630,7 @@
    ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
    values.add(new ASN1OctetString("foo"));
    LDAPAttribute attr = new LDAPAttribute("mail", values);
    LDAPAttribute attr = new LDAPAttribute("description", values);
    ArrayList<RawModification> mods = new ArrayList<RawModification>();
    mods.add(new LDAPModification(ModificationType.REPLACE, attr));
@@ -661,7 +661,7 @@
    ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
    values.add(new ASN1OctetString("foo"));
    LDAPAttribute attr = new LDAPAttribute("mail", values);
    LDAPAttribute attr = new LDAPAttribute("description", values);
    ArrayList<RawModification> mods = new ArrayList<RawModification>();
    mods.add(new LDAPModification(ModificationType.REPLACE, attr));
@@ -1135,7 +1135,7 @@
    ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
    values.add(new ASN1OctetString("Foo"));
    values.add(new ASN1OctetString("Foo"));
    LDAPAttribute attr = new LDAPAttribute("mail", values);
    LDAPAttribute attr = new LDAPAttribute("description", values);
    ArrayList<RawModification> mods = new ArrayList<RawModification>();
    mods.add(new LDAPModification(ModificationType.REPLACE, attr));
@@ -1954,7 +1954,7 @@
    ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
    values.add(new ASN1OctetString("bar"));
    LDAPAttribute attr = new LDAPAttribute("mail", values);
    LDAPAttribute attr = new LDAPAttribute("description", values);
    ArrayList<RawModification> mods = new ArrayList<RawModification>();
    mods.add(new LDAPModification(ModificationType.REPLACE, attr));
@@ -2224,7 +2224,7 @@
    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
    LDAPAttribute attr = new LDAPAttribute("mail");
    LDAPAttribute attr = new LDAPAttribute("description");
    ArrayList<RawModification> mods = new ArrayList<RawModification>();
    mods.add(new LDAPModification(ModificationType.REPLACE, attr));
@@ -2272,7 +2272,7 @@
    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
    LDAPAttribute attr = new LDAPAttribute("mail");
    LDAPAttribute attr = new LDAPAttribute("description");
    ArrayList<RawModification> mods = new ArrayList<RawModification>();
    mods.add(new LDAPModification(ModificationType.REPLACE, attr));
@@ -2322,7 +2322,7 @@
    ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
    values.add(new ASN1OctetString("foo"));
    LDAPAttribute attr = new LDAPAttribute("mail", values);
    LDAPAttribute attr = new LDAPAttribute("description", values);
    ArrayList<RawModification> mods = new ArrayList<RawModification>();
    mods.add(new LDAPModification(ModificationType.REPLACE, attr));
@@ -3083,7 +3083,7 @@
    ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
    values.add(new ASN1OctetString("notnumeric"));
    LDAPAttribute attr = new LDAPAttribute("mail", values);
    LDAPAttribute attr = new LDAPAttribute("description", values);
    ArrayList<RawModification> mods = new ArrayList<RawModification>();
    mods.add(new LDAPModification(ModificationType.INCREMENT, attr));
@@ -4079,7 +4079,7 @@
    ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
    values.add(new ASN1OctetString("foo"));
    LDAPAttribute attr = new LDAPAttribute("mail", values);
    LDAPAttribute attr = new LDAPAttribute("description", values);
    ArrayList<RawModification> mods = new ArrayList<RawModification>();
    mods.add(new LDAPModification(ModificationType.REPLACE, attr));
@@ -4090,7 +4090,7 @@
    CancelRequest cancelRequest = new CancelRequest(false,
                                                    Message.raw("testCancelBeforeStartup"));
    modifyOperation.setCancelRequest(cancelRequest);
    modifyOperation.abort(cancelRequest);
    modifyOperation.run();
    assertEquals(modifyOperation.getResultCode(), ResultCode.CANCELED);
  }
@@ -4098,6 +4098,42 @@
  /**
   * Tests a modify operation that gets canceled before startup.
   *
   * @throws  Exception  If an unexpected probem occurs.
   */
  @Test(dataProvider = "baseDNs")
  public void testCancelAfterOperation(String baseDN)
         throws Exception
  {
    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
    InternalClientConnection conn =
         InternalClientConnection.getRootConnection();
    ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
    values.add(new ASN1OctetString("foo"));
    LDAPAttribute attr = new LDAPAttribute("description", values);
    ArrayList<RawModification> mods = new ArrayList<RawModification>();
    mods.add(new LDAPModification(ModificationType.REPLACE, attr));
    ModifyOperationBasis modifyOperation =
         new ModifyOperationBasis(conn, conn.nextOperationID(), conn.nextMessageID(),
                             null, new ASN1OctetString(baseDN), mods);
    modifyOperation.run();
    CancelRequest cancelRequest = new CancelRequest(false,
                                                    Message.raw("testCancelBeforeStartup"));
    CancelResult cancelResponse = modifyOperation.cancel(cancelRequest);
    assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
    assertEquals(cancelResponse.getResultCode(), ResultCode.TOO_LATE);
  }
  /**
   * Tests a modify operation in which the server cannot obtain a lock on the
   * target entry because there is already a read lock held on it.
   *
@@ -4118,7 +4154,7 @@
      ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
      values.add(new ASN1OctetString("foo"));
      LDAPAttribute attr = new LDAPAttribute("mail", values);
      LDAPAttribute attr = new LDAPAttribute("description", values);
      ArrayList<RawModification> mods = new ArrayList<RawModification>();
      mods.add(new LDAPModification(ModificationType.REPLACE, attr));
@@ -4165,7 +4201,7 @@
    ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
    values.add(new ASN1OctetString("foo"));
    LDAPAttribute attr = new LDAPAttribute("mail", values);
    LDAPAttribute attr = new LDAPAttribute("description", values);
    ArrayList<RawModification> mods = new ArrayList<RawModification>();
    mods.add(new LDAPModification(ModificationType.REPLACE, attr));
@@ -4284,7 +4320,7 @@
    ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
    values.add(new ASN1OctetString("foo"));
    LDAPAttribute attr = new LDAPAttribute("mail", values);
    LDAPAttribute attr = new LDAPAttribute("description", values);
    ArrayList<RawModification> mods = new ArrayList<RawModification>();
    mods.add(new LDAPModification(ModificationType.REPLACE, attr));
@@ -4296,13 +4332,41 @@
              "PostOperation"));
    w.writeElement(message.encode());
    ASN1Element element = r.readElement();
    if (element != null)
    // The operation should NOT be aborted at the post operation stage. While
    // the plugin can disconnect the client, the modify should have already
    // been committed to the backend and a SUCCESS COULD get back to the
    // client.
responseLoop:
    while (true)
    {
      // If we got an element back, then it must be a notice of disconnect
      // unsolicited notification.
      ASN1Element element = r.readElement();
      if (element == null)
      {
        // The connection has been closed.
        break responseLoop;
      }
      message = LDAPMessage.decode(element.decodeAsSequence());
      assertEquals(message.getProtocolOpType(), OP_TYPE_EXTENDED_RESPONSE);
      switch (message.getProtocolOpType())
      {
        case OP_TYPE_MODIFY_RESPONSE:
          // This was expected.  The disconnect didn't happen until after the
          // response was sent.
          break;
        case OP_TYPE_EXTENDED_RESPONSE:
          // The server is notifying us that it will be closing the connection.
          break responseLoop;
        default:
          // This is a problem.  It's an unexpected response.
          try
          {
            s.close();
          } catch (Exception e) {}
          throw new Exception("Unexpected response message " + message +
                              " encountered in " +
                              "testDisconnectInPostOperationModify");
      }
    }
    try
@@ -4344,7 +4408,7 @@
    ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
    values.add(new ASN1OctetString("foo"));
    LDAPAttribute attr = new LDAPAttribute("mail", values);
    LDAPAttribute attr = new LDAPAttribute("description", values);
    ArrayList<RawModification> mods = new ArrayList<RawModification>();
    mods.add(new LDAPModification(ModificationType.REPLACE, attr));
opends/tests/unit-tests-testng/src/server/org/opends/server/core/TestModifyDNOperation.java
@@ -47,6 +47,7 @@
import org.opends.server.plugins.InvocationCounterPlugin;
import org.opends.server.plugins.ShortCircuitPlugin;
import org.opends.server.tools.LDAPModify;
import org.opends.messages.Message;
import java.util.ArrayList;
import java.util.List;
@@ -466,6 +467,12 @@
                               null);
    modifyDNOperation.run();
    CancelRequest cancelRequest = new CancelRequest(false,
                                                    Message.raw("testCancelBeforeStartup"));
    CancelResult cancelResult = modifyDNOperation.cancel(cancelRequest);
    assertEquals(cancelResult.getResultCode(), ResultCode.TOO_LATE);
    assertEquals(modifyDNOperation.getResultCode(),
                 ResultCode.SUCCESS);
    assertEquals(modifyDNOperation.getErrorMessage().length(), 0);
@@ -1483,5 +1490,28 @@
      InvocationCounterPlugin.resetAllCounters();
    }
  }
  @Test
  public void testCancelBeforeStartup() throws Exception
  {
    ArrayList<Control> noControls = new ArrayList<Control>(0);
    InvocationCounterPlugin.resetAllCounters();
    InternalClientConnection conn =
         InternalClientConnection.getRootConnection();
    ModifyDNOperationBasis modifyDNOperation =
         new ModifyDNOperationBasis(conn, conn.nextOperationID(), conn.nextMessageID(),
                               noControls,
                               DN.decode("uid=user.invalid,ou=People,dc=example,dc=com"),
                               RDN.decode("uid=user.test0"), true,
                               DN.decode("dc=example,dc=com"));
    CancelRequest cancelRequest = new CancelRequest(false,
                                                    Message.raw("testCancelBeforeStartup"));
    modifyDNOperation.abort(cancelRequest);
    modifyDNOperation.run();
    assertEquals(modifyDNOperation.getResultCode(), ResultCode.CANCELED);
  }
}
opends/tests/unit-tests-testng/src/server/org/opends/server/core/UnbindOperationTestCase.java
@@ -36,10 +36,7 @@
import org.opends.messages.Message;
import org.opends.server.plugins.InvocationCounterPlugin;
import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.types.CancelRequest;
import org.opends.server.types.CancelResult;
import org.opends.server.types.Control;
import org.opends.server.types.Operation;
import org.opends.server.types.*;
import static org.testng.Assert.*;
@@ -131,8 +128,8 @@
    UnbindOperationBasis unbindOperation =
         new UnbindOperationBasis(conn, conn.nextOperationID(),
                             conn.nextMessageID(), new ArrayList<Control>());
    assertEquals(unbindOperation.cancel(cancelRequest),
                 CancelResult.CANNOT_CANCEL);
    assertEquals(unbindOperation.cancel(cancelRequest).getResultCode(),
                 ResultCode.CANNOT_CANCEL);
  }
@@ -155,8 +152,8 @@
                             conn.nextMessageID(), new ArrayList<Control>());
    assertNull(unbindOperation.getCancelRequest());
    assertEquals(unbindOperation.cancel(cancelRequest),
                 CancelResult.CANNOT_CANCEL);
    assertEquals(unbindOperation.cancel(cancelRequest).getResultCode(),
                 ResultCode.CANNOT_CANCEL);
    assertNull(unbindOperation.getCancelRequest());
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CancelExtendedOperationTestCase.java
@@ -38,6 +38,7 @@
import org.opends.server.TestCaseUtils;
import org.opends.server.core.AddOperation;
import org.opends.server.core.AbandonOperationBasis;
import org.opends.server.plugins.DelayPreOpPlugin;
import org.opends.server.protocols.asn1.ASN1Element;
import org.opends.server.protocols.asn1.ASN1Integer;
@@ -67,23 +68,14 @@
import org.opends.server.protocols.ldap.ModifyDNResponseProtocolOp;
import org.opends.server.protocols.ldap.SearchRequestProtocolOp;
import org.opends.server.protocols.ldap.SearchResultDoneProtocolOp;
import org.opends.server.types.Attribute;
import org.opends.server.types.Control;
import org.opends.server.types.DereferencePolicy;
import org.opends.server.types.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.Modification;
import org.opends.server.types.ModificationType;
import org.opends.server.types.RawAttribute;
import org.opends.server.types.RawModification;
import org.opends.server.types.ResultCode;
import org.opends.server.types.SearchScope;
import org.opends.server.types.*;
import static org.testng.Assert.*;
import static org.testng.Assert.assertEquals;
import static org.opends.server.protocols.ldap.LDAPConstants.*;
import static org.opends.server.util.ServerConstants.*;
import org.opends.messages.Message;
/**
@@ -848,5 +840,56 @@
    socket.close();
  }
  /**
   * Tests the ability to cancel an extended operation.
   *
   * @throws  Exception  If an unexpected problem occurs.
   */
  @Test()
  public void testCancelCancelExtendedOperation()
         throws Exception
  {
    TestCaseUtils.initializeTestBackend(true);
    // Create a new connection to the Directory Server and authenticate as
    // the Directory Manager.
    Socket socket = new Socket("127.0.0.1", TestCaseUtils.getServerLdapPort());
    ASN1Reader reader = new ASN1Reader(socket);
    ASN1Writer writer = new ASN1Writer(socket);
    BindRequestProtocolOp bindRequest =
         new BindRequestProtocolOp(new ASN1OctetString("cn=Directory Manager"),
                                   3, new ASN1OctetString("password"));
    LDAPMessage message = new LDAPMessage(1, bindRequest);
    writer.writeElement(message.encode());
    message = LDAPMessage.decode(reader.readElement().decodeAsSequence());
    BindResponseProtocolOp bindResponse = message.getBindResponseProtocolOp();
    assertEquals(bindResponse.getResultCode(), LDAPResultCode.SUCCESS);
    // Create a self cancelling request and send it to the server. Make sure
    // to include the delay request control so it won't complete before we
    // can send the cancel request.
    ArrayList<ASN1Element> sequenceElements = new ArrayList<ASN1Element>(1);
    sequenceElements.add(new ASN1Integer(2));
    ASN1Sequence valueSequence = new ASN1Sequence(sequenceElements);
    ASN1OctetString extendedValue = new ASN1OctetString(valueSequence.encode());
    ExtendedRequestProtocolOp extendedRequest =
        new ExtendedRequestProtocolOp(OID_CANCEL_REQUEST, extendedValue);
    message = new LDAPMessage(2, extendedRequest);
    writer.writeElement(message.encode());
    message = LDAPMessage.decode(reader.readElement().decodeAsSequence());
    ExtendedResponseProtocolOp extendedResponse =
        message.getExtendedResponseProtocolOp();
    assertEquals(extendedResponse.getResultCode(),
        LDAPResultCode.CANNOT_CANCEL);
    socket.close();
  }
}
opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/ErrorLogAccountStatusNotificationHandlerTestCase.java
@@ -257,7 +257,7 @@
               DirectoryServer.getEntry(DN.decode("uid=test.user,o=test"));
    PasswordPolicyState pwPolicyState =
         new PasswordPolicyState(userEntry, false, false);
         new PasswordPolicyState(userEntry, false);
    PasswordPolicy policy = pwPolicyState.getPolicy();
    HashMap<AccountStatusNotificationProperty,List<String>>
opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java
@@ -35,13 +35,14 @@
import org.opends.server.admin.std.server.PluginCfg;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.config.ConfigException;
import org.opends.server.protocols.asn1.ASN1Long;
import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.protocols.ldap.LDAPControl;
import org.opends.server.types.Control;
import org.opends.server.types.ResultCode;
import org.opends.server.types.CanceledOperationException;
import org.opends.server.types.operation.*;
import org.opends.messages.Message;
@@ -115,9 +116,9 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationAddOperation addOperation)
  {
      throws CanceledOperationException {
    return doPreOperationInternal(addOperation);
  }
@@ -127,10 +128,18 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
       doPreOperation(PreOperationBindOperation bindOperation)
  public PluginResult.PreOperation
         doPreOperation(PreOperationBindOperation bindOperation)
  {
    return doPreOperationInternal(bindOperation);
    try
    {
      return doPreOperationInternal(bindOperation);
    }
    catch(CanceledOperationException coe)
    {
      // Bind ops can't be canceled. Just ignore.
      return PluginResult.PreOperation.continueOperationProcessing();
    }
  }
@@ -139,9 +148,9 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
       doPreOperation(PreOperationCompareOperation compareOperation)
  {
  public PluginResult.PreOperation
         doPreOperation(PreOperationCompareOperation compareOperation)
      throws CanceledOperationException {
    return doPreOperationInternal(compareOperation);
  }
@@ -151,9 +160,9 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationDeleteOperation deleteOperation)
  {
      throws CanceledOperationException {
    return doPreOperationInternal(deleteOperation);
  }
@@ -163,9 +172,9 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationExtendedOperation extendedOperation)
  {
      throws CanceledOperationException {
    return doPreOperationInternal(extendedOperation);
  }
@@ -175,9 +184,9 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationModifyOperation modifyOperation)
  {
      throws CanceledOperationException {
    return doPreOperationInternal(modifyOperation);
  }
@@ -187,9 +196,9 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationModifyDNOperation modifyDNOperation)
  {
      throws CanceledOperationException {
    return doPreOperationInternal(modifyDNOperation);
  }
@@ -199,9 +208,9 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationSearchOperation searchOperation)
  {
      throws CanceledOperationException {
    return doPreOperationInternal(searchOperation);
  }
@@ -217,9 +226,9 @@
   *
   * @return  The result of the plugin processing.
   */
  private PreOperationPluginResult
  private PluginResult.PreOperation
       doPreOperationInternal(PreOperationOperation operation)
  {
      throws CanceledOperationException {
    long delayDuration = 0L;
    List<Control> requestControls = operation.getRequestControls();
    if (requestControls != null)
@@ -235,10 +244,10 @@
          }
          catch (Exception e)
          {
            operation.setResultCode(ResultCode.PROTOCOL_ERROR);
            operation.appendErrorMessage(Message.raw("Unable to decode the delay request " +
                                         "control:  " + e));
            return new PreOperationPluginResult(false, false, true);
            return PluginResult.PreOperation.stopProcessing(
                ResultCode.PROTOCOL_ERROR,
                Message.raw("Unable to decode the delay request control:  " +
                    e));
          }
        }
      }
@@ -246,16 +255,13 @@
    if (delayDuration <= 0)
    {
      return PreOperationPluginResult.SUCCESS;
      return PluginResult.PreOperation.continueOperationProcessing();
    }
    long stopSleepTime = System.currentTimeMillis() + delayDuration;
    while (System.currentTimeMillis() < stopSleepTime)
    {
      if (operation.getCancelRequest() != null)
      {
        break;
      }
      operation.checkIfCanceled(false);
      try
      {
@@ -263,7 +269,7 @@
      } catch (Exception e) {}
    }
    return new PreOperationPluginResult(false, false, false);
    return PluginResult.PreOperation.continueOperationProcessing();
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DisconnectClientPlugin.java
@@ -33,18 +33,13 @@
import java.util.Set;
import org.opends.server.admin.std.server.PluginCfg;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.PostOperationPluginResult;
import org.opends.server.api.plugin.PostResponsePluginResult;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.PreParsePluginResult;
import org.opends.server.api.plugin.*;
import org.opends.server.config.ConfigException;
import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.protocols.ldap.LDAPControl;
import org.opends.server.types.Control;
import org.opends.server.types.DisconnectReason;
import org.opends.server.types.CanceledOperationException;
import org.opends.server.types.operation.*;
import org.opends.messages.Message;
@@ -155,17 +150,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
       doPreParse(PreParseAbandonOperation abandonOperation)
  public PluginResult.PreParse doPreParse(
      PreParseAbandonOperation abandonOperation)
  {
    if (disconnectInternal(abandonOperation, "PreParse"))
    {
      return new PreParsePluginResult(true, false, false);
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
    }
    disconnectInternal(abandonOperation, "PreParse");
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -174,16 +163,13 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult doPreParse(PreParseAddOperation addOperation)
  {
  public PluginResult.PreParse doPreParse(PreParseAddOperation addOperation)
      throws CanceledOperationException {
    if (disconnectInternal(addOperation, "PreParse"))
    {
      return new PreParsePluginResult(true, false, false);
      addOperation.checkIfCanceled(false);
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
    }
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -192,16 +178,10 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult doPreParse(PreParseBindOperation bindOperation)
  public PluginResult.PreParse doPreParse(PreParseBindOperation bindOperation)
  {
    if (disconnectInternal(bindOperation, "PreParse"))
    {
      return new PreParsePluginResult(true, false, false);
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
    }
    disconnectInternal(bindOperation, "PreParse");
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -210,17 +190,14 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseCompareOperation compareOperation)
  {
       throws CanceledOperationException {
    if (disconnectInternal(compareOperation, "PreParse"))
    {
      return new PreParsePluginResult(true, false, false);
      compareOperation.checkIfCanceled(false);
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
    }
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -229,17 +206,14 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseDeleteOperation deleteOperation)
  {
       throws CanceledOperationException {
    if (disconnectInternal(deleteOperation, "PreParse"))
    {
      return new PreParsePluginResult(true, false, false);
      deleteOperation.checkIfCanceled(false);
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
    }
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -248,17 +222,14 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseExtendedOperation extendedOperation)
  {
       throws CanceledOperationException {
    if (disconnectInternal(extendedOperation, "PreParse"))
    {
      return new PreParsePluginResult(true, false, false);
      extendedOperation.checkIfCanceled(false);
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
    }
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -267,17 +238,14 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseModifyOperation modifyOperation)
  {
       throws CanceledOperationException {
    if (disconnectInternal(modifyOperation, "PreParse"))
    {
      return new PreParsePluginResult(true, false, false);
      modifyOperation.checkIfCanceled(false);
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
    }
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -286,17 +254,14 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseModifyDNOperation modifyDNOperation)
  {
       throws CanceledOperationException {
    if (disconnectInternal(modifyDNOperation, "PreParse"))
    {
      return new PreParsePluginResult(true, false, false);
      modifyDNOperation.checkIfCanceled(false);
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
    }
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -305,17 +270,14 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseSearchOperation searchOperation)
  {
       throws CanceledOperationException {
    if (disconnectInternal(searchOperation, "PreParse"))
    {
      return new PreParsePluginResult(true, false, false);
      searchOperation.checkIfCanceled(false);
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
    }
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -324,17 +286,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseUnbindOperation unbindOperation)
  {
    if (disconnectInternal(unbindOperation, "PreParse"))
    {
      return new PreParsePluginResult(true, false, false);
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
    }
    disconnectInternal(unbindOperation, "PreParse");
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -343,17 +299,14 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationAddOperation addOperation)
  {
       throws CanceledOperationException {
    if (disconnectInternal(addOperation, "PreOperation"))
    {
      return new PreOperationPluginResult(true, false, false);
      addOperation.checkIfCanceled(false);
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
    }
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -362,17 +315,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationBindOperation bindOperation)
  {
    if (disconnectInternal(bindOperation, "PreOperation"))
    {
      return new PreOperationPluginResult(true, false, false);
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
    }
    disconnectInternal(bindOperation, "PreOperation");
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -381,17 +328,14 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationCompareOperation compareOperation)
  {
       throws CanceledOperationException {
    if (disconnectInternal(compareOperation, "PreOperation"))
    {
      return new PreOperationPluginResult(true, false, false);
      compareOperation.checkIfCanceled(false);
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
    }
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -400,17 +344,14 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationDeleteOperation deleteOperation)
  {
       throws CanceledOperationException {
    if (disconnectInternal(deleteOperation, "PreOperation"))
    {
      return new PreOperationPluginResult(true, false, false);
      deleteOperation.checkIfCanceled(false);
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
    }
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -419,17 +360,14 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationExtendedOperation extendedOperation)
  {
       throws CanceledOperationException {
    if (disconnectInternal(extendedOperation, "PreOperation"))
    {
      return new PreOperationPluginResult(true, false, false);
      extendedOperation.checkIfCanceled(false);
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
    }
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -438,17 +376,14 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationModifyOperation modifyOperation)
  {
       throws CanceledOperationException {
    if (disconnectInternal(modifyOperation, "PreOperation"))
    {
      return new PreOperationPluginResult(true, false, false);
      modifyOperation.checkIfCanceled(false);
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
    }
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -457,17 +392,14 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationModifyDNOperation modifyDNOperation)
  {
       throws CanceledOperationException {
    if (disconnectInternal(modifyDNOperation, "PreOperation"))
    {
      return new PreOperationPluginResult(true, false, false);
      modifyDNOperation.checkIfCanceled(false);
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
    }
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -476,17 +408,14 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationSearchOperation searchOperation)
  {
       throws CanceledOperationException {
    if (disconnectInternal(searchOperation, "PreOperation"))
    {
      return new PreOperationPluginResult(true, false, false);
      searchOperation.checkIfCanceled(false);
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
    }
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -495,17 +424,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationAbandonOperation abandonOperation)
  {
    if (disconnectInternal(abandonOperation, "PreOperation"))
    {
      return new PostOperationPluginResult(true, false);
    }
    else
    {
      return PostOperationPluginResult.SUCCESS;
    }
    disconnectInternal(abandonOperation, "PostOperation");
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -514,17 +437,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationAddOperation addOperation)
  {
    if (disconnectInternal(addOperation, "PostOperation"))
    {
      return new PostOperationPluginResult(true, false);
    }
    else
    {
      return PostOperationPluginResult.SUCCESS;
    }
    disconnectInternal(addOperation, "PostOperation");
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -533,17 +450,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationBindOperation bindOperation)
  {
    if (disconnectInternal(bindOperation, "PostOperation"))
    {
      return new PostOperationPluginResult(true, false);
    }
    else
    {
      return PostOperationPluginResult.SUCCESS;
    }
    disconnectInternal(bindOperation, "PostOperation");
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -552,17 +463,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationCompareOperation compareOperation)
  {
    if (disconnectInternal(compareOperation, "PostOperation"))
    {
      return new PostOperationPluginResult(true, false);
    }
    else
    {
      return PostOperationPluginResult.SUCCESS;
    }
    disconnectInternal(compareOperation, "PostOperation");
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -571,17 +476,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationDeleteOperation deleteOperation)
  {
    if (disconnectInternal(deleteOperation, "PostOperation"))
    {
      return new PostOperationPluginResult(true, false);
    }
    else
    {
      return PostOperationPluginResult.SUCCESS;
    }
    disconnectInternal(deleteOperation, "PostOperation");
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -590,17 +489,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationExtendedOperation extendedOperation)
  {
    if (disconnectInternal(extendedOperation, "PostOperation"))
    {
      return new PostOperationPluginResult(true, false);
    }
    else
    {
      return PostOperationPluginResult.SUCCESS;
    }
    disconnectInternal(extendedOperation, "PostOperation");
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -609,17 +502,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationModifyOperation modifyOperation)
  {
    if (disconnectInternal(modifyOperation, "PostOperation"))
    {
      return new PostOperationPluginResult(true, false);
    }
    else
    {
      return PostOperationPluginResult.SUCCESS;
    }
    disconnectInternal(modifyOperation, "PostOperation");
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -628,17 +515,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationModifyDNOperation modifyDNOperation)
  {
    if (disconnectInternal(modifyDNOperation, "PostOperation"))
    {
      return new PostOperationPluginResult(true, false);
    }
    else
    {
      return PostOperationPluginResult.SUCCESS;
    }
    disconnectInternal(modifyDNOperation, "PostOperation");
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -647,17 +528,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationSearchOperation searchOperation)
  {
    if (disconnectInternal(searchOperation, "PostOperation"))
    {
      return new PostOperationPluginResult(true, false);
    }
    else
    {
      return PostOperationPluginResult.SUCCESS;
    }
    disconnectInternal(searchOperation, "PostOperation");
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -666,17 +541,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationUnbindOperation unbindOperation)
  {
    if (disconnectInternal(unbindOperation, "PostOperation"))
    {
      return new PostOperationPluginResult(true, false);
    }
    else
    {
      return PostOperationPluginResult.SUCCESS;
    }
    disconnectInternal(unbindOperation, "PostOperation");
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -685,17 +554,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseAddOperation addOperation)
  {
    if (disconnectInternal(addOperation, "PostResponse"))
    {
      return new PostResponsePluginResult(true, false);
    }
    else
    {
      return PostResponsePluginResult.SUCCESS;
    }
    disconnectInternal(addOperation, "PostResponse");
    return PluginResult.PostResponse.continueOperationProcessing();
  }
@@ -704,17 +567,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseBindOperation bindOperation)
  {
    if (disconnectInternal(bindOperation, "PostResponse"))
    {
      return new PostResponsePluginResult(true, false);
    }
    else
    {
      return PostResponsePluginResult.SUCCESS;
    }
    disconnectInternal(bindOperation, "PostResponse");
    return PluginResult.PostResponse.continueOperationProcessing();
  }
@@ -723,17 +580,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseCompareOperation compareOperation)
  {
    if (disconnectInternal(compareOperation, "PostResponse"))
    {
      return new PostResponsePluginResult(true, false);
    }
    else
    {
      return PostResponsePluginResult.SUCCESS;
    }
    disconnectInternal(compareOperation, "PostResponse");
    return PluginResult.PostResponse.continueOperationProcessing();
  }
@@ -742,17 +593,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseDeleteOperation deleteOperation)
  {
    if (disconnectInternal(deleteOperation, "PostResponse"))
    {
      return new PostResponsePluginResult(true, false);
    }
    else
    {
      return PostResponsePluginResult.SUCCESS;
    }
    disconnectInternal(deleteOperation, "PostResponse");
    return PluginResult.PostResponse.continueOperationProcessing();
  }
@@ -761,17 +606,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseExtendedOperation extendedOperation)
  {
    if (disconnectInternal(extendedOperation, "PostResponse"))
    {
      return new PostResponsePluginResult(true, false);
    }
    else
    {
      return PostResponsePluginResult.SUCCESS;
    }
    disconnectInternal(extendedOperation, "PostResponse");
    return PluginResult.PostResponse.continueOperationProcessing();
  }
@@ -780,17 +619,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseModifyOperation modifyOperation)
  {
    if (disconnectInternal(modifyOperation, "PostResponse"))
    {
      return new PostResponsePluginResult(true, false);
    }
    else
    {
      return PostResponsePluginResult.SUCCESS;
    }
    disconnectInternal(modifyOperation, "PostResponse");
    return PluginResult.PostResponse.continueOperationProcessing();
  }
@@ -799,17 +632,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseModifyDNOperation modifyDNOperation)
  {
    if (disconnectInternal(modifyDNOperation, "PostResponse"))
    {
      return new PostResponsePluginResult(true, false);
    }
    else
    {
      return PostResponsePluginResult.SUCCESS;
    }
    disconnectInternal(modifyDNOperation, "PostResponse");
    return PluginResult.PostResponse.continueOperationProcessing();
  }
@@ -818,17 +645,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseSearchOperation searchOperation)
  {
    if (disconnectInternal(searchOperation, "PostResponse"))
    {
      return new PostResponsePluginResult(true, false);
    }
    else
    {
      return PostResponsePluginResult.SUCCESS;
    }
    disconnectInternal(searchOperation, "PostResponse");
    return PluginResult.PostResponse.continueOperationProcessing();
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/InvocationCounterPlugin.java
@@ -34,20 +34,7 @@
import org.opends.server.admin.std.server.PluginCfg;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.IntermediateResponsePluginResult;
import org.opends.server.api.plugin.LDIFPluginResult;
import org.opends.server.api.plugin.PostConnectPluginResult;
import org.opends.server.api.plugin.PostDisconnectPluginResult;
import org.opends.server.api.plugin.PostOperationPluginResult;
import org.opends.server.api.plugin.PostResponsePluginResult;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.PreParsePluginResult;
import org.opends.server.api.plugin.SearchEntryPluginResult;
import org.opends.server.api.plugin.SearchReferencePluginResult;
import org.opends.server.api.plugin.StartupPluginResult;
import org.opends.server.api.plugin.SubordinateModifyDNPluginResult;
import org.opends.server.api.plugin.*;
import org.opends.server.types.DisconnectReason;
import org.opends.server.types.Entry;
import org.opends.server.types.IntermediateResponse;
@@ -136,11 +123,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseAbandonOperation abandonOperation)
  {
    preParseCounter.incrementAndGet();
    return PreParsePluginResult.SUCCESS;
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -149,10 +136,10 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult doPreParse(PreParseAddOperation addOperation)
  public PluginResult.PreParse doPreParse(PreParseAddOperation addOperation)
  {
    preParseCounter.incrementAndGet();
    return PreParsePluginResult.SUCCESS;
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -161,10 +148,10 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult doPreParse(PreParseBindOperation bindOperation)
  public PluginResult.PreParse doPreParse(PreParseBindOperation bindOperation)
  {
    preParseCounter.incrementAndGet();
    return PreParsePluginResult.SUCCESS;
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -173,11 +160,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseCompareOperation compareOperation)
  {
    preParseCounter.incrementAndGet();
    return PreParsePluginResult.SUCCESS;
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -186,11 +173,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseDeleteOperation deleteOperation)
  {
    preParseCounter.incrementAndGet();
    return PreParsePluginResult.SUCCESS;
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -199,11 +186,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseExtendedOperation extendedOperation)
  {
    preParseCounter.incrementAndGet();
    return PreParsePluginResult.SUCCESS;
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -212,11 +199,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseModifyOperation modifyOperation)
  {
    preParseCounter.incrementAndGet();
    return PreParsePluginResult.SUCCESS;
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -225,11 +212,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseModifyDNOperation modifyDNOperation)
  {
    preParseCounter.incrementAndGet();
    return PreParsePluginResult.SUCCESS;
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -238,11 +225,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseSearchOperation searchOperation)
  {
    preParseCounter.incrementAndGet();
    return PreParsePluginResult.SUCCESS;
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -251,11 +238,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseUnbindOperation unbindOperation)
  {
    preParseCounter.incrementAndGet();
    return PreParsePluginResult.SUCCESS;
    return PluginResult.PreParse.continueOperationProcessing();
  }
@@ -290,11 +277,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationAddOperation addOperation)
  {
    preOperationCounter.incrementAndGet();
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -303,11 +290,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationBindOperation bindOperation)
  {
    preOperationCounter.incrementAndGet();
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -316,11 +303,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationCompareOperation compareOperation)
  {
    preOperationCounter.incrementAndGet();
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -329,11 +316,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationDeleteOperation deleteOperation)
  {
    preOperationCounter.incrementAndGet();
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -342,11 +329,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationExtendedOperation extendedOperation)
  {
    preOperationCounter.incrementAndGet();
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -355,11 +342,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationModifyOperation modifyOperation)
  {
    preOperationCounter.incrementAndGet();
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -368,11 +355,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationModifyDNOperation modifyDNOperation)
  {
    preOperationCounter.incrementAndGet();
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -381,11 +368,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationSearchOperation searchOperation)
  {
    preOperationCounter.incrementAndGet();
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -420,11 +407,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationAbandonOperation abandonOperation)
  {
    postOperationCounter.incrementAndGet();
    return PostOperationPluginResult.SUCCESS;
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -433,11 +420,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationAddOperation addOperation)
  {
    postOperationCounter.incrementAndGet();
    return PostOperationPluginResult.SUCCESS;
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -446,11 +433,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationBindOperation bindOperation)
  {
    postOperationCounter.incrementAndGet();
    return PostOperationPluginResult.SUCCESS;
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -459,11 +446,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationCompareOperation compareOperation)
  {
    postOperationCounter.incrementAndGet();
    return PostOperationPluginResult.SUCCESS;
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -472,11 +459,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationDeleteOperation deleteOperation)
  {
    postOperationCounter.incrementAndGet();
    return PostOperationPluginResult.SUCCESS;
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -485,11 +472,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationExtendedOperation extendedOperation)
  {
    postOperationCounter.incrementAndGet();
    return PostOperationPluginResult.SUCCESS;
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -498,11 +485,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationModifyOperation modifyOperation)
  {
    postOperationCounter.incrementAndGet();
    return PostOperationPluginResult.SUCCESS;
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -511,11 +498,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationModifyDNOperation modifyDNOperation)
  {
    postOperationCounter.incrementAndGet();
    return PostOperationPluginResult.SUCCESS;
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -524,11 +511,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationSearchOperation searchOperation)
  {
    postOperationCounter.incrementAndGet();
    return PostOperationPluginResult.SUCCESS;
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -537,11 +524,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostOperationPluginResult
  public PluginResult.PostOperation
       doPostOperation(PostOperationUnbindOperation unbindOperation)
  {
    postOperationCounter.incrementAndGet();
    return PostOperationPluginResult.SUCCESS;
    return PluginResult.PostOperation.continueOperationProcessing();
  }
@@ -576,11 +563,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseAddOperation addOperation)
  {
    postResponseCounter.incrementAndGet();
    return PostResponsePluginResult.SUCCESS;
    return PluginResult.PostResponse.continueOperationProcessing();
  }
@@ -589,11 +576,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseBindOperation bindOperation)
  {
    postResponseCounter.incrementAndGet();
    return PostResponsePluginResult.SUCCESS;
    return PluginResult.PostResponse.continueOperationProcessing();
  }
@@ -602,11 +589,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseCompareOperation compareOperation)
  {
    postResponseCounter.incrementAndGet();
    return PostResponsePluginResult.SUCCESS;
    return PluginResult.PostResponse.continueOperationProcessing();
  }
@@ -615,11 +602,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseDeleteOperation deleteOperation)
  {
    postResponseCounter.incrementAndGet();
    return PostResponsePluginResult.SUCCESS;
    return PluginResult.PostResponse.continueOperationProcessing();
  }
@@ -628,11 +615,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseExtendedOperation extendedOperation)
  {
    postResponseCounter.incrementAndGet();
    return PostResponsePluginResult.SUCCESS;
    return PluginResult.PostResponse.continueOperationProcessing();
  }
@@ -641,11 +628,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseModifyOperation modifyOperation)
  {
    postResponseCounter.incrementAndGet();
    return PostResponsePluginResult.SUCCESS;
    return PluginResult.PostResponse.continueOperationProcessing();
  }
@@ -654,11 +641,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseModifyDNOperation modifyDNOperation)
  {
    postResponseCounter.incrementAndGet();
    return PostResponsePluginResult.SUCCESS;
    return PluginResult.PostResponse.continueOperationProcessing();
  }
@@ -667,11 +654,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostResponsePluginResult
  public PluginResult.PostResponse
       doPostResponse(PostResponseSearchOperation searchOperation)
  {
    postResponseCounter.incrementAndGet();
    return PostResponsePluginResult.SUCCESS;
    return PluginResult.PostResponse.continueOperationProcessing();
  }
@@ -769,12 +756,12 @@
   * {@inheritDoc}
   */
  @Override()
  public SearchEntryPluginResult
  public PluginResult.IntermediateResponse
       processSearchEntry(SearchEntrySearchOperation searchOperation,
                          SearchResultEntry searchEntry)
  {
    searchEntryCounter.incrementAndGet();
    return SearchEntryPluginResult.SUCCESS;
    return PluginResult.IntermediateResponse.continueOperationProcessing(true);
  }
@@ -810,12 +797,12 @@
   * {@inheritDoc}
   */
  @Override()
  public SearchReferencePluginResult
  public PluginResult.IntermediateResponse
       processSearchReference(SearchReferenceSearchOperation searchOperation,
                              SearchResultReference searchReference)
  {
    searchReferenceCounter.incrementAndGet();
    return SearchReferencePluginResult.SUCCESS;
    return PluginResult.IntermediateResponse.continueOperationProcessing(true);
  }
@@ -851,12 +838,12 @@
   * {@inheritDoc}
   */
  @Override()
  public SubordinateModifyDNPluginResult processSubordinateModifyDN(
  public PluginResult.SubordinateModifyDN processSubordinateModifyDN(
              SubordinateModifyDNOperation modifyDNOperation, Entry oldEntry,
              Entry newEntry, List<Modification> modifications)
  {
    subordinateModifyDNCounter.incrementAndGet();
    return SubordinateModifyDNPluginResult.SUCCESS;
    return PluginResult.SubordinateModifyDN.continueOperationProcessing();
  }
@@ -893,11 +880,11 @@
   * {@inheritDoc}
   */
  @Override()
  public IntermediateResponsePluginResult processIntermediateResponse(
  public PluginResult.IntermediateResponse processIntermediateResponse(
              IntermediateResponse intermediateResponse)
  {
    intermediateResponseCounter.incrementAndGet();
    return IntermediateResponsePluginResult.SUCCESS;
    return PluginResult.IntermediateResponse.continueOperationProcessing(true);
  }
@@ -933,11 +920,11 @@
   * {@inheritDoc}
   */
  @Override()
  public PostConnectPluginResult doPostConnect(ClientConnection
  public PluginResult.PostConnect doPostConnect(ClientConnection
                                                    clientConnection)
  {
    postConnectCounter.incrementAndGet();
    return PostConnectPluginResult.SUCCESS;
    return PluginResult.PostConnect.continueConnectProcessing();
  }
@@ -972,12 +959,12 @@
   * {@inheritDoc}
   */
  @Override()
  public PostDisconnectPluginResult doPostDisconnect(
  public PluginResult.PostDisconnect doPostDisconnect(
          ClientConnection clientConnection, DisconnectReason disconnectReason,
          Message message)
  {
    postDisconnectCounter.incrementAndGet();
    return PostDisconnectPluginResult.SUCCESS;
    return PluginResult.PostDisconnect.continueDisconnectProcessing();
  }
@@ -1012,11 +999,11 @@
   * {@inheritDoc}
   */
  @Override()
  public LDIFPluginResult doLDIFImport(LDIFImportConfig importConfig,
                                       Entry entry)
  public PluginResult.ImportLDIF doLDIFImport(LDIFImportConfig importConfig,
                                        Entry entry)
  {
    ldifImportCounter.incrementAndGet();
    return LDIFPluginResult.SUCCESS;
    return PluginResult.ImportLDIF.continueEntryProcessing();
  }
@@ -1051,11 +1038,11 @@
   * {@inheritDoc}
   */
  @Override()
  public LDIFPluginResult doLDIFExport(LDIFExportConfig exportConfig,
  public PluginResult.ImportLDIF doLDIFExport(LDIFExportConfig exportConfig,
                                       Entry entry)
  {
    ldifExportCounter.incrementAndGet();
    return LDIFPluginResult.SUCCESS;
    return PluginResult.ImportLDIF.continueEntryProcessing();
  }
@@ -1113,10 +1100,10 @@
   * {@inheritDoc}
   */
  @Override()
  public StartupPluginResult doStartup()
  public PluginResult.Startup doStartup()
  {
    startupCalled = true;
    return StartupPluginResult.SUCCESS;
    return PluginResult.Startup.continueStartup();
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/NullPlugin.java
@@ -28,21 +28,11 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.opends.server.admin.std.server.PluginCfg;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.config.ConfigException;
import org.opends.server.protocols.asn1.ASN1Long;
import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.protocols.ldap.LDAPControl;
import org.opends.server.types.Control;
import org.opends.server.types.ResultCode;
import org.opends.server.types.operation.*;
opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/SevenBitCleanPluginTestCase.java
@@ -32,6 +32,7 @@
import org.testng.annotations.Test;
import org.opends.server.TestCaseUtils;
import org.opends.server.types.ResultCode;
import org.opends.server.core.AddOperation;
import org.opends.server.core.ModifyOperation;
import org.opends.server.core.ModifyDNOperation;
@@ -248,8 +249,8 @@
        "-f", path
      };
      assertFalse(LDAPModify.mainModify(args, false, System.out, System.err) ==
                  0);
      assertEquals(LDAPModify.mainModify(args, false, System.out, System.err),
                  ResultCode.CONSTRAINT_VIOLATION.getIntValue());
    }
    finally
    {
@@ -413,8 +414,8 @@
        "-f", path
      };
      assertFalse(LDAPModify.mainModify(args, false, System.out, System.err) ==
                  0);
      assertEquals(LDAPModify.mainModify(args, false, System.out, System.err),
                  ResultCode.CONSTRAINT_VIOLATION.getIntValue());
    }
    finally
    {
@@ -641,8 +642,8 @@
        "-f", path
      };
      assertFalse(LDAPModify.mainModify(args, false, System.out, System.err) ==
                  0);
      assertEquals(LDAPModify.mainModify(args, false, System.out, System.err),
                  ResultCode.CONSTRAINT_VIOLATION.getIntValue());
    }
    finally
    {
opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java
@@ -35,11 +35,7 @@
import java.util.concurrent.ConcurrentHashMap;
import org.opends.server.admin.std.server.PluginCfg;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.PreParsePluginResult;
import org.opends.server.config.ConfigEntry;
import org.opends.server.api.plugin.*;
import org.opends.server.config.ConfigException;
import org.opends.server.protocols.asn1.ASN1Element;
import org.opends.server.protocols.asn1.ASN1Enumerated;
@@ -132,20 +128,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
       doPreParse(PreParseAbandonOperation abandonOperation)
  public PluginResult.PreParse
         doPreParse(PreParseAbandonOperation abandonOperation)
  {
    int resultCode = shortCircuitInternal(abandonOperation, "PreParse");
    if (resultCode >= 0)
    {
      abandonOperation.setResultCode(ResultCode.valueOf(resultCode));
      abandonOperation.appendErrorMessage(
              Message.raw("Short-circuit in pre-parse"));
      return new PreParsePluginResult(false, false, true);
      return PluginResult.PreParse.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-parse"));
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
      return PluginResult.PreParse.continueOperationProcessing();
    }
  }
@@ -155,18 +150,18 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult doPreParse(PreParseAddOperation addOperation)
  public PluginResult.PreParse doPreParse(PreParseAddOperation addOperation)
  {
    int resultCode = shortCircuitInternal(addOperation, "PreParse");
    if (resultCode >= 0)
    {
      addOperation.setResultCode(ResultCode.valueOf(resultCode));
      addOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreParsePluginResult(false, false, true);
      return PluginResult.PreParse.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-parse"));
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
      return PluginResult.PreParse.continueOperationProcessing();
    }
  }
@@ -176,18 +171,18 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult doPreParse(PreParseBindOperation bindOperation)
  public PluginResult.PreParse doPreParse(PreParseBindOperation bindOperation)
  {
    int resultCode = shortCircuitInternal(bindOperation, "PreParse");
    if (resultCode >= 0)
    {
      bindOperation.setResultCode(ResultCode.valueOf(resultCode));
      bindOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreParsePluginResult(false, false, true);
      return PluginResult.PreParse.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-parse"));
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
      return PluginResult.PreParse.continueOperationProcessing();
    }
  }
@@ -197,19 +192,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseCompareOperation compareOperation)
  {
    int resultCode = shortCircuitInternal(compareOperation, "PreParse");
    if (resultCode >= 0)
    {
      compareOperation.setResultCode(ResultCode.valueOf(resultCode));
      compareOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreParsePluginResult(false, false, true);
      return PluginResult.PreParse.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-parse"));
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
      return PluginResult.PreParse.continueOperationProcessing();
    }
  }
@@ -219,19 +214,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseDeleteOperation deleteOperation)
  {
    int resultCode = shortCircuitInternal(deleteOperation, "PreParse");
    if (resultCode >= 0)
    {
      deleteOperation.setResultCode(ResultCode.valueOf(resultCode));
      deleteOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreParsePluginResult(false, false, true);
      return PluginResult.PreParse.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-parse"));
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
      return PluginResult.PreParse.continueOperationProcessing();
    }
  }
@@ -241,19 +236,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseExtendedOperation extendedOperation)
  {
    int resultCode = shortCircuitInternal(extendedOperation, "PreParse");
    if (resultCode >= 0)
    {
      extendedOperation.setResultCode(ResultCode.valueOf(resultCode));
      extendedOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreParsePluginResult(false, false, true);
      return PluginResult.PreParse.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-parse"));
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
      return PluginResult.PreParse.continueOperationProcessing();
    }
  }
@@ -263,19 +258,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseModifyOperation modifyOperation)
  {
    int resultCode = shortCircuitInternal(modifyOperation, "PreParse");
    if (resultCode >= 0)
    {
      modifyOperation.setResultCode(ResultCode.valueOf(resultCode));
      modifyOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreParsePluginResult(false, false, true);
      return PluginResult.PreParse.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-parse"));
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
      return PluginResult.PreParse.continueOperationProcessing();
    }
  }
@@ -285,19 +280,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseModifyDNOperation modifyDNOperation)
  {
    int resultCode = shortCircuitInternal(modifyDNOperation, "PreParse");
    if (resultCode >= 0)
    {
      modifyDNOperation.setResultCode(ResultCode.valueOf(resultCode));
      modifyDNOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreParsePluginResult(false, false, true);
      return PluginResult.PreParse.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-parse"));
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
      return PluginResult.PreParse.continueOperationProcessing();
    }
  }
@@ -307,19 +302,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseSearchOperation searchOperation)
  {
    int resultCode = shortCircuitInternal(searchOperation, "PreParse");
    if (resultCode >= 0)
    {
      searchOperation.setResultCode(ResultCode.valueOf(resultCode));
      searchOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreParsePluginResult(false, false, true);
      return PluginResult.PreParse.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-parse"));
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
      return PluginResult.PreParse.continueOperationProcessing();
    }
  }
@@ -329,19 +324,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreParsePluginResult
  public PluginResult.PreParse
       doPreParse(PreParseUnbindOperation unbindOperation)
  {
    int resultCode = shortCircuitInternal(unbindOperation, "PreParse");
    if (resultCode >= 0)
    {
      unbindOperation.setResultCode(ResultCode.valueOf(resultCode));
      unbindOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreParsePluginResult(false, false, true);
      return PluginResult.PreParse.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-parse"));
    }
    else
    {
      return PreParsePluginResult.SUCCESS;
      return PluginResult.PreParse.continueOperationProcessing();
    }
  }
@@ -351,19 +346,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationAddOperation addOperation)
  {
    int resultCode = shortCircuitInternal(addOperation, "PreOperation");
    if (resultCode >= 0)
    {
      addOperation.setResultCode(ResultCode.valueOf(resultCode));
      addOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreOperationPluginResult(false, false, true);
      return PluginResult.PreOperation.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-operation"));
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
      return PluginResult.PreOperation.continueOperationProcessing();
    }
  }
@@ -373,19 +368,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationBindOperation bindOperation)
  {
    int resultCode = shortCircuitInternal(bindOperation, "PreOperation");
    if (resultCode >= 0)
    {
      bindOperation.setResultCode(ResultCode.valueOf(resultCode));
      bindOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreOperationPluginResult(false, false, true);
      return PluginResult.PreOperation.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-operation"));
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
      return PluginResult.PreOperation.continueOperationProcessing();
    }
  }
@@ -395,19 +390,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationCompareOperation compareOperation)
  {
    int resultCode = shortCircuitInternal(compareOperation, "PreOperation");
    if (resultCode >= 0)
    {
      compareOperation.setResultCode(ResultCode.valueOf(resultCode));
      compareOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreOperationPluginResult(false, false, true);
      return PluginResult.PreOperation.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-operation"));
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
      return PluginResult.PreOperation.continueOperationProcessing();
    }
  }
@@ -417,19 +412,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationDeleteOperation deleteOperation)
  {
    int resultCode = shortCircuitInternal(deleteOperation, "PreOperation");
    if (resultCode >= 0)
    {
      deleteOperation.setResultCode(ResultCode.valueOf(resultCode));
      deleteOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreOperationPluginResult(false, false, true);
      return PluginResult.PreOperation.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-operation"));
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
      return PluginResult.PreOperation.continueOperationProcessing();
    }
  }
@@ -439,19 +434,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationExtendedOperation extendedOperation)
  {
    int resultCode = shortCircuitInternal(extendedOperation, "PreOperation");
    if (resultCode >= 0)
    {
      extendedOperation.setResultCode(ResultCode.valueOf(resultCode));
      extendedOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreOperationPluginResult(false, false, true);
      return PluginResult.PreOperation.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-operation"));
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
      return PluginResult.PreOperation.continueOperationProcessing();
    }
  }
@@ -461,19 +456,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationModifyOperation modifyOperation)
  {
    int resultCode = shortCircuitInternal(modifyOperation, "PreOperation");
    if (resultCode >= 0)
    {
      modifyOperation.setResultCode(ResultCode.valueOf(resultCode));
      modifyOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreOperationPluginResult(false, false, true);
      return PluginResult.PreOperation.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-operation"));
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
      return PluginResult.PreOperation.continueOperationProcessing();
    }
  }
@@ -483,19 +478,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationModifyDNOperation modifyDNOperation)
  {
    int resultCode = shortCircuitInternal(modifyDNOperation, "PreOperation");
    if (resultCode >= 0)
    {
      modifyDNOperation.setResultCode(ResultCode.valueOf(resultCode));
      modifyDNOperation.appendErrorMessage(Message.raw("Short-circuit in pre-parse"));
      return new PreOperationPluginResult(false, false, true);
      return PluginResult.PreOperation.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-operation"));
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
      return PluginResult.PreOperation.continueOperationProcessing();
    }
  }
@@ -505,20 +500,19 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationSearchOperation searchOperation)
  {
    int resultCode = shortCircuitInternal(searchOperation, "PreOperation");
    if (resultCode >= 0)
    {
      searchOperation.setResultCode(ResultCode.valueOf(resultCode));
      searchOperation.appendErrorMessage(
              Message.raw("Short-circuit in pre-parse"));
      return new PreOperationPluginResult(false, false, true);
      return PluginResult.PreOperation.stopProcessing(
          ResultCode.valueOf(resultCode),
          Message.raw("Short-circuit in pre-operation"));
    }
    else
    {
      return PreOperationPluginResult.SUCCESS;
      return PluginResult.PreOperation.continueOperationProcessing();
    }
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/UpdatePreOpPlugin.java
@@ -29,13 +29,12 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.opends.server.admin.std.server.PluginCfg;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.PreOperationPluginResult;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.config.ConfigException;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeType;
@@ -135,7 +134,7 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationAddOperation addOperation)
  {
    for (AttributeType t : removeAttributes)
@@ -160,7 +159,7 @@
      addOperation.addObjectClass(oc, oc.getPrimaryName());
    }
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
@@ -169,7 +168,7 @@
   * {@inheritDoc}
   */
  @Override()
  public PreOperationPluginResult
  public PluginResult.PreOperation
       doPreOperation(PreOperationModifyOperation modifyOperation)
  {
    for (Modification m : modifications)
@@ -180,12 +179,12 @@
      }
      catch (DirectoryException de)
      {
        modifyOperation.setResponseData(de);
        return new PreOperationPluginResult(false, false, true);
        return PluginResult.PreOperation.stopProcessing(de.getResultCode(),
            de.getMessageObject(), de.getMatchedDN(), de.getReferralURLs());
      }
    }
    return PreOperationPluginResult.SUCCESS;
    return PluginResult.PreOperation.continueOperationProcessing();
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/protocols/internal/InternalClientConnectionTestCase.java
@@ -1118,7 +1118,7 @@
    CancelResult cancelResult =
         conn.cancelOperation(1,
              new CancelRequest(true, Message.raw("testCancelOperation")));
    assertEquals(cancelResult, CancelResult.CANNOT_CANCEL);
    assertEquals(cancelResult.getResultCode(), ResultCode.CANNOT_CANCEL);
  }