From 6b3ef14a652f6be0d559365d2fd2c78a61524fec Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Fri, 17 Sep 2010 22:06:25 +0000
Subject: [PATCH] Minimize Historical Data (dsreplication/client side). The purge historical can be executed on the local server even when it is stopped. This is matches the functionality provided by utilities such import-ldif, backup, etc.

---
 opends/src/server/org/opends/server/tools/dsreplication/ReplicationCliArgumentParser.java |  231 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 229 insertions(+), 2 deletions(-)

diff --git a/opends/src/server/org/opends/server/tools/dsreplication/ReplicationCliArgumentParser.java b/opends/src/server/org/opends/server/tools/dsreplication/ReplicationCliArgumentParser.java
index 4409a8a..a4d85ed 100644
--- a/opends/src/server/org/opends/server/tools/dsreplication/ReplicationCliArgumentParser.java
+++ b/opends/src/server/org/opends/server/tools/dsreplication/ReplicationCliArgumentParser.java
@@ -44,6 +44,10 @@
 import org.opends.server.admin.AdministrationConnector;
 import org.opends.server.admin.client.cli.SecureConnectionCliArgs;
 import org.opends.server.admin.client.cli.SecureConnectionCliParser;
+import org.opends.server.admin.client.cli.TaskScheduleArgs;
+import org.opends.server.extensions.ConfigFileHandler;
+import org.opends.server.tasks.PurgeConflictsHistoricalTask;
+import org.opends.server.types.OpenDsException;
 import org.opends.server.util.args.Argument;
 import org.opends.server.util.args.ArgumentException;
 import org.opends.server.util.args.ArgumentGroup;
@@ -68,6 +72,7 @@
   private SubCommand postExternalInitializationSubCmd;
   private SubCommand preExternalInitializationSubCmd;
   private SubCommand statusReplicationSubCmd;
+  private SubCommand purgeHistoricalSubCmd;
 
   int defaultAdminPort =
     AdministrationConnector.DEFAULT_ADMINISTRATION_CONNECTOR_PORT;
@@ -219,7 +224,7 @@
   /**
    * The 'suffixes' global argument.
    */
-  private StringArgument baseDNsArg = null;
+  StringArgument baseDNsArg = null;
 
   /**
    * The 'quiet' argument.
@@ -259,6 +264,22 @@
    */
   BooleanArgument advancedArg;
 
+  // The argument set by the user to specify the configuration class
+  // (useful when dsreplication purge-historical runs locally/starts the server)
+  private StringArgument  configClassArg;
+
+  // The argument set by the user to specify the configuration file
+  // (useful when dsreplication purge-historical runs locally/starts the server)
+  private StringArgument  configFileArg;
+
+  TaskScheduleArgs taskArgs;
+
+
+  /**
+   * The 'maximumDuration' argument for the purge of historical.
+   */
+  IntegerArgument maximumDurationArg;
+
   /**
    * The text of the enable replication subcommand.
    */
@@ -297,6 +318,11 @@
    */
   public static final String STATUS_REPLICATION_SUBCMD_NAME = "status";
 
+  /**
+   * The text of the purge historical subcommand.
+   */
+  public static final String PURGE_HISTORICAL_SUBCMD_NAME = "purge-historical";
+
   // This CLI is always using the administration connector with SSL
   private final boolean alwaysSSL = true;
 
