From a6bc1867af126f844a8b308381b8de6c25320c4c Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Fri, 29 Feb 2008 18:24:15 +0000
Subject: [PATCH] Fix for issue 2984 (Infinite looping of uninstall command)

---
 opends/src/server/org/opends/server/util/cli/ConsoleApplication.java |   81 ++++++++++++++++++++++++++++++++++------
 1 files changed, 69 insertions(+), 12 deletions(-)

diff --git a/opends/src/server/org/opends/server/util/cli/ConsoleApplication.java b/opends/src/server/org/opends/server/util/cli/ConsoleApplication.java
index bfc73db..698846e 100644
--- a/opends/src/server/org/opends/server/util/cli/ConsoleApplication.java
+++ b/opends/src/server/org/opends/server/util/cli/ConsoleApplication.java
@@ -102,7 +102,8 @@
   // The output stream which this application should use.
   private final PrintStream out;
 
-
+  // The maximum number of times we try to confirm.
+  private final static int CONFIRMATION_MAX_TRIES = 5;
 
   /**
    * Creates a new console application instance.
@@ -221,12 +222,7 @@
       }
     };
 
-    try {
-      return readValidatedInput(prompt, validator);
-    } catch (CLIException e) {
-      // Should never happen.
-      throw new RuntimeException(e);
-    }
+    return readValidatedInput(prompt, validator, CONFIRMATION_MAX_TRIES);
   }
 
 
@@ -658,6 +654,40 @@
   }
 
   /**
+   * Interactively prompts for user input and continues until valid
+   * input is provided.
+   *
+   * @param <T>
+   *          The type of decoded user input.
+   * @param prompt
+   *          The interactive prompt which should be displayed on each
+   *          input attempt.
+   * @param validator
+   *          An input validator responsible for validating and
+   *          decoding the user's response.
+   * @param maxTries
+   *          The maximum number of tries that we can make.
+   * @return Returns the decoded user's response.
+   * @throws CLIException
+   *           If an unexpected error occurred which prevented
+   *           validation or if the maximum number of tries was reached.
+   */
+  public final <T> T readValidatedInput(Message prompt,
+      ValidationCallback<T> validator, int maxTries) throws CLIException {
+    int nTries = 0;
+    while (nTries < maxTries) {
+      String response = readLineOfInput(prompt);
+      T value = validator.validate(this, response);
+      if (value != null) {
+        return value;
+      }
+      nTries++;
+    }
+    throw new CLIException(ERR_CONFIRMATION_TRIES_LIMIT_REACHED.get(
+        CONFIRMATION_MAX_TRIES));
+  }
+
+  /**
    * Commodity method that interactively confirms whether a user wishes to
    * perform an action. If the application is non-interactive, then the provided
    * default is returned automatically.  If there is an error an error message
@@ -672,18 +702,45 @@
    * @param logger the Logger to be used to log the error message.
    * @return Returns <code>true</code> if the user wishes the action
    *         to be performed, or <code>false</code> if they refused.
+   * @throws CLIException if the user did not provide valid answer after
+   *         a certain number of tries
+   *         (ConsoleApplication.CONFIRMATION_MAX_TRIES)
    */
   protected final boolean askConfirmation(Message prompt, boolean defaultValue,
-      Logger logger)
+      Logger logger) throws CLIException
   {
     boolean v = defaultValue;
-    try
+
+    boolean done = false;
+    int nTries = 0;
+
+    while (!done && (nTries < CONFIRMATION_MAX_TRIES))
     {
-      v = confirmAction(prompt, defaultValue);
+      nTries++;
+      try
+      {
+        v = confirmAction(prompt, defaultValue);
+        done = true;
+      }
+      catch (CLIException ce)
+      {
+        if (ce.getMessageObject().equals(
+            ERR_CONFIRMATION_TRIES_LIMIT_REACHED.get(
+                  CONFIRMATION_MAX_TRIES)))
+        {
+          throw ce;
+        }
+        logger.log(Level.WARNING, "Error reading input: "+ce, ce);
+//      Try again...
+        println();
+      }
     }
-    catch (CLIException ce)
+
+    if (!done)
     {
-      logger.log(Level.WARNING, "Error reading input: "+ce, ce);
+      // This means we reached the maximum number of tries
+      throw new CLIException(ERR_CONFIRMATION_TRIES_LIMIT_REACHED.get(
+          CONFIRMATION_MAX_TRIES));
     }
     return v;
   }

--
Gitblit v1.10.0