From d9b2b9b7578edb367174b1a516f38feb6eb028ae Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Fri, 10 Nov 2006 23:45:06 +0000
Subject: [PATCH] Make a number of changes to administrative tools provided with OpenDS.  These are all made under the umbrella of issue #994, but there are individual issues for each change.

---
 opends/src/server/org/opends/server/tools/LDAPSearch.java |  523 +++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 317 insertions(+), 206 deletions(-)

diff --git a/opends/src/server/org/opends/server/tools/LDAPSearch.java b/opends/src/server/org/opends/server/tools/LDAPSearch.java
index 2c2e9d8..ae28234 100644
--- a/opends/src/server/org/opends/server/tools/LDAPSearch.java
+++ b/opends/src/server/org/opends/server/tools/LDAPSearch.java
@@ -159,8 +159,7 @@
         LDAPMessage message = new LDAPMessage(nextMessageID.getAndIncrement(),
                                               protocolOp,
                                               searchOptions.getControls());
-        int numBytes =
-            connection.getASN1Writer().writeElement(message.encode());
+        connection.getASN1Writer().writeElement(message.encode());
 
         byte opType;
         do
@@ -186,13 +185,14 @@
                     EntryChangeNotificationControl ecn =
                          EntryChangeNotificationControl.decodeControl(
                               c.getControl());
-                    out.println("# Persistent Search Change Type:  " +
-                                ecn.getChangeType().toString());
+                    int msgID = MSGID_LDAPSEARCH_PSEARCH_CHANGE_TYPE;
+                    out.println(getMessage(msgID,
+                                           ecn.getChangeType().toString()));
                     DN previousDN = ecn.getPreviousDN();
                     if (previousDN != null)
                     {
-                      out.println("# Persistent Search Previous DN:  " +
-                                  previousDN.toString());
+                      msgID = MSGID_LDAPSEARCH_PSEARCH_PREVIOUS_DN;
+                      out.println(getMessage(msgID, previousDN.toString()));
                     }
                   } catch (Exception e) {}
                 }
@@ -203,49 +203,58 @@
                     AccountUsableResponseControl acrc =
                          AccountUsableResponseControl.decodeControl(
                               c.getControl());
-                    out.println("# Account Usable Response Control");
+                    int msgID = MSGID_LDAPSEARCH_ACCTUSABLE_HEADER;
+                    out.println(getMessage(msgID));
                     if (acrc.isUsable())
                     {
-                      out.println("#   Account is usable");
+                      msgID = MSGID_LDAPSEARCH_ACCTUSABLE_IS_USABLE;
+                      out.println(getMessage(msgID));
                       if (acrc.getSecondsBeforeExpiration() > 0)
                       {
                         int    timeToExp    = acrc.getSecondsBeforeExpiration();
                         String timeToExpStr = secondsToTimeString(timeToExp);
-                        out.println("#   Time until expiration:  " +
-                                    timeToExpStr);
+                        msgID =
+                             MSGID_LDAPSEARCH_ACCTUSABLE_TIME_UNTIL_EXPIRATION;
+                        out.println(getMessage(msgID, timeToExpStr));
                       }
                     }
                     else
                     {
-                      out.println("#   Account is not usable");
+                      msgID = MSGID_LDAPSEARCH_ACCTUSABLE_NOT_USABLE;
+                      out.println(getMessage(msgID));
                       if (acrc.isInactive())
                       {
-                        out.println("#   Account is inactive");
+                        msgID = MSGID_LDAPSEARCH_ACCTUSABLE_ACCT_INACTIVE;
+                        out.println(getMessage(msgID));
                       }
                       if (acrc.isReset())
                       {
-                        out.println("#   Password has been reset");
+                        msgID = MSGID_LDAPSEARCH_ACCTUSABLE_PW_RESET;
+                        out.println(getMessage(msgID));
                       }
                       if (acrc.isExpired())
                       {
-                        out.println("#   Password is expired");
+                        msgID = MSGID_LDAPSEARCH_ACCTUSABLE_PW_EXPIRED;
+                        out.println(getMessage(msgID));
 
                         if (acrc.getRemainingGraceLogins() > 0)
                         {
-                          out.println("#   Grace logins remaining:  " +
-                                      acrc.getRemainingGraceLogins());
+                          msgID = MSGID_LDAPSEARCH_ACCTUSABLE_REMAINING_GRACE;
+                          out.println(getMessage(msgID,
+                                           acrc.getRemainingGraceLogins()));
                         }
                       }
                       if (acrc.isLocked())
                       {
-                        out.println("#   Account is locked");
+                        msgID = MSGID_LDAPSEARCH_ACCTUSABLE_LOCKED;
+                        out.println(getMessage(msgID));
                         if (acrc.getSecondsBeforeUnlock() > 0)
                         {
                           int timeToUnlock = acrc.getSecondsBeforeUnlock();
                           String timeToUnlockStr =
                                       secondsToTimeString(timeToUnlock);
-                          out.println("#   Time until automatic unlock:  " +
-                                      timeToUnlockStr);
+                          msgID = MSGID_LDAPSEARCH_ACCTUSABLE_TIME_UNTIL_UNLOCK;
+                          out.println(getMessage(msgID, timeToUnlockStr));
                         }
                       }
                     }
