From 54ca1396ac0b7cbc7c697586bda8f0a4366e2be1 Mon Sep 17 00:00:00 2001
From: Violette Roche-Montane <violette.roche-montane@forgerock.com>
Date: Tue, 13 Aug 2013 15:48:19 +0000
Subject: [PATCH] Major code refactoring - preparing the ground to OPENDJ-1030. Thanks to JN for his help :)

---
 opends/src/server/org/opends/server/tools/RebuildIndex.java |  455 +++++++++++++++++++++++++++++---------------------------
 1 files changed, 238 insertions(+), 217 deletions(-)

diff --git a/opends/src/server/org/opends/server/tools/RebuildIndex.java b/opends/src/server/org/opends/server/tools/RebuildIndex.java
index 057b78d..1c4ef96 100644
--- a/opends/src/server/org/opends/server/tools/RebuildIndex.java
+++ b/opends/src/server/org/opends/server/tools/RebuildIndex.java
@@ -87,6 +87,10 @@
   private BooleanArgument rebuildDegraded = null;
   private BooleanArgument clearDegradedState = null;
 
+  private final LDAPConnectionArgumentParser argParser = createArgParser(
+      "org.opends.server.tools.RebuildIndex",
+      INFO_REBUILDINDEX_TOOL_DESCRIPTION.get());
+
   /**
    * Processes the command-line arguments and invokes the rebuild process.
    *
@@ -95,7 +99,8 @@
    */
   public static void main(final String[] args)
   {
-    final int retCode = mainRebuildIndex(args, true, System.out, System.err);
+    final int retCode =
+        mainRebuildIndex(args, true, System.out, System.err);
 
     if (retCode != 0)
     {
@@ -127,77 +132,16 @@
   }
 
   private int process(final String[] args, final boolean initializeServer,
-      final OutputStream outStream, final OutputStream errStream)
+      final OutputStream outStream, final OutputStream errStream )
   {
     final PrintStream out = NullOutputStream.wrapOrNullStream(outStream);
     final PrintStream err = NullOutputStream.wrapOrNullStream(errStream);
 
-    // Define the command-line arguments that may be used with this program.
-    BooleanArgument displayUsage;
-
-    // Create the command-line argument parser for use with this program.
-    final Message toolDescription = INFO_REBUILDINDEX_TOOL_DESCRIPTION.get();
-    final LDAPConnectionArgumentParser argParser =
-        createArgParser("org.opends.server.tools.RebuildIndex",
-            toolDescription);
-
     // Initialize all the command-line argument types and register them with the
     // parser.
     try
     {
-      configClass =
-          new StringArgument("configclass", 'C', "configClass", true, false,
-              true, INFO_CONFIGCLASS_PLACEHOLDER.get(), ConfigFileHandler.class
-                  .getName(), null, INFO_DESCRIPTION_CONFIG_CLASS.get());
-      configClass.setHidden(true);
-      argParser.addArgument(configClass);
-
-      configFile =
-          new StringArgument("configfile", 'f', "configFile", true, false,
-              true, INFO_CONFIGFILE_PLACEHOLDER.get(), null, null,
-              INFO_DESCRIPTION_CONFIG_FILE.get());
-      configFile.setHidden(true);
-      argParser.addArgument(configFile);
-
-      baseDNString =
-          new StringArgument("basedn", 'b', "baseDN", true, false, true,
-              INFO_BASEDN_PLACEHOLDER.get(), null, null,
-              INFO_REBUILDINDEX_DESCRIPTION_BASE_DN.get());
-      argParser.addArgument(baseDNString);
-
-      indexList =
-          new StringArgument("index", 'i', "index", false, true, true,
-              INFO_INDEX_PLACEHOLDER.get(), null, null,
-              INFO_REBUILDINDEX_DESCRIPTION_INDEX_NAME.get());
-      argParser.addArgument(indexList);
-
-      rebuildAll =
-          new BooleanArgument("rebuildAll", null, "rebuildAll",
-              INFO_REBUILDINDEX_DESCRIPTION_REBUILD_ALL.get());
-      argParser.addArgument(rebuildAll);
-
-      rebuildDegraded =
-          new BooleanArgument("rebuildDegraded", null, "rebuildDegraded",
-              INFO_REBUILDINDEX_DESCRIPTION_REBUILD_DEGRADED.get());
-      argParser.addArgument(rebuildDegraded);
-
-      clearDegradedState =
-          new BooleanArgument("clearDegradedState", null, "clearDegradedState",
-              INFO_REBUILDINDEX_DESCRIPTION_CLEAR_DEGRADED_STATE.get());
-      argParser.addArgument(clearDegradedState);
-
-      tmpDirectory =
-          new StringArgument("tmpdirectory", null, "tmpdirectory", false,
-              false, true, INFO_REBUILDINDEX_TEMP_DIR_PLACEHOLDER.get(),
-              "import-tmp", null, INFO_REBUILDINDEX_DESCRIPTION_TEMP_DIRECTORY
-                  .get());
-      argParser.addArgument(tmpDirectory);
-
-      displayUsage =
-          new BooleanArgument("help", 'H',
-              "help", INFO_DESCRIPTION_USAGE.get());
-      argParser.addArgument(displayUsage);
-      argParser.setUsageArgument(displayUsage);
+      initializeArguments(false);
     }
     catch (ArgumentException ae)
     {
@@ -284,8 +228,7 @@
     if (rebuildAll.isPresent() && clearDegradedState.isPresent())
     {
       final Message msg =
-          ERR_REBUILDINDEX_REBUILD_ALL_DEGRADED_ERROR
-              .get("clearDegradedState");
+          ERR_REBUILDINDEX_REBUILD_ALL_DEGRADED_ERROR.get("clearDegradedState");
       err.println(wrapText(msg, MAX_LINE_WIDTH));
       out.println(argParser.getUsage());
       return 1;
@@ -301,11 +244,76 @@
       err.println(wrapText(e.getMessage(), MAX_LINE_WIDTH));
       return 1;
     }
-
     return process(argParser, initializeServer, out, err);
   }
 
   /**
+   * Initializes the arguments for the rebuild index tool.
+   *
+   * @param isMultipleBackends
+   *          {@code true} if the tool is used as internal.
+   * @throws ArgumentException
+   *           If the initialization fails.
+   */
+  private void initializeArguments(final boolean isMultipleBackends)
+      throws ArgumentException
+  {
+    configClass =
+        new StringArgument("configclass", 'C', "configClass", true, false,
+            true, INFO_CONFIGCLASS_PLACEHOLDER.get(), ConfigFileHandler.class
+                .getName(), null, INFO_DESCRIPTION_CONFIG_CLASS.get());
+    configClass.setHidden(true);
+    argParser.addArgument(configClass);
+
+    configFile =
+        new StringArgument("configfile", 'f', "configFile", true, false, true,
+            INFO_CONFIGFILE_PLACEHOLDER.get(), null, null,
+            INFO_DESCRIPTION_CONFIG_FILE.get());
+    configFile.setHidden(true);
+    argParser.addArgument(configFile);
+
+
+    baseDNString =
+        new StringArgument("basedn", 'b', "baseDN", true, isMultipleBackends,
+            true, INFO_BASEDN_PLACEHOLDER.get(), null, null,
+            INFO_REBUILDINDEX_DESCRIPTION_BASE_DN.get());
+    argParser.addArgument(baseDNString);
+
+
+    indexList =
+        new StringArgument("index", 'i', "index", false, true, true,
+            INFO_INDEX_PLACEHOLDER.get(), null, null,
+            INFO_REBUILDINDEX_DESCRIPTION_INDEX_NAME.get());
+    argParser.addArgument(indexList);
+
+    rebuildAll =
+        new BooleanArgument("rebuildAll", null, "rebuildAll",
+            INFO_REBUILDINDEX_DESCRIPTION_REBUILD_ALL.get());
+    argParser.addArgument(rebuildAll);
+
+    rebuildDegraded =
+        new BooleanArgument("rebuildDegraded", null, "rebuildDegraded",
+            INFO_REBUILDINDEX_DESCRIPTION_REBUILD_DEGRADED.get());
+    argParser.addArgument(rebuildDegraded);
+
+    clearDegradedState =
+        new BooleanArgument("clearDegradedState", null, "clearDegradedState",
+            INFO_REBUILDINDEX_DESCRIPTION_CLEAR_DEGRADED_STATE.get());
+    argParser.addArgument(clearDegradedState);
+
+    tmpDirectory =
+        new StringArgument("tmpdirectory", null, "tmpdirectory", false, false,
+            true, INFO_REBUILDINDEX_TEMP_DIR_PLACEHOLDER.get(), "import-tmp",
+            null, INFO_REBUILDINDEX_DESCRIPTION_TEMP_DIRECTORY.get());
+    argParser.addArgument(tmpDirectory);
+
+    BooleanArgument displayUsage =
+        new BooleanArgument("help", 'H', "help", INFO_DESCRIPTION_USAGE.get());
+    argParser.addArgument(displayUsage);
+    argParser.setUsageArgument(displayUsage);
+  }
+
+  /**
    * {@inheritDoc}
    */
   @Override
@@ -314,154 +322,19 @@
   {
     // Performs the initial bootstrap of the Directory Server and processes the
     // configuration.
-    DirectoryServer directoryServer = DirectoryServer.getInstance();
-
+    final DirectoryServer directoryServer = DirectoryServer.getInstance();
     if (initializeServer)
     {
-      try
-      {
-        DirectoryServer.bootstrapClient();
-        DirectoryServer.initializeJMX();
-      }
-      catch (Exception e)
-      {
-        final Message message =
-            ERR_SERVER_BOOTSTRAP_ERROR.get(getExceptionMessage(e));
-        err.println(wrapText(message, MAX_LINE_WIDTH));
-        return 1;
-      }
-
-      try
-      {
-        directoryServer.initializeConfiguration(configClass.getValue(),
-            configFile.getValue());
-      }
-      catch (InitializationException ie)
-      {
-        final Message message = ERR_CANNOT_LOAD_CONFIG.get(ie.getMessage());
-        err.println(wrapText(message, MAX_LINE_WIDTH));
-        return 1;
-      }
-      catch (Exception e)
-      {
-        final Message message =
-            ERR_CANNOT_LOAD_CONFIG.get(getExceptionMessage(e));
-        err.println(wrapText(message, MAX_LINE_WIDTH));
-        return 1;
-      }
-
-      // Initializes the Directory Server schema elements.
-      try
-      {
-        directoryServer.initializeSchema();
-      }
-      catch (ConfigException ce)
-      {
-        final Message message = ERR_CANNOT_LOAD_SCHEMA.get(ce.getMessage());
-        err.println(wrapText(message, MAX_LINE_WIDTH));
-        return 1;
-      }
-      catch (InitializationException ie)
-      {
-        final Message message = ERR_CANNOT_LOAD_SCHEMA.get(ie.getMessage());
-        err.println(wrapText(message, MAX_LINE_WIDTH));
-        return 1;
-      }
-      catch (Exception e)
-      {
-        final Message message =
-            ERR_CANNOT_LOAD_SCHEMA.get(getExceptionMessage(e));
-        err.println(wrapText(message, MAX_LINE_WIDTH));
-        return 1;
-      }
-
-      // Initializes the Directory Server core configuration.
-      try
-      {
-        final CoreConfigManager coreConfigManager = new CoreConfigManager();
-        coreConfigManager.initializeCoreConfig();
-      }
-      catch (ConfigException ce)
-      {
-        final Message message =
-            ERR_CANNOT_INITIALIZE_CORE_CONFIG.get(ce.getMessage());
-        err.println(wrapText(message, MAX_LINE_WIDTH));
-        return 1;
-      }
-      catch (InitializationException ie)
-      {
-        final Message message =
-            ERR_CANNOT_INITIALIZE_CORE_CONFIG.get(ie.getMessage());
-        err.println(wrapText(message, MAX_LINE_WIDTH));
-        return 1;
-      }
-      catch (Exception e)
-      {
-        final Message message =
-            ERR_CANNOT_INITIALIZE_CORE_CONFIG.get(getExceptionMessage(e));
-        err.println(wrapText(message, MAX_LINE_WIDTH));
-        return 1;
-      }
-
-      // Initializes the Directory Server crypto manager.
-      try
-      {
-        directoryServer.initializeCryptoManager();
-      }
-      catch (ConfigException ce)
-      {
-        final Message message =
-            ERR_CANNOT_INITIALIZE_CRYPTO_MANAGER.get(ce.getMessage());
-        err.println(wrapText(message, MAX_LINE_WIDTH));
-        return 1;
-      }
-      catch (InitializationException ie)
-      {
-        final Message message =
-            ERR_CANNOT_INITIALIZE_CRYPTO_MANAGER.get(ie.getMessage());
-        err.println(wrapText(message, MAX_LINE_WIDTH));
-        return 1;
-      }
-      catch (Exception e)
-      {
-        final Message message =
-            ERR_CANNOT_INITIALIZE_CRYPTO_MANAGER.get(getExceptionMessage(e));
-        err.println(wrapText(message, MAX_LINE_WIDTH));
-        return 1;
-      }
-
-      try
-      {
-        final ErrorLogPublisher<?> errorLogPublisher =
-            TextErrorLogPublisher
-                .getToolStartupTextErrorPublisher(new TextWriter.STREAM(out));
-        final DebugLogPublisher<?> debugLogPublisher =
-            TextDebugLogPublisher
-                .getStartupTextDebugPublisher(new TextWriter.STREAM(out));
-        ErrorLogger.addErrorLogPublisher(errorLogPublisher);
-        DebugLogger.addDebugLogPublisher(debugLogPublisher);
-      }
-      catch (Exception e)
-      {
-        err.println("Error installing the custom error logger: "
-            + stackTraceToSingleLineString(e));
-      }
+      initializeServer(directoryServer, out, err);
+      setErrorAndDebugLogPublisher(out, err);
     }
 
     // Decodes the base DN provided by the user.
-    DN rebuildBaseDN;
+    DN rebuildBaseDN = null;
     try
     {
       rebuildBaseDN = DN.decode(baseDNString.getValue());
     }
-    catch (DirectoryException de)
-    {
-      final Message message =
-          ERR_CANNOT_DECODE_BASE_DN.get(baseDNString.getValue(), de
-              .getMessageObject());
-      logError(message);
-      return 1;
-    }
     catch (Exception e)
     {
       final Message message =
@@ -475,12 +348,7 @@
     Backend backend = null;
     try
     {
-      backend = getBackend(rebuildBaseDN);
-    }
-    catch (ConfigException e)
-    {
-      logError(e.getMessageObject());
-      return 1;
+      backend = retrieveBackend(rebuildBaseDN);
     }
     catch (Exception e)
     {
@@ -488,12 +356,165 @@
       return 1;
     }
 
-    // Initializes and sets the rebuild index configuration.
+    // Sets the rebuild index configuration.
     final RebuildConfig rebuildConfig =
         initializeRebuildIndexConfiguration(rebuildBaseDN);
 
-    // Launches the rebuild process.
-    return processRebuildIndex(backend, rebuildConfig);
+    return rebuildIndex(backend, rebuildConfig);
+  }
+
+  /**
+   * Defines the error and the debug log publisher used in this tool.
+   *
+   * @param out
+   *          The output stream to use for standard output, or {@code null} if
+   *          standard output is not needed.
+   * @param err
+   *          The output stream to use for standard error, or {@code null} if
+   *          standard error is not needed.
+   */
+  private void setErrorAndDebugLogPublisher(final PrintStream out,
+      final PrintStream err)
+  {
+    try
+    {
+      final ErrorLogPublisher<?> errorLogPublisher =
+          TextErrorLogPublisher
+              .getToolStartupTextErrorPublisher(new TextWriter.STREAM(out));
+      final DebugLogPublisher<?> debugLogPublisher =
+          TextDebugLogPublisher
+              .getStartupTextDebugPublisher(new TextWriter.STREAM(out));
+      ErrorLogger.addErrorLogPublisher(errorLogPublisher);
+      DebugLogger.addDebugLogPublisher(debugLogPublisher);
+    }
+    catch (Exception e)
+    {
+      err.println("Error installing the custom error logger: "
+          + stackTraceToSingleLineString(e));
+    }
+  }
+
+  /**
+   * Initializes the directory server.<br />
+   * - bootstrapClient
+   * - initializeJMX
+   * - initializeConfiguration
+   * - initializeSchema
+   * - coreConfigManager.initializeCoreConfig()
+   * - initializeCryptoManager
+   *
+   * @param directoryServer
+   *          The current instance.
+   * @param outStream
+   *          The output stream to use for standard output, or {@code null} if
+   *          standard output is not needed.
+   * @param errStream
+   *          The output stream to use for standard error, or {@code null} if
+   *          standard error is not needed.
+   * @return The error code.
+   */
+  private int initializeServer(final DirectoryServer directoryServer,
+      final PrintStream out, final PrintStream err)
+  {
+    try
+    {
+      DirectoryServer.bootstrapClient();
+      DirectoryServer.initializeJMX();
+    }
+    catch (Exception e)
+    {
+      final Message message =
+          ERR_SERVER_BOOTSTRAP_ERROR.get(getExceptionMessage(e));
+      err.println(wrapText(message, MAX_LINE_WIDTH));
+      return 1;
+    }
+
+    try
+    {
+      directoryServer.initializeConfiguration(configClass.getValue(),
+          configFile.getValue());
+    }
+    catch (Exception ex)
+    {
+      Message message = null;
+      if (ex instanceof InitializationException)
+      {
+        message = ERR_CANNOT_LOAD_CONFIG.get(ex.getMessage());
+      }
+      else
+      {
+        message = ERR_CANNOT_LOAD_CONFIG.get(getExceptionMessage(ex));
+      }
+      err.println(wrapText(message, MAX_LINE_WIDTH));
+      return 1;
+    }
+
+    // Initializes the Directory Server schema elements.
+    try
+    {
+      directoryServer.initializeSchema();
+    }
+    catch (Exception e)
+    {
+      Message message = null;
+      if (e instanceof ConfigException || e instanceof InitializationException)
+      {
+        message = ERR_CANNOT_LOAD_SCHEMA.get(e.getMessage());
+      }
+      else
+      {
+        message = ERR_CANNOT_LOAD_SCHEMA.get(getExceptionMessage(e));
+      }
+      err.println(wrapText(message, MAX_LINE_WIDTH));
+      return 1;
+    }
+
+    // Initializes the Directory Server core configuration.
+    try
+    {
+      final CoreConfigManager coreConfigManager = new CoreConfigManager();
+      coreConfigManager.initializeCoreConfig();
+    }
+    catch (Exception ex)
+    {
+      Message message = null;
+      if (ex instanceof ConfigException
+          || ex instanceof InitializationException)
+      {
+        message = ERR_CANNOT_INITIALIZE_CORE_CONFIG.get(ex.getMessage());
+      }
+      else
+      {
+        message =
+            ERR_CANNOT_INITIALIZE_CORE_CONFIG.get(getExceptionMessage(ex));
+      }
+      err.println(wrapText(message, MAX_LINE_WIDTH));
+      return 1;
+    }
+
+    // Initializes the Directory Server crypto manager.
+    try
+    {
+      directoryServer.initializeCryptoManager();
+    }
+    catch (Exception ex)
+    {
+      Message message = null;
+      if (ex instanceof ConfigException
+          || ex instanceof InitializationException)
+      {
+        message = ERR_CANNOT_INITIALIZE_CRYPTO_MANAGER.get(ex.getMessage());
+      }
+      else
+      {
+        message =
+            ERR_CANNOT_INITIALIZE_CRYPTO_MANAGER.get(getExceptionMessage(ex));
+      }
+      err.println(wrapText(message, MAX_LINE_WIDTH));
+      return 1;
+    }
+
+    return 0;
   }
 
   /**
@@ -544,7 +565,7 @@
    *          process.
    * @return An integer representing the result of the process.
    */
-  private int processRebuildIndex(final Backend backend,
+  private int rebuildIndex(final Backend backend,
       final RebuildConfig rebuildConfig)
   {
     int returnCode = 0;
@@ -624,7 +645,7 @@
    * @throws Exception
    *           If an exception occurred during the backend search.
    */
-  private Backend getBackend(final DN selectedDN) throws ConfigException,
+  private Backend retrieveBackend(final DN selectedDN) throws ConfigException,
       Exception
   {
     Backend backend = null;

--
Gitblit v1.10.0