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/guitools/org/opends/guitools/uninstaller/UninstallCliHelper.java | 357 ++++++++++++++++++-----------
opends/src/guitools/org/opends/guitools/replicationcli/ReplicationCliMain.java | 261 ++++++++++++++++----
opends/src/messages/messages/utility.properties | 2
opends/src/server/org/opends/server/util/cli/ConsoleApplication.java | 81 +++++-
4 files changed, 493 insertions(+), 208 deletions(-)
diff --git a/opends/src/guitools/org/opends/guitools/replicationcli/ReplicationCliMain.java b/opends/src/guitools/org/opends/guitools/replicationcli/ReplicationCliMain.java
index b18102b..68626dc 100644
--- a/opends/src/guitools/org/opends/guitools/replicationcli/ReplicationCliMain.java
+++ b/opends/src/guitools/org/opends/guitools/replicationcli/ReplicationCliMain.java
@@ -781,9 +781,17 @@
}
if (!secureReplication1)
{
- secureReplication1 =
- askConfirmation(INFO_REPLICATION_ENABLE_SECURE1_PROMPT.get(
+ try
+ {
+ secureReplication1 =
+ askConfirmation(INFO_REPLICATION_ENABLE_SECURE1_PROMPT.get(
String.valueOf(replicationPort1)), false, LOG);
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ cancelled = true;
+ }
println();
}
}
@@ -980,9 +988,17 @@
}
if (!secureReplication2)
{
- secureReplication2 =
- askConfirmation(INFO_REPLICATION_ENABLE_SECURE2_PROMPT.get(
- String.valueOf(replicationPort2)), false, LOG);
+ try
+ {
+ secureReplication2 =
+ askConfirmation(INFO_REPLICATION_ENABLE_SECURE2_PROMPT.get(
+ String.valueOf(replicationPort2)), false, LOG);
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ cancelled = true;
+ }
println();
}
}
@@ -1219,29 +1235,54 @@
if (disableADS)
{
println();
- cancelled = !askConfirmation(INFO_REPLICATION_CONFIRM_DISABLE_ADS.get(
- ADSContext.getAdministrationSuffixDN()), true, LOG);
+ try
+ {
+ cancelled = !askConfirmation(INFO_REPLICATION_CONFIRM_DISABLE_ADS.get(
+ ADSContext.getAdministrationSuffixDN()), true, LOG);
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ cancelled = true;
+ }
println();
}
if (disableSchema)
{
println();
- cancelled = !askConfirmation(
- INFO_REPLICATION_CONFIRM_DISABLE_SCHEMA.get(), true, LOG);
+ try
+ {
+ cancelled = !askConfirmation(
+ INFO_REPLICATION_CONFIRM_DISABLE_SCHEMA.get(), true, LOG);
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ cancelled = true;
+ }
println();
}
if (!disableSchema && !disableADS)
{
println();
- if (disableAllBaseDns(ctx, uData))
+ try
{
- cancelled = !askConfirmation(
- INFO_REPLICATION_CONFIRM_DISABLE_LAST_SUFFIXES.get(), true, LOG);
+ if (disableAllBaseDns(ctx, uData))
+ {
+ cancelled = !askConfirmation(
+ INFO_REPLICATION_CONFIRM_DISABLE_LAST_SUFFIXES.get(), true,
+ LOG);
+ }
+ else
+ {
+ cancelled = !askConfirmation(
+ INFO_REPLICATION_CONFIRM_DISABLE_GENERIC.get(), true, LOG);
+ }
}
- else
+ catch (CLIException ce)
{
- cancelled = !askConfirmation(
- INFO_REPLICATION_CONFIRM_DISABLE_GENERIC.get(), true, LOG);
+ println(ce.getMessageObject());
+ cancelled = true;
}
println();
}
@@ -1359,17 +1400,34 @@
if (initializeADS)
{
println();
- cancelled = !askConfirmation(
- INFO_REPLICATION_CONFIRM_INITIALIZE_ALL_ADS.get(
- ADSContext.getAdministrationSuffixDN(), hostPortSource), true, LOG);
+ try
+ {
+ cancelled = !askConfirmation(
+ INFO_REPLICATION_CONFIRM_INITIALIZE_ALL_ADS.get(
+ ADSContext.getAdministrationSuffixDN(), hostPortSource), true,
+ LOG);
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ cancelled = true;
+ }
println();
}
else
{
println();
- cancelled = !askConfirmation(
- INFO_REPLICATION_CONFIRM_INITIALIZE_ALL_GENERIC.get(
- hostPortSource), true, LOG);
+ try
+ {
+ cancelled = !askConfirmation(
+ INFO_REPLICATION_CONFIRM_INITIALIZE_ALL_GENERIC.get(
+ hostPortSource), true, LOG);
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ cancelled = true;
+ }
println();
}
}
@@ -1456,9 +1514,17 @@
if (!argParser.isExternalInitializationLocalOnly())
{
println();
- localOnly = askConfirmation(
- INFO_REPLICATION_PRE_EXTERNAL_INITIALIZATION_LOCAL_PROMPT.get(
- ConnectionUtils.getHostPort(ctx)), false, LOG);
+ try
+ {
+ localOnly = askConfirmation(
+ INFO_REPLICATION_PRE_EXTERNAL_INITIALIZATION_LOCAL_PROMPT.get(
+ ConnectionUtils.getHostPort(ctx)), false, LOG);
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ cancelled = true;
+ }
}
else
{
@@ -1856,21 +1922,38 @@
}
String hostPortSource = ConnectionUtils.getHostPort(ctxSource);
String hostPortDestination = ConnectionUtils.getHostPort(ctxDestination);
+
if (initializeADS)
{
println();
- cancelled = !askConfirmation(
- INFO_REPLICATION_CONFIRM_INITIALIZE_ADS.get(
- ADSContext.getAdministrationSuffixDN(), hostPortDestination,
- hostPortSource), true, LOG);
+ try
+ {
+ cancelled = !askConfirmation(
+ INFO_REPLICATION_CONFIRM_INITIALIZE_ADS.get(
+ ADSContext.getAdministrationSuffixDN(), hostPortDestination,
+ hostPortSource), true, LOG);
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ cancelled = true;
+ }
println();
}
else
{
println();
- cancelled = !askConfirmation(
- INFO_REPLICATION_CONFIRM_INITIALIZE_GENERIC.get(
- hostPortDestination, hostPortSource), true, LOG);
+ try
+ {
+ cancelled = !askConfirmation(
+ INFO_REPLICATION_CONFIRM_INITIALIZE_GENERIC.get(
+ hostPortDestination, hostPortSource), true, LOG);
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ cancelled = true;
+ }
println();
}
}
@@ -2478,10 +2561,18 @@
}
else
{
- cancelled = !askConfirmation(
- ERR_REPLICATION_READING_REGISTERED_SERVERS_CONFIRM_UPDATE_REMOTE.
- get(Utils.getMessageFromCollection(exceptionMsgs,
- Constants.LINE_SEPARATOR).toString()), true, LOG);
+ try
+ {
+ cancelled = !askConfirmation(
+ ERR_REPLICATION_READING_REGISTERED_SERVERS_CONFIRM_UPDATE_REMOTE.
+ get(Utils.getMessageFromCollection(exceptionMsgs,
+ Constants.LINE_SEPARATOR).toString()), true, LOG);
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ cancelled = true;
+ }
}
}
}
@@ -3552,7 +3643,7 @@
}
if (interactive)
{
-
+ boolean confirmationLimitReached = false;
while (suffixes.isEmpty())
{
boolean noSchemaOrAds = false;
@@ -3585,14 +3676,28 @@
!Utils.areDnsEqual(dn, Constants.SCHEMA_DN) &&
!Utils.areDnsEqual(dn, Constants.REPLICATION_CHANGES_DN))
{
- if (askConfirmation(
- INFO_REPLICATION_ENABLE_SUFFIX_PROMPT.get(dn), true, LOG))
+ try
{
- suffixes.add(dn);
+ if (askConfirmation(
+ INFO_REPLICATION_ENABLE_SUFFIX_PROMPT.get(dn), true, LOG))
+ {
+ suffixes.add(dn);
+ }
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ confirmationLimitReached = true;
+ break;
}
}
}
}
+ if (confirmationLimitReached)
+ {
+ suffixes.clear();
+ break;
+ }
}
}
}
@@ -3709,6 +3814,7 @@
}
if (interactive)
{
+ boolean confirmationLimitReached = false;
while (suffixes.isEmpty())
{
boolean noSchemaOrAds = false;
@@ -3740,14 +3846,28 @@
!Utils.areDnsEqual(dn, Constants.SCHEMA_DN) &&
!Utils.areDnsEqual(dn, Constants.REPLICATION_CHANGES_DN))
{
- if (askConfirmation(
- INFO_REPLICATION_DISABLE_SUFFIX_PROMPT.get(dn), true, LOG))
+ try
{
- suffixes.add(dn);
+ if (askConfirmation(
+ INFO_REPLICATION_DISABLE_SUFFIX_PROMPT.get(dn), true,LOG))
+ {
+ suffixes.add(dn);
+ }
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ confirmationLimitReached = true;
+ break;
}
}
}
}
+ if (confirmationLimitReached)
+ {
+ suffixes.clear();
+ break;
+ }
}
}
}
@@ -3872,6 +3992,7 @@
}
if (interactive)
{
+ boolean confirmationLimitReached = false;
while (suffixes.isEmpty())
{
boolean noSchemaOrAds = false;
@@ -3926,23 +4047,32 @@
!Utils.areDnsEqual(dn, Constants.REPLICATION_CHANGES_DN))
{
boolean addSuffix;
- if (argParser.isPreExternalInitializationSubcommand())
+ try
{
- addSuffix = askConfirmation(
+ if (argParser.isPreExternalInitializationSubcommand())
+ {
+ addSuffix = askConfirmation(
INFO_REPLICATION_PRE_EXTERNAL_INITIALIZATION_SUFFIX_PROMPT.
- get(dn), true, LOG);
- }
- else if (argParser.isPostExternalInitializationSubcommand())
- {
- addSuffix = askConfirmation(
+ get(dn), true, LOG);
+ }
+ else if (argParser.isPostExternalInitializationSubcommand())
+ {
+ addSuffix = askConfirmation(
INFO_REPLICATION_POST_EXTERNAL_INITIALIZATION_SUFFIX_PROMPT.
- get(dn), true, LOG);
+ get(dn), true, LOG);
+ }
+ else
+ {
+ addSuffix = askConfirmation(
+ INFO_REPLICATION_INITIALIZE_ALL_SUFFIX_PROMPT.get(dn),
+ true, LOG);
+ }
}
- else
+ catch (CLIException ce)
{
- addSuffix = askConfirmation(
- INFO_REPLICATION_INITIALIZE_ALL_SUFFIX_PROMPT.get(dn),
- true, LOG);
+ println(ce.getMessageObject());
+ confirmationLimitReached = true;
+ break;
}
if (addSuffix)
{
@@ -3951,6 +4081,11 @@
}
}
}
+ if (confirmationLimitReached)
+ {
+ suffixes.clear();
+ break;
+ }
}
}
}
@@ -4010,6 +4145,7 @@
}
if (interactive)
{
+ boolean confirmationLimitReached = false;
while (suffixes.isEmpty())
{
boolean noSchemaOrAds = false;
@@ -4042,11 +4178,20 @@
!Utils.areDnsEqual(dn, Constants.SCHEMA_DN) &&
!Utils.areDnsEqual(dn, Constants.REPLICATION_CHANGES_DN))
{
- if (askConfirmation(
- INFO_REPLICATION_INITIALIZE_SUFFIX_PROMPT.get(dn), true,
- LOG))
+ try
{
- suffixes.add(dn);
+ if (askConfirmation(
+ INFO_REPLICATION_INITIALIZE_SUFFIX_PROMPT.get(dn), true,
+ LOG))
+ {
+ suffixes.add(dn);
+ }
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ confirmationLimitReached = true;
+ break;
}
}
}
diff --git a/opends/src/guitools/org/opends/guitools/uninstaller/UninstallCliHelper.java b/opends/src/guitools/org/opends/guitools/uninstaller/UninstallCliHelper.java
index e8983e8..2972363 100644
--- a/opends/src/guitools/org/opends/guitools/uninstaller/UninstallCliHelper.java
+++ b/opends/src/guitools/org/opends/guitools/uninstaller/UninstallCliHelper.java
@@ -342,7 +342,7 @@
else
{
boolean somethingSelected = false;
- while (!somethingSelected)
+ while (!somethingSelected && !cancelled)
{
println();
// Ask for confirmation for the different items
@@ -363,80 +363,92 @@
};
boolean[] answers = new boolean[msgs.length];
- for (int i=0; i<msgs.length; i++)
+ try
{
- boolean ignore = ((i == 6) && (outsideDbs.size() == 0)) ||
- ((i == 7) && (outsideLogs.size() == 0));
- if (!ignore)
+ for (int i=0; i<msgs.length; i++)
{
- answers[i] = askConfirmation(msgs[i], true, LOG);
+ boolean ignore = ((i == 6) && (outsideDbs.size() == 0)) ||
+ ((i == 7) && (outsideLogs.size() == 0));
+ if (!ignore)
+ {
+ answers[i] = askConfirmation(msgs[i], true, LOG);
+ }
+ else
+ {
+ answers[i] = false;
+ }
+ }
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ println();
+ cancelled = true;
+ }
+
+ if (!cancelled)
+ {
+ for (int i=0; i<answers.length; i++)
+ {
+ switch (i)
+ {
+ case 0:
+ userData.setRemoveLibrariesAndTools(answers[i]);
+ break;
+
+ case 1:
+ userData.setRemoveDatabases(answers[i]);
+ break;
+
+ case 2:
+ userData.setRemoveLogs(answers[i]);
+ break;
+
+ case 3:
+ userData.setRemoveConfigurationAndSchema(answers[i]);
+ break;
+
+ case 4:
+ userData.setRemoveBackups(answers[i]);
+ break;
+
+ case 5:
+ userData.setRemoveLDIFs(answers[i]);
+ break;
+
+ case 6:
+ if (answers[i])
+ {
+ userData.setExternalDbsToRemove(outsideDbs);
+ }
+ break;
+
+ case 7:
+ if (answers[i])
+ {
+ userData.setExternalLogsToRemove(outsideLogs);
+ }
+ break;
+ }
+ }
+ if ((userData.getExternalDbsToRemove().size() == 0) &&
+ (userData.getExternalLogsToRemove().size() == 0) &&
+ !userData.getRemoveLibrariesAndTools() &&
+ !userData.getRemoveDatabases() &&
+ !userData.getRemoveConfigurationAndSchema() &&
+ !userData.getRemoveBackups() &&
+ !userData.getRemoveLDIFs() &&
+ !userData.getRemoveLogs())
+ {
+ somethingSelected = false;
+ println();
+ println(ERR_CLI_UNINSTALL_NOTHING_TO_BE_UNINSTALLED.get());
}
else
{
- answers[i] = false;
+ somethingSelected = true;
}
}
-
- for (int i=0; i<answers.length; i++)
- {
- switch (i)
- {
- case 0:
- userData.setRemoveLibrariesAndTools(answers[i]);
- break;
-
- case 1:
- userData.setRemoveDatabases(answers[i]);
- break;
-
- case 2:
- userData.setRemoveLogs(answers[i]);
- break;
-
- case 3:
- userData.setRemoveConfigurationAndSchema(answers[i]);
- break;
-
- case 4:
- userData.setRemoveBackups(answers[i]);
- break;
-
- case 5:
- userData.setRemoveLDIFs(answers[i]);
- break;
-
- case 6:
- if (answers[i])
- {
- userData.setExternalDbsToRemove(outsideDbs);
- }
- break;
-
- case 7:
- if (answers[i])
- {
- userData.setExternalLogsToRemove(outsideLogs);
- }
- break;
- }
- }
- if ((userData.getExternalDbsToRemove().size() == 0) &&
- (userData.getExternalLogsToRemove().size() == 0) &&
- !userData.getRemoveLibrariesAndTools() &&
- !userData.getRemoveDatabases() &&
- !userData.getRemoveConfigurationAndSchema() &&
- !userData.getRemoveBackups() &&
- !userData.getRemoveLDIFs() &&
- !userData.getRemoveLogs())
- {
- somethingSelected = false;
- println();
- println(ERR_CLI_UNINSTALL_NOTHING_TO_BE_UNINSTALLED.get());
- }
- else
- {
- somethingSelected = true;
- }
}
}
@@ -477,56 +489,16 @@
{
if (interactive)
{
- if (confirmToUpdateRemote())
+ try
{
- println();
- cancelled = !askForAuthenticationIfNeeded(userData);
- if (cancelled)
+ if (confirmToUpdateRemote())
{
- /* Ask for confirmation to stop server */
println();
- cancelled = !confirmToStopServer();
- }
- else
- {
- cancelled = !updateUserUninstallDataWithRemoteServers(userData);
- if (cancelled)
- {
- println();
- /* Ask for confirmation to stop server */
- cancelled = !confirmToStopServer();
- }
- }
- }
- else
- {
- println();
- /* Ask for confirmation to stop server */
- cancelled = !confirmToStopServer();
- }
- }
- else
- {
- cancelled =
- !updateUserUninstallDataWithRemoteServers(userData);
- }
- }
- else
- {
- if (interactive)
- {
- println();
- if (confirmToUpdateRemoteAndStart())
- {
- boolean startWorked = startServer(userData.isQuiet());
- // Ask for authentication if needed, etc.
- if (startWorked)
- {
cancelled = !askForAuthenticationIfNeeded(userData);
if (cancelled)
{
- println();
/* Ask for confirmation to stop server */
+ println();
cancelled = !confirmToStopServer();
}
else
@@ -542,17 +514,76 @@
}
else
{
- userData.setStopServer(false);
+ println();
+ /* Ask for confirmation to stop server */
+ cancelled = !confirmToStopServer();
+ }
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ println();
+ cancelled = true;
+ }
+ }
+ else
+ {
+ cancelled =
+ !updateUserUninstallDataWithRemoteServers(userData);
+ }
+ }
+ else
+ {
+ if (interactive)
+ {
+ println();
+ try
+ {
+ if (confirmToUpdateRemoteAndStart())
+ {
+ boolean startWorked = startServer(userData.isQuiet());
+ // Ask for authentication if needed, etc.
+ if (startWorked)
+ {
+ cancelled = !askForAuthenticationIfNeeded(userData);
+ if (cancelled)
+ {
+ println();
+ /* Ask for confirmation to stop server */
+ cancelled = !confirmToStopServer();
+ }
+ else
+ {
+ cancelled =
+ !updateUserUninstallDataWithRemoteServers(userData);
+ if (cancelled)
+ {
+ println();
+ /* Ask for confirmation to stop server */
+ cancelled = !confirmToStopServer();
+ }
+ }
+ }
+ else
+ {
+ userData.setStopServer(false);
+ println();
+ /* Ask for confirmation to delete files */
+ cancelled = !confirmDeleteFiles();
+ }
+ }
+ else
+ {
println();
/* Ask for confirmation to delete files */
cancelled = !confirmDeleteFiles();
}
}
- else
+ catch (CLIException ce)
{
+ println(ce.getMessageObject());
println();
- /* Ask for confirmation to delete files */
- cancelled = !confirmDeleteFiles();
+ cancelled = true;
}
}
else
@@ -583,18 +614,27 @@
{
if (conf.isServerRunning())
{
- if (interactive)
+ try
{
- println();
- /* Ask for confirmation to stop server */
- cancelled = !confirmToStopServer();
- }
+ if (interactive)
+ {
+ println();
+ /* Ask for confirmation to stop server */
+ cancelled = !confirmToStopServer();
+ }
- if (!cancelled)
+ if (!cancelled)
+ {
+ /* During all the confirmations, the server might be stopped. */
+ userData.setStopServer(
+ Installation.getLocal().getStatus().isServerRunning());
+ }
+ }
+ catch (CLIException ce)
{
- /* During all the confirmations, the server might be stopped. */
- userData.setStopServer(
- Installation.getLocal().getStatus().isServerRunning());
+ println(ce.getMessageObject());
+ println();
+ cancelled = false;
}
}
else
@@ -604,7 +644,16 @@
{
println();
/* Ask for confirmation to delete files */
- cancelled = !confirmDeleteFiles();
+ try
+ {
+ cancelled = !confirmDeleteFiles();
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ println();
+ cancelled = true;
+ }
}
}
}
@@ -615,8 +664,9 @@
* Ask for confirmation to stop server.
* @return <CODE>true</CODE> if the user wants to continue and stop the
* server. <CODE>false</CODE> otherwise.
+ * @throws CLIException if the user reached the confirmation limit.
*/
- private boolean confirmToStopServer()
+ private boolean confirmToStopServer() throws CLIException
{
return askConfirmation(INFO_CLI_UNINSTALL_CONFIRM_STOP.get(), true, LOG);
}
@@ -625,8 +675,9 @@
* Ask for confirmation to delete files.
* @return <CODE>true</CODE> if the user wants to continue and delete the
* files. <CODE>false</CODE> otherwise.
+ * @throws CLIException if the user reached the confirmation limit.
*/
- private boolean confirmDeleteFiles()
+ private boolean confirmDeleteFiles() throws CLIException
{
return askConfirmation(INFO_CLI_UNINSTALL_CONFIRM_DELETE_FILES.get(), true,
LOG);
@@ -636,8 +687,9 @@
* Ask for confirmation to update configuration on remote servers.
* @return <CODE>true</CODE> if the user wants to continue and stop the
* server. <CODE>false</CODE> otherwise.
+ * @throws CLIException if the user reached the confirmation limit.
*/
- private boolean confirmToUpdateRemote()
+ private boolean confirmToUpdateRemote() throws CLIException
{
return askConfirmation(INFO_CLI_UNINSTALL_CONFIRM_UPDATE_REMOTE.get(), true,
LOG);
@@ -647,8 +699,9 @@
* Ask for confirmation to update configuration on remote servers.
* @return <CODE>true</CODE> if the user wants to continue and stop the
* server. <CODE>false</CODE> otherwise.
+ * @throws CLIException if the user reached the confirmation limit.
*/
- private boolean confirmToUpdateRemoteAndStart()
+ private boolean confirmToUpdateRemoteAndStart() throws CLIException
{
return askConfirmation(
INFO_CLI_UNINSTALL_CONFIRM_UPDATE_REMOTE_AND_START.get(), true, LOG);
@@ -657,9 +710,10 @@
/**
* Ask for confirmation to provide again authentication.
* @return <CODE>true</CODE> if the user wants to provide authentication
- * againr. <CODE>false</CODE> otherwise.
+ * again. <CODE>false</CODE> otherwise.
+ * @throws CLIException if the user reached the confirmation limit.
*/
- private boolean promptToProvideAuthenticationAgain()
+ private boolean promptToProvideAuthenticationAgain() throws CLIException
{
return askConfirmation(
INFO_UNINSTALL_CONFIRM_PROVIDE_AUTHENTICATION_AGAIN.get(), true, LOG);
@@ -830,11 +884,20 @@
if (!couldConnect)
{
- accepted = promptToProvideAuthenticationAgain();
- if (accepted)
+ try
{
- uid = null;
- pwd = null;
+ accepted = promptToProvideAuthenticationAgain();
+ if (accepted)
+ {
+ uid = null;
+ pwd = null;
+ }
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ println();
+ accepted = false;
}
}
}
@@ -1113,8 +1176,17 @@
}
else
{
- accepted = askConfirmation(ERR_UNINSTALL_NOT_UPDATE_REMOTE_PROMPT.get(),
- false, LOG);
+ try
+ {
+ accepted = askConfirmation(
+ ERR_UNINSTALL_NOT_UPDATE_REMOTE_PROMPT.get(),
+ false, LOG);
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ accepted = false;
+ }
}
}
userData.setUpdateRemoteReplication(accepted);
@@ -1210,10 +1282,19 @@
if (!stopProcessing && (exceptionMsgs.size() > 0))
{
println();
- returnValue = askConfirmation(
+ try
+ {
+ returnValue = askConfirmation(
ERR_UNINSTALL_READING_REGISTERED_SERVERS_CONFIRM_UPDATE_REMOTE.get(
Utils.getMessageFromCollection(exceptionMsgs,
Constants.LINE_SEPARATOR).toString()), true, LOG);
+ }
+ catch (CLIException ce)
+ {
+ println(ce.getMessageObject());
+ println();
+ returnValue = false;
+ }
}
else if (reloadTopologyCache)
{
diff --git a/opends/src/messages/messages/utility.properties b/opends/src/messages/messages/utility.properties
index 8559d45..12e045b 100644
--- a/opends/src/messages/messages/utility.properties
+++ b/opends/src/messages/messages/utility.properties
@@ -550,3 +550,5 @@
INFO_ARGPARSER_USAGE_JAVA_CLASSNAME_264=Usage: java %s {options}
INFO_ARGPARSER_USAGE_JAVA_SCRIPTNAME_265=Usage: %s {options}
INFO_ARGPARSER_USAGE_TRAILINGARGS_266={trailing-arguments}
+MILD_ERR_CONFIRMATION_TRIES_LIMIT_REACHED_267=Confirmation tries limit reached \
+ (%d)
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