@@ -276,7 +285,7 @@
               // FIXME - throw exception?
               int msgID = MSGID_SEARCH_OPERATION_INVALID_PROTOCOL;
               String msg = getMessage(msgID, opType);
-              err.println(msg);
+              err.println(wrapText(msg, MAX_LINE_WIDTH));
               break;
           }
 
@@ -292,7 +301,7 @@
           else if (errorMessage != null)
           {
             out.println();
-            out.println(errorMessage);
+            out.println(wrapText(errorMessage, MAX_LINE_WIDTH));
           }
 
         } while(opType != OP_TYPE_SEARCH_RESULT_DONE);
@@ -512,199 +521,248 @@
     ArrayList<LDAPFilter> filters = new ArrayList<LDAPFilter>();
     LinkedHashSet<String> attributes = new LinkedHashSet<String>();
 
-    BooleanArgument trustAll = null;
-    BooleanArgument noop = null;
-    StringArgument assertionFilter = null;
-    StringArgument baseDN = null;
-    StringArgument bindDN = null;
-    StringArgument bindPassword = null;
-    FileBasedArgument bindPasswordFile = null;
-    StringArgument proxyAuthzID = null;
-    BooleanArgument reportAuthzID = null;
-    BooleanArgument usePasswordPolicyControl = null;
-    StringArgument encodingStr = null;
-    StringArgument keyStorePath = null;
-    StringArgument keyStorePassword = null;
-    StringArgument trustStorePath = null;
-    StringArgument trustStorePassword = null;
-    StringArgument hostName = null;
-    IntegerArgument port = null;
-    IntegerArgument version = null;
-    BooleanArgument showUsage = null;
-    StringArgument controlStr = null;
-    BooleanArgument verbose = null;
-    BooleanArgument continueOnError = null;
-    BooleanArgument useSSL = null;
-    BooleanArgument startTLS = null;
-    BooleanArgument saslExternal = null;
-    StringArgument filename = null;
-    IntegerArgument sizeLimit = null;
-    IntegerArgument timeLimit = null;
-    StringArgument searchScope = null;
-    StringArgument dereferencePolicy = null;
-    StringArgument saslOptions = null;
-    BooleanArgument dontWrap = null;
-    BooleanArgument typesOnly = null;
-    StringArgument pSearchInfo = null;
-    StringArgument matchedValuesFilter = null;
+    BooleanArgument   continueOnError          = null;
+    BooleanArgument   dontWrap                 = null;
+    BooleanArgument   noop                     = null;
+    BooleanArgument   reportAuthzID            = null;
+    BooleanArgument   saslExternal             = null;
+    BooleanArgument   showUsage                = null;
+    BooleanArgument   trustAll                 = null;
+    BooleanArgument   usePasswordPolicyControl = null;
+    BooleanArgument   useSSL                   = null;
+    BooleanArgument   startTLS                 = null;
+    BooleanArgument   typesOnly                = null;
+    BooleanArgument   verbose                  = null;
+    FileBasedArgument bindPasswordFile         = null;
+    FileBasedArgument keyStorePasswordFile     = null;
+    FileBasedArgument trustStorePasswordFile   = null;
+    IntegerArgument   port                     = null;
+    IntegerArgument   sizeLimit                = null;
+    IntegerArgument   timeLimit                = null;
+    IntegerArgument   version                  = null;
+    StringArgument    assertionFilter          = null;
+    StringArgument    baseDN                   = null;
+    StringArgument    bindDN                   = null;
+    StringArgument    bindPassword             = null;
+    StringArgument    controlStr               = null;
+    StringArgument    dereferencePolicy        = null;
+    StringArgument    encodingStr              = null;
+    StringArgument    filename                 = null;
+    StringArgument    hostName                 = null;
+    StringArgument    keyStorePath             = null;
+    StringArgument    keyStorePassword         = null;
+    StringArgument    matchedValuesFilter      = null;
+    StringArgument    proxyAuthzID             = null;
+    StringArgument    pSearchInfo              = null;
+    StringArgument    saslOptions              = null;
+    StringArgument    searchScope              = null;
+    StringArgument    trustStorePath           = null;
+    StringArgument    trustStorePassword       = null;
 
 
     // Create the command-line argument parser for use with this program.