@@ -329,6 +355,7 @@
   public void initializeParser(OutputStream outStream)
       throws ArgumentException
   {
+    taskArgs = new TaskScheduleArgs();
     initializeGlobalArguments(outStream);
     try
     {
@@ -345,6 +372,7 @@
     createPreExternalInitializationSubCommand();
     createPostExternalInitializationSubCommand();
     createStatusReplicationSubCommand();
+    createPurgeHistoricalSubCommand();
   }
 
   /**
@@ -365,6 +393,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public int validateGlobalOptions(MessageBuilder buf)
   {
     int returnValue;
@@ -418,7 +447,8 @@
       {
         errors.add(ERR_REPLICATION_NO_BASE_DN_PROVIDED.get());
       }
-      if (getBindPasswordAdmin() == null)
+      if (getBindPasswordAdmin() == null &&
+          !isPurgeHistoricalSubcommand())
       {
         errors.add(ERR_REPLICATION_NO_ADMINISTRATOR_PASSWORD_PROVIDED.get(
             "--"+secureArgsList.bindPasswordArg.getLongIdentifier(),
@@ -556,6 +586,23 @@
         INFO_REPLICATION_DESCRIPTION_ADVANCED.get());
     defaultArgs.add(index++, advancedArg);
 
+    configClassArg =
+      new StringArgument("configclass", OPTION_SHORT_CONFIG_CLASS,
+                         OPTION_LONG_CONFIG_CLASS, true, false,
+                         true, INFO_CONFIGCLASS_PLACEHOLDER.get(),
+                         ConfigFileHandler.class.getName(), null,
+                         INFO_DESCRIPTION_CONFIG_CLASS.get());
+    configClassArg.setHidden(true);
+    defaultArgs.add(index++, configClassArg);
+
+    configFileArg =
+      new StringArgument("configfile", 'f', "configFile", true, false,
+                         true, INFO_CONFIGFILE_PLACEHOLDER.get(), null,
+                         null,
+                         INFO_DESCRIPTION_CONFIG_FILE.get());
+    configFileArg.setHidden(true);
+    defaultArgs.add(index++, configFileArg);
+
     for (int i=0; i<index; i++)
     {
       Argument arg = defaultArgs.get(i);
@@ -585,6 +632,7 @@
    * @throws ArgumentException if there is a conflict with the provided
    * arguments.
    */
+  @Override
   protected void initializeGlobalArguments(
           Collection<Argument> args,
           ArgumentGroup argGroup)
@@ -625,6 +673,8 @@
     port1Arg = new IntegerArgument("port1", OPTION_SHORT_PORT, "port1",
         false, false, true, INFO_PORT_PLACEHOLDER.get(),
         defaultAdminPort, null,
+        true, 1,
+        true, 65336,
         INFO_DESCRIPTION_ENABLE_REPLICATION_SERVER_PORT1.get());
 
     bindDn1Arg = new StringArgument("bindDN1", OPTION_SHORT_BINDDN,
@@ -645,6 +695,8 @@
     replicationPort1Arg = new IntegerArgument("replicationPort1", 'r',
         "replicationPort1", false, false, true, INFO_PORT_PLACEHOLDER.get(),
         8989, null,
+        true, 1,
+        true, 65336,
         INFO_DESCRIPTION_ENABLE_REPLICATION_PORT1.get());
 
     secureReplication1Arg = new BooleanArgument("secureReplication1", null,
@@ -666,6 +718,8 @@
 
     port2Arg = new IntegerArgument("port2", null, "port2",
         false, false, true, INFO_PORT_PLACEHOLDER.get(), defaultAdminPort, null,
+        true, 1,
+        true, 65336,
         INFO_DESCRIPTION_ENABLE_REPLICATION_SERVER_PORT2.get());
 
     bindDn2Arg = new StringArgument("bindDN2", null,
@@ -686,6 +740,8 @@
     replicationPort2Arg = new IntegerArgument("replicationPort2", 'R',
         "replicationPort2", false, false, true, INFO_PORT_PLACEHOLDER.get(),
         8989, null,
+        true, 1,
+        true, 65336,
         INFO_DESCRIPTION_ENABLE_REPLICATION_PORT2.get());
 
     secureReplication2Arg = new BooleanArgument("secureReplication2", null,
@@ -783,6 +839,8 @@
     portSourceArg = new IntegerArgument("portSource", OPTION_SHORT_PORT,
         "portSource", false, false, true, INFO_PORT_PLACEHOLDER.get(),
         defaultAdminPort, null,
+        true, 1,
+        true, 65336,
         INFO_DESCRIPTION_INITIALIZE_REPLICATION_SERVER_PORT_SOURCE.get());
 
     hostNameDestinationArg = new StringArgument("hostDestination", 'O',
@@ -794,6 +852,8 @@
         "portDestination", false, false, true, INFO_PORT_PLACEHOLDER.get(),
         defaultAdminPort,
         null,
+        true, 1,
+        true, 65336,
         INFO_DESCRIPTION_INITIALIZE_REPLICATION_SERVER_PORT_DESTINATION.get());
 
     initializeReplicationSubCmd = new SubCommand(this,
@@ -916,6 +976,50 @@
   }
 
   /**
+   * Creates the purge historical subcommand and all the specific options
+   * for the subcommand.  Note: this method assumes that
+   * initializeGlobalArguments has already been called and that hostNameArg and
+   * portArg have been created.
+   */
+  private void createPurgeHistoricalSubCommand()
+  throws ArgumentException
+  {
+    maximumDurationArg = new IntegerArgument(
+        "maximumDuration",
+        null, // shortId
+        "maximumDuration",
+        true, // isRequired
+        false, // isMultivalued
+        true,  // needsValue
+        INFO_MAXIMUM_DURATION_PLACEHOLDER.get(),
+        PurgeConflictsHistoricalTask.DEFAULT_MAX_DURATION,
+        null,
+        true, 0,
+        false, Integer.MAX_VALUE,
+        INFO_DESCRIPTION_PURGE_HISTORICAL_MAXIMUM_DURATION.get());
+
+    purgeHistoricalSubCmd = new SubCommand(
+        this,
+        PURGE_HISTORICAL_SUBCMD_NAME,
+        INFO_DESCRIPTION_SUBCMD_PURGE_HISTORICAL.get());
+
+    Argument[] argsToAdd = {
+        secureArgsList.hostNameArg,
+        secureArgsList.portArg,
+        maximumDurationArg};
+
+    for (int i=0; i<argsToAdd.length; i++)
+    {
+      argsToAdd[i].setPropertyName(argsToAdd[i].getLongIdentifier());
+      purgeHistoricalSubCmd.addArgument(argsToAdd[i]);
+    }
+    for (Argument arg : taskArgs.getArguments())
+    {
+      purgeHistoricalSubCmd.addArgument(arg);
+    }
+  }
+
+  /**
    * Tells whether the user specified to have an interactive operation or not.
    * This method must be called after calling parseArguments.
    * @return <CODE>true</CODE> if the user specified to have an interactive
@@ -1061,6 +1165,7 @@
    * Returns the Administrator UID explicitly provided in the command-line.
    * @return the Administrator UID explicitly provided in the command-line.
    */
+  @Override
   public String getAdministratorUID()
   {
     return getValue(secureArgsList.adminUidArg);
@@ -1642,6 +1747,28 @@
   }
 
   /**
+   * Returns the config class value provided in the hidden argument of the
+   * command-line.
+   * @return the config class value provided in the hidden argument of the
+   * command-line.
+   */
+  public String getConfigClass()
+  {
+    return getValue(configClassArg);
+  }
+
+  /**
+   * Returns the config file value provided in the hidden argument of the
+   * command-line.
+   * @return the config file value provided in the hidden argument of the
+   * command-line.
+   */
+  public String getConfigFile()
+  {
+    return getValue(configFileArg);
+  }
+
+  /**
    * Returns the value of the provided argument only if the user provided it
    * explicitly.
    * @param arg the StringArgument to be handled.
@@ -1752,6 +1879,10 @@
     {
       validatePostExternalInitializationOptions(buf);
     }
+    else if (isPurgeHistoricalSubcommand())
+    {
+      validatePurgeHistoricalOptions(buf);
+    }
 
     else
     {
@@ -1762,6 +1893,35 @@
   }
 
   /**
+   * Checks the purge historical subcommand options and updates the
+   * provided MessageBuilder with the errors that were encountered with the
+   * subcommand options.
+   *
+   * This method assumes that the method parseArguments for the parser has
+   * already been called.
+   * @param buf the MessageBuilder object where we add the error messages
+   * describing the errors encountered.
+   */
+  private void validatePurgeHistoricalOptions(MessageBuilder buf)
+  {
+    try
+    {
+      if (!isInteractive() && !connectionArgumentsPresent())
+      {
+        taskArgs.validateArgsIfOffline();
+      }
+      else
+      {
+        taskArgs.validateArgs();
+      }
+    }
+    catch (OpenDsException ode)
+    {
+      addMessage(buf, ode.getMessageObject());
+    }
+  }
+
+  /**
    * Returns whether the user provided subcommand is the enable replication
    * or not.
    * @return <CODE>true</CODE> if the user provided subcommand is the
@@ -1795,6 +1955,17 @@
   }
 
   /**
+   * Returns whether the user provided subcommand is the purge historical
+   * or not.
+   * @return <CODE>true</CODE> if the user provided subcommand is the
+   * purge historical and <CODE>false</CODE> otherwise.
+   */
+  public boolean isPurgeHistoricalSubcommand()
+  {
+    return isSubcommand(PURGE_HISTORICAL_SUBCMD_NAME);
+  }
+
+  /**
    * Returns whether the user provided subcommand is the initialize all
    * replication or not.
    * @return <CODE>true</CODE> if the user provided subcommand is the
@@ -2071,4 +2242,60 @@
   {
     return secureArgsList;
   }
+
+  /**
+   * Returns the TaskScheduleArgs object containing the arguments
+   * of this parser.
+   * @return the TaskScheduleArgs object containing the arguments
+   * of this parser.
+   */
+  public TaskScheduleArgs getTaskArgsList()
+  {
+    return taskArgs;
+  }
+
+  /**
+   * Returns whether the user specified connection arguments or not.
+   * @return {@code true} if the user specified connection arguments and
+   * {@code false} otherwise.
+   */
+  public boolean connectionArgumentsPresent()
+  {
+    if (isPurgeHistoricalSubcommand()) {
+      boolean secureArgsPresent = getSecureArgsList() != null &&
+      getSecureArgsList().argumentsPresent();
+      // This have to be explicitly specified because their original definition
+      // has been replaced.
+      boolean adminArgsPresent = secureArgsList.adminUidArg.isPresent() ||
+      secureArgsList.bindPasswordArg.isPresent() ||
+      secureArgsList.bindPasswordFileArg.isPresent();
+      return secureArgsPresent || adminArgsPresent;
+    }
+    else
+    {
+      return true;
+    }
+  }
+
+  /**
+    * Returns the maximum duration explicitly provided in the purge historical
+    * replication subcommand.
+    * @return the maximum duration explicitly provided in the purge historical
+    * replication subcommand.  Returns -1 if no port was explicitly provided.
+    */
+  public int getMaximumDuration()
+  {
+     return getValue(maximumDurationArg);
+  }
+
+  /**
+   * Returns the maximum duration default value in the purge historical
+   * replication subcommand.
+   * @return the maximum duration default value in the purge historical
+   * replication subcommand.
+   */
+  public int getDefaultMaximumDuration()
+  {
+    return getDefaultValue(maximumDurationArg);
+  }
 }

--
Gitblit v1.10.0