From 0fd845d18cfaf23fc9f54e92775c735955e4e859 Mon Sep 17 00:00:00 2001
From: Gaetan Boismal <gaetan.boismal@forgerock.com>
Date: Mon, 27 Jul 2015 09:02:08 +0000
Subject: [PATCH] OPENDJ-2027 CR-7646 Change tools message on error

---
 opendj-server-legacy/src/main/java/org/opends/server/util/Base64.java                            |    2 
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPSearch.java                       |   14 
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/MakeLDIF.java                  |    3 
 opendj-server-legacy/src/main/java/org/opends/server/tools/StopDS.java                           |    6 
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPModify.java                       |   16 
 opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java |   32 -
 opendj-server-legacy/src/main/java/org/opends/server/tools/JavaPropertiesTool.java               |    6 
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java                |    6 
 opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/DBTest.java                    |    6 
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFDiff.java                         |    3 
 opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/MakeLDIFITCase.java            |   11 
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFSearch.java                       |    6 
 opendj-server-legacy/src/main/java/org/opends/server/tools/CreateRCScript.java                   |   23 
 opendj-server-legacy/src/main/java/org/opends/server/tools/ExportLDIF.java                       |    3 
 opendj-server-legacy/src/main/java/org/opends/server/tools/WaitForFileDelete.java                |    5 
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPDelete.java                       |   16 
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java               |   21 
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFDiff.java                  |    3 
 opendj-server-legacy/src/main/java/org/opends/server/tools/InstallDS.java                        |    5 
 opendj-server-legacy/src/main/java/org/opends/server/tools/ManageTasks.java                      |    4 
 opendj-cli/src/main/java/com/forgerock/opendj/cli/SubCommandArgumentParser.java                  |   14 
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFSearch.java                |    6 
 opendj-server-legacy/src/main/java/org/opends/server/plugins/profiler/ProfileViewer.java         |    6 
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPCompare.java                      |    8 
 opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java                   |    8 
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AddRate.java                   |    3 
 opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/AuthRateITCase.java            |    2 
 opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallLauncher.java        |    6 
 opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPSearchITCase.java          |    7 
 opendj-cli/src/main/java/com/forgerock/opendj/cli/ConsoleApplication.java                        |    2 
 opendj-server-legacy/src/test/java/org/opends/server/tools/ArgumentParserToolsTestCase.java      |  244 ++++++++++++++++
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFModify.java                       |    3 
 opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallCliHelper.java       |   22 
 opendj-server-legacy/src/main/java/org/opends/server/tools/EncodePassword.java                   |   11 
 opendj-server-legacy/src/main/java/org/opends/server/tools/ListBackends.java                     |    3 
 opendj-server-legacy/src/main/java/org/opends/server/util/args/LDAPConnectionArgumentParser.java |   28 +
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPPasswordModify.java               |   18 
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFModify.java                |    3 
 opendj-server-legacy/src/main/java/org/opends/server/tools/makeldif/MakeLDIF.java                |   22 +
 opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPCompareITCase.java         |    7 
 opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureWindowsService.java          |    9 
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java        |    3 
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java                |    3 
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java                   |    3 
 opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentParser.java                            |   29 +
 opendj-server-legacy/src/main/java/org/opends/server/tools/VerifyIndex.java                      |   14 
 opendj-server-legacy/src/main/java/org/opends/server/tools/BackUpDB.java                         |   30 -
 opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java                   |    8 
 opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeCli.java               |   11 
 opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java                   |   20 
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java                  |    3 
 opendj-server-legacy/src/main/java/org/opends/server/tools/ImportLDIF.java                       |   13 
 opendj-server-legacy/src/main/java/org/opends/quicksetup/installer/SetupLauncher.java            |    6 
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java                |    3 
 opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/AddRateITCase.java             |    4 
 opendj-server-legacy/src/main/java/org/opends/server/tools/RebuildIndex.java                     |   33 -
 opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureDS.java                      |    7 
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ControlPanelLauncher.java    |    5 
 opendj-server-legacy/src/main/java/org/opends/server/tools/status/StatusCli.java                 |   30 +
 opendj-server-legacy/src/main/java/org/opends/server/util/EMailMessage.java                      |    2 
 opendj-server-legacy/src/main/java/org/opends/server/tools/ManageAccount.java                    |    6 
 opendj-server-legacy/src/main/java/org/opends/server/tools/RestoreDB.java                        |    3 
 62 files changed, 519 insertions(+), 340 deletions(-)

diff --git a/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentParser.java b/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentParser.java
index c8d7b0e..5264d89 100644
--- a/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentParser.java
+++ b/opendj-cli/src/main/java/com/forgerock/opendj/cli/ArgumentParser.java
@@ -35,6 +35,7 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.OutputStream;
+import java.io.PrintStream;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Comparator;
@@ -1800,6 +1801,34 @@
     }
 
     /**
+     * Displays the provided message on the provided stream followed by a help usage reference.
+     *
+     * @param printStream
+     *            The stream to print error message and help reference message.
+     * @param message
+     *            The error message to print.
+     */
+    public void displayMessageAndUsageReference(final PrintStream printStream, final LocalizableMessage message) {
+        printWrappedText(printStream, message);
+        printStream.println();
+        printWrappedText(printStream, getHelpUsageReference());
+    }
+
+    /**
+     * Retrieves a string describing how the user can get more help.
+     *
+     * @return A string describing how the user can get more help.
+     */
+    public LocalizableMessage getHelpUsageReference() {
+        setUsageOrVersionDisplayed(true);
+
+        LocalizableMessageBuilder buffer = new LocalizableMessageBuilder();
+        buffer.append(INFO_GLOBAL_HELP_REFERENCE.get(getScriptNameOrJava()));
+        buffer.append(EOL);
+        return buffer.toMessage();
+    }
+
+    /**
      * Get the password which has to be used for the command without prompting the user. If no password was specified,
      * return null.
      *
diff --git a/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConsoleApplication.java b/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConsoleApplication.java
index 468203a..6457971 100755
--- a/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConsoleApplication.java
+++ b/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConsoleApplication.java
@@ -668,7 +668,7 @@
      *
      * @return The error stream that should be used with this application.
      */
