From dc6bbc9fbe92f7db73e4e3105a0ba371e7ce2f65 Mon Sep 17 00:00:00 2001
From: kenneth_suter <kenneth_suter@localhost>
Date: Wed, 19 Sep 2007 17:03:37 +0000
Subject: [PATCH] This commit would clarifies the local operation vs. task scheduling behavior by:

---
 opendj-sdk/opends/src/messages/messages/tools.properties                                     |   15 ++++++-
 opendj-sdk/opends/src/server/org/opends/server/tools/tasks/TaskTool.java                     |   33 ++++++++++++----
 opendj-sdk/opends/src/server/org/opends/server/admin/client/cli/SecureConnectionCliArgs.java |   59 ++++++++++++++++++++---------
 opendj-sdk/opends/src/server/org/opends/server/tools/RestoreDB.java                          |    2 
 opendj-sdk/opends/src/server/org/opends/server/util/args/LDAPConnectionArgumentParser.java   |    6 +--
 5 files changed, 81 insertions(+), 34 deletions(-)

diff --git a/opendj-sdk/opends/src/messages/messages/tools.properties b/opendj-sdk/opends/src/messages/messages/tools.properties
index e22ab24..6f7aa54 100644
--- a/opendj-sdk/opends/src/messages/messages/tools.properties
+++ b/opendj-sdk/opends/src/messages/messages/tools.properties
@@ -2140,8 +2140,19 @@
 SEVERE_ERR_TASK_CLIENT_TASK_STATE_UNKNOWN_1455=State for task '%s' cannot be \
   determined
 INFO_DESCRIPTION_START_DATETIME_1456=Indicates the date/time at which the this \
-  task will start when scheduled expressed in format 'YYYYMMDDhhmmss'. \
-  Omission of this option will cause the task to be for immediate execution
+  operation will start when scheduled as a server task expressed in format \
+  'YYYYMMDDhhmmss'.  A value of '0' will cause the task to be scheduled for \
+  immediate execution
 SEVERE_ERR_START_DATETIME_FORMAT_1457=The start date/time must in format \
   'YYYYMMDDhhmmss'
 INFO_TASK_TOOL_TASK_SCHEDULED_FUTURE_1458=%s task %s scheduled to start %s
+SEVERE_ERR_TASK_TOOL_START_TIME_NO_LDAP_1459=You have provided a task start \
+  time but options provided for connecting to the server's tasks backend \
+  resulted in the following error: '%s'
+SEVERE_ERR_TASK_TOOL_LDAP_NO_START_TIME_1460=You have provided options that \
+  specify information for specifying a connection to the Directory Server but \
+  no -t/--startTime option.  In order to schedule a server task you must \
+  provide the -t/--startTime argument with either the start time in format \
+  'YYYYMMDDhhmmss' as the value or '0' to schedule the task for immediate \
+  execution.  To run this operation locally and not as a server task omit the \
+  Directory Server connection options
diff --git a/opendj-sdk/opends/src/server/org/opends/server/admin/client/cli/SecureConnectionCliArgs.java b/opendj-sdk/opends/src/server/org/opends/server/admin/client/cli/SecureConnectionCliArgs.java
index fe1dcb5..0d59287 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/admin/client/cli/SecureConnectionCliArgs.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/admin/client/cli/SecureConnectionCliArgs.java
@@ -154,6 +154,10 @@
    */
   public StringArgument  saslOptionArg = null;
 
+  /**
+   * Private container for global arguments.
+   */
+  private LinkedHashSet<Argument> argList = null;
 
   // the trust manager.
   private ApplicationTrustManager trustManager;