-    ArgumentParser argParser = new ArgumentParser(CLASS_NAME, false, true, 0, 0,
+    String toolDescription = getMessage(MSGID_LDAPSEARCH_TOOL_DESCRIPTION);
+    ArgumentParser argParser = new ArgumentParser(CLASS_NAME, toolDescription,
+                                                  false, true, 0, 0,
                                                   "[filter] [attributes ...]");
 
     try
     {
+      hostName = new StringArgument("host", 'h', "host", false, false, true,
+                                    "{host}", "localhost", null,
+                                    MSGID_DESCRIPTION_HOST);
+      argParser.addArgument(hostName);
+
+      port = new IntegerArgument("port", 'p', "port", false, false, true,
+                                 "{port}", 389, null, MSGID_DESCRIPTION_PORT);
+      argParser.addArgument(port);
+
+      useSSL = new BooleanArgument("useSSL", 'Z', "useSSL",
+                                   MSGID_DESCRIPTION_USE_SSL);
+      argParser.addArgument(useSSL);
+
+      startTLS = new BooleanArgument("startTLS", 'q', "startTLS",
+                                    MSGID_DESCRIPTION_START_TLS);
+      argParser.addArgument(startTLS);
+
+      bindDN = new StringArgument("bindDN", 'D', "bindDN", false, false, true,
+                                  "{bindDN}", null, null,
+                                  MSGID_DESCRIPTION_BINDDN);
+      argParser.addArgument(bindDN);
+
+      bindPassword = new StringArgument("bindPassword", 'w', "bindPassword",
+                                        false, false, true, "{bindPassword}",
+                                        null, null,
+                                        MSGID_DESCRIPTION_BINDPASSWORD);
+      argParser.addArgument(bindPassword);
+
+      bindPasswordFile =
+           new FileBasedArgument("bindPasswordFile", 'j', "bindPasswordFile",
+                                 false, false, "{bindPasswordFilename}", null,
+                                 null, MSGID_DESCRIPTION_BINDPASSWORDFILE);
+      argParser.addArgument(bindPasswordFile);
+
+      baseDN = new StringArgument("baseDN", 'b', "baseDN", true, false, true,
+                                  "{baseDN}", null, null,
+                                  MSGID_SEARCH_DESCRIPTION_BASEDN);
+      argParser.addArgument(baseDN);
+
+      searchScope = new StringArgument("searchScope", 's', "searchScope", false,
+                                       false, true, "{searchScope}", null, null,
+                                       MSGID_SEARCH_DESCRIPTION_SEARCH_SCOPE);
+      argParser.addArgument(searchScope);
+
+      filename = new StringArgument("filename", 'f', "filename", false, false,
+                                    true, "{filename}", null, null,
+                                    MSGID_SEARCH_DESCRIPTION_FILENAME);
+      argParser.addArgument(filename);
+
+      saslExternal = new BooleanArgument("useSASLExternal", 'r',
+                                         "useSASLExternal",
+                                         MSGID_DESCRIPTION_USE_SASL_EXTERNAL);
+      argParser.addArgument(saslExternal);
+
+      saslOptions = new StringArgument("saslOptions", 'o', "saslOptions", false,
+                                       true, true, "{name=value}", null, null,
+                                       MSGID_DESCRIPTION_SASL_PROPERTIES);
+      argParser.addArgument(saslOptions);
+
       trustAll = new BooleanArgument("trustAll", 'X', "trustAll",
                                     MSGID_DESCRIPTION_TRUSTALL);
       argParser.addArgument(trustAll);
-      baseDN = new StringArgument("baseDN", 'b', "baseDN", true, false,
-                                  true, "{baseDN}", null, null,
-                                  MSGID_SEARCH_DESCRIPTION_BASEDN);
-      argParser.addArgument(baseDN);
-      bindDN = new StringArgument("bindDN", 'D', "bindDN", false, false,
-                                  true, "{bindDN}", null, null,
-                                  MSGID_DESCRIPTION_BINDDN);
-      argParser.addArgument(bindDN);
-      bindPassword = new StringArgument("bindPassword", 'w', "bindPassword",
-                                  false, false,
-                                  true, "{bindPassword}", null, null,
-                                  MSGID_DESCRIPTION_BINDPASSWORD);
-      argParser.addArgument(bindPassword);
-      bindPasswordFile = new FileBasedArgument("bindPasswordFile", 'j',
-                                  "bindPasswordFile", false, false,
-                                  "{bindPasswordFilename}", null, null,
-                                  MSGID_DESCRIPTION_BINDPASSWORDFILE);
-      argParser.addArgument(bindPasswordFile);
-      proxyAuthzID = new StringArgument("proxy_authzid", 'Y', "proxyAs", false,
-                                        false, true, "{authzID}", null, null,
-                                        MSGID_DESCRIPTION_PROXY_AUTHZID);
-      argParser.addArgument(proxyAuthzID);
-      reportAuthzID = new BooleanArgument("reportauthzid", 'E',
-                                          "reportAuthzID",
-                                          MSGID_DESCRIPTION_REPORT_AUTHZID);
-      argParser.addArgument(reportAuthzID);
-      usePasswordPolicyControl = new BooleanArgument("usepwpolicycontrol", null,
-                                          "usePasswordPolicyControl",
-                                          MSGID_DESCRIPTION_USE_PWP_CONTROL);
-      argParser.addArgument(usePasswordPolicyControl);
-      encodingStr = new StringArgument("encoding", 'i', "encoding",
-                                      false, false,
-                                      true, "{encoding}", null, null,
-                                      MSGID_DESCRIPTION_ENCODING);
-      argParser.addArgument(encodingStr);
+
       keyStorePath = new StringArgument("keyStorePath", 'K',
                                   "keyStorePath", false, false, true,
                                   "{keyStorePath}", null, null,
                                   MSGID_DESCRIPTION_KEYSTOREPATH);
       argParser.addArgument(keyStorePath);
-      trustStorePath = new StringArgument("trustStorePath", 'P',
-                                  "trustStorePath", false, false, true,
-                                  "{trustStorePath}", null, null,
-                                  MSGID_DESCRIPTION_TRUSTSTOREPATH);
-      argParser.addArgument(trustStorePath);
+
       keyStorePassword = new StringArgument("keyStorePassword", 'W',
                                   "keyStorePassword", false, false,
                                   true, "{keyStorePassword}", null, null,
                                   MSGID_DESCRIPTION_KEYSTOREPASSWORD);
       argParser.addArgument(keyStorePassword);
-      hostName = new StringArgument("host", 'h', "host",
-                                      false, false,
-                                      true, "{host}", "localhost", null,
-                                      MSGID_DESCRIPTION_HOST);
-      argParser.addArgument(hostName);
-      port = new IntegerArgument("port", 'p', "port",
-                              false, false, true, "{port}", 389, null,
-                              MSGID_DESCRIPTION_PORT);
-      argParser.addArgument(port);
-      version = new IntegerArgument("version", 'V', "version",
-                              false, false, true, "{version}", 3, null,
-                              MSGID_DESCRIPTION_VERSION);
-      argParser.addArgument(version);
-      filename = new StringArgument("filename", 'f',
-                                  "filename", false, false, true,
-                                  "{filename}", null, null,
-                                  MSGID_SEARCH_DESCRIPTION_FILENAME);
-      argParser.addArgument(filename);
-      showUsage = new BooleanArgument("showUsage", 'H', "help",
-                                    MSGID_DESCRIPTION_SHOWUSAGE);
-      argParser.addArgument(showUsage);
-      argParser.setUsageArgument(showUsage, out);
-      controlStr = new StringArgument("controls", 'J', "controls", false,
-                false, true,
-                "{controloid[:criticality[:value|::b64value|:<fileurl]]}",
-                null, null, MSGID_DESCRIPTION_CONTROLS);
-      argParser.addArgument(controlStr);
-      verbose = new BooleanArgument("verbose", 'v', "verbose",
-                                    MSGID_DESCRIPTION_VERBOSE);
-      argParser.addArgument(verbose);
-      continueOnError = new BooleanArgument("continueOnError", 'c',
-                                    "continueOnError",
-                                    MSGID_DESCRIPTION_CONTINUE_ON_ERROR);
-      argParser.addArgument(continueOnError);
-      useSSL = new BooleanArgument("useSSL", 'Z',
-                                    "useSSL",
-                                    MSGID_DESCRIPTION_USE_SSL);
-      argParser.addArgument(useSSL);
-      startTLS = new BooleanArgument("startTLS", 'q',
-                                    "startTLS",
-                                    MSGID_DESCRIPTION_START_TLS);
-      argParser.addArgument(startTLS);
-      saslExternal = new BooleanArgument("useSASLExternal", 'r',
-                                    "useSASLExternal",
-                                    MSGID_DESCRIPTION_USE_SASL_EXTERNAL);
-      argParser.addArgument(saslExternal);
-      sizeLimit = new IntegerArgument("sizeLimit", 'z', "sizeLimit",
-                              false, false, true, "{sizeLimit}", 0, null,
-                              MSGID_SEARCH_DESCRIPTION_SIZE_LIMIT);
-      argParser.addArgument(sizeLimit);
-      timeLimit = new IntegerArgument("timeLimit", 'l', "timeLimit",
-                              false, false, true, "{timeLimit}", 0, null,
-                              MSGID_SEARCH_DESCRIPTION_TIME_LIMIT);
-      argParser.addArgument(timeLimit);
-      searchScope = new StringArgument("searchScope", 's',
-                                  "searchScope", false, false, true,
-                                  "{searchScope}", null, null,
-                                  MSGID_SEARCH_DESCRIPTION_SEARCH_SCOPE);
-      argParser.addArgument(searchScope);
-      dereferencePolicy = new StringArgument("dereferencePolicy", 'a',
-                                  "dereferencePolicy", false, false, true,
-                                  "{dereferencePolicy}", null, null,
-                                  MSGID_SEARCH_DESCRIPTION_DEREFERENCE_POLICY);
-      argParser.addArgument(dereferencePolicy);
-      saslOptions = new StringArgument("saslOptions", 'o', "saslOptions", false,
-                                       true, true, "{name=value}", null, null,
-                                       MSGID_DESCRIPTION_SASL_PROPERTIES);
-      argParser.addArgument(saslOptions);
+
+      keyStorePasswordFile =
+           new FileBasedArgument("keystorepasswordfile", null,
+                                 "keyStorePasswordFile", false, false, "{path}",
+                                 null, null,
+                                 MSGID_DESCRIPTION_KEYSTOREPASSWORD_FILE);
+      argParser.addArgument(keyStorePasswordFile);
+
+      trustStorePath = new StringArgument("trustStorePath", 'P',
+                                  "trustStorePath", false, false, true,
+                                  "{trustStorePath}", null, null,
+                                  MSGID_DESCRIPTION_TRUSTSTOREPATH);
+      argParser.addArgument(trustStorePath);
+
+      trustStorePassword =
+           new StringArgument("trustStorePassword", null, "trustStorePassword",
+                              false, false, true, "{trustStorePassword}", null,
+                              null, MSGID_DESCRIPTION_TRUSTSTOREPASSWORD);
+      argParser.addArgument(trustStorePassword);
+
+      trustStorePasswordFile =
+           new FileBasedArgument("truststorepasswordfile", null,
+                                 "trustStorePasswordFile", false, false,
+                                 "{path}", null, null,
+                                 MSGID_DESCRIPTION_TRUSTSTOREPASSWORD_FILE);
+      argParser.addArgument(trustStorePasswordFile);
+
+      proxyAuthzID = new StringArgument("proxy_authzid", 'Y', "proxyAs", false,
+                                        false, true, "{authzID}", null, null,
+                                        MSGID_DESCRIPTION_PROXY_AUTHZID);
+      argParser.addArgument(proxyAuthzID);
+
+      reportAuthzID = new BooleanArgument("reportauthzid", 'E', "reportAuthzID",
+                                          MSGID_DESCRIPTION_REPORT_AUTHZID);
+      argParser.addArgument(reportAuthzID);
+
+      usePasswordPolicyControl = new BooleanArgument("usepwpolicycontrol", null,
+                                          "usePasswordPolicyControl",
+                                          MSGID_DESCRIPTION_USE_PWP_CONTROL);
+      argParser.addArgument(usePasswordPolicyControl);
+
       pSearchInfo = new StringArgument("psearchinfo", 'C', "persistentSearch",
                              false, false, true,
                              "ps[:changetype[:changesonly[:entrychgcontrols]]]",
                               null, null, MSGID_DESCRIPTION_PSEARCH_INFO);
       argParser.addArgument(pSearchInfo);
-      dontWrap = new BooleanArgument("dontwrap", 'T', "dontWrap",
-                                     MSGID_DESCRIPTION_DONT_WRAP);
-      argParser.addArgument(dontWrap);
-      noop = new BooleanArgument("no-op", 'n', "noop", MSGID_DESCRIPTION_NOOP);
-      argParser.addArgument(noop);
-      typesOnly = new BooleanArgument("typesOnly", 'A', "typesOnly",
-                                      MSGID_DESCRIPTION_TYPES_ONLY);
-      argParser.addArgument(typesOnly);
+
       assertionFilter = new StringArgument("assertionfilter", null,
-                                 "assertionFilter", false, false, true,
-                                 "{filter}", null, null,
-                                 MSGID_DESCRIPTION_SEARCH_ASSERTION_FILTER);
+                                           "assertionFilter", false, false,
+                                           true, "{filter}", null, null,
+                                           MSGID_DESCRIPTION_ASSERTION_FILTER);
       argParser.addArgument(assertionFilter);
+
       matchedValuesFilter = new StringArgument("matchedvalues", null,
                                      "matchedValuesFilter", false, true, true,
                                      "{filter}", null, null,
                                      MSGID_DESCRIPTION_MATCHED_VALUES_FILTER);
       argParser.addArgument(matchedValuesFilter);
+
+      controlStr =
+           new StringArgument("controls", 'J', "controls", false, false, true,
+                    "{controloid[:criticality[:value|::b64value|:<fileurl]]}",
+                    null, null, MSGID_DESCRIPTION_CONTROLS);
+      argParser.addArgument(controlStr);
+
+      version = new IntegerArgument("version", 'V', "version", false, false,
+                                    true, "{version}", 3, null,
+                                    MSGID_DESCRIPTION_VERSION);
+      argParser.addArgument(version);
+
+      encodingStr = new StringArgument("encoding", 'i', "encoding", false,
+                                       false, true, "{encoding}", null, null,
+                                       MSGID_DESCRIPTION_ENCODING);
+      argParser.addArgument(encodingStr);
+
+      dereferencePolicy =
+           new StringArgument("derefpolicy", 'a', "dereferencePolicy", false,
+                              false, true, "{dereferencePolicy}", null,  null,
+                              MSGID_SEARCH_DESCRIPTION_DEREFERENCE_POLICY);
+      argParser.addArgument(dereferencePolicy);
+
+      typesOnly = new BooleanArgument("typesOnly", 'A', "typesOnly",
+                                      MSGID_DESCRIPTION_TYPES_ONLY);
+      argParser.addArgument(typesOnly);
+
+      sizeLimit = new IntegerArgument("sizeLimit", 'z', "sizeLimit", false,
+                                      false, true, "{sizeLimit}", 0, null,
+                                      MSGID_SEARCH_DESCRIPTION_SIZE_LIMIT);
+      argParser.addArgument(sizeLimit);
+
+      timeLimit = new IntegerArgument("timeLimit", 'l', "timeLimit", false,
+                                      false, true, "{timeLimit}", 0, null,
+                                      MSGID_SEARCH_DESCRIPTION_TIME_LIMIT);
+      argParser.addArgument(timeLimit);
+
+      dontWrap = new BooleanArgument("dontwrap", 'T', "dontWrap",
+                                     MSGID_DESCRIPTION_DONT_WRAP);
+      argParser.addArgument(dontWrap);
+
+      continueOnError =
+           new BooleanArgument("continueOnError", 'c', "continueOnError",
+                               MSGID_DESCRIPTION_CONTINUE_ON_ERROR);
+      argParser.addArgument(continueOnError);
+
+      noop = new BooleanArgument("noop", 'n', "noop", MSGID_DESCRIPTION_NOOP);
+      argParser.addArgument(noop);
+
+      verbose = new BooleanArgument("verbose", 'v', "verbose",
+                                    MSGID_DESCRIPTION_VERBOSE);
+      argParser.addArgument(verbose);
+
+      showUsage = new BooleanArgument("showUsage", 'H', "help",
+                                    MSGID_DESCRIPTION_SHOWUSAGE);
+      argParser.addArgument(showUsage);
+      argParser.setUsageArgument(showUsage, out);
     } catch (ArgumentException ae)
     {
       int    msgID   = MSGID_ENCPW_CANNOT_INITIALIZE_ARGS;
       String message = getMessage(msgID, ae.getMessage());
 
-      err.println(message);
+      err.println(wrapText(message, MAX_LINE_WIDTH));
       return 1;
     }
 