-    private PrintStream getErrStream() {
+    protected PrintStream getErrStream() {
         if (isInteractive()) {
             return out;
         }
diff --git a/opendj-cli/src/main/java/com/forgerock/opendj/cli/SubCommandArgumentParser.java b/opendj-cli/src/main/java/com/forgerock/opendj/cli/SubCommandArgumentParser.java
index f3597a2..0add6d4 100644
--- a/opendj-cli/src/main/java/com/forgerock/opendj/cli/SubCommandArgumentParser.java
+++ b/opendj-cli/src/main/java/com/forgerock/opendj/cli/SubCommandArgumentParser.java
@@ -860,20 +860,6 @@
     }
 
     /**
-     * Retrieves a string describing how the user can get more help.
-     *
-     * @return A string describing how the user can get more help.
-     */
-    public LocalizableMessage getHelpUsageReference() {
-        setUsageOrVersionDisplayed(true);
-
-        LocalizableMessageBuilder buffer = new LocalizableMessageBuilder();
-        buffer.append(INFO_GLOBAL_HELP_REFERENCE.get(getScriptNameOrJava()));
-        buffer.append(EOL);
-        return buffer.toMessage();
-    }
-
-    /**
      * Adds the provided subcommand to this argument parser. This is only intended for use by the
      * <CODE>SubCommand</CODE> constructor and does not do any validation of its own to ensure that there are no
      * conflicts with the subcommand or any of its arguments.
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 4147e59..cf62c10 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
@@ -963,13 +963,6 @@
         return verboseArgument.isPresent();
     }
 
-    /** Displays the provided error message followed by a help usage reference. */
-    private void displayErrorMessageAndUsageReference(LocalizableMessage message) {
-        errPrintln(message);
-        errPrintln();
-        errPrintln(parser.getHelpUsageReference());
-    }
-
     /**
      * Registers the global arguments with the argument parser.
      *
@@ -1123,7 +1116,7 @@
             parser.parseArguments(args);
             checkForConflictingArguments();
         } catch (ArgumentException ae) {
-            displayErrorMessageAndUsageReference(ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
+            parser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
             return ReturnCode.CONFLICTING_ARGS.get();
         }
 
@@ -1150,7 +1143,7 @@
         try {
             factory = new LDAPManagementContextFactory(cfp);
         } catch (ArgumentException e) {
-            displayErrorMessageAndUsageReference(ERR_ERROR_PARSING_ARGS.get(e.getMessage()));
+            parser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(e.getMessage()));
             return ReturnCode.CONFLICTING_ARGS.get();
         }
 
@@ -1167,8 +1160,8 @@
                 // Top-level interactive mode.
                 retCode = runInteractiveMode();
             } else {
-                displayErrorMessageAndUsageReference(
-                    ERR_ERROR_PARSING_ARGS.get(ERR_DSCFG_ERROR_MISSING_SUBCOMMAND.get()));
+                parser.displayMessageAndUsageReference(
+                        getErrStream(), ERR_ERROR_PARSING_ARGS.get(ERR_DSCFG_ERROR_MISSING_SUBCOMMAND.get()));
                 retCode = ReturnCode.ERROR_USER_DATA.get();
             }
         } else {
@@ -1277,7 +1270,10 @@
         try {
             // Force retrieval of management context.
             factory.getManagementContext(app);
-        } catch (ArgumentException | ClientException e) {
+        } catch (ArgumentException e) {
+            parser.displayMessageAndUsageReference(getErrStream(), e.getMessageObject());
+            return ReturnCode.ERROR_USER_DATA.get();
+        } catch (ClientException e) {
             app.errPrintln(e.getMessageObject());
             return ReturnCode.ERROR_UNEXPECTED.get();
         }
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AddRate.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AddRate.java
index 944980c..bfca0ea 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AddRate.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AddRate.java
@@ -503,8 +503,7 @@
             connectionFactory = connectionFactoryProvider.getAuthenticatedConnectionFactory();
             runner.validate(deleteMode, deleteSizeThreshold, deleteAgeThreshold, noPurgeArgument);
         } catch (final ArgumentException ae) {
-            errPrintln(ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-            errPrintln(argParser.getUsageMessage());
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
index a93926b..68172f7 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
@@ -490,8 +490,7 @@
                         .raw("Authentication information must be provided to use this tool"));
             }
         } catch (final ArgumentException ae) {
-            final LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-            errPrintln(message);
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java
index ccee29a..25e2cff 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java
@@ -226,19 +226,20 @@
 
             connectionFactory = connectionFactoryProvider.getAuthenticatedConnectionFactory();
         } catch (final ArgumentException ae) {
-            final LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-            errPrintln(message);
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
         try {
             final int versionNumber = version.getIntValue();
             if (versionNumber != 2 && versionNumber != 3) {
-                errPrintln(ERR_DESCRIPTION_INVALID_VERSION.get(String.valueOf(versionNumber)));
+                argParser.displayMessageAndUsageReference(
+                    getErrStream(), ERR_DESCRIPTION_INVALID_VERSION.get(String.valueOf(versionNumber)));
                 return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
             }
         } catch (final ArgumentException ae) {
-            errPrintln(ERR_DESCRIPTION_INVALID_VERSION.get(String.valueOf(version.getValue())));
+            argParser.displayMessageAndUsageReference(
+                getErrStream(), ERR_DESCRIPTION_INVALID_VERSION.get(String.valueOf(version.getValue())));
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
@@ -246,8 +247,7 @@
         final ArrayList<String> attrAndDNStrings = argParser.getTrailingArguments();
 
         if (attrAndDNStrings.isEmpty()) {
-            final LocalizableMessage message = ERR_LDAPCOMPARE_NO_ATTR.get();
-            errPrintln(message);
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_LDAPCOMPARE_NO_ATTR.get());
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
@@ -258,23 +258,22 @@
 
         // If no DNs were provided, then exit with an error.
         if (dnStrings.isEmpty() && !filename.isPresent()) {
-            errPrintln(ERR_LDAPCOMPARE_NO_DNS.get());
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_LDAPCOMPARE_NO_DNS.get());
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
         /* If trailing DNs were provided and the filename argument was also
          provided, exit with an error.*/
         if (!dnStrings.isEmpty() && filename.isPresent()) {
-            errPrintln(ERR_LDAPCOMPARE_FILENAME_AND_DNS.get());
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_LDAPCOMPARE_FILENAME_AND_DNS.get());
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
         // parse the attribute string
         final int idx = attributeString.indexOf(":");
         if (idx == -1) {
-            final LocalizableMessage message =
-                    ERR_LDAPCOMPARE_INVALID_ATTR_STRING.get(attributeString);
-            errPrintln(message);
+            argParser.displayMessageAndUsageReference(
+                getErrStream(), ERR_LDAPCOMPARE_INVALID_ATTR_STRING.get(attributeString));
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
         final String attributeType = attributeString.substring(0, idx);
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java
index 22920b7..b19b1f0 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java
@@ -369,8 +369,7 @@
 
             connectionFactory = connectionFactoryProvider.getAuthenticatedConnectionFactory();
         } catch (final ArgumentException ae) {
-            final LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-            errPrintln(message);
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java
index 62e0eff..443cef1 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java
@@ -196,8 +196,7 @@
 
             connectionFactory = connectionFactoryProvider.getAuthenticatedConnectionFactory();
         } catch (final ArgumentException ae) {
-            final LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-            errPrintln(message);
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java
index 5c92c6d..8db2239 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java
@@ -446,8 +446,7 @@
 
             connectionFactory = connectionFactoryProvider.getAuthenticatedConnectionFactory();
         } catch (final ArgumentException ae) {
-            final LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-            errPrintln(message);
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
@@ -507,8 +506,7 @@
         }
 
         if (filters.isEmpty()) {
-            errPrintln(ERR_SEARCH_NO_FILTERS.get());
-            errPrintln(argParser.getUsageMessage());
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_SEARCH_NO_FILTERS.get());
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFDiff.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFDiff.java
index fcf144f..2ee93e5 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFDiff.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFDiff.java
@@ -116,8 +116,7 @@
                 return ResultCode.SUCCESS.intValue();
             }
         } catch (final ArgumentException ae) {
-            final LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-            errPrintln(message);
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFModify.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFModify.java
index 7f654b5..495023a 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFModify.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFModify.java
@@ -127,8 +127,7 @@
                 return ResultCode.SUCCESS.intValue();
             }
         } catch (final ArgumentException ae) {
-            final LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-            errPrintln(message);
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFSearch.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFSearch.java
index ef09adf..f9c4977 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFSearch.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDIFSearch.java
@@ -168,8 +168,7 @@
                 return ResultCode.SUCCESS.intValue();
             }
         } catch (final ArgumentException ae) {
-            final LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-            errPrintln(message);
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
@@ -224,8 +223,7 @@
         }
 
         if (filters.isEmpty()) {
-            errPrintln(ERR_SEARCH_NO_FILTERS.get());
-            errPrintln(argParser.getUsageMessage());
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_SEARCH_NO_FILTERS.get());
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/MakeLDIF.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/MakeLDIF.java
index c7d3e38..9004182 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/MakeLDIF.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/MakeLDIF.java
@@ -128,8 +128,7 @@
         try {
             argParser.parseArguments(args);
         } catch (ArgumentException ae) {
-            errPrintln(ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-            errPrintln(argParser.getUsageMessage());
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
             return EXIT_CODE_FAILURE;
         }
 
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java
index d7754b2..8743383 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java
@@ -230,8 +230,7 @@
             connectionFactory = connectionFactoryProvider.getAuthenticatedConnectionFactory();
             runner.validate();
         } catch (final ArgumentException ae) {
-            final LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-            errPrintln(message);
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java
index 459adc4..c3ead07 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java
@@ -292,8 +292,7 @@
             connectionFactory = connectionFactoryProvider.getAuthenticatedConnectionFactory();
             runner.validate();
         } catch (final ArgumentException ae) {
-            final LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-            errPrintln(message);
+            argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
             return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
         }
 
diff --git a/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/AddRateITCase.java b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/AddRateITCase.java
index eb6b999..709dea7 100644
--- a/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/AddRateITCase.java
+++ b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/AddRateITCase.java
@@ -28,6 +28,7 @@
 import static org.fest.assertions.Assertions.*;
 import static org.forgerock.util.Utils.*;
 
+import static com.forgerock.opendj.cli.CliMessages.*;
 import static com.forgerock.opendj.ldap.tools.ToolsMessages.*;
 
 import java.io.PrintStream;
@@ -88,7 +89,8 @@
             { args("-C", "off", "-s", "30000", TEMPLATE_NAME), ERR_ADDRATE_DELMODE_OFF_THRESHOLD_ON.get() },
             { args("-C", "fifo", "-a", "3", "-s", "20000", TEMPLATE_NAME), ERR_ADDRATE_THRESHOLD_SIZE_AND_AGE.get() },
             { args("-C", "random", "-a", "3", TEMPLATE_NAME), ERR_ADDRATE_DELMODE_RAND_THRESHOLD_AGE.get() },
-            { args("-s", "999", TEMPLATE_NAME), ERR_ADDRATE_SIZE_THRESHOLD_LOWER_THAN_ITERATIONS.get() }
+            { args("-s", "999", TEMPLATE_NAME), ERR_ADDRATE_SIZE_THRESHOLD_LOWER_THAN_ITERATIONS.get() },
+            { args("-42"), INFO_GLOBAL_HELP_REFERENCE.get("java " + AddRate.class.getCanonicalName()) }
         };
     }
 
diff --git a/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/AuthRateITCase.java b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/AuthRateITCase.java
index 4fa5dbe..0f43b80 100644
--- a/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/AuthRateITCase.java
+++ b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/AuthRateITCase.java
@@ -25,6 +25,7 @@
  */
 package com.forgerock.opendj.ldap.tools;
 
+import static com.forgerock.opendj.cli.CliMessages.*;
 import static com.forgerock.opendj.ldap.tools.ToolsMessages.ERR_ERROR_PARSING_ARGS;
 import static com.forgerock.opendj.ldap.tools.ToolsMessages.INFO_TOOL_WARMING_UP;
 import static org.fest.assertions.Assertions.assertThat;
