From 9cad73ed793b1f1a898fb0a0e8ad115178de3240 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 26 Feb 2015 10:14:26 +0000
Subject: [PATCH] OPENDJ-1840 (CR-6146) dsconfig should support batching commands from standard input

---
 opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentConstants.java       |    2 ++
 opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java |   35 ++++++++++++++++++++++++++++-------
 opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties          |    7 +++----
 3 files changed, 33 insertions(+), 11 deletions(-)

diff --git a/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentConstants.java b/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentConstants.java
index fa169f8..86f7723 100644
--- a/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentConstants.java
+++ b/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentConstants.java
@@ -66,6 +66,8 @@
      */
     public static final String SASL_PROPERTY_MECH = "mech";
 
+    /** The value for the long option batch. */
+    public static final String OPTION_LONG_BATCH = "batch";
     /** The value for the short option batchFilePath. */
     public static final char OPTION_SHORT_BATCH_FILE_PATH = 'F';
     /** The value for the long option batchFilePath. */
diff --git a/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties b/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties
index 745927b..2bcfc1c 100755
--- a/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties
+++ b/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties
@@ -806,14 +806,13 @@
 INFO_CANNOT_CONNECT_TO_REMOTE_GENERIC=Could not connect to %s.  Check that the \
  server is running and that the provided credentials are valid.%nError \
  details:%n%s
-ERR_CONFIRMATION_TRIES_LIMIT_REACHED=Confirmation tries limit reached \
- (%d)
+ERR_CONFIRMATION_TRIES_LIMIT_REACHED=Confirmation tries limit reached (%d)
 INFO_ADMINISTRATOR_UID_PROMPT=Global Administrator User ID
 INFO_ADMINISTRATOR_PWD_PROMPT=Global Administrator Password:
 INFO_ADMINISTRATOR_PWD_CONFIRM_PROMPT=Confirm Password:
 ERR_ADMINISTRATOR_PWD_DO_NOT_MATCH=The provided passwords do not match.
-ERR_BAD_INTEGER=Invalid integer number "%s". Please \
-  enter a valid integer
+ERR_BAD_INTEGER=Invalid integer number "%s". Please enter a valid integer
+INFO_DESCRIPTION_BATCH=Reads from standard input a set of commands to be executed
 INFO_DESCRIPTION_BATCH_FILE_PATH=Path to a batch file containing \
 a set of commands to be executed
 INFO_DESCRIPTION_DISPLAY_EQUIVALENT=Display the equivalent \
diff --git a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java
index 1534ae4..9ee400c 100644
--- a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java
+++ b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java
@@ -43,6 +43,7 @@
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.PrintStream;
 import java.net.URL;
@@ -809,6 +810,8 @@
     /** Indicates whether or not a sub-command was provided. */
     private boolean hasSubCommand = true;
 
+    /** The argument which should be used to read dsconfig commands from standard input. */
+    private BooleanArgument batchArgument;
     /** The argument which should be used to read dsconfig commands from a file. */
     private StringArgument batchFileArgument;
 
@@ -946,6 +949,9 @@
             advancedModeArgument = CommonArguments.getAdvancedMode();
             showUsageArgument = CommonArguments.getShowUsage();
 
+            batchArgument = new BooleanArgument(OPTION_LONG_BATCH, null, OPTION_LONG_BATCH,
+                    INFO_DESCRIPTION_BATCH.get());
+
             batchFileArgument = new StringArgument(OPTION_LONG_BATCH_FILE_PATH, OPTION_SHORT_BATCH_FILE_PATH,
                     OPTION_LONG_BATCH_FILE_PATH, false, false, true, INFO_BATCH_FILE_PATH_PLACEHOLDER.get(), null,
                     null, INFO_DESCRIPTION_BATCH_FILE_PATH.get());
@@ -975,6 +981,7 @@
             parser.addGlobalArgument(quietArgument);
             parser.addGlobalArgument(scriptFriendlyArgument);
             parser.addGlobalArgument(noPromptArgument);
+            parser.addGlobalArgument(batchArgument);
             parser.addGlobalArgument(batchFileArgument);
             parser.addGlobalArgument(displayEquivalentArgument);
             parser.addGlobalArgument(equivalentCommandFileArgument);
@@ -1111,8 +1118,8 @@
         }
 
         // Handle batch file if any
-        if (batchFileArgument.isPresent()) {
-            handleBatchFile(args);
+        if (batchArgument.isPresent() || batchFileArgument.isPresent()) {
+            handleBatch(args);
             return ReturnCode.SUCCESS.get();
         }
 
@@ -1139,8 +1146,10 @@
 
     private void checkForConflictingArguments() throws ArgumentException {
         throwIfConflictingArgsSet(quietArgument, verboseArgument);
+        throwIfConflictingArgsSet(batchArgument, batchFileArgument);
 
         throwIfSetInInteractiveMode(batchFileArgument);
+        throwIfSetInInteractiveMode(batchArgument);
         throwIfSetInInteractiveMode(quietArgument);
 
         throwIfConflictingArgsSet(scriptFriendlyArgument, verboseArgument);
@@ -1411,11 +1420,18 @@
         return INFO_DSCFG_SESSION_START_TIME_MESSAGE.get(getScriptName(), date).toString();
     }
 
-    private void handleBatchFile(String[] args) {
+    private void handleBatch(String[] args) {
         BufferedReader bReader = null;
         try {
-            final String batchFilePath = batchFileArgument.getValue().trim();
-            bReader = new BufferedReader(new FileReader(batchFilePath));
+            if (batchArgument.isPresent()) {
+                bReader = new BufferedReader(new InputStreamReader(System.in));
+            } else if (batchFileArgument.isPresent()) {
+                final String batchFilePath = batchFileArgument.getValue().trim();
+                bReader = new BufferedReader(new FileReader(batchFilePath));
+            } else {
+                throw new IllegalArgumentException("Either --" + OPTION_LONG_BATCH
+                    + " or --" + OPTION_LONG_BATCH_FILE_PATH + " argument should have been set");
+            }
 
             List<String> initialArgs = removeBatchArgs(args);
 
@@ -1486,8 +1502,13 @@
         Collections.addAll(initialArgs, args);
         for (Iterator<String> it = initialArgs.iterator(); it.hasNext();) {
             final String elem = it.next();
-            if (elem.startsWith("-" + batchFileArgument.getShortIdentifier())
-                    || elem.contains(batchFileArgument.getLongIdentifier())) {
+            if (batchArgument.isPresent()
+                    && elem.contains(batchArgument.getLongIdentifier())) {
+                it.remove();
+                break;
+            } else if (batchFileArgument.isPresent()
+                    && (elem.startsWith("-" + batchFileArgument.getShortIdentifier())
+                            || elem.contains(batchFileArgument.getLongIdentifier()))) {
                 // Remove both the batch file arg and its value
                 it.remove();
                 it.next();

--
Gitblit v1.10.0