From ec29a28c5fc950cac24f3714ab24bf7155094c04 Mon Sep 17 00:00:00 2001
From: Violette Roche-Montane <violette.roche-montane@forgerock.com>
Date: Tue, 18 Feb 2014 14:05:45 +0000
Subject: [PATCH] Checkpoint OPENDJ-1343 Migrate dsconfig / OPENDJ-1303 "opendj-cli" - Added methods to ConsoleApplication which are going to be used by the server. - Added APPLICATION_ERROR to ReturnCode. - Added methods to Utils (used by opendj3)

---
 opendj-sdk/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/package-info.java |   30 +
 opendj-sdk/opendj-config/src/main/resources/com/forgerock/opendj/dsconfig/dsconfig.properties |  445 ++++++++++++++++++++++++++
 opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConsoleApplication.java          |  341 +++++++++++++++++++
 opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ReturnCode.java                  |    4 
 opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/Utils.java                       |  107 +++++
 opendj-sdk/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties              |   32 +
 opendj-sdk/opendj-cli/src/test/java/com/forgerock/opendj/cli/ConsoleApplicationTestCase.java  |    6 
 7 files changed, 938 insertions(+), 27 deletions(-)

diff --git a/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConsoleApplication.java b/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConsoleApplication.java
index a17ca6f..c023260 100755
--- a/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConsoleApplication.java
+++ b/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConsoleApplication.java
@@ -27,12 +27,11 @@
  */
 package com.forgerock.opendj.cli;
 
-import static com.forgerock.opendj.cli.CliMessages.INFO_ERROR_EMPTY_RESPONSE;
-import static com.forgerock.opendj.cli.CliMessages.INFO_MENU_PROMPT_RETURN_TO_CONTINUE;
-import static com.forgerock.opendj.cli.CliMessages.INFO_PROMPT_SINGLE_DEFAULT;
-import static com.forgerock.opendj.cli.CliMessages.ERR_TRIES_LIMIT_REACHED;
+import static com.forgerock.opendj.cli.CliMessages.*;
 import static com.forgerock.opendj.cli.Utils.MAX_LINE_WIDTH;
+import static com.forgerock.opendj.cli.Utils.CONFIRMATION_MAX_TRIES;
 import static com.forgerock.opendj.cli.Utils.wrapText;
+import static com.forgerock.opendj.util.StaticUtils.EOL;
 
 import java.io.BufferedReader;
 import java.io.Console;
