From cab0b20204866c68b0cce38b4492f707187cc128 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Mon, 15 Jul 2013 08:17:58 +0000
Subject: [PATCH] Refactoring on the LocalBackend*Operation classes: - Extracted process*() methods from the processLocal*() methods for the LocalBackend*Operation classes. - Transformed plain comments into javadocs. - Used interfaces instead of concrete classes. - Made all protected members be private.

---
 opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendSearchOperation.java |  372 ++++++++++++++++++++++++++---------------------------
 1 files changed, 182 insertions(+), 190 deletions(-)

diff --git a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendSearchOperation.java b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendSearchOperation.java
index 52b155c..f568cdc 100644
--- a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendSearchOperation.java
+++ b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendSearchOperation.java
@@ -27,8 +27,6 @@
  */
 package org.opends.server.workflowelement.localbackend;
 
-
-
 import java.util.List;
 
 import org.opends.server.api.Backend;
@@ -43,7 +41,6 @@
 import org.opends.server.core.AccessControlConfigManager;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.PersistentSearch;
-import org.opends.server.core.PluginConfigManager;
 import org.opends.server.core.SearchOperationWrapper;
 import org.opends.server.core.SearchOperation;
 import org.opends.server.loggers.debug.DebugTracer;
@@ -58,8 +55,6 @@
 import static org.opends.server.util.ServerConstants.*;
 import static org.opends.server.util.StaticUtils.*;
 
-
-
 /**
  * This class defines an operation used to search for entries in a local backend
  * of the Directory Server.
@@ -79,33 +74,33 @@
   /**
    * The backend in which the search is to be performed.
    */
-  protected Backend backend;
+  private Backend backend;
 
   /**
    * Indicates whether we should actually process the search.  This should
    * only be false if it's a persistent search with changesOnly=true.
    */
-  protected boolean processSearch;
+  private boolean processSearch;
 
   /**
    * The client connection for the search operation.
    */
-  protected ClientConnection clientConnection;
+  private ClientConnection clientConnection;
 
   /**
    * The base DN for the search.
    */
-  protected DN baseDN;
+  private DN baseDN;
 
   /**
    * The persistent search request, if applicable.
    */
-  protected PersistentSearch persistentSearch;
+  private PersistentSearch persistentSearch;
 
   /**
    * The filter for the search.
    */
-  protected SearchFilter filter;
+  private SearchFilter filter;
 
 
 