@@ -182,6 +186,25 @@
   }
 
   /**
+   * Indicates whether or not any of the arguments are present.
+   *
+   * @return boolean where true indicates that at least one of the
+   *         arguments is present
+   */
+  public boolean argumentsPresent() {
+    boolean present = false;
+    if (argList != null) {
+      for (Argument arg : argList) {
+        if (arg.isPresent()) {
+          present = true;
+          break;
+        }
+      }
+    }
+    return present;
+  }
+
+  /**
    * Get the bindDN which has to be used for the command.
    *
    * @return The bindDN specified by the command line argument, or the
@@ -360,42 +383,42 @@
   public LinkedHashSet<Argument> createGlobalArguments()
   throws ArgumentException
   {
-    LinkedHashSet<Argument> set = new LinkedHashSet<Argument>();
+    argList = new LinkedHashSet<Argument>();
 
     useSSLArg = new BooleanArgument("useSSL", OPTION_SHORT_USE_SSL,
         OPTION_LONG_USE_SSL, INFO_DESCRIPTION_USE_SSL.get());
-    set.add(useSSLArg);
+    argList.add(useSSLArg);
 
     useStartTLSArg = new BooleanArgument("startTLS", OPTION_SHORT_START_TLS,
         OPTION_LONG_START_TLS,
         INFO_DESCRIPTION_START_TLS.get());
-    set.add(useStartTLSArg);
+    argList.add(useStartTLSArg);
 
     hostNameArg = new StringArgument("host", OPTION_SHORT_HOST,
         OPTION_LONG_HOST, false, false, true, OPTION_VALUE_HOST, "localhost",
         null, INFO_DESCRIPTION_HOST.get());
-    set.add(hostNameArg);
+    argList.add(hostNameArg);
 
     portArg = new IntegerArgument("port", OPTION_SHORT_PORT, OPTION_LONG_PORT,
         false, false, true, OPTION_VALUE_PORT, 389, null,
         INFO_DESCRIPTION_PORT.get());
-    set.add(portArg);
+    argList.add(portArg);
 
     bindDnArg = new StringArgument("bindDN", OPTION_SHORT_BINDDN,
         OPTION_LONG_BINDDN, false, false, true, OPTION_VALUE_BINDDN,
         "cn=Directory Manager", null, INFO_DESCRIPTION_BINDDN.get());
-    set.add(bindDnArg);
+    argList.add(bindDnArg);
 
     bindPasswordArg = new StringArgument("bindPassword",
         OPTION_SHORT_BINDPWD, OPTION_LONG_BINDPWD, false, false, true,
         OPTION_VALUE_BINDPWD, null, null, INFO_DESCRIPTION_BINDPASSWORD.get());
-    set.add(bindPasswordArg);
+    argList.add(bindPasswordArg);
 
     bindPasswordFileArg = new FileBasedArgument("bindPasswordFile",
         OPTION_SHORT_BINDPWD_FILE, OPTION_LONG_BINDPWD_FILE, false, false,
         OPTION_VALUE_BINDPWD_FILE, null, null,
         INFO_DESCRIPTION_BINDPASSWORDFILE.get());
-    set.add(bindPasswordFileArg);
+    argList.add(bindPasswordFileArg);
 
     saslOptionArg = new StringArgument(
             "sasloption", OPTION_SHORT_SASLOPTION,
@@ -403,56 +426,56 @@
             true, true,
             OPTION_VALUE_SASLOPTION, null, null,
             INFO_LDAP_CONN_DESCRIPTION_SASLOPTIONS.get());
-    set.add(saslOptionArg);
+    argList.add(saslOptionArg);
 
     trustAllArg = new BooleanArgument("trustAll", OPTION_SHORT_TRUSTALL,
         OPTION_LONG_TRUSTALL, INFO_DESCRIPTION_TRUSTALL.get());
-    set.add(trustAllArg);
+    argList.add(trustAllArg);
 
     trustStorePathArg = new StringArgument("trustStorePath",
         OPTION_SHORT_TRUSTSTOREPATH, OPTION_LONG_TRUSTSTOREPATH, false,
         false, true, OPTION_VALUE_TRUSTSTOREPATH, null, null,
         INFO_DESCRIPTION_TRUSTSTOREPATH.get());
-    set.add(trustStorePathArg);
+    argList.add(trustStorePathArg);
 
     trustStorePasswordArg = new StringArgument("trustStorePassword",
         OPTION_SHORT_TRUSTSTORE_PWD, OPTION_LONG_TRUSTSTORE_PWD, false, false,
         true, OPTION_VALUE_TRUSTSTORE_PWD, null, null,
         INFO_DESCRIPTION_TRUSTSTOREPASSWORD.get());
-    set.add(trustStorePasswordArg);
+    argList.add(trustStorePasswordArg);
 
     trustStorePasswordFileArg = new FileBasedArgument("trustStorePasswordFile",
         OPTION_SHORT_TRUSTSTORE_PWD_FILE, OPTION_LONG_TRUSTSTORE_PWD_FILE,
         false, false, OPTION_VALUE_TRUSTSTORE_PWD_FILE, null, null,
         INFO_DESCRIPTION_TRUSTSTOREPASSWORD_FILE.get());
-    set.add(trustStorePasswordFileArg);
+    argList.add(trustStorePasswordFileArg);
 
     keyStorePathArg = new StringArgument("keyStorePath",
         OPTION_SHORT_KEYSTOREPATH, OPTION_LONG_KEYSTOREPATH, false, false,
         true, OPTION_VALUE_KEYSTOREPATH, null, null,
         INFO_DESCRIPTION_KEYSTOREPATH.get());
-    set.add(keyStorePathArg);
+    argList.add(keyStorePathArg);
 
     keyStorePasswordArg = new StringArgument("keyStorePassword",
         OPTION_SHORT_KEYSTORE_PWD,
         OPTION_LONG_KEYSTORE_PWD, false, false, true,
         OPTION_VALUE_KEYSTORE_PWD, null, null,
         INFO_DESCRIPTION_KEYSTOREPASSWORD.get());
-    set.add(keyStorePasswordArg);
+    argList.add(keyStorePasswordArg);
 
     keyStorePasswordFileArg = new FileBasedArgument("keystorePasswordFile",
         OPTION_SHORT_KEYSTORE_PWD_FILE, OPTION_LONG_KEYSTORE_PWD_FILE, false,
         false, OPTION_VALUE_KEYSTORE_PWD_FILE, null, null,
         INFO_DESCRIPTION_KEYSTOREPASSWORD_FILE.get());
-    set.add(keyStorePasswordFileArg);
+    argList.add(keyStorePasswordFileArg);
 
     certNicknameArg = new StringArgument("certNickname",
         OPTION_SHORT_CERT_NICKNAME, OPTION_LONG_CERT_NICKNAME,
         false, false, true, OPTION_VALUE_CERT_NICKNAME, null, null,
         INFO_DESCRIPTION_CERT_NICKNAME.get());
-    set.add(certNicknameArg);
+    argList.add(certNicknameArg);
 
-    return set;
+    return argList;
   }
 
   /**
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/RestoreDB.java b/opendj-sdk/opends/src/server/org/opends/server/tools/RestoreDB.java
index 89a13b7..8fe73d6 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/RestoreDB.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/RestoreDB.java
@@ -265,7 +265,7 @@
     }
 
 
-    if (listBackups.isPresent() && argParser.isLdapOperation()) {
+    if (listBackups.isPresent() && argParser.argumentsPresent()) {
       Message message = ERR_LDAP_CONN_INCOMPATIBLE_ARGS.get(
               listBackups.getLongIdentifier());
       err.println(wrapText(message, MAX_LINE_WIDTH));
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/tasks/TaskTool.java b/opendj-sdk/opends/src/server/org/opends/server/tools/tasks/TaskTool.java
index 9d7b17b..9e4020d 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/tasks/TaskTool.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/tasks/TaskTool.java
@@ -56,6 +56,13 @@
  */
 public abstract class TaskTool implements TaskScheduleInformation {
 
+  /**
+   * Magic value used to indicate that the user would like to schedule
+   * this operation to run immediately as a task as opposed to running
+   * the operation in the local VM.
+   */
+  public static final String NOW = "0";
+
   LDAPConnectionArgumentParser argParser;
 
   StringArgument startArg;
@@ -85,8 +92,8 @@
   protected LDAPConnectionArgumentParser createArgParser(String className,
                                            Message toolDescription)
   {
-    LDAPConnectionArgumentParser argParser = new LDAPConnectionArgumentParser(
-            className, toolDescription, false);
+    argParser = new LDAPConnectionArgumentParser(className,
+            toolDescription, false);
 
     try {
       startArg =
@@ -113,7 +120,7 @@
    * @throws ArgumentException if there is a problem with the arguments
    */
   protected void validateTaskArgs() throws ArgumentException {
-    if (startArg.isPresent()) {
+    if (startArg.isPresent() && !NOW.equals(startArg.getValue())) {
       try {
         StaticUtils.parseDateTimeString(startArg.getValue());
       } catch (ParseException pe) {
@@ -128,10 +135,14 @@
   public Date getStartDateTime() {
     Date start = null;
     if (startArg != null && startArg.isPresent()) {
-      try {
-        start = StaticUtils.parseDateTimeString(startArg.getValue());
-      } catch (ParseException pe) {
-        // ignore; valiidated in validateTaskArgs()
+      if (NOW.equals(startArg.getValue())) {
+        start = new Date();
+      } else {
+        try {
+          start = StaticUtils.parseDateTimeString(startArg.getValue());
+        } catch (ParseException pe) {
+          // ignore; valiidated in validateTaskArgs()
+        }
       }
     }
     return start;
@@ -153,7 +164,7 @@
                         PrintStream out, PrintStream err) {
     int ret;
 
-    if (argParser.isLdapOperation())
+    if (startArg.isPresent())
     {
       if (initializeServer)
       {
@@ -193,7 +204,7 @@
         }
         ret = 0;
       } catch (LDAPConnectionException e) {
-        Message message = ERR_LDAP_CONN_CANNOT_CONNECT.get(e.getMessage());
+        Message message = ERR_TASK_TOOL_START_TIME_NO_LDAP.get(e.getMessage());
         if (err != null) err.println(wrapText(message, MAX_LINE_WIDTH));
         ret = 1;
       } catch (IOException ioe) {
@@ -213,6 +224,10 @@
         if (err != null) err.println(wrapText(message, MAX_LINE_WIDTH));
         ret = 1;
       }
+    } else if (argParser.argumentsPresent()) {
+      Message message = ERR_TASK_TOOL_LDAP_NO_START_TIME.get();
+      if (err != null) err.println(wrapText(message, MAX_LINE_WIDTH));
+      ret = 1;
     } else {
       ret = processLocal(initializeServer, out, err);
     }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/util/args/LDAPConnectionArgumentParser.java b/opendj-sdk/opends/src/server/org/opends/server/util/args/LDAPConnectionArgumentParser.java
index 5482cc3..7c11439 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/util/args/LDAPConnectionArgumentParser.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/util/args/LDAPConnectionArgumentParser.java
@@ -124,10 +124,8 @@
    * @return true if the user wants to perform a remote operation;
    *         false otherwise
    */
-  public boolean isLdapOperation() {
-    return args.hostNameArg.isPresent() ||
-            args.portArg.isPresent() ||
-            args.bindDnArg.isPresent();
+  public boolean argumentsPresent() {
+    return args != null && args.argumentsPresent();
   }
 
   /**

--
Gitblit v1.10.0