@@ -718,7 +776,7 @@
       int    msgID   = MSGID_ENCPW_ERROR_PARSING_ARGS;
       String message = getMessage(msgID, ae.getMessage());
 
-      err.println(message);
+      err.println(wrapText(message, MAX_LINE_WIDTH));
       err.println(argParser.getUsage());
       return 1;
     }
@@ -740,7 +798,7 @@
       } catch(LDAPException le)
       {
         assert debugException(CLASS_NAME, "main", le);
-        err.println(le.getMessage());
+        err.println(wrapText(le.getMessage(), MAX_LINE_WIDTH));
         return 1;
       }
       // The rest are attributes
@@ -753,8 +811,37 @@
 
     if(bindPassword.isPresent() && bindPasswordFile.isPresent())
     {
-      err.println("ERROR: Both -w and -j flags specified. " +
-                  "Please specify one.");
+      int    msgID   = MSGID_TOOL_CONFLICTING_ARGS;
+      String message = getMessage(msgID, bindPassword.getLongIdentifier(),
+                                  bindPasswordFile.getLongIdentifier());
+      err.println(wrapText(message, MAX_LINE_WIDTH));
+      return 1;
+    }
+
+    if (useSSL.isPresent() && startTLS.isPresent())
+    {
+      int    msgID   = MSGID_TOOL_CONFLICTING_ARGS;
+      String message = getMessage(msgID, useSSL.getLongIdentifier(),
+                                  startTLS.getLongIdentifier());
+      err.println(wrapText(message, MAX_LINE_WIDTH));
+      return 1;
+    }
+
+    if (keyStorePassword.isPresent() && keyStorePasswordFile.isPresent())
+    {
+      int    msgID   = MSGID_TOOL_CONFLICTING_ARGS;
+      String message = getMessage(msgID, keyStorePassword.getLongIdentifier(),
+                                  keyStorePasswordFile.getLongIdentifier());
+      err.println(wrapText(message, MAX_LINE_WIDTH));
+      return 1;
+    }
+
+    if (trustStorePassword.isPresent() && trustStorePasswordFile.isPresent())
+    {
+      int    msgID   = MSGID_TOOL_CONFLICTING_ARGS;
+      String message = getMessage(msgID, trustStorePassword.getLongIdentifier(),
+                                  trustStorePasswordFile.getLongIdentifier());
+      err.println(wrapText(message, MAX_LINE_WIDTH));
       return 1;
     }
 