@@ -134,195 +129,27 @@
   public void processLocalSearch(LocalBackendWorkflowElement wfe)
       throws CanceledOperationException
   {
-    boolean executePostOpPlugins = false;
     this.backend = wfe.getBackend();
 
     clientConnection = getClientConnection();
 
-    // Get the plugin config manager that will be used for invoking plugins.
-    PluginConfigManager pluginConfigManager =
-      DirectoryServer.getPluginConfigManager();
     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:
-    {
-      // 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.
-      baseDN = getBaseDN();
-      filter = getFilter();
-
-      if ((baseDN == null) || (filter == null)){
-        break searchProcessing;
-      }
-
-      // Check to see if there are any controls in the request.  If so, then
-      // see if there is any special processing required.
-      try
-      {
-        handleRequestControls();
-      }
-      catch (DirectoryException de)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, de);
-        }
-
-        setResponseData(de);
-        break searchProcessing;
-      }
-
-
-      // Check to see if the client has permission to perform the
-      // search.
-
-      // FIXME: for now assume that this will check all permission
-      // pertinent to the operation. This includes proxy authorization
-      // and any other controls specified.
-      try
-      {
-        if (!AccessControlConfigManager.getInstance()
-            .getAccessControlHandler().isAllowed(this))
-        {
-          setResultCode(ResultCode.INSUFFICIENT_ACCESS_RIGHTS);
-          appendErrorMessage(ERR_SEARCH_AUTHZ_INSUFFICIENT_ACCESS_RIGHTS
-              .get(String.valueOf(baseDN)));
-          break searchProcessing;
-        }
-      }
-      catch (DirectoryException e)
-      {
-        setResultCode(e.getResultCode());
-        appendErrorMessage(e.getMessageObject());
-        break searchProcessing;
-      }
-
-      // Check for a request to cancel this operation.
-      checkIfCanceled(false);
-
-
-      // Invoke the pre-operation search plugins.
-      executePostOpPlugins = true;
-      PluginResult.PreOperation preOpResult =
-          pluginConfigManager.invokePreOperationSearchPlugins(this);
-      if (!preOpResult.continueProcessing())
-      {
-        setResultCode(preOpResult.getResultCode());
-        appendErrorMessage(preOpResult.getErrorMessage());
-        setMatchedDN(preOpResult.getMatchedDN());
-        setReferralURLs(preOpResult.getReferralURLs());
-        break searchProcessing;
-      }
-
-
-      // Check for a request to cancel this operation.
-      checkIfCanceled(false);
-
-
-      // Get the backend that should hold the search base.  If there is none,
-      // then fail.
-      if (backend == null)
-      {
-        setResultCode(ResultCode.NO_SUCH_OBJECT);
-        appendErrorMessage(ERR_SEARCH_BASE_DOESNT_EXIST.get(
-                                String.valueOf(baseDN)));
-        break searchProcessing;
-      }
-
-
-      // We'll set the result code to "success".  If a problem occurs, then it
-      // will be overwritten.
-      setResultCode(ResultCode.SUCCESS);
-
-
-      // If there's a persistent search, then register it with the server.
-      if (persistentSearch != null)
-      {
-        //The Core server maintains the count of concurrent persistent searches
-        //so that all the backends (Remote and Local)  are aware of it. Verify
-        //with the core if we have already reached the threshold.
-        if(!DirectoryServer.allowNewPersistentSearch())
-        {
-          setResultCode(ResultCode.ADMIN_LIMIT_EXCEEDED);
-          appendErrorMessage(ERR_MAX_PSEARCH_LIMIT_EXCEEDED.get());
-          break searchProcessing;
-        }
-        wfe.registerPersistentSearch(persistentSearch);
-        persistentSearch.enable();
-      }
-
-
-      // Process the search in the backend and all its subordinates.
-      try
-      {
-        if (processSearch)
-        {
-          backend.search(this);
-        }
-      }
-      catch (DirectoryException de)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.VERBOSE, de);
-        }
-
-        setResponseData(de);
-
-        if (persistentSearch != null)
-        {
-          persistentSearch.cancel();
-          setSendResponse(true);
-        }
-
-        break searchProcessing;
-      }
-      catch (CanceledOperationException coe)
-      {
-        if (persistentSearch != null)
-        {
-          persistentSearch.cancel();
-          setSendResponse(true);
-        }
-
-        throw coe;
-      }
-      catch (Exception e)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, e);
-        }
-
-        setResultCode(DirectoryServer.getServerErrorResultCode());
-        appendErrorMessage(ERR_SEARCH_BACKEND_EXCEPTION.get(
-                                getExceptionMessage(e)));
-
-        if (persistentSearch != null)
-        {
-          persistentSearch.cancel();
-          setSendResponse(true);
-        }
-
-        break searchProcessing;
-      }
-    }
-
+    BooleanHolder executePostOpPlugins = new BooleanHolder();
+    processSearch(wfe, executePostOpPlugins);
 
     // Check for a request to cancel this operation.
     checkIfCanceled(false);
 
     // Invoke the post-operation search plugins.
-    if (executePostOpPlugins)
+    if (executePostOpPlugins.value)
     {
       PluginResult.PostOperation postOpResult =
-           pluginConfigManager.invokePostOperationSearchPlugins(this);
+          DirectoryServer.getPluginConfigManager()
+              .invokePostOperationSearchPlugins(this);
       if (!postOpResult.continueProcessing())
       {
         setResultCode(postOpResult.getResultCode());
@@ -333,15 +160,180 @@
     }
   }
 