@@ -43,6 +42,7 @@
 import java.io.PrintStream;
 
 import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
 
 /**
  * This class provides an abstract base class which can be used as the basis of a console-based application.
@@ -60,6 +60,36 @@
     private final Console console = System.console();
 
     /**
+     * Defines the different line styles for output.
+     */
+    public enum Style {
+        /**
+         * Defines a title.
+         */
+        TITLE,
+        /**
+         * Defines a subtitle.
+         */
+        SUBTITLE,
+        /**
+         * Defines a notice.
+         */
+        NOTICE,
+        /**
+         * Defines a normal line.
+         */
+        NORMAL,
+        /**
+         * Defines an error.
+         */
+        ERROR,
+        /**
+         * Defines a warning.
+         */
+        WARNING
+    }
+
+    /**
      * Creates a new console application instance.
      */
     public ConsoleApplication() {
@@ -154,6 +184,17 @@
     }
 
     /**
+     * Indicates whether or not this console application is running in its menu-driven mode. This can be used to dictate
+     * whether output should go to the error stream or not. In addition, it may also dictate whether or not sub-menus
+     * should display a cancel option as well as a quit option.
+     *
+     * @return Returns <code>true</code> if this console application is running in its menu-driven mode.
+     */
+    public boolean isMenuDrivenMode() {
+        return false;
+    }
+
+    /**
      * Interactively prompts the user to press return to continue. This method should be called in situations where a
      * user needs to be given a chance to read some documentation before continuing (continuing may cause the
      * documentation to be scrolled out of view).
@@ -266,6 +307,92 @@
     }
 
     /**
+     * Prints a progress bar on the same output stream line if not in quiet mode.
+     *
+     * <pre>
+     * Like
+     *   msg......   50%
+     *   if progress is up to 100 :
+     *   msg.....................  100%
+     *   if progress is < 0 :
+     *   msg....  FAIL
+     *   msg.....................  FAIL
+     * </pre>
+     *
+     * @param linePos
+     *            The progress bar starts at this position on the line.
+     * @param progress
+     *            The current percentage progress to print.
+     */
+    public final void printProgressBar(final int linePos, final int progress) {
+        if (!isQuiet()) {
+            final int spacesLeft = MAX_LINE_WIDTH - linePos - 10;
+            StringBuilder bar = new StringBuilder();
+            if (progress != 0) {
+                for (int i = 0; i < 50; i++) {
+                    if ((i < (Math.abs(progress) / 2)) && (bar.length() < spacesLeft)) {
+                        bar.append(".");
+                    }
+                }
+            }
+            bar.append(".   ");
+            if (progress >= 0) {
+                bar.append(progress).append("%     ");
+            } else {
+                bar.append("FAIL");
+            }
+            final int endBuilder = linePos + bar.length();
+            for (int i = 0; i < endBuilder; i++) {
+                bar.append("\b");
+            }
+            if (progress >= 100 || progress < 0) {
+                bar.append(EOL);
+            }
+            out.print(bar.toString());
+        }
+    }
+
+    /**
+     * Print a line with EOL in the output stream.
+     *
+     * @param msgStyle
+     *            The type of formatted output desired.
+     * @param msg
+     *            The message to display in normal mode.
+     * @param indent
+     *            The indentation.
+     */
+    public final void println(final Style msgStyle, final LocalizableMessage msg, final int indent) {
+        if (!isQuiet()) {
+            switch (msgStyle) {
+            case TITLE:
+                out.println();
+                out.println(">>>> " + wrapText(msg, MAX_LINE_WIDTH, indent));
+                out.println();
+                break;
+            case SUBTITLE:
+                out.println(wrapText(msg, MAX_LINE_WIDTH, indent));
+                out.println();
+                break;
+            case NOTICE:
+                out.println(wrapText("* " + msg, MAX_LINE_WIDTH, indent));
+                break;
+            case ERROR:
+                out.println();
+                out.println(wrapText("** " + msg, MAX_LINE_WIDTH, indent));
+                out.println();
+                break;
+            case WARNING:
+                out.println(wrapText("[!] " + msg, MAX_LINE_WIDTH, indent));
+                break;
+            default:
+                out.println(wrapText(msg, MAX_LINE_WIDTH, indent));
+                break;
+            }
+        }
+    }
+
+    /**
      * Displays a message to the output stream if verbose mode is enabled.
      *
      * @param msg
@@ -291,12 +418,39 @@
      * @return The string value read from the user.
      */
     public final String readInput(LocalizableMessage prompt, final String defaultValue) throws ClientException {
+        return readInput(prompt, defaultValue, null);
+    }
+
+    /**
+     * Interactively prompts (on error output) the user to provide a string value. Any non-empty string will be allowed
+     * (the empty string will indicate that the default should be used, if there is one).
+     *
+     * @param prompt
+     *            The prompt to present to the user.
+     * @param defaultValue
+     *            The default value to assume if the user presses ENTER without typing anything, or {@code null} if
+     *            there should not be a default and the user must explicitly provide a value.
+     * @param msgStyle
+     *            The formatted style chosen.
+     * @throws ClientException
+     *             If the line of input could not be retrieved for some reason.
+     * @return The string value read from the user.
+     */
+    public final String readInput(LocalizableMessage prompt, final String defaultValue, final Style msgStyle)
+            throws ClientException {
+        if (msgStyle != null && msgStyle == Style.TITLE) {
+            println();
+        }
         while (true) {
             if (defaultValue != null) {
                 prompt = INFO_PROMPT_SINGLE_DEFAULT.get(prompt.toString(), defaultValue);
             }
             final String response = readLineOfInput(prompt);
 
+            if (msgStyle != null && (msgStyle == Style.TITLE || msgStyle == Style.SUBTITLE)) {
+                println();
+            }
+
             if ("".equals(response)) {
                 if (defaultValue == null) {
                     print(INFO_ERROR_EMPTY_RESPONSE.get());
@@ -321,8 +475,8 @@
     public final char[] readPassword(final LocalizableMessage prompt) throws ClientException {
         if (console != null) {
             if (prompt != null) {
-                err.print(wrap(prompt));
-                err.print(" ");
+                out.print(wrap(prompt));
+                out.print(" ");
             }
             try {
                 final char[] password = console.readPassword();
@@ -348,10 +502,10 @@
      * @throws ClientException
      *             If the line of input could not be retrieved for some reason.
      */
-    final String readLineOfInput(final LocalizableMessage prompt) throws ClientException {
+    public final String readLineOfInput(final LocalizableMessage prompt) throws ClientException {
         if (prompt != null) {
-            err.print(wrap(prompt));
-            err.print(" ");
+            out.print(wrap(prompt));
+            out.print(" ");
         }
         try {
             final String s = reader.readLine();
@@ -366,6 +520,49 @@
     }
 
     /**
+     * Interactively retrieves a port value from the console.
+     *
+     * @param prompt
+     *            The port prompt.
+     * @param defaultValue
+     *            The port default value.
+     * @return Returns the port.
+     * @throws ClientException
+     *             If the port could not be retrieved for some reason.
+     */
+    public final int readPort(LocalizableMessage prompt, final int defaultValue) throws ClientException {
+        final ValidationCallback<Integer> callback = new ValidationCallback<Integer>() {
+            @Override
+            public Integer validate(ConsoleApplication app, String input) throws ClientException {
+                final String ninput = input.trim();
+                if (ninput.length() == 0) {
+                    return defaultValue;
+                } else {
+                    try {
+                        int i = Integer.parseInt(ninput);
+                        if (i < 1 || i > 65535) {
+                            throw new NumberFormatException();
+                        }
+                        return i;
+                    } catch (NumberFormatException e) {
+                        // Try again...
+                        app.println();
+                        app.println(ERR_BAD_PORT_NUMBER.get(ninput));
+                        app.println();
+                        return null;
+                    }
+                }
+            }
+
+        };
+        if (defaultValue != -1) {
+            prompt = INFO_PROMPT_SINGLE_DEFAULT.get(prompt, defaultValue);
+        }
+
+        return readValidatedInput(prompt, callback, CONFIRMATION_MAX_TRIES);
+    }
+
+    /**
      * Interactively prompts for user input and continues until valid input is provided.
      *
      * @param <T>
@@ -402,8 +599,8 @@
      *            The maximum number of tries that we can make.
      * @return Returns the decoded user's response.
      * @throws ClientException
-     *             If an unexpected error occurred which prevented validation or
-     *             if the maximum number of tries was reached.
+     *             If an unexpected error occurred which prevented validation or if the maximum number of tries was
+     *             reached.
      */
     public final <T> T readValidatedInput(final LocalizableMessage prompt, final ValidationCallback<T> validator,
             final int maxTries) throws ClientException {
@@ -432,7 +629,7 @@
 
     /**
      * Returns the error stream. Effectively, when an application is in "interactive mode" all the informations should
-     * be written in the stdout.
+     * be written in the STDout.
      *
      * @return The error stream that should be used with this application.
      */
@@ -444,4 +641,124 @@
         }
     }
 
+    /**
+     * Commodity method that interactively confirms whether a user wishes to perform an action. If
+     * the application is non-interactive, then the provided default is returned automatically. If there is an error an
+     * error message is logged to the provided Logger and the default value is returned.
+     *
+     * @param prompt
+     *            The prompt describing the action.
+     * @param defaultValue
+     *            The default value for the confirmation message. This will be returned if the application is
+     *            non-interactive or if the user just presses return.
+     * @param logger
+     *            the Logger to be used to log the error message.
+     * @return Returns <code>true</code> if the user wishes the action to be performed, or <code>false</code> if they
+     *         refused.
+     * @throws ClientException
+     *             if the user did not provide valid answer after a certain number of tries
+     *             (ConsoleApplication.CONFIRMATION_MAX_TRIES)
+     */
+    protected final boolean askConfirmation(LocalizableMessage prompt, boolean defaultValue, LocalizedLogger logger)
+            throws ClientException {
+        boolean v = defaultValue;
+
+        boolean done = false;
+        int nTries = 0;
+
+        while (!done && (nTries < CONFIRMATION_MAX_TRIES)) {
+            nTries++;
+            try {
+                v = confirmAction(prompt, defaultValue);
+                done = true;
+            } catch (ClientException ce) {
+                if (ce.getMessageObject().toString().contains(ERR_CONFIRMATION_TRIES_LIMIT_REACHED.get(nTries))) {
+                    throw ce;
+                }
+                logger.warn(LocalizableMessage.raw("Error reading input: " + ce, ce));
+                // Try again...
+                println();
+            }
+        }
+
+        if (!done) {
+            // This means we reached the maximum number of tries
+            throw new ClientException(ReturnCode.ERROR_USER_DATA,
+                    ERR_CONFIRMATION_TRIES_LIMIT_REACHED.get(CONFIRMATION_MAX_TRIES));
+        }
+        return v;
+    }
+
+    /**
+     * Interactively confirms whether a user wishes to perform an action.
+     * If the application is non-interactive, then the provided default is returned automatically.
+     *
+     * @param prompt
+     *            The prompt describing the action.
+     * @param defaultValue
+     *            The default value for the confirmation message. This will be returned if the application is
+     *            non-interactive or if the user just presses return.
+     * @return Returns <code>true</code> if the user wishes the action to be performed, or <code>false</code> if they
+     *         refused, or if an exception occurred.
+     * @throws ClientException
+     *             If the user's response could not be read from the console for some reason.
+     */
+    public final boolean confirmAction(LocalizableMessage prompt, final boolean defaultValue) throws ClientException {
+        if (!isInteractive()) {
+            return defaultValue;
+        }
+
+        final LocalizableMessage yes = INFO_GENERAL_YES.get();
+        final LocalizableMessage no = INFO_GENERAL_NO.get();
+        final LocalizableMessage errMsg = ERR_CONSOLE_APP_CONFIRM.get(yes, no);
+        prompt = INFO_MENU_PROMPT_CONFIRM.get(prompt, yes, no, defaultValue ? yes : no);
+
+        ValidationCallback<Boolean> validator = new ValidationCallback<Boolean>() {
+
+            @Override
+            public Boolean validate(ConsoleApplication app, String input) {
+                String ninput = input.toLowerCase().trim();
+                if (ninput.length() == 0) {
+                    return defaultValue;
+                } else if (no.toString().toLowerCase().startsWith(ninput)) {
+                    return false;
+                } else if (yes.toString().toLowerCase().startsWith(ninput)) {
+                    return true;
+                } else {
+                    // Try again...
+                    app.println();
+                    app.println(errMsg);
+                    app.println();
+                }
+
+                return null;
+            }
+        };
+
+        return readValidatedInput(prompt, validator, CONFIRMATION_MAX_TRIES);
+    }
+
+    /**
+     * Commodity method used to repeatedly ask the user to provide a port value.
+     *
+     * @param prompt
+     *            the prompt message.
+     * @param defaultValue
+     *            the default value of the port to be proposed to the user.
+     * @param logger
+     *            the logger where the errors will be written.
+     * @return the port value provided by the user.
+     */
+    protected int askPort(LocalizableMessage prompt, int defaultValue, LocalizedLogger logger) {
+        int port = -1;
+        while (port == -1) {
+            try {
+                port = readPort(prompt, defaultValue);
+            } catch (ClientException ce) {
+                port = -1;
+                logger.warn(LocalizableMessage.raw("Error reading input: " + ce, ce));
+            }
+        }
+        return port;
+    }
 }
diff --git a/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ReturnCode.java b/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ReturnCode.java
index 5d073ad..294341c 100644
--- a/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ReturnCode.java
+++ b/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ReturnCode.java
@@ -104,6 +104,10 @@
      */
     JAVA_VERSION_INCOMPATIBLE(8),
     /**
+     * Application specific error.
+     */
+    APPLICATION_ERROR(10),
+    /**
      * The LDAP result code used for multi-stage SASL bind operations that are not
      * yet complete.
      */
diff --git a/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/Utils.java b/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/Utils.java
index 0ee1a38..df5da38 100644
--- a/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/Utils.java
+++ b/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/Utils.java
@@ -26,12 +26,10 @@
  */
 package com.forgerock.opendj.cli;
 
-import static com.forgerock.opendj.cli.CliMessages.ERR_INCOMPATIBLE_JAVA_VERSION;
-import static com.forgerock.opendj.cli.CliMessages.INFO_TIME_IN_DAYS_HOURS_MINUTES_SECONDS;
-import static com.forgerock.opendj.cli.CliMessages.INFO_TIME_IN_HOURS_MINUTES_SECONDS;
-import static com.forgerock.opendj.cli.CliMessages.INFO_TIME_IN_MINUTES_SECONDS;
-import static com.forgerock.opendj.cli.CliMessages.INFO_TIME_IN_SECONDS;
+import static com.forgerock.opendj.cli.CliMessages.*;
+
 import com.forgerock.opendj.util.OperatingSystem;
+
 import static com.forgerock.opendj.util.StaticUtils.EOL;
 
 import java.io.File;
@@ -39,11 +37,19 @@
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.security.GeneralSecurityException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.StringTokenizer;
 import java.util.TimeZone;
 
+import javax.naming.AuthenticationException;
+import javax.naming.CommunicationException;
+import javax.naming.NamingException;
+import javax.naming.NamingSecurityException;
+import javax.naming.NoPermissionException;
+import javax.net.ssl.SSLHandshakeException;
+
 import org.forgerock.i18n.LocalizableMessage;
 
 /**
@@ -52,7 +58,7 @@
 final public class Utils {
 
     /** Platform appropriate line separator. */
-    static public final String LINE_SEPARATOR = System.getProperty("line.separator");
+    public static final String LINE_SEPARATOR = System.getProperty("line.separator");
 
     /**
      * The value used to display arguments that must be obfuscated (such as passwords). This does not require
@@ -61,11 +67,28 @@
     public final static String OBFUSCATED_VALUE = "******";
 
     /**
+     * The maximum number of times we try to confirm.
+     */
+    public final static int CONFIRMATION_MAX_TRIES = 5;
+
+    /**
      * The date format string that will be used to construct and parse dates represented using generalized time. It is
      * assumed that the provided date formatter will be set to UTC.
      */
     public static final String DATE_FORMAT_LOCAL_TIME = "dd/MMM/yyyy:HH:mm:ss Z";
 
+    /**
+     * Returns the message to be displayed in the file with the equivalent command-line with information about the
+     * current time.
+     *
+     * @return the message to be displayed in the file with the equivalent command-line with information about the
+     *         current time.
+     */
+    public static String getCurrentOperationDateMessage() {
+        String date = formatDateTimeStringForEquivalentCommand(new Date());
+        return INFO_OPERATION_START_TIME_MESSAGE.get(date).toString();
+    }
+
     private static final String COMMENT_SHELL_UNIX = "# ";
     private static final String COMMENT_BATCH_WINDOWS = "rem ";
 
@@ -79,8 +102,7 @@
      * The column at which to wrap long lines of output in the command-line
      * tools.
      */
-    static public final int MAX_LINE_WIDTH;
-
+    public static final int MAX_LINE_WIDTH;
     static {
         int columns = 80;
         try {
@@ -98,18 +120,18 @@
      * Formats a Date to String representation in "dd/MMM/yyyy:HH:mm:ss Z".
      *
      * @param date
-     *            to format; null if <code>date</code> is null
-     * @return string representation of the date
+     *            The date to format; null if <code>date</code> is null.
+     * @return A string representation of the date.
      */
-    public String formatDateTimeStringForEquivalentCommand(Date date) {
-        String timeStr = null;
+    public static String formatDateTimeStringForEquivalentCommand(final Date date) {
         if (date != null) {
-            SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_LOCAL_TIME);
+            final SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_LOCAL_TIME);
             dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
-            timeStr = dateFormat.format(date);
+            return dateFormat.format(date);
         }
-        return timeStr;
+        return null;
     }
+
     /**
      * Filters the provided value to ensure that it is appropriate for use as an
      * exit code. Exit code values are generally only allowed to be between 0
@@ -412,6 +434,61 @@
         return "";
     }
 
+    /**
+     * Tells whether the provided Throwable was caused because of a problem with a certificate while trying to establish
+     * a connection.
+     *
+     * @param t
+     *            The Throwable to analyze.
+     * @return <CODE>true</CODE> if the provided Throwable was caused because of a problem with a certificate while
+     *         trying to establish a connection and <CODE>false</CODE> otherwise.
+     */
+    public static boolean isCertificateException(Throwable t) {
+        boolean returnValue = false;
+
+        while (!returnValue && (t != null)) {
+            returnValue = (t instanceof SSLHandshakeException) || (t instanceof GeneralSecurityException);
+            t = t.getCause();
+        }
+
+        return returnValue;
+    }
+
+    /**
+     * Returns a message object for the given NamingException.
+     *
+     * @param ne
+     *            The NamingException.
+     * @param hostPort
+     *            The hostPort representation of the server we were contacting when the NamingException occurred.
+     * @return A message object for the given NamingException.
+     */
+    public static LocalizableMessage getMessageForException(NamingException ne, String hostPort) {
+        LocalizableMessage msg;
+        String arg;
+        if (ne.getLocalizedMessage() != null) {
+            arg = ne.getLocalizedMessage();
+        } else if (ne.getExplanation() != null) {
+            arg = ne.getExplanation();
+        } else {
+            arg = ne.toString(true);
+        }
+        if (Utils.isCertificateException(ne)) {
+            msg = INFO_ERROR_READING_CONFIG_LDAP_CERTIFICATE_SERVER.get(hostPort, arg);
+        } else if (ne instanceof AuthenticationException) {
+            msg = INFO_CANNOT_CONNECT_TO_REMOTE_AUTHENTICATION.get(hostPort, arg);
+        } else if (ne instanceof NoPermissionException) {
+            msg = INFO_CANNOT_CONNECT_TO_REMOTE_PERMISSIONS.get(hostPort, arg);
+        } else if (ne instanceof NamingSecurityException) {
+            msg = INFO_CANNOT_CONNECT_TO_REMOTE_PERMISSIONS.get(hostPort, arg);
+        } else if (ne instanceof CommunicationException) {
+            msg = ERR_CANNOT_CONNECT_TO_REMOTE_COMMUNICATION.get(hostPort, arg);
+        } else {
+            msg = INFO_CANNOT_CONNECT_TO_REMOTE_GENERIC.get(hostPort, arg);
+        }
+        return msg;
+    }
+
     // Prevent instantiation.
     private Utils() {
         // Do nothing.
diff --git a/opendj-sdk/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties b/opendj-sdk/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties
index 03373d4..c5706e8 100755
--- a/opendj-sdk/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties
+++ b/opendj-sdk/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties
@@ -729,6 +729,7 @@
 INFO_MENU_PROMPT_MULTI=Enter one or more choices separated by commas:
 INFO_MENU_PROMPT_SINGLE_DEFAULT=Enter choice [%s]:
 INFO_MENU_PROMPT_SINGLE=Enter choice:
+INFO_MENU_PROMPT_CONFIRM=%s (%s / %s) [%s]:
 INFO_MENU_OPTION_HELP=help
 INFO_MENU_OPTION_HELP_KEY=?
 INFO_MENU_OPTION_CANCEL=cancel
@@ -739,4 +740,35 @@
 INFO_MENU_CHAR_OPTION=%c)
 INFO_MENU_OPTION_BACK=back
 INFO_MENU_OPTION_BACK_KEY=b
+INFO_GENERAL_NO=no
+INFO_GENERAL_YES=yes
+ERR_CONSOLE_APP_CONFIRM=Invalid response. Please enter \
+ "%s" or "%s"
 ERR_TRIES_LIMIT_REACHED=Input tries limit reached (%d)
+ERR_BAD_PORT_NUMBER=Invalid port number "%s". Please \
+  enter a valid port number between 1 and 65535
+INFO_OPERATION_START_TIME_MESSAGE=Operation date: %s
+INFO_ERROR_READING_CONFIG_LDAP_CERTIFICATE_SERVER=Error reading data from \
+ server %s.  There is an error with the certificate presented by the \
+ server.\nDetails: %s
+INFO_CANNOT_CONNECT_TO_REMOTE_AUTHENTICATION=The provided credentials are not \
+ valid in server %s.  Details: %s
+INFO_CANNOT_CONNECT_TO_REMOTE_PERMISSIONS=You do not have enough access \
+ rights to read the configuration in %s. %nProvide credentials with enough \
+ rights.  Details: %s
+ERR_CANNOT_CONNECT_TO_REMOTE_COMMUNICATION=Could not connect to \
+ %s. Check that the server is running and that it is accessible \
+ from the local machine.  Details: %s
+INFO_CANNOT_CONNECT_TO_REMOTE_GENERIC=Could not connect to %s.  Check that the \
+ server is running and that the provided credentials are valid.%nError \
+ details:%n%s
+ERR_CONFIRMATION_TRIES_LIMIT_REACHED=Confirmation tries limit reached \
+ (%d)
+INFO_ADMINISTRATOR_UID_PROMPT=Global Administrator User ID
+INFO_ADMINISTRATOR_PWD_PROMPT=Global Administrator Password:
+INFO_ADMINISTRATOR_PWD_CONFIRM_PROMPT=Confirm Password:
+ERR_ADMINISTRATOR_PWD_DO_NOT_MATCH=The provided passwords do not match.
+ERR_BAD_INTEGER=Invalid integer number "%s". Please \
+  enter a valid integer
+
+ 
diff --git a/opendj-sdk/opendj-cli/src/test/java/com/forgerock/opendj/cli/ConsoleApplicationTestCase.java b/opendj-sdk/opendj-cli/src/test/java/com/forgerock/opendj/cli/ConsoleApplicationTestCase.java
index 4b291a6..332fd94 100644
--- a/opendj-sdk/opendj-cli/src/test/java/com/forgerock/opendj/cli/ConsoleApplicationTestCase.java
+++ b/opendj-sdk/opendj-cli/src/test/java/com/forgerock/opendj/cli/ConsoleApplicationTestCase.java
@@ -104,6 +104,12 @@
         public void setQuiet(boolean q) {
             quiet = q;
         }
+
+        @Override
+        public boolean isMenuDrivenMode() {
+            // TODO Auto-generated method stub
+            return false;
+        }
     }
 
     @Test()
diff --git a/opendj-sdk/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/package-info.java b/opendj-sdk/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/package-info.java
new file mode 100644
index 0000000..19fb3b5
--- /dev/null
+++ b/opendj-sdk/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/package-info.java
@@ -0,0 +1,30 @@
+/*
+ * 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 2014 ForgeRock AS
+ */
+
+/**
+ * This package contains the DS config.
+ */
+package org.forgerock.opendj.config.dsconfig;
diff --git a/opendj-sdk/opendj-config/src/main/resources/com/forgerock/opendj/dsconfig/dsconfig.properties b/opendj-sdk/opendj-config/src/main/resources/com/forgerock/opendj/dsconfig/dsconfig.properties
new file mode 100644
index 0000000..e88aef2
--- /dev/null
+++ b/opendj-sdk/opendj-config/src/main/resources/com/forgerock/opendj/dsconfig/dsconfig.properties
@@ -0,0 +1,445 @@
+# 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 2006-2010 Sun Microsystems, Inc.
+#      Portions Copyright 2011-2014 ForgeRock AS
+#
+# Format string definitions
+#
+# Keys must be formatted as follows:
+#
+# [SEVERITY]_[DESCRIPTION]_[ORDINAL]
+#
+# where:
+#
+# SEVERITY is one of:
+# [ERR, WARN, NOTICE, INFO, DEBUG]
+#
+# DESCRIPTION is an upper case string providing a hint as to the context of
+# the message in upper case with the underscore ('_') character serving as
+# word separator
+#
+# ORDINAL is an integer unique among other ordinals in this file
+#
+ERR_DSCFG_ERROR_CANNOT_READ_CONNECTION_PARAMETERS_1=The connection \
+ parameters could not be read due to the following error: %s
+ERR_DSCFG_ERROR_LDAP_SIMPLE_BIND_FAILED_2=Unable to authenticate to \
+ the server as "%s"
+ERR_DSCFG_ERROR_LDAP_FAILED_TO_CONNECT_3=Unable to connect to the \
+ server at "%s" on port %s
+ERR_DSCFG_ERROR_LDAP_SIMPLE_BIND_NOT_SUPPORTED_4=Unable to \
+ authenticate using simple authentication
+INFO_DSCFG_DESCRIPTION_SUBCMD_CREATE_5=Creates %s
+INFO_DSCFG_DESCRIPTION_SUBCMD_DELETE_6=Deletes %s
+INFO_DSCFG_DESCRIPTION_SUBCMD_LIST_7=Lists existing %s
+INFO_DSCFG_DESCRIPTION_SUBCMD_GETPROP_8=Shows %s properties
+INFO_DSCFG_DESCRIPTION_SUBCMD_SETPROP_9=Modifies %s properties
+ERR_DSCFG_ERROR_MISSING_SUBCOMMAND_10=A sub-command must be \
+ specified
+INFO_DSCFG_DESCRIPTION_TYPE_11=The type of %s which should be created. The \
+ value for TYPE can be one of: %s
+ERR_DSCFG_ERROR_NO_PASSWORD_12=No password was specified for \
+ administrator "%s"
+ERR_DSCFG_ERROR_PROPERTY_UNRECOGNIZED_13=The property "%s" is not a \
+ recognized property of %s
+ERR_DSCFG_ERROR_PROPERTY_INVALID_VALUE_14=The value "%s" is not a \
+ valid value for the %s property "%s" which has the following syntax: %s
+ERR_DSCFG_ERROR_PROPERTY_READ_ONLY_15=The %s property "%s" is \
+ read-only and cannot be modified
+ERR_DSCFG_ERROR_PROPERTY_MANDATORY_16=The %s property "%s" is \
+ mandatory and must be specified
+ERR_DSCFG_ERROR_PROPERTY_SINGLE_VALUED_17=It is not possible to \
+ specify multiple values for the %s property "%s" as it is single-valued
+INFO_DSCFG_DESCRIPTION_SUBCMD_HELPPROP_18=Describes managed objects and \
+ their properties
+INFO_DSCFG_HEADING_COMPONENT_NAME_19=Component
+INFO_DSCFG_HEADING_PROPERTY_NAME_20=Property
+INFO_DSCFG_HEADING_PROPERTY_VALUE_21=Value(s)
+INFO_DSCFG_HEADING_PROPERTY_SYNTAX_22=Syntax
+INFO_DSCFG_HEADING_PROPERTY_OPTIONS_23=Options
+INFO_DSCFG_DESCRIPTION_PROPERTY_SYNTAX_HELP_24=See detailed help
+ERR_DSCFG_ERROR_GET_PARENT_DDE_25=The parent %s could not be \
+ retrieved because its type could not be determined. This is probably due to \
+ the %s having an invalid LDAP entry. Check that the %s has the correct object \
+ classes
+ERR_DSCFG_ERROR_GET_PARENT_MODE_26=The parent %s could not be \
+ retrieved because of the reasons listed below:
+ERR_DSCFG_ERROR_GET_PARENT_MONFE_27=The parent %s does not exist
+ERR_DSCFG_ERROR_CREATE_MOAEE_28=The %s could not be created because \
+ there is already an existing one with the same name
+ERR_DSCFG_ERROR_CREATE_AUTHZ_29=The %s could not be created because \
+ you do not have the correct authorization
+ERR_DSCFG_ERROR_CREATE_CE_30=The %s could not be created due to a \
+ communications problem: %s
+ERR_DSCFG_ERROR_CREATE_CME_31=The %s could not be created because \
+ another client is currently making conflicting configuration changes
+ERR_DSCFG_ERROR_DELETE_MONFE_32=The %s could not be deleted because \
+ it does not exist
+ERR_DSCFG_ERROR_DELETE_AUTHZ_33=The %s could not be deleted because \
+ you do not have the correct authorization
+ERR_DSCFG_ERROR_DELETE_CE_34=The %s could not be deleted due to a \
+ communications problem: %s
+ERR_DSCFG_ERROR_DELETE_CME_35=The %s could not be deleted because \
+ another client is currently making conflicting configuration changes
+ERR_DSCFG_ERROR_GET_CHILD_DDE_36=The %s could not be retrieved \
+ because its type could not be determined. This is probably due to the %s \
+ having an invalid LDAP entry. Check that the %s object classes are correct
+ERR_DSCFG_ERROR_GET_CHILD_MODE_37=The %s could not be retrieved \
+ because of the reasons listed below:
+ERR_DSCFG_ERROR_GET_CHILD_MONFE_38=The %s does not exist
+ERR_DSCFG_ERROR_GET_CHILD_AUTHZ_39=The %s could not be accessed \
+ because you do not have the correct authorization
+ERR_DSCFG_ERROR_GET_CHILD_CE_40=The %s could not be accessed due to \
+ a communications problem: %s
+ERR_DSCFG_ERROR_GET_CHILD_CME_41=The %s could not be accessed \
+ because another client is currently making conflicting configuration changes
+ERR_DSCFG_ERROR_MODIFY_AUTHZ_42=The %s could not be modified because \
+ you do not have the correct authorization
+ERR_DSCFG_ERROR_MODIFY_CE_43=The %s could not be modified due to a \
+ communications problem: %s
+ERR_DSCFG_ERROR_MODIFY_CME_44=The %s could not be modified because \
+ another client is currently making conflicting configuration changes
+ERR_DSCFG_ERROR_LIST_DDE_45=The %s could not be retrieved because \
+ its type could not be determined. This is probably due to the %s having an \
+ invalid LDAP entry. Check that the %s object classes are correct
+ERR_DSCFG_ERROR_LIST_MODE_46=The %s could not be retrieved because \
+ of the reasons listed below:
+ERR_DSCFG_ERROR_LIST_MONFE_47=The %s does not exist
+ERR_DSCFG_ERROR_LIST_AUTHZ_48=The %s could not be listed because you \
+ do not have the correct authorization
+ERR_DSCFG_ERROR_LIST_CE_49=The %s could not be listed due to a \
+ communications problem: %s
+ERR_DSCFG_ERROR_LIST_CME_50=The %s could not be listed because \
+ another client is currently making conflicting configuration changes
+ERR_DSCFG_ERROR_PROPERTY_UNKNOWN_ERROR_51=The value(s) of the %s \
+ property "%s" could not be determined due to an unknown error: %s
+ERR_DSCFG_ERROR_PROPERTY_DEFAULT_BEHAVIOR_52=The default value(s) of \
+ the %s property "%s" could not be determined due to the following reason: %s
+ERR_DSCFG_ERROR_NO_SEPARATOR_IN_PROPERTY_VALUE_53=The property \
+ argument "%s" does not contain a name/value separator. The argument should \
+ have the following syntax: property:value
+ERR_DSCFG_ERROR_NO_NAME_IN_PROPERTY_VALUE_54=The property argument \
+ "%s" does not contain a property name. The argument should have the following \
+ syntax: property:value
+ERR_DSCFG_ERROR_NO_VALUE_IN_PROPERTY_VALUE_55=The property argument \
+ "%s" does not contain a property value. The argument should have the \
+ following syntax: property:value
+ERR_DSCFG_ERROR_SUB_TYPE_UNRECOGNIZED_56=The sub-type "%s" is not a \
+ recognized type of %s. It should be one of: %s
+ERR_DSCFG_ERROR_NO_SEPARATOR_IN_PROPERTY_MOD_57=The property \
+ modification "%s" does not contain a name/value separator. The argument \
+ should have the following syntax: property[+|-]:value
+ERR_DSCFG_ERROR_NO_NAME_IN_PROPERTY_MOD_58=The property modification \
+ "%s" does not contain a property name. The argument should have the following \
+ syntax: property[+|-]:value
+ERR_DSCFG_ERROR_INCOMPATIBLE_PROPERTY_MOD_59=The property \
+ modification "%s" is incompatible with another modification to the same \
+ property
+INFO_DSCFG_DESCRIPTION_TYPE_DEFAULT_60=The type of %s which should be \
+ created (Default: %s). The value for TYPE can be one of: %s
+INFO_DSCFG_DESCRIPTION_RECORD_61=Modifies the display output to show one \
+ property value per line
+INFO_DSCFG_DESCRIPTION_UNIT_TIME_62=Display time data using the specified \
+ unit. The value for UNIT can be one of ms, s, m, h, d, or w (milliseconds, \
+ seconds, minutes, hours, days, or weeks)
+INFO_DSCFG_DESCRIPTION_UNIT_SIZE_63=Display size data using the specified \
+ unit. The value for UNIT can be one of b, kb, mb, gb, or tb (bytes, \
+ kilobytes, megabytes, gigabytes, or terabytes)
+INFO_DSCFG_ERROR_TIME_UNIT_UNRECOGNIZED_64=The time unit "%s" is invalid. \
+ The valid time units are ms, s, m, h, d, or w (milliseconds, seconds, \
+ minutes, hours, days, or weeks)
+INFO_DSCFG_ERROR_SIZE_UNIT_UNRECOGNIZED_65=The size unit "%s" is invalid. \
+ The valid size units are b, kb, mb, gb, or tb (bytes, kilobytes, megabytes, \
+ gigabytes, or terabytes)
+INFO_DSCFG_HEADING_COMPONENT_TYPE_66=Type
+INFO_DSCFG_DESCRIPTION_SHOW_GROUP_USAGE_67=Display subcommands relating to \
+ %s
+INFO_DSCFG_DESCRIPTION_SHOW_GROUP_USAGE_ALL_68=Display all subcommands
+INFO_DSCFG_DESCRIPTION_SHOW_GROUP_USAGE_SUMMARY_69=Display summary usage \
+ information
+INFO_DSCFG_DESCRIPTION_NAME_70=The name of the %s
+INFO_DSCFG_DESCRIPTION_PROP_71=The name of a property to be displayed
+INFO_DSCFG_DESCRIPTION_PROP_VAL_72=Assigns a value to a property where PROP \
+ is the name of the property and VALUE is the single value to be assigned. \
+ Specify the same property multiple times in order to assign more than one \
+ value to it
+INFO_DSCFG_DESCRIPTION_ADD_PROP_VAL_73=Adds a single value to a property \
+ where PROP is the name of the property and VALUE is the single value to be \
+ added
+INFO_DSCFG_DESCRIPTION_REMOVE_PROP_VAL_74=Removes a single value from a \
+ property where PROP is the name of the property and VALUE is the single value \
+ to be removed
+INFO_DSCFG_DESCRIPTION_RESET_PROP_75=Resets a property back to its default \
+ values where PROP is the name of the property to be reset
+INFO_DSCFG_DESCRIPTION_HELP_TYPE_76=The type of components whose properties \
+ should be described. The value for TYPE must be one of the component types \
+ associated with the CATEGORY specified using the "--category" option
+ERR_DSCFG_ERROR_BIND_PASSWORD_NONINTERACTIVE_77=The LDAP bind \
+ password was not specified and cannot be read interactively
+INFO_DSCFG_DESCRIPTION_FORCE_1196=Ignore non-existent %s
+ERR_DSCFG_ERROR_UNABLE_TO_RESET_MANDATORY_PROPERTY_78=The %s \
+ property "%s" is mandatory cannot be reset. Use the "%s" option to specify a \
+ new value
+ERR_DSCFG_ERROR_UNABLE_TO_RESET_PROPERTY_WITH_VALUE_79="--%s %s" : \
+ the argument "--%s" \
+ reset the property to the default value. It cannot be used to set a property \
+ to a given value
+ERR_DSCFG_ERROR_ILLEGAL_NAME_SYNTAX_80=The name "%s" is not a valid \
+ name for the %s which has the following syntax: %s
+ERR_DSCFG_ERROR_ILLEGAL_NAME_EMPTY_81=Empty names are not permitted \
+ for %s
+ERR_DSCFG_ERROR_ILLEGAL_NAME_BLANK_82=Blank names are not permitted \
+ for %s
+ERR_DSCFG_ERROR_ILLEGAL_NAME_UNKNOWN_83=The name "%s" is not a valid \
+ name for the %s
+INFO_DSCFG_DESCRIPTION_NAME_CREATE_84=The name of the new %s
+INFO_DSCFG_DESCRIPTION_NAME_CREATE_EXT_85=The name of the new %s which will \
+ also be used as the value of the "%s" property: %s
+ERR_DSCFG_ERROR_UNABLE_TO_SET_NAMING_PROPERTY_86=The property "%s" \
+ cannot be set as it is defined implicitly by the name of the %s
+INFO_DSCFG_DESCRIPTION_ADVANCED_87=Allows the configuration of advanced \
+ components and properties
+ERR_DSCFG_ERROR_MISSING_NON_INTERACTIVE_ARG_88=The argument "--%s" \
+ must be specified when this application is used non-interactively
+INFO_DSCFG_CREATE_TYPE_PROMPT_89=>>>> Select the type of %s that you want to \
+ create:
+INFO_DSCFG_CREATE_NAME_PROMPT_90=>>>> Enter a name for the %s that you want to \
+ create:
+ERR_DSCFG_ERROR_CREATE_NAME_ALREADY_EXISTS_91=There is already \
+ another %s with the name "%s"
+INFO_DSCFG_DESCRIPTION_CREATE_HELP_HEADING_TYPE_92=Type
+INFO_DSCFG_DESCRIPTION_CREATE_HELP_HEADING_DESCR_93=Description
+ERR_DSCFG_ERROR_FINDER_NO_CHILDREN_94=Unable to continue since there \
+ are no %s currently configured on the server
+INFO_DSCFG_FINDER_PROMPT_SINGLE_95=>>>> There is only one %s: "%s". Are you sure \
+ that this is the correct one?
+INFO_DSCFG_FINDER_PROMPT_MANY_96=>>>> Select the %s from the following list:
+ERR_DSCFG_ERROR_FINDER_NO_CHILDREN_NULL_97=Unable to continue since there \
+ is no such an object currently configured on the server
+INFO_DSCFG_HELP_FIELD_ENUM_98=one of the following values:
+INFO_DSCFG_HELP_FIELD_UNDEFINED_99=undefined
+INFO_DSCFG_HELP_FIELD_INHERITED_ABS_100=inherits from the property "%s" in \
+ the %s
+INFO_DSCFG_HELP_FIELD_INHERITED_PARENT_101=inherits from the property "%s" \
+ in the parent %s
+INFO_DSCFG_HELP_FIELD_INHERITED_THIS_102=inherits from the property "%s" in \
+ this %s
+INFO_DSCFG_HELP_FIELD_SERVER_RESTART_103=The server must be restarted in \
+ order for changes to this property to take effect
+INFO_DSCFG_HELP_FIELD_COMPONENT_RESTART_104=The %s must be restarted in \
+ order for changes to this property to take effect
+INFO_DSCFG_HELP_FIELD_READ_ONLY_105=read-only - this property can only be \
+ specified when the %s is created
+INFO_DSCFG_HELP_FIELD_MONITORING_106=monitoring - this property is \
+ automatically generated by the server
+INFO_DSCFG_HELP_HEADING_PROPERTY_107=Property: %s
+INFO_DSCFG_HELP_HEADING_COMPONENT_108=Component name: %s
+INFO_DSCFG_HELP_HEADING_DEFAULT_109=Default behavior
+INFO_DSCFG_HELP_HEADING_MANDATORY_110=Mandatory
+INFO_DSCFG_HELP_HEADING_ADVANCED_111=Advanced
+INFO_DSCFG_HELP_HEADING_MULTI_VALUED_112=Multi-valued
+INFO_DSCFG_HELP_HEADING_READ_ONLY_113=Read-only
+INFO_DSCFG_HELP_HEADING_SYNTAX_114=Syntax
+INFO_DSCFG_HELP_DESCRIPTION_OPTION_115=Option Types:
+INFO_DSCFG_HELP_DESCRIPTION_READ_116=Property value(s) are readable
+INFO_DSCFG_HELP_DESCRIPTION_WRITE_117=Property value(s) are writable
+INFO_DSCFG_HELP_DESCRIPTION_MANDATORY_118=The property is mandatory
+INFO_DSCFG_HELP_DESCRIPTION_SINGLE_VALUED_119=The property is single-valued
+INFO_DSCFG_HELP_DESCRIPTION_ADMIN_ACTION_120=Administrative action is \
+ required for changes to take effect
+INFO_DSCFG_CONFIRM_CREATE_121=Are you sure that you want to create the %s?
+INFO_DSCFG_CONFIRM_DELETE_122=Are you sure that you want to delete the %s?
+INFO_DSCFG_CONFIRM_MODIFY_123=Are you sure that you want to modify the %s?
+INFO_DSCFG_CONFIRM_CREATE_SUCCESS_124=The %s was created successfully
+INFO_DSCFG_CONFIRM_DELETE_SUCCESS_125=The %s was deleted successfully
+INFO_DSCFG_CONFIRM_MODIFY_SUCCESS_126=The %s was modified successfully
+INFO_DSCFG_CONFIRM_CREATE_FAIL_127=The %s was not created
+INFO_DSCFG_CONFIRM_DELETE_FAIL_128=The %s was not deleted
+INFO_DSCFG_CONFIRM_MODIFY_FAIL_129=The %s was not modified
+INFO_DSCFG_DESCRIPTION_HELP_CATEGORY_130=The category of components whose \
+ properties should be described
+ERR_DSCFG_ERROR_CATEGORY_UNRECOGNIZED_131="%s" is not a recognized \
+ component category
+ERR_DSCFG_ERROR_CATEGORY_TYPE_UNRECOGNIZED_132="%s" is not a \
+ recognized component type in category "%s"
+ERR_DSCFG_ERROR_PROPERTY_UNRECOGNIZED_NO_DEFN_133=The property "%s" \
+ is not a recognized property
+INFO_DSCFG_DESCRIPTION_HELP_INHERITED_134=Modifies the display output to \
+ show the inherited properties of components
+INFO_VALUE_TRUE_135=true
+INFO_VALUE_FALSE_136=false
+INFO_VALUE_UNLIMITED_137=unlimited
+INFO_EDITOR_PROMPT_SELECT_VALUE_SINGLE_138=Select a value for the "%s" property:
+INFO_EDITOR_PROMPT_SELECT_VALUE_MULTI_139=Select one or more values for the "%s" property:
+INFO_EDITOR_HEADING_SYNTAX_140=Syntax:
+INFO_EDITOR_HEADING_VALUES_SUMMARY_141=The "%s" property has the following values:
+INFO_EDITOR_PROMPT_SELECT_VALUES_ADD_142=Select the values you wish to add:
+INFO_EDITOR_PROMPT_SELECT_VALUES_REMOVE_143=Select the values you wish to remove:
+INFO_EDITOR_PROMPT_MODIFY_MENU_144=Do you want to modify the "%s" property?
+INFO_EDITOR_OPTION_ADD_ALL_VALUES_145=Add all values
+INFO_EDITOR_OPTION_ADD_ONE_OR_MORE_VALUES_146=Add one or more values
+INFO_EDITOR_OPTION_REMOVE_ONE_OR_MORE_VALUES_147=Remove one or more values
+INFO_EDITOR_OPTION_REMOVE_ALL_VALUES_148=Remove all values
+INFO_EDITOR_OPTION_REVERT_CHANGES_149=Revert changes
+INFO_EDITOR_OPTION_LEAVE_UNDEFINED_150=Leave undefined
+INFO_EDITOR_OPTION_USE_DEFAULT_ALIAS_151=Use the default behavior: %s
+INFO_EDITOR_OPTION_USE_DEFAULT_INHERITED_ALIAS_152=Use the inherited default behavior: %s
+INFO_EDITOR_OPTION_USE_DEFAULT_INHERITED_ALIAS_UNDEFINED_153=Use the inherited default behavior: undefined
+INFO_EDITOR_OPTION_USE_VALUE_154=Use the value: %s
+INFO_EDITOR_OPTION_USE_DEFAULT_VALUE_155=Use the default value: %s
+INFO_EDITOR_OPTION_USE_INHERITED_DEFAULT_VALUE_156=Use the inherited default value: %s
+INFO_EDITOR_OPTION_USE_VALUES_157=Use these values
+INFO_EDITOR_OPTION_USE_DEFAULT_VALUES_158=Use these default values
+INFO_EDITOR_OPTION_USE_INHERITED_DEFAULT_VALUES_159=Use these inherited default values
+INFO_EDITOR_OPTION_KEEP_DEFAULT_ALIAS_160=Keep the default behavior: %s
+INFO_EDITOR_OPTION_KEEP_DEFAULT_INHERITED_ALIAS_161=Keep the inherited default behavior: %s
+INFO_EDITOR_OPTION_KEEP_DEFAULT_INHERITED_ALIAS_UNDEFINED_162=Keep the inherited default behavior: undefined
+INFO_EDITOR_OPTION_KEEP_VALUE_163=Keep the value: %s
+INFO_EDITOR_OPTION_KEEP_DEFAULT_VALUE_164=Keep the default value: %s
+INFO_EDITOR_OPTION_KEEP_INHERITED_DEFAULT_VALUE_165=Keep the inherited default value: %s
+INFO_EDITOR_OPTION_KEEP_VALUES_166=Keep these values
+INFO_EDITOR_OPTION_KEEP_DEFAULT_VALUES_167=Keep these default values
+INFO_EDITOR_OPTION_KEEP_INHERITED_DEFAULT_VALUES_168=Keep these inherited default values
+INFO_EDITOR_OPTION_RESET_DEFAULT_ALIAS_169=Reset to the default behavior: %s
+INFO_EDITOR_OPTION_RESET_DEFAULT_INHERITED_ALIAS_170=Reset to the inherited default behavior: %s
+INFO_EDITOR_OPTION_RESET_DEFAULT_INHERITED_ALIAS_UNDEFINED_171=Reset to the inherited default behavior: undefined
+INFO_EDITOR_OPTION_RESET_DEFAULT_VALUE_172=Reset to the default value: %s
+INFO_EDITOR_OPTION_RESET_INHERITED_DEFAULT_VALUE_173=Reset to the inherited default value: %s
+INFO_EDITOR_OPTION_RESET_DEFAULT_VALUES_174=Reset to the default values: %s
+INFO_EDITOR_OPTION_RESET_INHERITED_DEFAULT_VALUES_175=Reset to the inherited default values: %s
+INFO_EDITOR_HEADING_READ_ONLY_ALIAS_UNDEFINED_176=The "%s" property is undefined
+INFO_EDITOR_HEADING_READ_ONLY_ALIAS_177=The "%s" property is undefined: %s
+INFO_EDITOR_HEADING_READ_ONLY_VALUE_178=The "%s" property has the following value: %s
+INFO_EDITOR_HEADING_READ_ONLY_VALUES_179=The "%s" property has the following values:
+INFO_EDITOR_PROMPT_READ_ONLY_180=This property is read-only and cannot be modified. Would you like to view its help documentation?
+INFO_EDITOR_OPTION_CHANGE_TO_DEFAULT_VALUE_181=Change it to the default value: %s
+INFO_EDITOR_OPTION_CHANGE_TO_VALUE_182=Change it to the value: %s
+INFO_EDITOR_OPTION_CHANGE_VALUE_183=Change the value
+INFO_EDITOR_HEADING_CONFIGURE_PROPERTY_184=>>>> Configuring the "%s" property
+INFO_EDITOR_PROMPT_READ_FIRST_VALUE_185=Enter a value for the "%s" property:
+INFO_EDITOR_PROMPT_READ_FIRST_VALUE_OPTIONAL_186=Enter a value for the "%s" property [continue]:
+INFO_EDITOR_PROMPT_READ_NEXT_VALUE_187=Enter another value for the "%s" property [continue]:
+ERR_EDITOR_READ_FIRST_DUPLICATE_188=This property already contains the value "%s". Please enter a different value
+ERR_EDITOR_READ_NEXT_DUPLICATE_189=This property already contains the value "%s". Please enter a different value, or press RETURN to continue
+INFO_EDITOR_HEADING_CONFIGURE_COMPONENT_190=>>>> Configure the properties of the %s
+INFO_EDITOR_OPTION_FINISH_CREATE_COMPONENT_191=finish - create the new %s
+INFO_EDITOR_OPTION_FINISH_MODIFY_COMPONENT_192=finish - apply any changes to the %s
+INFO_EDITOR_OPTION_FINISH_KEY_193=f
+INFO_EDITOR_HEADING_CONFIGURE_PROPERTY_CONT_194=>>>> Configuring the "%s" property (Continued)
+INFO_DSCFG_CREATE_NAME_PROMPT_NAMING_195=>>>> Specify a name for the %s. This name will be used as the value for the "%s" property which has the following description:
+INFO_DSCFG_CREATE_NAME_PROMPT_NAMING_CONT_196=Enter a name for the %s that you want to create:
+INFO_DSCFG_HEADING_MAIN_MENU_TITLE_197=>>>> OpenDJ configuration console main menu
+INFO_DSCFG_HEADING_MAIN_MENU_PROMPT_198=What do you want to configure?
+INFO_DSCFG_HEADING_COMPONENT_MENU_TITLE_199=>>>> %s management menu
+INFO_DSCFG_HEADING_COMPONENT_MENU_PROMPT_200=What would you like to do?
+INFO_DSCFG_OPTION_COMPONENT_MENU_CREATE_201=Create a new %s
+INFO_DSCFG_OPTION_COMPONENT_MENU_MODIFY_SINGULAR_202=View and edit the %s
+INFO_DSCFG_OPTION_COMPONENT_MENU_MODIFY_PLURAL_203=View and edit an existing %s
+INFO_DSCFG_OPTION_COMPONENT_MENU_DELETE_204=Delete an existing %s
+INFO_DSCFG_OPTION_COMPONENT_MENU_LIST_PLURAL_205=List existing %s
+INFO_DSCFG_OPTION_COMPONENT_MENU_LIST_SINGULAR_206=Show the %s
+INFO_DSCFG_GENERIC_TYPE_OPTION_207=Generic %s
+ERR_DSCFG_ERROR_CREATE_ORE_SINGLE_208=The %s could not be created because of the following reason:
+ERR_DSCFG_ERROR_CREATE_ORE_PLURAL_209=The %s could not be created because of the following reasons:
+ERR_DSCFG_ERROR_DELETE_ORE_SINGLE_210=The %s could not be deleted because of the following reason:
+ERR_DSCFG_ERROR_DELETE_ORE_PLURAL_211=The %s could not be deleted because of the following reasons:
+ERR_DSCFG_ERROR_MODIFY_ORE_SINGLE_212=The %s could not be modified because of the following reason:
+ERR_DSCFG_ERROR_MODIFY_ORE_PLURAL_213=The %s could not be modified because of the following reasons:
+INFO_DSCFG_PROMPT_EDIT_AGAIN_214=Would you like to edit the properties of the %s again in order to resolve this problem?
+ERR_DSCFG_ERROR_TYPE_UNRECOGNIZED_FOR_SUBCOMMAND_215="%s" component \
+ type cannot be used with subcommand {%s}
+INFO_EDITOR_PROMPT_SELECT_COMPONENT_MULTI_216=Select one or more %s for the "%s" property:
+INFO_EDITOR_PROMPT_SELECT_COMPONENT_SINGLE_217=Select a %s for the "%s" property:
+INFO_EDITOR_HEADING_COMPONENT_SUMMARY_218=The "%s" property references the following %s:
+INFO_EDITOR_PROMPT_SELECT_COMPONENTS_ADD_219=Select the %s you wish to add:
+INFO_EDITOR_OPTION_ADD_ALL_COMPONENTS_220=Add all %s
+INFO_EDITOR_PROMPT_SELECT_COMPONENTS_REMOVE_221=Select the %s you wish to remove:
+INFO_EDITOR_OPTION_CHANGE_TO_DEFAULT_COMPONENT_222=Change it to the default %s: %s
+INFO_EDITOR_OPTION_CHANGE_TO_COMPONENT_223=Change it to the %s: %s
+INFO_EDITOR_PROMPT_ENABLED_REFERENCED_COMPONENT_224=The referenced %s \
+ called "%s" must be enabled so that it can be used with this %s. Do \
+ you want to enable it?
+ERR_SET_REFERENCED_COMPONENT_DISABLED_225=The modifications to \
+ the %s cannot be made because it contains a reference to a \
+ disabled %s
+ERR_CREATE_HEADING_MMPE_SINGLE_226=The %s could not be created because the following mandatory property was not defined:
+ERR_CREATE_HEADING_MMPE_PLURAL_227=The %s could not be created because the following mandatory properties were not defined:
+ERR_MODIFY_HEADING_MMPE_SINGLE_228=The %s could not be modified because the following mandatory property was not defined:
+ERR_MODIFY_HEADING_MMPE_PLURAL_229=The %s could not be modified because the following mandatory properties were not defined:
+INFO_DSCFG_PROMPT_EDIT_230=Would you like to edit the properties of the %s in order to resolve this problem?
+ERR_GET_HEADING_MODE_SINGLE_231=The %s could not be decoded due to the following reason:
+ERR_GET_HEADING_MODE_PLURAL_232=The %s could not be decoded due to the following reasons:
+INFO_EDITOR_OPTION_CREATE_A_NEW_COMPONENT_233=Create a new %s
+INFO_DSCFG_PROMPT_EDIT_TO_ENABLE_234=The referenced %s \
+ called "%s" must be enabled so that it can be used with this %s. Do \
+ you want to edit its properties in order to enable it?
+INFO_DSCFG_CUSTOM_TYPE_OPTION_235=Custom %s
+INFO_DSCFG_CUSTOM_TYPE_SYNOPSIS_236=A Custom %s with a user-defined \
+ implementation class
+INFO_DSCFG_GENERIC_TYPE_SYNOPSIS_237=A Generic %s
+INFO_DSCFG_CREATE_TYPE_HELP_HEADING_238=Help: %s
+INFO_DSCFG_NON_INTERACTIVE_239=The equivalent non-interactive command-line is:\
+ %n%s
+INFO_DSCFG_DESCRIPTION_DISPLAY_EQUIVALENT_240=Display the equivalent \
+ non-interactive argument in the standard output when this command is run in \
+ interactive mode
+INFO_DSCFG_DESCRIPTION_EQUIVALENT_COMMAND_FILE_PATH_241=The full path to the \
+ file where the equivalent non-interactive commands will be written when this \
+ command is run in interactive mode
+ERR_DSCFG_ERROR_WRITING_EQUIVALENT_COMMAND_LINE_242=An error occurred \
+ while attempting to write equivalent non-interactive command line to file \
+ %s.  Error details:  %s
+ERR_DSCFG_CANNOT_WRITE_EQUIVALENT_COMMAND_LINE_FILE_243=Cannot write \
+ to file %s.  Verify that you have access rights to that file and that you \
+ provided the full path of the file
+ERR_DSCFG_EQUIVALENT_COMMAND_LINE_FILE_DIRECTORY_244=The specified \
+ path %s to write the equivalent command is a directory.  You must specify a \
+ path to a file
+ERR_DSCFG_ERROR_LDAP_FAILED_TO_CONNECT_WRONG_PORT_245=Unable to connect to the \
+ server at %s on port %s. Check this port is an administration port
+ERR_DSCFG_ERROR_LDAP_FAILED_TO_CONNECT_NOT_TRUSTED_246=Unable to connect to the \
+ server at %s on port %s. In non-interactive mode, if the trustStore related parameters are not used, \
+ you must use the '--trustAll' option for remote connections
+ERR_DSCFG_ERROR_VALUE_DOES_NOT_EXIST_247=The value %s for the %s property does not exist
+ERR_DSCFG_ERROR_NO_AVAILABLE_TYPES_248=Unable to continue since there are \
+ no available types of %s to choose from
+INFO_DSCFG_TYPE_PROMPT_SINGLE_249=>>>> There is only one type of %s available: "%s". \
+ Are you sure that this is the correct one?
+ERR_DSCFG_ERROR_READING_BATCH_FILE_250=An error occurred \
+ while attempting to read the batch file : %s
+INFO_DSCFG_SESSION_START_TIME_MESSAGE_251=%s session start date: %s
+INFO_DSCFG_EQUIVALENT_COMMAND_LINE_SESSION_OPERATION_NUMBER_252=Session \
+ operation number: %d
+INFO_DSCFG_DESCRIPTION_OPTIONS_ARGS_253=Configuration Options
+ERR_DSCFG_ERROR_BATCH_FILE_AND_INTERACTIVE_INCOMPATIBLE_254=If you specify \
+ the {%s} argument you must also specify {%s}
+ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE_255=If you specify \
+ the {%s} argument you must also specify {%s}
+INFO_DSCFG_TOOL_DESCRIPTION_256=This utility can be used to define a base \
+ configuration for the Directory Server
+INFO_DSCFG_BATCH_FILE_PATH_257=Path to a batch file containing \
+a set of dsconfig commands to be executed
+INFO_DSCFG_DESCRIPTION_OPTIONS_ARGS_258=Configuration Options
+ERR_DSCFG_ERROR_BATCH_FILE_AND_INTERACTIVE_INCOMPATIBLE_259=If you specify \
+ the {%s} argument you must also specify {%s}
+ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE_260=If you specify \
+ the {%s} argument you must also specify {%s}
+

--
Gitblit v1.10.0