@@ -766,7 +853,7 @@
     } catch(ArgumentException ae)
     {
       assert debugException(CLASS_NAME, "main", ae);
-      err.println(ae.getMessage());
+      err.println(wrapText(ae.getMessage(), MAX_LINE_WIDTH));
       return 1;
     }
 
@@ -777,14 +864,14 @@
       if(versionNumber != 2 && versionNumber != 3)
       {
         int msgID = MSGID_DESCRIPTION_INVALID_VERSION;
-        err.println(getMessage(msgID, versionNumber));
+        err.println(wrapText(getMessage(msgID, versionNumber), MAX_LINE_WIDTH));
         return 1;
       }
       connectionOptions.setVersionNumber(versionNumber);
     } catch(ArgumentException ae)
     {
       assert debugException(CLASS_NAME, "main", ae);
-      err.println(ae.getMessage());
+      err.println(wrapText(ae.getMessage(), MAX_LINE_WIDTH));
       return 1;
     }
 
@@ -811,7 +898,7 @@
       } catch(Exception ex)
       {
         assert debugException(CLASS_NAME, "main", ex);
-        err.println(ex.getMessage());
+        err.println(wrapText(ex.getMessage(), MAX_LINE_WIDTH));
         return 1;
       }
     } else if(bindPasswordValue == null)