@@ -45,6 +46,7 @@
     public Object[][] authRateArgs() throws Exception {
         return new Object[][] {
             { args(""), "", ERR_ERROR_PARSING_ARGS.get("") },
+            { args("-42"), "", INFO_GLOBAL_HELP_REFERENCE.get("java " + AuthRate.class.getCanonicalName()) },
             // Warm-up test case
             {
                 args("-h", TestCaseUtils.getServerSocketAddress().getHostName(),
diff --git a/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPCompareITCase.java b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPCompareITCase.java
index e3e91e5..71b84e5 100644
--- a/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPCompareITCase.java
+++ b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPCompareITCase.java
@@ -25,6 +25,7 @@
  */
 package com.forgerock.opendj.ldap.tools;
 
+import static com.forgerock.opendj.cli.CliMessages.*;
 import static com.forgerock.opendj.ldap.tools.ToolsMessages.INFO_COMPARE_OPERATION_RESULT_FALSE;
 import static com.forgerock.opendj.ldap.tools.ToolsMessages.INFO_COMPARE_OPERATION_RESULT_TRUE;
 import static com.forgerock.opendj.ldap.tools.ToolsMessages.INFO_LDAPCOMPARE_TOOL_DESCRIPTION;
@@ -42,7 +43,7 @@
 public class LDAPCompareITCase extends ToolsITCase {
 
     private static final int NB_RAND_SIMPLE_COMPARE = 10;
-    private static final int NB_OTHER_SIMPLE_SEARCH = 1;
+    private static final int NB_OTHER_SIMPLE_SEARCH = 2;
 
     @DataProvider
     public Object[][] ldapCompareArgs() throws Exception {
@@ -53,6 +54,10 @@
         // Check if the help message is correctly prompted
         data[0] = new Object[] { args("--help"), INFO_LDAPCOMPARE_TOOL_DESCRIPTION.get(), "" };
 
+        // Check if the help reference message is prompted if arguments failed to be parsed
+        data[1] = new Object[] {
+            args("-42"), "", INFO_GLOBAL_HELP_REFERENCE.get("java " + LDAPCompare.class.getCanonicalName()) };
+
         // Perform some basic comparison on random user from the test server
         for (int i = 0; i < NB_RAND_SIMPLE_COMPARE; i++) {
             randUIDs[i] = Math.round(rand.nextInt(1000));
diff --git a/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPSearchITCase.java b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPSearchITCase.java
index d6ee882..2fa67a9 100644
--- a/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPSearchITCase.java
+++ b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPSearchITCase.java
@@ -25,6 +25,7 @@
  */
 package com.forgerock.opendj.ldap.tools;
 
+import static com.forgerock.opendj.cli.CliMessages.*;
 import static com.forgerock.opendj.ldap.tools.ToolsMessages.ERR_ERROR_PARSING_ARGS;
 import static com.forgerock.opendj.ldap.tools.ToolsMessages.ERR_TOOL_RESULT_CODE;
 import static com.forgerock.opendj.ldap.tools.ToolsMessages.INFO_LDAPSEARCH_MATCHING_ENTRY_COUNT;
@@ -47,7 +48,7 @@
 @SuppressWarnings("javadoc")
 public class LDAPSearchITCase extends ToolsITCase {
     private static final int NB_RAND_SIMPLE_SEARCH = 10;
-    private static final int NB_OTHER_SIMPLE_SEARCH = 2;
+    private static final int NB_OTHER_SIMPLE_SEARCH = 3;
 
     @DataProvider
     public Object[][] ldapSearchArgs() throws Exception {
@@ -60,6 +61,10 @@
         // ldapsearch command
         data[1] = new Object[] { args(""), "", ERR_ERROR_PARSING_ARGS.get("") };
 
+        // Check if the help reference message is prompted if arguments failed to be parsed
+        data[2] = new Object[] {
+            args("-42"), "", INFO_GLOBAL_HELP_REFERENCE.get("java " + LDAPSearch.class.getCanonicalName()) };
+
         // Perform some basic ldapsearch for random user in the test server
         for (int i = 0; i < NB_RAND_SIMPLE_SEARCH; i++) {
             long userID = new Random().nextInt(1000);
diff --git a/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/MakeLDIFITCase.java b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/MakeLDIFITCase.java
index 525af35..a8c6be4 100644
--- a/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/MakeLDIFITCase.java
+++ b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/MakeLDIFITCase.java
@@ -21,7 +21,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2013-2014 ForgeRock AS.
+ *      Copyright 2013-2015 ForgeRock AS.
  */
 package com.forgerock.opendj.ldap.tools;
 
@@ -29,6 +29,7 @@
 import static org.forgerock.util.Utils.*;
 
 import static com.forgerock.opendj.ldap.tools.ToolsMessages.*;
+import static com.forgerock.opendj.cli.CliMessages.INFO_GLOBAL_HELP_REFERENCE;
 
 import java.io.PrintStream;
 
@@ -82,11 +83,11 @@
         return new Object[][] {
             { // check that usage is written to output when arguments are invalid
               args(),
-              expectedOutput(INFO_MAKELDIF_TOOL_DESCRIPTION.get()) },
+              expectedOutput(INFO_GLOBAL_HELP_REFERENCE.get("java " + MakeLDIF.class.getCanonicalName())) },
 
-            { // check that there is an argument error when no arg provided
-              args(),
-              expectedOutput(ERR_ERROR_PARSING_ARGS.get("")) },
+            { // Check if the help reference message is prompted if arguments failed to be parsed
+              args("-42"),
+              expectedOutput(INFO_GLOBAL_HELP_REFERENCE.get("java " + MakeLDIF.class.getCanonicalName())) },
 
             { args("-r", "unknown/path" , "example.template"),
               expectedOutput(ERR_LDIF_GEN_TOOL_NO_SUCH_RESOURCE_DIRECTORY.get("unknown/path")) },
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ControlPanelLauncher.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ControlPanelLauncher.java
index 9a73bcf..0cc7cba 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ControlPanelLauncher.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ControlPanelLauncher.java
@@ -92,10 +92,7 @@
     }
     catch (ArgumentException ae)
     {
-      LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-      System.err.println(message);
-      System.out.println(LocalizableMessage.raw(argParser.getUsage()));
-
+      argParser.displayMessageAndUsageReference(System.err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       System.exit(ErrorReturnCode.ERROR_PARSING_ARGS.getReturnCode());
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallCliHelper.java b/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallCliHelper.java
index 1227d5c..7c17739 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallCliHelper.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallCliHelper.java
@@ -26,6 +26,14 @@
  */
 package org.opends.guitools.uninstaller;
 
+import static org.forgerock.util.Utils.*;
+import static org.opends.admin.ads.util.ConnectionUtils.*;
+import static org.opends.messages.AdminToolMessages.*;
+import static org.opends.messages.QuickSetupMessages.*;
+
+import static com.forgerock.opendj.cli.ArgumentConstants.*;
+import static com.forgerock.opendj.cli.Utils.*;
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
@@ -77,14 +85,6 @@
 import com.forgerock.opendj.cli.MenuResult;
 import com.forgerock.opendj.cli.ReturnCode;
 
-import static com.forgerock.opendj.cli.ArgumentConstants.*;
-import static com.forgerock.opendj.cli.Utils.*;
-
-import static org.forgerock.util.Utils.*;
-import static org.opends.admin.ads.util.ConnectionUtils.*;
-import static org.opends.messages.AdminToolMessages.*;
-import static org.opends.messages.QuickSetupMessages.*;
-
 /**
  * The class used to provide some CLI interface in the uninstall.
  *
@@ -888,7 +888,11 @@
         userData.setLocalServerUrl(adminConnectorUrl);
         couldConnect = true;
       }
-      catch (ArgumentException | ClientException e) {
+      catch (ArgumentException e)
+      {
+        parser.displayMessageAndUsageReference(getErrStream(), e.getMessageObject());
+      }
+      catch (ClientException e) {
         printErrorMessage(e.getMessageObject());
         println();
       }
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallLauncher.java b/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallLauncher.java
index 8a9cdd3..6999377 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallLauncher.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallLauncher.java
@@ -127,11 +127,7 @@
     }
     catch (ArgumentException ae)
     {
-      LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-      System.err.println(message);
-      System.err.println();
-      System.err.println(argParser.getUsage());
-
+      argParser.displayMessageAndUsageReference(System.err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       System.exit(ReturnCode.USER_DATA_ERROR.getReturnCode());
     }
   }
diff --git a/opendj-server-legacy/src/main/java/org/opends/quicksetup/installer/SetupLauncher.java b/opendj-server-legacy/src/main/java/org/opends/quicksetup/installer/SetupLauncher.java
index 9d9d76a..fef5ae4 100644
--- a/opendj-server-legacy/src/main/java/org/opends/quicksetup/installer/SetupLauncher.java
+++ b/opendj-server-legacy/src/main/java/org/opends/quicksetup/installer/SetupLauncher.java
@@ -159,11 +159,7 @@
     }
     catch (ArgumentException ae)
     {
-      LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-      System.err.println(message);
-      System.err.println();
-      System.err.println(argParser.getUsage());
-
+      argParser.displayMessageAndUsageReference(System.err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       System.exit(ReturnCode.USER_DATA_ERROR.getReturnCode());
     }
     catch (IncompatibleVersionException ive)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/DBTest.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/DBTest.java
index f0412d1..5e6df1a 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/DBTest.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/DBTest.java
@@ -377,8 +377,7 @@
     try {
       parser.parseArguments(args);
     } catch (ArgumentException ae) {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(parser.getUsage());
+      parser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return 1;
     }
 
@@ -490,8 +489,7 @@
     // Make sure that we have a sub-command.
     if (parser.getSubCommand() == null)
     {
-      printWrappedText(err, ERR_DBTEST_MISSING_SUBCOMMAND.get());
-      err.println(parser.getUsage());
+      parser.displayMessageAndUsageReference(err, ERR_DBTEST_MISSING_SUBCOMMAND.get());
       return 1;
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java b/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java
index 8a6c5ed..4ecc189 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java
@@ -7175,9 +7175,7 @@
     }
     catch (ArgumentException ae)
     {
-      LocalizableMessage message = ERR_DSCORE_ERROR_PARSING_ARGS.get(ae.getMessage());
-      System.err.println(message);
-      System.err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(System.err, ERR_DSCORE_ERROR_PARSING_ARGS.get(ae.getMessage()));
       System.exit(1);
     }
 
@@ -7248,9 +7246,7 @@
       return;
     }
     else if (noDetach.isPresent() && timeout.isPresent()) {
-      LocalizableMessage message = ERR_DSCORE_ERROR_NODETACH_TIMEOUT.get();
-      System.err.println(message);
-      System.err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(System.err, ERR_DSCORE_ERROR_NODETACH_TIMEOUT.get());
       System.exit(1);
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/plugins/profiler/ProfileViewer.java b/opendj-server-legacy/src/main/java/org/opends/server/plugins/profiler/ProfileViewer.java
index 8ef122b..033ee2c 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/plugins/profiler/ProfileViewer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/plugins/profiler/ProfileViewer.java
@@ -152,11 +152,7 @@
     }
     catch (ArgumentException ae)
     {
-      LocalizableMessage message =
-              ERR_PROFILEVIEWER_ERROR_PARSING_ARGS.get(ae.getMessage());
-
-      System.err.println(message);
-      System.err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(System.err, ERR_PROFILEVIEWER_ERROR_PARSING_ARGS.get(ae.getMessage()));
       System.exit(1);
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/BackUpDB.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/BackUpDB.java
index 5672c2f..114420a 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/BackUpDB.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/BackUpDB.java
@@ -292,8 +292,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return 1;
     }
     catch (ClientException ce)
@@ -317,17 +316,15 @@
     {
       if (backendID.isPresent())
       {
-        printWrappedText(err, ERR_BACKUPDB_CANNOT_MIX_BACKUP_ALL_AND_BACKEND_ID.get(
-                backUpAll.getLongIdentifier(), backendID.getLongIdentifier()));
-        err.println(argParser.getUsage());
+        argParser.displayMessageAndUsageReference(err, ERR_BACKUPDB_CANNOT_MIX_BACKUP_ALL_AND_BACKEND_ID.get(
+            backUpAll.getLongIdentifier(), backendID.getLongIdentifier()));
         return 1;
       }
     }
     else if (! backendID.isPresent())
     {
-      printWrappedText(err, ERR_BACKUPDB_NEED_BACKUP_ALL_OR_BACKEND_ID.get(
-              backUpAll.getLongIdentifier(), backendID.getLongIdentifier()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_BACKUPDB_NEED_BACKUP_ALL_OR_BACKEND_ID.get(
+          backUpAll.getLongIdentifier(), backendID.getLongIdentifier()));
       return 1;
     }
     else
@@ -345,8 +342,8 @@
       }
       if (!repeatedBackendIds.isEmpty())
       {
-        printWrappedText(err, ERR_BACKUPDB_REPEATED_BACKEND_ID.get(Utils.joinAsString(", ", repeatedBackendIds)));
-        err.println(argParser.getUsage());
+        argParser.displayMessageAndUsageReference(err,
+            ERR_BACKUPDB_REPEATED_BACKEND_ID.get(Utils.joinAsString(", ", repeatedBackendIds)));
         return 1;
       }
     }
@@ -355,9 +352,8 @@
     // incremental backup.
     if (incrementalBaseID.isPresent() && ! incremental.isPresent())
     {
-      printWrappedText(err, ERR_BACKUPDB_INCREMENTAL_BASE_REQUIRES_INCREMENTAL.get(
+      argParser.displayMessageAndUsageReference(err, ERR_BACKUPDB_INCREMENTAL_BASE_REQUIRES_INCREMENTAL.get(
               incrementalBaseID.getLongIdentifier(), incremental.getLongIdentifier()));
-      err.println(argParser.getUsage());
       return 1;
     }
 
@@ -366,9 +362,8 @@
     //  are present, infer an offline backup.
     if ((encrypt.isPresent() || signHash.isPresent())
             && ! argParser.connectionArgumentsPresent()) {
-      printWrappedText(err, ERR_BACKUPDB_ENCRYPT_OR_SIGN_REQUIRES_ONLINE.get(
-              encrypt.getLongIdentifier(), signHash.getLongIdentifier()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_BACKUPDB_ENCRYPT_OR_SIGN_REQUIRES_ONLINE.get(
+          encrypt.getLongIdentifier(), signHash.getLongIdentifier()));
       return 1;
     }
 
@@ -376,9 +371,8 @@
     // was given.
     if (signHash.isPresent() && !hash.isPresent())
     {
-      printWrappedText(
-              err, ERR_BACKUPDB_SIGN_REQUIRES_HASH.get(signHash.getLongIdentifier(), hash.getLongIdentifier()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err,
+          ERR_BACKUPDB_SIGN_REQUIRES_HASH.get(signHash.getLongIdentifier(), hash.getLongIdentifier()));
       return 1;
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureDS.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureDS.java
index 3551f03..d7598aa 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureDS.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureDS.java
@@ -343,9 +343,12 @@
     {
      if (e.isWrongUsage())
      {
-       err.println(argParser.getUsage());
+       argParser.displayMessageAndUsageReference(err, e.getErrorMessage());
      }
-     printWrappedText(err, e.getErrorMessage());
+     else
+     {
+       printWrappedText(err, e.getErrorMessage());
+     }
      return e.getErrorCode();
     }
     finally
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureWindowsService.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureWindowsService.java
index 2b24922..f26a417 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureWindowsService.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureWindowsService.java
@@ -205,8 +205,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return ERROR;
     }
 
@@ -234,10 +233,8 @@
       }
       if (nArgs != 1)
       {
-        LocalizableMessage message = nArgs == 0 ? ERR_CONFIGURE_WINDOWS_SERVICE_TOO_FEW_ARGS.get()
-                                                : ERR_CONFIGURE_WINDOWS_SERVICE_TOO_MANY_ARGS.get();
-        printWrappedText(err, message);
-        err.println(argParser.getUsage());
+        argParser.displayMessageAndUsageReference(err, nArgs == 0 ? ERR_CONFIGURE_WINDOWS_SERVICE_TOO_FEW_ARGS.get()
+                                                                  : ERR_CONFIGURE_WINDOWS_SERVICE_TOO_MANY_ARGS.get());
         return ERROR;
       }
     }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/CreateRCScript.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/CreateRCScript.java
index a6789c0..83f1787 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/CreateRCScript.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/CreateRCScript.java
@@ -101,23 +101,12 @@
     PrintStream err = NullOutputStream.wrapOrNullStream(errStream);
     JDKLogging.disableLogging();
 
-    EmbeddedUtils.initializeForClientUse();
-
     if (! OperatingSystem.isUnixBased())
     {
       printWrappedText(err, ERR_CREATERC_ONLY_RUNS_ON_UNIX.get());
       return 1;
     }
 
-    File serverRoot = DirectoryServer.getEnvironmentConfig().getServerRoot();
-    if (serverRoot == null)
-    {
-      printWrappedText(
-          err, ERR_CREATERC_UNABLE_TO_DETERMINE_SERVER_ROOT.get(PROPERTY_SERVER_ROOT, ENV_VAR_INSTALL_ROOT));
-      return 1;
-    }
-
-
     LocalizableMessage description = INFO_CREATERC_TOOL_DESCRIPTION.get();
     ArgumentParser argParser =
          new ArgumentParser(CreateRCScript.class.getName(), description, false);
@@ -176,8 +165,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return 1;
     }
 
@@ -186,6 +174,15 @@
       return 0;
     }
 
+    EmbeddedUtils.initializeForClientUse();
+    File serverRoot = DirectoryServer.getEnvironmentConfig().getServerRoot();
+    if (serverRoot == null)
+    {
+      printWrappedText(
+          err, ERR_CREATERC_UNABLE_TO_DETERMINE_SERVER_ROOT.get(PROPERTY_SERVER_ROOT, ENV_VAR_INSTALL_ROOT));
+      return 1;
+    }
+
     // Determine the path to the Java installation that should be used.
     String javaHomeDir;
     if (javaHome.isPresent())
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/EncodePassword.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/EncodePassword.java
index d11e24c..d1c69d3 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/EncodePassword.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/EncodePassword.java
@@ -263,8 +263,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return OPERATIONS_ERROR;
     }
 
@@ -325,8 +324,7 @@
         && !encodedPasswordFile.isPresent()
         && !schemeName.isPresent())
     {
-      printWrappedText(err, ERR_ENCPW_NO_SCHEME.get(schemeName.getLongIdentifier()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ENCPW_NO_SCHEME.get(schemeName.getLongIdentifier()));
       return OPERATIONS_ERROR;
     }
 
@@ -859,9 +857,8 @@
     }
     else
     {
-      printWrappedText(err, ERR_ENCPW_NO_CLEAR_PW.get(clearPassword.getLongIdentifier(),
-                            clearPasswordFile.getLongIdentifier(), interactivePassword.getLongIdentifier()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ENCPW_NO_CLEAR_PW.get(clearPassword.getLongIdentifier(),
+                                      clearPasswordFile.getLongIdentifier(), interactivePassword.getLongIdentifier()));
       return null;
     }
   }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ExportLDIF.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ExportLDIF.java
index 15ddaec..c88f9c7 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ExportLDIF.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ExportLDIF.java
@@ -328,8 +328,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return 1;
     }
     catch (ClientException ce)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ImportLDIF.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ImportLDIF.java
index 39b4438..8dbb4a7 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ImportLDIF.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ImportLDIF.java
@@ -222,8 +222,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return 1;
     }
     catch (ClientException ce)
@@ -253,9 +252,8 @@
     }
     else if (! templateFile.isPresent())
     {
-      printWrappedText(err, ERR_LDIFIMPORT_MISSING_REQUIRED_ARGUMENT.get(
+      argParser.displayMessageAndUsageReference(err, ERR_LDIFIMPORT_MISSING_REQUIRED_ARGUMENT.get(
           ldifFiles.getLongIdentifier(), templateFile.getLongIdentifier()));
-      err.println(argParser.getUsage());
       return 1;
     }
 
@@ -263,9 +261,8 @@
     // "backendID" argument was provided.
     if(!includeBranchStrings.isPresent() && !backendID.isPresent())
     {
-      printWrappedText(err, ERR_LDIFIMPORT_MISSING_BACKEND_ARGUMENT.get(
+      argParser.displayMessageAndUsageReference(err, ERR_LDIFIMPORT_MISSING_BACKEND_ARGUMENT.get(
           includeBranchStrings.getLongIdentifier(), backendID.getLongIdentifier()));
-      err.println(argParser.getUsage());
       return 1;
     }
 
@@ -274,8 +271,8 @@
     // the task framework.
     if (countRejects.isPresent() && argParser.connectionArgumentsPresent())
     {
-      printWrappedText(err, ERR_LDIFIMPORT_COUNT_REJECTS_REQUIRES_OFFLINE.get(countRejects.getLongIdentifier()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_LDIFIMPORT_COUNT_REJECTS_REQUIRES_OFFLINE.get(
+          countRejects.getLongIdentifier()));
       return 1;
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/InstallDS.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/InstallDS.java
index bce614b..977a305 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/InstallDS.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/InstallDS.java
@@ -339,10 +339,7 @@
     }
     catch (final ArgumentException ae)
     {
-      println(ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      println();
-      println(LocalizableMessage.raw(argParser.getUsage()));
-
+      argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return InstallReturnCode.ERROR_USER_DATA.getReturnCode();
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/JavaPropertiesTool.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/JavaPropertiesTool.java
index 5a784ef..37804c6 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/JavaPropertiesTool.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/JavaPropertiesTool.java
@@ -222,11 +222,7 @@
     }
     catch (ArgumentException ae)
     {
-      LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-      println(message);
-      println();
-      println(LocalizableMessage.raw(argParser.getUsage()));
-
+      argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return ErrorReturnCode.ERROR_USER_DATA.getReturnCode();
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPCompare.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPCompare.java
index 531e854..45630c0 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPCompare.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPCompare.java
@@ -657,8 +657,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -759,7 +758,7 @@
       portNumber = port.getIntValue();
     } catch (ArgumentException ae)
     {
-      printWrappedText(err, ae.getMessage());
+      argParser.displayMessageAndUsageReference(err, ae.getMessageObject());
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -774,7 +773,7 @@
       connectionOptions.setVersionNumber(versionNumber);
     } catch(ArgumentException ae)
     {
-      printWrappedText(err, ae.getMessage());
+      argParser.displayMessageAndUsageReference(err, ae.getMessageObject());
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -829,7 +828,6 @@
         if(ctrl == null)
         {
           printWrappedText(err, ERR_TOOL_INVALID_CONTROL_STRING.get(ctrlString));
-          err.println(argParser.getUsage());
           return CLIENT_SIDE_PARAM_ERROR;
         }
         compareOptions.getControls().add(ctrl);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPDelete.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPDelete.java
index 30db426..9c0513a 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPDelete.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPDelete.java
@@ -559,8 +559,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -587,7 +586,7 @@
     } catch(ArgumentException ae)
     {
       logger.traceException(ae);
-      printWrappedText(err, ae.getMessage());
+      argParser.displayMessageAndUsageReference(err, ae.getMessageObject());
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -603,7 +602,7 @@
     } catch(ArgumentException ae)
     {
       logger.traceException(ae);
-      printWrappedText(err, ae.getMessage());
+      argParser.displayMessageAndUsageReference(err, ae.getMessageObject());
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -659,7 +658,6 @@
         if(ctrl == null)
         {
           printWrappedText(err, ERR_TOOL_INVALID_CONTROL_STRING.get(ctrlString));
-          err.println(argParser.getUsage());
           return CLIENT_SIDE_PARAM_ERROR;
         }
         deleteOptions.getControls().add(ctrl);
@@ -778,7 +776,13 @@
                                       lce.getErrorMessage(),
                                       lce.getMatchedDN());
       return lce.getResultCode();
-    } catch(Exception e)
+    }
+    catch(ArgumentException e)
+    {
+      argParser.displayMessageAndUsageReference(err, e.getMessageObject());
+      return 1;
+    }
+    catch (Exception e)
     {
       logger.traceException(e);
       printWrappedText(err, e.getMessage());
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPModify.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPModify.java
index 2cc1d4d..eb43313 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPModify.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPModify.java
@@ -879,8 +879,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -906,7 +905,7 @@
     } catch(ArgumentException ae)
     {
       logger.traceException(ae);
-      printWrappedText(err, ae.getMessage());
+      argParser.displayMessageAndUsageReference(err, ae.getMessageObject());
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -922,7 +921,7 @@
     } catch(ArgumentException ae)
     {
       logger.traceException(ae);
-      printWrappedText(err, ae.getMessage());
+      argParser.displayMessageAndUsageReference(err, ae.getMessageObject());
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -978,7 +977,6 @@
         if(ctrl == null)
         {
           printWrappedText(err, ERR_TOOL_INVALID_CONTROL_STRING.get(ctrlString));
-          err.println(argParser.getUsage());
           return CLIENT_SIDE_PARAM_ERROR;
         }
         modifyOptions.getControls().add(ctrl);
@@ -1137,7 +1135,13 @@
       logger.traceException(fe);
       printWrappedText(err, fe.getMessage());
       return CLIENT_SIDE_PARAM_ERROR;
-    } catch(Exception e)
+    }
+    catch(ArgumentException e)
+    {
+      argParser.displayMessageAndUsageReference(err, e.getMessageObject());
+      return 1;
+    }
+    catch(Exception e)
     {
       logger.traceException(e);
       printWrappedText(err, e.getMessage());
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPPasswordModify.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPPasswordModify.java
index af1b1ae..f8993db 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPPasswordModify.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPPasswordModify.java
@@ -426,8 +426,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -492,31 +491,27 @@
     {
       if (!bindPW.isPresent() && !bindPWFile.isPresent())
       {
-        printWrappedText(err, ERR_LDAPPWMOD_BIND_DN_AND_PW_MUST_BE_TOGETHER.get());
-        err.println(argParser.getUsage());
+        argParser.displayMessageAndUsageReference(err, ERR_LDAPPWMOD_BIND_DN_AND_PW_MUST_BE_TOGETHER.get());
         return CLIENT_SIDE_PARAM_ERROR;
       }
     }
     else if (bindPW.isPresent() || bindPWFile.isPresent())
     {
-      printWrappedText(err, ERR_LDAPPWMOD_BIND_DN_AND_PW_MUST_BE_TOGETHER.get());
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_LDAPPWMOD_BIND_DN_AND_PW_MUST_BE_TOGETHER.get());
       return CLIENT_SIDE_PARAM_ERROR;
     }
     else
     {
       if (provideDNForAuthzID.isPresent())
       {
-        printWrappedText(
-            err, ERR_LDAPPWMOD_DEPENDENT_ARGS.get(provideDNForAuthzID.getLongIdentifier(), bindDN.getLongIdentifier()));
-        err.println(argParser.getUsage());
+        argParser.displayMessageAndUsageReference(err,
+            ERR_LDAPPWMOD_DEPENDENT_ARGS.get(provideDNForAuthzID.getLongIdentifier(), bindDN.getLongIdentifier()));
         return CLIENT_SIDE_PARAM_ERROR;
       }
 
       if (!authzID.isPresent() || (!currentPW.isPresent() && !currentPWFile.isPresent()))
       {
-        printWrappedText(err, ERR_LDAPPWMOD_ANON_REQUIRES_AUTHZID_AND_CURRENTPW.get());
-        err.println(argParser.getUsage());
+        argParser.displayMessageAndUsageReference(err, ERR_LDAPPWMOD_ANON_REQUIRES_AUTHZID_AND_CURRENTPW.get());
         return CLIENT_SIDE_PARAM_ERROR;
       }
     }
@@ -547,7 +542,6 @@
         if(ctrl == null)
         {
           printWrappedText(err, ERR_TOOL_INVALID_CONTROL_STRING.get(ctrlString));
-          err.println(argParser.getUsage());
           return CLIENT_SIDE_PARAM_ERROR;
         }
         controls.add(ctrl);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPSearch.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPSearch.java
index d703e89..27f283d 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPSearch.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPSearch.java
@@ -1076,8 +1076,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -1149,7 +1148,7 @@
     } catch(ArgumentException ae)
     {
       logger.traceException(ae);
-      printWrappedText(err, ae.getMessage());
+      argParser.displayMessageAndUsageReference(err, ae.getMessageObject());
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -1166,7 +1165,7 @@
     } catch(ArgumentException ae)
     {
       logger.traceException(ae);
-      printWrappedText(err, ae.getMessage());
+      argParser.displayMessageAndUsageReference(err, ae.getMessageObject());
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -1229,7 +1228,7 @@
       searchOptions.setSizeLimit(sizeLimit.getIntValue());
     } catch(ArgumentException ex1)
     {
-      printWrappedText(err, ex1.getMessage());
+      argParser.displayMessageAndUsageReference(err, ex1.getMessageObject());
       return CLIENT_SIDE_PARAM_ERROR;
     }
     if (!searchOptions.setSearchScope(searchScope.getValue(), err)
@@ -1246,7 +1245,6 @@
         if(ctrl == null)
         {
           printWrappedText(err, ERR_TOOL_INVALID_CONTROL_STRING.get(ctrlString));
-          err.println(argParser.getUsage());
           return CLIENT_SIDE_PARAM_ERROR;
         }
         searchOptions.getControls().add(ctrl);
@@ -1257,7 +1255,6 @@
       String authzID=effectiveRightsUser.getValue();
       if (!authzID.startsWith("dn:")) {
         printWrappedText(err, ERR_EFFECTIVERIGHTS_INVALID_AUTHZID.get(authzID));
-        err.println(argParser.getUsage());
         return CLIENT_SIDE_PARAM_ERROR;
       }
       Control effectiveRightsControl =
@@ -1578,8 +1575,7 @@
 
     if(filters.isEmpty())
     {
-      printWrappedText(err, ERR_SEARCH_NO_FILTERS.get());
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_SEARCH_NO_FILTERS.get());
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFDiff.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFDiff.java
index df69f58..5f4f276 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFDiff.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFDiff.java
@@ -266,8 +266,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFModify.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFModify.java
index 57779a6..300098b 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFModify.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFModify.java
@@ -495,8 +495,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFSearch.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFSearch.java
index b7f0bec..badc935 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFSearch.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFSearch.java
@@ -240,8 +240,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -333,8 +332,7 @@
       ArrayList<String> trailingArguments = argParser.getTrailingArguments();
       if (trailingArguments == null || trailingArguments.isEmpty())
       {
-        printWrappedText(err, ERR_LDIFSEARCH_NO_FILTER.get());
-        err.println(argParser.getUsage());
+        argParser.displayMessageAndUsageReference(err, ERR_LDIFSEARCH_NO_FILTER.get());
         return 1;
       }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ListBackends.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ListBackends.java
index 908a208..796000b 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ListBackends.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ListBackends.java
@@ -198,8 +198,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return 1;
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageAccount.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageAccount.java
index 1757268..71c346d 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageAccount.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageAccount.java
@@ -1197,8 +1197,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -1336,7 +1335,8 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_PWPSTATE_CANNOT_DETERMINE_PORT.get(port.getLongIdentifier(), ae.getMessage()));
+      argParser.displayMessageAndUsageReference(
+          err, ERR_PWPSTATE_CANNOT_DETERMINE_PORT.get(port.getLongIdentifier(), ae.getMessage()));
       return CLIENT_SIDE_PARAM_ERROR;
     }
     catch (LDAPConnectionException lce)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageTasks.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageTasks.java
index 1535074..280545b 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageTasks.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageTasks.java
@@ -281,9 +281,7 @@
       StaticUtils.checkOnlyOneArgPresent(task, summary, cancel);
     }
     catch (ArgumentException ae) {
-      LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-      println(message);
-      println(argParser.getUsageMessage());
+      argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return 1;
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/RebuildIndex.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/RebuildIndex.java
index 5066609..f50c9fd 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/RebuildIndex.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/RebuildIndex.java
@@ -164,8 +164,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return 1;
     }
 
@@ -176,55 +175,43 @@
       return 0;
     }
 
-    // If no arguments were provided, then display usage information and exit.
-    final int numArgs = args.length;
-    if (numArgs == 0)
-    {
-      out.println(argParser.getUsage());
-      return 1;
-    }
-
     if (indexList.getValues().isEmpty()
         && !rebuildAll.isPresent()
         && !rebuildDegraded.isPresent())
     {
-      printWrappedText(err, ERR_REBUILDINDEX_REQUIRES_AT_LEAST_ONE_INDEX.get());
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_REBUILDINDEX_REQUIRES_AT_LEAST_ONE_INDEX.get());
       return 1;
     }
 
     if (rebuildAll.isPresent() && indexList.isPresent())
     {
-      printWrappedText(err, ERR_REBUILDINDEX_REBUILD_ALL_ERROR.get());
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_REBUILDINDEX_REBUILD_ALL_ERROR.get());
       return 1;
     }
 
     if (rebuildDegraded.isPresent() && indexList.isPresent())
     {
-      printWrappedText(err, ERR_REBUILDINDEX_REBUILD_DEGRADED_ERROR.get("index"));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_REBUILDINDEX_REBUILD_DEGRADED_ERROR.get("index"));
       return 1;
     }
 
     if (rebuildDegraded.isPresent() && clearDegradedState.isPresent())
     {
-      printWrappedText(err, ERR_REBUILDINDEX_REBUILD_DEGRADED_ERROR.get("clearDegradedState"));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_REBUILDINDEX_REBUILD_DEGRADED_ERROR.get("clearDegradedState"));
       return 1;
     }
 
     if (rebuildAll.isPresent() && rebuildDegraded.isPresent())
     {
-      printWrappedText(err, ERR_REBUILDINDEX_REBUILD_ALL_DEGRADED_ERROR.get("rebuildDegraded"));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err,
+          ERR_REBUILDINDEX_REBUILD_ALL_DEGRADED_ERROR.get("rebuildDegraded"));
       return 1;
     }
 
     if (rebuildAll.isPresent() && clearDegradedState.isPresent())
     {
-      printWrappedText(err, ERR_REBUILDINDEX_REBUILD_ALL_DEGRADED_ERROR.get("clearDegradedState"));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err,
+          ERR_REBUILDINDEX_REBUILD_ALL_DEGRADED_ERROR.get("clearDegradedState"));
       return 1;
     }
 
@@ -691,7 +678,7 @@
       }
       catch (ArgumentException ae)
       {
-        printWrappedText(out, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
+        argParser.displayMessageAndUsageReference(out, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
         return 1;
       }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/RestoreDB.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/RestoreDB.java
index fc8980d..c069519 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/RestoreDB.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/RestoreDB.java
@@ -241,8 +241,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return 1;
     }
     catch (ClientException ce)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/StopDS.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/StopDS.java
index d0edccc..45cf731 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/StopDS.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/StopDS.java
@@ -403,8 +403,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return CLIENT_SIDE_PARAM_ERROR;
     }
 
@@ -570,7 +569,8 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_STOPDS_CANNOT_DETERMINE_PORT.get(port.getLongIdentifier(), ae.getMessage()));
+      argParser.displayMessageAndUsageReference(
+          err, ERR_STOPDS_CANNOT_DETERMINE_PORT.get(port.getLongIdentifier(), ae.getMessage()));
       return CLIENT_SIDE_PARAM_ERROR;
     }
     catch (LDAPConnectionException lce)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/VerifyIndex.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/VerifyIndex.java
index 38c3d7f..0bf4d4d 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/VerifyIndex.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/VerifyIndex.java
@@ -190,8 +190,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return 1;
     }
 
@@ -203,18 +202,9 @@
       return 0;
     }
 
-    // If no arguments were provided, then display usage information and exit.
-    int numArgs = args.length;
-    if (numArgs == 0)
-    {
-      out.println(argParser.getUsage());
-      return 1;
-    }
-
     if (cleanMode.isPresent() && indexList.getValues().size() != 1)
     {
-      printWrappedText(err, ERR_VERIFYINDEX_VERIFY_CLEAN_REQUIRES_SINGLE_INDEX.get());
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_VERIFYINDEX_VERIFY_CLEAN_REQUIRES_SINGLE_INDEX.get());
       return 1;
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/WaitForFileDelete.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/WaitForFileDelete.java
index 6d95dd4..3148106 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/WaitForFileDelete.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/WaitForFileDelete.java
@@ -242,10 +242,7 @@
     }
     catch (ArgumentException ae)
     {
-      LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-
-      println(message);
-      println(LocalizableMessage.raw(argParser.getUsage()));
+      argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return EXIT_CODE_INTERNAL_ERROR;
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java
index a883bd3..3a74823 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java
@@ -374,9 +374,7 @@
     }
     catch (ArgumentException ae)
     {
-      errPrintln(ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      errPrintln();
-      errPrintln(LocalizableMessage.raw(argParser.getUsage()));
+      argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       logger.error(LocalizableMessage.raw("Complete error stack:"), ae);
       return ERROR_USER_DATA;
     }
@@ -1843,9 +1841,7 @@
       catch (ArgumentException ae)
       {
         logger.warn(LocalizableMessage.raw("Argument exception " + ae));
-        errPrintln();
-        errPrintln(ae.getMessageObject());
-        errPrintln();
+        argParser.displayMessageAndUsageReference(getErrStream(), ae.getMessageObject());
         return null;
       }
       firstTry = false;
@@ -1962,9 +1958,7 @@
       catch (ArgumentException ae)
       {
         logger.warn(LocalizableMessage.raw("Argument exception "+ae));
-        errPrintln();
-        errPrintln(ae.getMessageObject());
-        errPrintln();
+        argParser.displayMessageAndUsageReference(getErrStream(), ae.getMessageObject());
         cancelled = true;
       }
     }
@@ -2226,9 +2220,7 @@
       catch (ArgumentException ae)
       {
         logger.warn(LocalizableMessage.raw("Argument exception "+ae));
-        errPrintln();
-        errPrintln(ae.getMessageObject());
-        errPrintln();
+        argParser.displayMessageAndUsageReference(getErrStream(), ae.getMessageObject());
         cancelled = true;
       }
       finally
@@ -2535,9 +2527,7 @@
       catch (ArgumentException ae)
       {
         logger.warn(LocalizableMessage.raw("Argument exception "+ae));
-        errPrintln();
-        errPrintln(ae.getMessageObject());
-        errPrintln();
+        argParser.displayMessageAndUsageReference(getErrStream(), ae.getMessageObject());
         cancelled = true;
       }
     }
@@ -2824,9 +2814,7 @@
       catch (ArgumentException ae)
       {
         logger.warn(LocalizableMessage.raw("Argument exception " + ae));
-        errPrintln();
-        errPrintln(ae.getMessageObject());
-        errPrintln();
+        argParser.displayMessageAndUsageReference(getErrStream(), ae.getMessageObject());
         return null;
       }
     }
@@ -2944,9 +2932,7 @@
       catch (ArgumentException ae)
       {
         logger.warn(LocalizableMessage.raw("Argument exception "+ae));
-        errPrintln();
-        errPrintln(ae.getMessageObject());
-        errPrintln();
+        argParser.displayMessageAndUsageReference(getErrStream(), ae.getMessageObject());
         cancelled = true;
       }
     }
@@ -3020,9 +3006,7 @@
       catch (ArgumentException ae)
       {
         logger.warn(LocalizableMessage.raw("Argument exception "+ae));
-        println();
-        println(ae.getMessageObject());
-        println();
+        argParser.displayMessageAndUsageReference(getErrStream(), ae.getMessageObject());
         cancelled = true;
       }
     }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/makeldif/MakeLDIF.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/makeldif/MakeLDIF.java
index 73a570e..4c41cbf 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/makeldif/MakeLDIF.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/makeldif/MakeLDIF.java
@@ -96,7 +96,24 @@
     }
   }
 
-
+  /**
+   * Provides the command-line arguments to the main application for
+   * processing and returns the exit code as an integer.
+   *
+   * @param args
+   *          The set of command-line arguments provided to this
+   *          program.
+   * @param outStream
+   *          The output stream for standard output.
+   * @param errStream
+   *          The output stream for standard error.
+   * @return Zero to indicate that the program completed successfully,
+   *         or non-zero to indicate that an error occurred.
+   */
+  public static int main(final String[] args, final OutputStream outStream, final OutputStream errStream)
+  {
+    return new MakeLDIF().makeLDIFMain(args, false, false, outStream, errStream);
+  }
 
   /**
    * Creates a new instance of this utility.  It should just be used for
@@ -217,8 +234,7 @@
     }
     catch (ArgumentException ae)
     {
-      printWrappedText(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      err.println(argParser.getUsage());
+      argParser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return 1;
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/status/StatusCli.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/status/StatusCli.java
index 56f1abe..5998e49 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/status/StatusCli.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/status/StatusCli.java
@@ -104,7 +104,7 @@
  * This class basically is in charge of parsing the data provided by the
  * user in the command line.
  */
-class StatusCli extends ConsoleApplication
+public class StatusCli extends ConsoleApplication
 {
   private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
 
@@ -233,10 +233,7 @@
     try {
       argParser.parseArguments(args);
     } catch (ArgumentException ae) {
-      println(ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
-      println();
-      println(LocalizableMessage.raw(argParser.getUsage()));
-
+      argParser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return ReturnCode.CLIENT_SIDE_PARAM_ERROR.get();
     }
 
@@ -297,16 +294,23 @@
       secureArgsList.portArg.setPresent(true);
       secureArgsList.hostNameArg.addValue(secureArgsList.hostNameArg.getDefaultValue());
       secureArgsList.portArg.addValue(Integer.toString(port));
+      // We already know if SSL or StartTLS can be used.  If we cannot
+      // use them we will not propose them in the connection parameters
+      // and if none of them can be used we will just not ask for the
+      // protocol to be used.
+      final LDAPConnectionConsoleInteraction ci =
+          new LDAPConnectionConsoleInteraction(this, argParser.getSecureArgsList());
       try
       {
-        // We already know if SSL or StartTLS can be used.  If we cannot
-        // use them we will not propose them in the connection parameters
-        // and if none of them can be used we will just not ask for the
-        // protocol to be used.
-        final LDAPConnectionConsoleInteraction ci =
-            new LDAPConnectionConsoleInteraction(this, argParser.getSecureArgsList());
-
         ci.run(false);
+      }
+      catch (ArgumentException e)
+      {
+        argParser.displayMessageAndUsageReference(getErrStream(), e.getMessageObject());
+        return ReturnCode.CLIENT_SIDE_PARAM_ERROR.get();
+      }
+      try
+      {
         if (argParser.isInteractive())
         {
           bindDn = ci.getBindDN();
@@ -324,7 +328,7 @@
           controlInfo.setTrustManager(interactiveTrustManager);
           useInteractiveTrustManager = true;
         }
-      } catch (ArgumentException | ClientException e) {
+      } catch (ClientException e) {
         println(e.getMessageObject());
         return ReturnCode.CLIENT_SIDE_PARAM_ERROR.get();
       } finally {
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java
index 91a198a..4b5a111 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java
@@ -337,10 +337,14 @@
       } catch (LDAPException le) {
         printWrappedText(err, ERR_TASK_TOOL_LDAP_ERROR.get(le.getMessage()));
         ret = 1;
-      } catch (ArgumentException | OpenDsException e) {
+      } catch (OpenDsException e) {
         printWrappedText(err, e.getMessageObject());
         ret = 1;
-      } finally
+      } catch (ArgumentException e) {
+        argParser.displayMessageAndUsageReference(err, e.getMessageObject());
+        ret = 1;
+      }
+      finally
       {
         if (conn != null)
         {
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeCli.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeCli.java
index 663164d..2eca4f0 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeCli.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeCli.java
@@ -219,14 +219,6 @@
     return acceptLicense.isPresent();
   }
 
-  /** Displays the provided message followed by a help usage reference. */
-  private void displayMessageAndUsageReference(final LocalizableMessage message)
-  {
-    println(message);
-    println();
-    println(parser.getHelpUsageReference());
-  }
-
   /** Initialize arguments provided by the command line. */
   private void initializeGlobalArguments() throws ArgumentException
   {
@@ -312,8 +304,7 @@
     }
     catch (ArgumentException ae)
     {
-      final LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
-      displayMessageAndUsageReference(message);
+      parser.displayMessageAndUsageReference(getErrStream(), ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       return EXIT_CODE_ERROR;
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/util/Base64.java b/opendj-server-legacy/src/main/java/org/opends/server/util/Base64.java
index 71b727b..ef4aff5 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/util/Base64.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/util/Base64.java
@@ -552,7 +552,7 @@
     }
     catch (ArgumentException ae)
     {
-      System.err.println(ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
+      argParser.displayMessageAndUsageReference(System.err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       System.exit(1);
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/util/EMailMessage.java b/opendj-server-legacy/src/main/java/org/opends/server/util/EMailMessage.java
index 27430fc..d80be4c 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/util/EMailMessage.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/util/EMailMessage.java
@@ -567,7 +567,7 @@
     }
     catch (ArgumentException ae)
     {
-      System.err.println(ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
+      argParser.displayMessageAndUsageReference(System.err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
       System.exit(1);
     }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/util/args/LDAPConnectionArgumentParser.java b/opendj-server-legacy/src/main/java/org/opends/server/util/args/LDAPConnectionArgumentParser.java
index 7557485..d3ec150 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/util/args/LDAPConnectionArgumentParser.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/util/args/LDAPConnectionArgumentParser.java
@@ -297,11 +297,12 @@
    *          stream to write error messages
    * @return LDAPConnection created by this class from parsed arguments
    * @throws LDAPConnectionException
-   *           if there was a problem connecting to the server indicated by the
-   *           input arguments
+   *           if there was a problem connecting to the server
+   * @throws ArgumentException
+   *           if there was a problem indicated by the input arguments
    */
   public LDAPConnection connect(LDAPConnectionConsoleInteraction ui, PrintStream out, PrintStream err)
-      throws LDAPConnectionException
+      throws LDAPConnectionException, ArgumentException
   {
     try
     {
@@ -311,18 +312,19 @@
       return connect(ui.getHostName(), ui.getPortNumber(), ui.getBindDN(),
           ui.getBindPassword(), ui.populateLDAPOptions(options), ui.getConnectTimeout(), out, err);
     }
-    catch (ArgumentException | OpenDsException e)
+    catch (OpenDsException e)
     {
-      if (e.getCause() != null && e.getCause().getCause() != null && e.getCause().getCause() instanceof SSLException)
-      {
-        err.println(ERR_TASKINFO_LDAP_EXCEPTION_SSL.get(ui.getHostName(), ui.getPortNumber()));
-      }
-      else
-      {
-        err.println(e.getMessageObject());
-      }
+      err.println(isSSLException(e) ?
+          ERR_TASKINFO_LDAP_EXCEPTION_SSL.get(ui.getHostName(), ui.getPortNumber()) : e.getMessageObject());
+      return null;
     }
-    return null;
+  }
+
+  private boolean isSSLException(Exception e)
+  {
+    return e.getCause() != null
+        && e.getCause().getCause() != null
+        && e.getCause().getCause() instanceof SSLException;
   }
 
   /**
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/tools/ArgumentParserToolsTestCase.java b/opendj-server-legacy/src/test/java/org/opends/server/tools/ArgumentParserToolsTestCase.java
new file mode 100644
index 0000000..1f14b73
--- /dev/null
+++ b/opendj-server-legacy/src/test/java/org/opends/server/tools/ArgumentParserToolsTestCase.java
@@ -0,0 +1,244 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2015 ForgeRock AS.
+ */
+package org.opends.server.tools;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.forgerock.util.Utils.*;
+
+import static com.forgerock.opendj.cli.CliMessages.*;
+
+import java.io.PrintStream;
+
+import org.forgerock.opendj.ldap.ByteStringBuilder;
+import org.opends.server.backends.jeb.DBTest;
+import org.opends.server.tools.dsreplication.ReplicationCliMain;
+import org.opends.server.tools.makeldif.MakeLDIF;
+import org.opends.server.tools.status.StatusCli;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+/**
+ * This class tests that help reference message is prompted for all tools when
+ * no arguments are provided or if they failed to be parsed.
+ */
+public class ArgumentParserToolsTestCase extends ToolsTestCase
+{
+  private static final boolean ERRORS_ON_STDOUT = false;
+
+  private ByteStringBuilder out;
+  private ByteStringBuilder err;
+  private PrintStream outStream;
+  private PrintStream errStream;
+
+  @BeforeMethod
+  private void refreshStreams()
+  {
+    out = new ByteStringBuilder();
+    err = new ByteStringBuilder();
+    outStream = new PrintStream(out.asOutputStream());
+    errStream = new PrintStream(err.asOutputStream());
+  }
+
+  @AfterMethod
+  private void validateAndCloseStreams()
+  {
+    closeSilently(outStream, errStream);
+  }
+
+  private void assertToolFailsWithUsage(final int returnCode)
+  {
+    assertToolFailsWithUsage(returnCode, true);
+  }
+
+  private void assertToolFailsWithUsage(final int returnCode, boolean errorsOnStdErr)
+  {
+    assertThat(returnCode).isNotEqualTo(0);
+    assertThat((errorsOnStdErr ? out : err).toString()).isEmpty();
+    final String streamToCheck = (errorsOnStdErr ? err : out).toString()
+                                                             .replace(System.getProperty("line.separator"), " ");
+    assertThat(streamToCheck).matches(".*" + INFO_GLOBAL_HELP_REFERENCE.get("(.*)") + ".*");
+    assertThat(streamToCheck).contains(ERR_ERROR_PARSING_ARGS.get(""));
+  }
+
+  @DataProvider
+  public Object[][] invalidArg() throws Exception
+  {
+    return new Object[][] { { new String[] { "-42" } } };
+  }
+
+  @DataProvider
+  public Object[][] invalidArgs() throws Exception
+  {
+    return new Object[][] { { new String[] { } }, { new String[] { "-42" } } };
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testBackup(final String[] args)
+  {
+    assertToolFailsWithUsage(BackUpDB.mainBackUpDB(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testCreateRCScript(final String[] args)
+  {
+    assertToolFailsWithUsage(CreateRCScript.main(args, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testDBTest(final String[] args)
+  {
+    assertToolFailsWithUsage(DBTest.main(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testDSJavaProperties(final String[] args)
+  {
+    assertToolFailsWithUsage(JavaPropertiesTool.mainCLI(args, outStream, errStream, null));
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testDSReplication(final String[] args)
+  {
+    assertToolFailsWithUsage(ReplicationCliMain.mainCLI(args, false, outStream, errStream), ERRORS_ON_STDOUT);
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testEncodePassword(final String[] args)
+  {
+    assertToolFailsWithUsage(EncodePassword.encodePassword(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testExportLDIF(final String[] args)
+  {
+    assertToolFailsWithUsage(ExportLDIF.mainExportLDIF(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testImportLDIF(final String[] args)
+  {
+    assertToolFailsWithUsage(ImportLDIF.mainImportLDIF(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testLDAPCompare(final String[] args)
+  {
+    assertToolFailsWithUsage(LDAPCompare.mainCompare(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArg")
+  public void testLDAPDelete(final String[] args)
+  {
+    assertToolFailsWithUsage(LDAPDelete.mainDelete(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArg")
+  public void testLDAPModify(final String[] args)
+  {
+    assertToolFailsWithUsage(LDAPModify.mainModify(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArg")
+  public void testLDAPPasswordModify(final String[] args)
+  {
+    assertToolFailsWithUsage(LDAPPasswordModify.mainPasswordModify(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testLDAPSearch(final String[] args)
+  {
+    assertToolFailsWithUsage(LDAPSearch.mainSearch(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testLDIFDiff(final String[] args)
+  {
+    assertToolFailsWithUsage(LDIFDiff.mainDiff(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testLDIFModify(final String[] args)
+  {
+    assertToolFailsWithUsage(LDIFModify.ldifModifyMain(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArg")
+  public void testLDIFSearch(final String[] args)
+  {
+    assertToolFailsWithUsage(LDIFSearch.mainSearch(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testListBackends(final String[] args)
+  {
+    assertToolFailsWithUsage(ListBackends.listBackends(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testMakeLDIF(final String[] args)
+  {
+    assertToolFailsWithUsage(MakeLDIF.main(args, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testManageAccount(final String[] args)
+  {
+    assertToolFailsWithUsage(ManageAccount.main(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArg")
+  public void testManageTasks(final String[] args)
+  {
+    assertToolFailsWithUsage(ManageTasks.mainTaskInfo(args, null, outStream, errStream, false), ERRORS_ON_STDOUT);
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testRebuildIndex(final String[] args)
+  {
+    assertToolFailsWithUsage(RebuildIndex.mainRebuildIndex(args, false, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArg")
+  public void testStopDS(final String[] args)
+  {
+    assertToolFailsWithUsage(StopDS.stopDS(args, outStream, errStream));
+  }
+
+  @Test(dataProvider = "invalidArg")
+  public void testStatus(final String[] args)
+  {
+    assertToolFailsWithUsage(StatusCli.mainCLI(args, false, outStream, errStream, null), ERRORS_ON_STDOUT);
+  }
+
+  @Test(dataProvider = "invalidArgs")
+  public void testVerifyIndex(final String[] args)
+  {
+    assertToolFailsWithUsage(VerifyIndex.mainVerifyIndex(args, false, outStream, errStream));
+  }
+
+}

--
Gitblit v1.10.0