+  private void processSearch(LocalBackendWorkflowElement wfe,
+      BooleanHolder executePostOpPlugins) throws CanceledOperationException
+  {
+    // 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.
+    baseDN = getBaseDN();
+    filter = getFilter();
+
+    if ((baseDN == null) || (filter == null))
+    {
+      return;
+    }
+
+    // Check to see if there are any controls in the request. If so, then
+    // see if there is any special processing required.
+    try
+    {
+      handleRequestControls();
+    }
+    catch (DirectoryException de)
+    {
+      if (debugEnabled())
+      {
+        TRACER.debugCaught(DebugLogLevel.ERROR, de);
+      }
+
+      setResponseData(de);
+      return;
+    }
+
+
+    // Check to see if the client has permission to perform the
+    // search.
+
+    // FIXME: for now assume that this will check all permission
+    // pertinent to the operation. This includes proxy authorization
+    // and any other controls specified.
+    try
+    {
+      if (!AccessControlConfigManager.getInstance().getAccessControlHandler()
+          .isAllowed(this))
+      {
+        setResultCode(ResultCode.INSUFFICIENT_ACCESS_RIGHTS);
+        appendErrorMessage(ERR_SEARCH_AUTHZ_INSUFFICIENT_ACCESS_RIGHTS
+            .get(String.valueOf(baseDN)));
+        return;
+      }
+    }
+    catch (DirectoryException e)
+    {
+      setResultCode(e.getResultCode());
+      appendErrorMessage(e.getMessageObject());
+      return;
+    }
+
+    // Check for a request to cancel this operation.
+    checkIfCanceled(false);
+
+
+    // Invoke the pre-operation search plugins.
+    executePostOpPlugins.value = true;
+    PluginResult.PreOperation preOpResult =
+        DirectoryServer.getPluginConfigManager()
+            .invokePreOperationSearchPlugins(this);
+    if (!preOpResult.continueProcessing())
+    {
+      setResultCode(preOpResult.getResultCode());
+      appendErrorMessage(preOpResult.getErrorMessage());
+      setMatchedDN(preOpResult.getMatchedDN());
+      setReferralURLs(preOpResult.getReferralURLs());
+      return;
+    }
+
+
+    // Check for a request to cancel this operation.
+    checkIfCanceled(false);
+
+
+    // Get the backend that should hold the search base. If there is none,
+    // then fail.
+    if (backend == null)
+    {
+      setResultCode(ResultCode.NO_SUCH_OBJECT);
+      appendErrorMessage(ERR_SEARCH_BASE_DOESNT_EXIST.get(String
+          .valueOf(baseDN)));
+      return;
+    }
+
+
+    // We'll set the result code to "success". If a problem occurs, then it
+    // will be overwritten.
+    setResultCode(ResultCode.SUCCESS);
+
+
+    // If there's a persistent search, then register it with the server.
+    if (persistentSearch != null)
+    {
+      // The Core server maintains the count of concurrent persistent searches
+      // so that all the backends (Remote and Local) are aware of it. Verify
+      // with the core if we have already reached the threshold.
+      if (!DirectoryServer.allowNewPersistentSearch())
+      {
+        setResultCode(ResultCode.ADMIN_LIMIT_EXCEEDED);
+        appendErrorMessage(ERR_MAX_PSEARCH_LIMIT_EXCEEDED.get());
+        return;
+      }
+      wfe.registerPersistentSearch(persistentSearch);
+      persistentSearch.enable();
+    }
+
+
+    // Process the search in the backend and all its subordinates.
+    try
+    {
+      if (processSearch)
+      {
+        backend.search(this);
+      }
+    }
+    catch (DirectoryException de)
+    {
+      if (debugEnabled())
+      {
+        TRACER.debugCaught(DebugLogLevel.VERBOSE, de);
+      }
+
+      setResponseData(de);
+
+      if (persistentSearch != null)
+      {
+        persistentSearch.cancel();
+        setSendResponse(true);
+      }
+
+      return;
+    }
+    catch (CanceledOperationException coe)
+    {
+      if (persistentSearch != null)
+      {
+        persistentSearch.cancel();
+        setSendResponse(true);
+      }
+
+      throw coe;
+    }
+    catch (Exception e)
+    {
+      if (debugEnabled())
+      {
+        TRACER.debugCaught(DebugLogLevel.ERROR, e);
+      }
+
+      setResultCode(DirectoryServer.getServerErrorResultCode());
+      appendErrorMessage(ERR_SEARCH_BACKEND_EXCEPTION
+          .get(getExceptionMessage(e)));
+
+      if (persistentSearch != null)
+      {
+        persistentSearch.cancel();
+        setSendResponse(true);
+      }
+    }
+  }
+
 
   /**
    * Handles any controls contained in the request.
    *
-   * @throws  DirectoryException  If there is a problem with any of the request
-   *                              controls.
+   * @throws DirectoryException
+   *           If there is a problem with any of the request controls.
    */
-  protected void handleRequestControls()
-          throws DirectoryException
+  private void handleRequestControls() throws DirectoryException
   {
     List<Control> requestControls  = getRequestControls();
     if ((requestControls != null) && (! requestControls.isEmpty()))
@@ -443,7 +435,7 @@
           addAdditionalLogItem(AdditionalLogItem.keyOnly(getClass(),
               "obsoleteProxiedAuthzV1Control"));
 
-          // The requester must have the PROXIED_AUTH privilige in order to be
+          // The requester must have the PROXIED_AUTH privilege in order to be
           // able to use this control.
           if (! clientConnection.hasPrivilege(Privilege.PROXIED_AUTH, this))
           {
@@ -467,7 +459,7 @@
         }
         else if (oid.equals(OID_PROXIED_AUTH_V2))
         {
-          // The requester must have the PROXIED_AUTH privilige in order to be
+          // The requester must have the PROXIED_AUTH privilege in order to be
           // able to use this control.
           if (! clientConnection.hasPrivilege(Privilege.PROXIED_AUTH, this))
           {

--
Gitblit v1.10.0