@@ -821,9 +908,27 @@
     }
 
     String keyStorePathValue = keyStorePath.getValue();
-    String keyStorePasswordValue = keyStorePassword.getValue();
     String trustStorePathValue = trustStorePath.getValue();
+
+    String keyStorePasswordValue = null;
+    if (keyStorePassword.isPresent())
+    {
+      keyStorePasswordValue = keyStorePassword.getValue();
+    }
+    else if (keyStorePasswordFile.isPresent())
+    {
+      keyStorePasswordValue = keyStorePasswordFile.getValue();
+    }
+
     String trustStorePasswordValue = null;
+    if (trustStorePassword.isPresent())
+    {
+      trustStorePasswordValue = trustStorePassword.getValue();
+    }
+    else if (trustStorePasswordFile.isPresent())
+    {
+      trustStorePasswordValue = trustStorePasswordFile.getValue();
+    }
 
     searchOptions.setTypesOnly(typesOnly.isPresent());
     searchOptions.setShowOperations(noop.isPresent());
@@ -836,7 +941,7 @@
       searchOptions.setSizeLimit(sizeLimit.getIntValue());
     } catch(ArgumentException ex1)
     {
-      err.println(ex1.getMessage());
+      err.println(wrapText(ex1.getMessage(), MAX_LINE_WIDTH));
       return 1;
     }
     boolean val = searchOptions.setSearchScope(searchScope.getValue(), err);
@@ -856,7 +961,9 @@
       LDAPControl ctrl = LDAPToolUtils.getControl(ctrlString, err);
       if(ctrl == null)
       {
-        err.println("Invalid control specified:" + ctrlString);
+        int    msgID   = MSGID_TOOL_INVALID_CONTROL_STRING;
+        String message = getMessage(msgID, ctrlString);
+        err.println(wrapText(message, MAX_LINE_WIDTH));
         err.println(argParser.getUsage());
         return 1;
       }
@@ -886,7 +993,7 @@
       {
         int    msgID   = MSGID_PSEARCH_MISSING_DESCRIPTOR;
         String message = getMessage(msgID);
-        err.println(message);
+        err.println(wrapText(message, MAX_LINE_WIDTH));
         return 1;
       }
       else
@@ -896,7 +1003,7 @@
         {
           int    msgID   = MSGID_PSEARCH_DOESNT_START_WITH_PS;
           String message = getMessage(msgID, String.valueOf(infoString));
-          err.println(message);
+          err.println(wrapText(message, MAX_LINE_WIDTH));
           return 1;
         }
       }
@@ -935,7 +1042,7 @@
           {
             int    msgID   = MSGID_PSEARCH_INVALID_CHANGE_TYPE;
             String message = getMessage(msgID, String.valueOf(token));
-            err.println(message);
+            err.println(wrapText(message, MAX_LINE_WIDTH));
             return 1;
           }
         }
@@ -965,7 +1072,7 @@
         {
           int    msgID   = MSGID_PSEARCH_INVALID_CHANGESONLY;
           String message = getMessage(msgID, String.valueOf(token));
-          err.println(message);
+          err.println(wrapText(message, MAX_LINE_WIDTH));
           return 1;
         }
       }
@@ -986,7 +1093,7 @@
         {
           int    msgID   = MSGID_PSEARCH_INVALID_RETURN_ECS;
           String message = getMessage(msgID, String.valueOf(token));
-          err.println(message);
+          err.println(wrapText(message, MAX_LINE_WIDTH));
           return 1;
         }
       }
@@ -1013,8 +1120,9 @@
       }
       catch (LDAPException le)
       {
-        err.println(getMessage(MSGID_LDAP_ASSERTION_INVALID_FILTER,
-                               le.getMessage()));
+        int    msgID   = MSGID_LDAP_ASSERTION_INVALID_FILTER;
+        String message = getMessage(msgID, le.getMessage());
+        err.println(wrapText(message, MAX_LINE_WIDTH));
         return 1;
       }
     }
@@ -1033,8 +1141,9 @@
         }
         catch (LDAPException le)
         {
-          err.println(getMessage(MSGID_LDAP_MATCHEDVALUES_INVALID_FILTER,
-                                 le.getMessage()));
+          int    msgID   = MSGID_LDAP_MATCHEDVALUES_INVALID_FILTER;
+          String message = getMessage(msgID, le.getMessage());
+          err.println(wrapText(message, MAX_LINE_WIDTH));
           return 1;
         }
       }
@@ -1074,14 +1183,16 @@
     {
       if(!connectionOptions.useSSL() && !connectionOptions.useStartTLS())
       {
-        err.println("SASL External requires either SSL or StartTLS " +
-                    "options to be requested.");
+        int    msgID   = MSGID_TOOL_SASLEXTERNAL_NEEDS_SSL_OR_TLS;
+        String message = getMessage(msgID);
+        err.println(wrapText(message, MAX_LINE_WIDTH));
         return 1;
       }
       if(keyStorePathValue == null)
       {
-        err.println("SASL External requires a path to the SSL " +
-                    "client certificate keystore.");
+        int    msgID   = MSGID_TOOL_SASLEXTERNAL_NEEDS_KEYSTORE;
+        String message = getMessage(msgID);
+        err.println(wrapText(message, MAX_LINE_WIDTH));
         return 1;
       }
     }
@@ -1108,7 +1219,7 @@
       } catch(Exception e)
       {
         assert debugException(CLASS_NAME, "main", e);
-        err.println(e.getMessage());
+        err.println(wrapText(e.getMessage(), MAX_LINE_WIDTH));
         return 1;
       }
       finally
@@ -1127,7 +1238,7 @@
     if(filters.isEmpty())
     {
       int msgid = MSGID_SEARCH_NO_FILTERS;
-      err.println(getMessage(msgid));
+      err.println(wrapText(getMessage(msgid), MAX_LINE_WIDTH));
       err.println(argParser.getUsage());
       return 1;
     }
@@ -1169,19 +1280,19 @@
     } catch(LDAPException le)
     {
       assert debugException(CLASS_NAME, "main", le);
-      err.println(le.getMessage());
+      err.println(wrapText(le.getMessage(), MAX_LINE_WIDTH));
       int code = le.getResultCode();
       return code;
     } catch(LDAPConnectionException lce)
     {
         assert debugException(CLASS_NAME, "main", lce);
-        err.println(lce.getMessage());
+        err.println(wrapText(lce.getMessage(), MAX_LINE_WIDTH));
         int code = lce.getErrorCode();
         return code;
     } catch(Exception e)
     {
       assert debugException(CLASS_NAME, "main", e);
-      err.println(e.getMessage());
+      err.println(wrapText(e.getMessage(), MAX_LINE_WIDTH));
       return 1;
     } finally
     {

--
Gitblit v1.10.0