From eaa23f4b7af97c108ecffa40c86c32e723a90594 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Wed, 29 Aug 2007 14:40:34 +0000
Subject: [PATCH] Fix issue 1831: dsconfig interactive mode.

---
 opends/src/server/org/opends/server/tools/dsconfig/CreateSubCommandHandler.java |  312 ++++++++++++++++++++++++++++++++-------------------
 1 files changed, 193 insertions(+), 119 deletions(-)

diff --git a/opends/src/server/org/opends/server/tools/dsconfig/CreateSubCommandHandler.java b/opends/src/server/org/opends/server/tools/dsconfig/CreateSubCommandHandler.java
index 0b2034e..21bb850 100644
--- a/opends/src/server/org/opends/server/tools/dsconfig/CreateSubCommandHandler.java
+++ b/opends/src/server/org/opends/server/tools/dsconfig/CreateSubCommandHandler.java
@@ -25,13 +25,11 @@
  *      Portions Copyright 2007 Sun Microsystems, Inc.
  */
 package org.opends.server.tools.dsconfig;
-import org.opends.messages.Message;
 
 
 
-import static org.opends.messages.ToolMessages.*;
+import static org.opends.messages.DSConfigMessages.*;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -44,6 +42,7 @@
 import java.util.TreeMap;
 import java.util.TreeSet;
 
+import org.opends.messages.Message;
 import org.opends.server.admin.AbstractManagedObjectDefinition;
 import org.opends.server.admin.Configuration;
 import org.opends.server.admin.ConfigurationClient;
@@ -57,6 +56,7 @@
 import org.opends.server.admin.ManagedObjectPath;
 import org.opends.server.admin.OptionalRelationDefinition;
 import org.opends.server.admin.PropertyDefinition;
+import org.opends.server.admin.PropertyDefinitionUsageBuilder;
 import org.opends.server.admin.PropertyException;
 import org.opends.server.admin.PropertyIsSingleValuedException;
 import org.opends.server.admin.PropertyOption;
@@ -68,6 +68,7 @@
 import org.opends.server.admin.client.IllegalManagedObjectNameException;
 import org.opends.server.admin.client.ManagedObject;
 import org.opends.server.admin.client.ManagedObjectDecodingException;
+import org.opends.server.admin.client.ManagementContext;
 import org.opends.server.admin.client.MissingMandatoryPropertiesException;
 import org.opends.server.admin.client.OperationRejectedException;
 import org.opends.server.protocols.ldap.LDAPResultCode;
@@ -76,6 +77,13 @@
 import org.opends.server.util.args.StringArgument;
 import org.opends.server.util.args.SubCommand;
 import org.opends.server.util.args.SubCommandArgumentParser;
+import org.opends.server.util.cli.CLIException;
+import org.opends.server.util.cli.ConsoleApplication;
+import org.opends.server.util.cli.HelpCallback;
+import org.opends.server.util.cli.Menu;
+import org.opends.server.util.cli.MenuBuilder;
+import org.opends.server.util.cli.MenuResult;
+import org.opends.server.util.cli.ValidationCallback;
 import org.opends.server.util.table.TableBuilder;
 import org.opends.server.util.table.TextTablePrinter;
 
@@ -94,7 +102,6 @@
 final class CreateSubCommandHandler<C extends ConfigurationClient,
     S extends Configuration> extends SubCommandHandler {
 
-
   /**
    * A property provider which uses the command-line arguments to
    * provide initial property values.
@@ -220,7 +227,8 @@
 
 
   /**
-   * A help call-back which displays help about available component types.
+   * A help call-back which displays help about available component
+   * types.
    */
   private final class TypeHelpCallback implements HelpCallback {
 
@@ -228,14 +236,15 @@
      * {@inheritDoc}
      */
     public void display(ConsoleApplication app) {
-      // Create a table containing a description of each component type.
+      // Create a table containing a description of each component
+      // type.
       TableBuilder builder = new TableBuilder();
 
-      builder.appendHeading(
-              INFO_DSCFG_DESCRIPTION_CREATE_HELP_HEADING_TYPE.get());
+      builder.appendHeading(INFO_DSCFG_DESCRIPTION_CREATE_HELP_HEADING_TYPE
+          .get());
 
-      builder.appendHeading(
-              INFO_DSCFG_DESCRIPTION_CREATE_HELP_HEADING_DESCR.get());
+      builder.appendHeading(INFO_DSCFG_DESCRIPTION_CREATE_HELP_HEADING_DESCR
+          .get());
 
       boolean isFirst = true;
       for (ManagedObjectDefinition<?, ?> d : types.values()) {
@@ -261,6 +270,8 @@
       printer.setColumnWidth(1, 0);
       printer.setColumnSeparator(":");
       builder.print(printer);
+      app.println();
+      app.pressReturnToContinue();
     }
   }
 
@@ -300,8 +311,6 @@
    *          The type of managed object which can be created.
    * @param <S>
    *          The type of server managed object which can be created.
-   * @param app
-   *          The console application.
    * @param parser
    *          The sub-command argument parser.
    * @param p
@@ -314,10 +323,9 @@
    */
   public static <C extends ConfigurationClient, S extends Configuration>
       CreateSubCommandHandler<C, S> create(
-      ConsoleApplication app, SubCommandArgumentParser parser,
-      ManagedObjectPath<?, ?> p, InstantiableRelationDefinition<C, S> r)
-      throws ArgumentException {
-    return new CreateSubCommandHandler<C, S>(app, parser, p, r, r
+      SubCommandArgumentParser parser, ManagedObjectPath<?, ?> p,
+      InstantiableRelationDefinition<C, S> r) throws ArgumentException {
+    return new CreateSubCommandHandler<C, S>(parser, p, r, r
         .getNamingPropertyDefinition(), p.child(r, "DUMMY"));
   }
 
@@ -330,8 +338,6 @@
    *          The type of managed object which can be created.
    * @param <S>
    *          The type of server managed object which can be created.
-   * @param app
-   *          The console application.
    * @param parser
    *          The sub-command argument parser.
    * @param p
@@ -344,11 +350,9 @@
    */
   public static <C extends ConfigurationClient, S extends Configuration>
       CreateSubCommandHandler<C, S> create(
-      ConsoleApplication app, SubCommandArgumentParser parser,
-      ManagedObjectPath<?, ?> p, OptionalRelationDefinition<C, S> r)
-      throws ArgumentException {
-    return new CreateSubCommandHandler<C, S>(app, parser, p, r, null, p
-        .child(r));
+      SubCommandArgumentParser parser, ManagedObjectPath<?, ?> p,
+      OptionalRelationDefinition<C, S> r) throws ArgumentException {
+    return new CreateSubCommandHandler<C, S>(parser, p, r, null, p.child(r));
   }
 
   // The sub-commands naming arguments.
@@ -377,7 +381,7 @@
   // The set of instantiable managed object definitions and their
   // associated type option value.
   private final SortedMap<String,
-    ManagedObjectDefinition<? extends C, ? extends S>> types;
+      ManagedObjectDefinition<? extends C, ? extends S>> types;
 
   // The syntax of the type argument.
   private final String typeUsage;
@@ -385,24 +389,20 @@
 
 
   // Common constructor.
-  private CreateSubCommandHandler(ConsoleApplication app,
-      SubCommandArgumentParser parser,
-      ManagedObjectPath<?, ?> p, RelationDefinition<C, S> r,
-      PropertyDefinition<?> pd, ManagedObjectPath<?, ?> c)
-      throws ArgumentException {
-    super(app);
-
+  private CreateSubCommandHandler(
+      SubCommandArgumentParser parser, ManagedObjectPath<?, ?> p,
+      RelationDefinition<C, S> r, PropertyDefinition<?> pd,
+      ManagedObjectPath<?, ?> c) throws ArgumentException {
     this.path = p;
     this.relation = r;
     this.namingPropertyDefinition = pd;
 
     // Create the sub-command.
     String name = "create-" + r.getName();
-    Message description = INFO_DSCFG_DESCRIPTION_SUBCMD_CREATE.get(
-      r.getChildDefinition().getUserFriendlyPluralName()
-    );
-    this.subCommand = new SubCommand(parser, name, false, 0,
-            0, null, description);
+    Message description = INFO_DSCFG_DESCRIPTION_SUBCMD_CREATE.get(r
+        .getChildDefinition().getUserFriendlyPluralName());
+    this.subCommand = new SubCommand(parser, name, false, 0, 0, null,
+        description);
 
     // Create the -t argument which is used to specify the type of
     // managed object to be created.
@@ -418,9 +418,8 @@
     // Create the --property argument which is used to specify
     // property values.
     this.propertySetArgument = new StringArgument(OPTION_DSCFG_LONG_SET,
-        OPTION_DSCFG_SHORT_SET, OPTION_DSCFG_LONG_SET, false, true,
-        true, "{PROP:VALUE}", null, null,
-        INFO_DSCFG_DESCRIPTION_PROP_VAL.get());
+        OPTION_DSCFG_SHORT_SET, OPTION_DSCFG_LONG_SET, false, true, true,
+        "{PROP:VALUE}", null, null, INFO_DSCFG_DESCRIPTION_PROP_VAL.get());
     this.subCommand.addArgument(this.propertySetArgument);
 
     // Build the -t option usage.
@@ -463,6 +462,19 @@
 
 
   /**
+   * Gets the relation definition associated with the type of
+   * component that this sub-command handles.
+   *
+   * @return Returns the relation definition associated with the type
+   *         of component that this sub-command handles.
+   */
+  public RelationDefinition<?, ?> getRelationDefinition() {
+    return relation;
+  }
+
+
+
+  /**
    * {@inheritDoc}
    */
   @Override
@@ -476,27 +488,57 @@
    * {@inheritDoc}
    */
   @Override
-  public int run() throws ArgumentException, ClientException {
+  public MenuResult<Integer> run(ConsoleApplication app,
+      ManagementContextFactory factory) throws ArgumentException,
+      ClientException, CLIException {
     // Determine the type of managed object to be created.
     String typeName;
 
     if (!typeArgument.isPresent()) {
-      if (getConsoleApplication().isInteractive()) {
+      if (app.isInteractive()) {
         // Let the user choose.
 
         // If there is only one choice then return immediately.
         if (types.size() == 1) {
           typeName = types.keySet().iterator().next();
         } else {
-          List<String> values = new ArrayList<String>(types.keySet());
-          List<Message> descriptions = new ArrayList<Message>(values.size());
-          for (ManagedObjectDefinition<?, ?> d : types.values()) {
-            descriptions.add(d.getUserFriendlyName());
+          MenuBuilder<String> builder = new MenuBuilder<String>(app);
+          Message msg = INFO_DSCFG_CREATE_TYPE_PROMPT.get(relation
+              .getChildDefinition().getUserFriendlyName());
+          builder.setMultipleColumnThreshold(MULTI_COLUMN_THRESHOLD);
+          builder.setPrompt(msg);
+
+          for (String type : types.keySet()) {
+            ManagedObjectDefinition<?, ?> d = types.get(type);
+            Message option = d.getUserFriendlyName();
+            if (type.equals(GENERIC_TYPE)) {
+              option = INFO_DSCFG_GENERIC_TYPE_OPTION.get(option);
+            }
+            builder.addNumberedOption(option, MenuResult.success(type));
           }
-          Message msg = INFO_DSCFG_CREATE_TYPE_PROMPT.get(
-                  relation.getChildDefinition().getUserFriendlyName());
-          typeName = getConsoleApplication().readChoice(msg, descriptions,
-              values, new TypeHelpCallback());
+          builder.addHelpOption(new TypeHelpCallback());
+          if (app.isMenuDrivenMode()) {
+            builder.addCancelOption(true);
+          }
+          builder.addQuitOption();
+
+          Menu<String> menu = builder.toMenu();
+          app.println();
+          app.println();
+          MenuResult<String> result = menu.run();
+          if (result.isSuccess()) {
+            typeName = result.getValue();
+          } else if (result.isCancel()) {
+            return MenuResult.cancel();
+          } else {
+            // Must be quit.
+            if (!app.isMenuDrivenMode()) {
+              msg = INFO_DSCFG_CONFIRM_CREATE_FAIL.get(relation
+                  .getUserFriendlyName());
+              app.printVerboseMessage(msg);
+            }
+            return MenuResult.quit();
+          }
         }
       } else if (typeArgument.getDefaultValue() != null) {
         typeName = typeArgument.getDefaultValue();
@@ -515,7 +557,7 @@
     }
 
     // Get the naming argument values.
-    List<String> names = getNamingArgValues(namingArgs);
+    List<String> names = getNamingArgValues(app, namingArgs);
 
     // Encode the provided properties.
     List<String> propertyArgs = propertySetArgument.getValues();
@@ -523,13 +565,13 @@
         namingPropertyDefinition, propertyArgs);
 
     // Add the child managed object.
-    ManagedObject<?> parent;
+    ManagementContext context = factory.getManagementContext(app);
+    MenuResult<ManagedObject<?>> result;
     try {
-      parent = getManagedObject(path, names);
+      result = getManagedObject(app, context, path, names);
     } catch (AuthorizationException e) {
       Message msg = ERR_DSCFG_ERROR_CREATE_AUTHZ.get(d.getUserFriendlyName());
-      throw new ClientException(LDAPResultCode.INSUFFICIENT_ACCESS_RIGHTS,
-          msg);
+      throw new ClientException(LDAPResultCode.INSUFFICIENT_ACCESS_RIGHTS, msg);
     } catch (DefinitionDecodingException e) {
       Message ufn = path.getManagedObjectDefinition().getUserFriendlyName();
       Message msg = ERR_DSCFG_ERROR_GET_PARENT_DDE.get(ufn, ufn, ufn);
@@ -539,19 +581,32 @@
       Message msg = ERR_DSCFG_ERROR_GET_PARENT_MODE.get(ufn);
       throw new ClientException(LDAPResultCode.OPERATIONS_ERROR, msg);
     } catch (CommunicationException e) {
-      Message msg = ERR_DSCFG_ERROR_CREATE_CE.get(
-          d.getUserFriendlyName(), e.getMessage());
+      Message msg = ERR_DSCFG_ERROR_CREATE_CE.get(d.getUserFriendlyName(), e
+          .getMessage());
       throw new ClientException(LDAPResultCode.CLIENT_SIDE_SERVER_DOWN, msg);
     } catch (ConcurrentModificationException e) {
       Message msg = ERR_DSCFG_ERROR_CREATE_CME.get(d.getUserFriendlyName());
-      throw new ClientException(LDAPResultCode.CONSTRAINT_VIOLATION,
-          msg);
+      throw new ClientException(LDAPResultCode.CONSTRAINT_VIOLATION, msg);
     } catch (ManagedObjectNotFoundException e) {
       Message ufn = path.getManagedObjectDefinition().getUserFriendlyName();
       Message msg = ERR_DSCFG_ERROR_GET_PARENT_MONFE.get(ufn);
       throw new ClientException(LDAPResultCode.NO_SUCH_OBJECT, msg);
     }
 
+    if (result.isQuit()) {
+      if (!app.isMenuDrivenMode()) {
+        // User chose to cancel creation.
+        Message msg = INFO_DSCFG_CONFIRM_CREATE_FAIL.get(d
+            .getUserFriendlyName());
+        app.printVerboseMessage(msg);
+      }
+      return MenuResult.quit();
+    } else if (result.isCancel()) {
+      // Must be menu driven, so no need for error message.
+      return MenuResult.cancel();
+    }
+
+    ManagedObject<?> parent = result.getValue();
     try {
       ManagedObject<? extends C> child;
       List<DefaultBehaviorException> exceptions =
@@ -561,8 +616,9 @@
           (InstantiableRelationDefinition<C, S>) relation;
         String name = names.get(names.size() - 1);
         if (name == null) {
-          if (getConsoleApplication().isInteractive()) {
-            child = createChildInteractively(parent, irelation, d, exceptions);
+          if (app.isInteractive()) {
+            child = createChildInteractively(app, parent, irelation,
+                d, exceptions);
           } else {
             throw ArgumentExceptionFactory
                 .missingMandatoryNonInteractiveArgument(namingArgs.get(names
@@ -570,7 +626,8 @@
           }
         } else {
           try {
-            child = parent.createChild(irelation, d, name, exceptions);
+            child = parent.createChild(irelation, d, name,
+                exceptions);
           } catch (IllegalManagedObjectNameException e) {
             throw ArgumentExceptionFactory
                 .adaptIllegalManagedObjectNameException(e, d);
@@ -591,7 +648,7 @@
       }
 
       // Interactively set properties if applicable.
-      if (getConsoleApplication().isInteractive()) {
+      if (app.isInteractive()) {
         SortedSet<PropertyDefinition<?>> properties =
           new TreeSet<PropertyDefinition<?>>();
 
@@ -600,10 +657,6 @@
             continue;
           }
 
-          if (pd.hasOption(PropertyOption.MONITORING)) {
-            continue;
-          }
-
           if (!isAdvancedMode() && pd.hasOption(PropertyOption.ADVANCED)) {
             continue;
           }
@@ -611,72 +664,65 @@
           properties.add(pd);
         }
 
-        PropertyValueReader reader =
-          new PropertyValueReader(getConsoleApplication());
-        reader.readAll(child, properties);
-      }
-
-      // Confirm commit.
-      Message prompt = INFO_DSCFG_CONFIRM_CREATE.get(d.getUserFriendlyName());
-      if (!getConsoleApplication().confirmAction(prompt)) {
-        // Output failure message.
-        Message msg =
-            INFO_DSCFG_CONFIRM_CREATE_FAIL.get(d.getUserFriendlyName());
-        getConsoleApplication().printVerboseMessage(msg);
-        return 1;
+        PropertyValueEditor editor = new PropertyValueEditor(app);
+        MenuResult<Void> result2 = editor.edit(child, properties, true);
+        if (result2.isQuit()) {
+          if (!app.isMenuDrivenMode()) {
+            Message msg = INFO_DSCFG_CONFIRM_CREATE_FAIL.get(d
+                .getUserFriendlyName());
+            app.printVerboseMessage(msg);
+          }
+          return MenuResult.quit();
+        } else if (result2.isCancel()) {
+          return MenuResult.cancel();
+        }
       }
 
       // Add the managed object.
       child.commit();
 
       // Output success message.
-      Message msg =
-          INFO_DSCFG_CONFIRM_CREATE_SUCCESS.get(d.getUserFriendlyName());
-      getConsoleApplication().printVerboseMessage(msg);
+      Message msg = INFO_DSCFG_CONFIRM_CREATE_SUCCESS.get(d
+          .getUserFriendlyName());
+      app.printVerboseMessage(msg);
     } catch (MissingMandatoryPropertiesException e) {
       throw ArgumentExceptionFactory.adaptMissingMandatoryPropertiesException(
           e, d);
     } catch (AuthorizationException e) {
       Message msg = ERR_DSCFG_ERROR_CREATE_AUTHZ.get(d.getUserFriendlyName());
-      throw new ClientException(LDAPResultCode.INSUFFICIENT_ACCESS_RIGHTS,
-          msg);
+      throw new ClientException(LDAPResultCode.INSUFFICIENT_ACCESS_RIGHTS, msg);
     } catch (ManagedObjectAlreadyExistsException e) {
       Message msg = ERR_DSCFG_ERROR_CREATE_MOAEE.get(d.getUserFriendlyName());
-      throw new ClientException(LDAPResultCode.ENTRY_ALREADY_EXISTS,
-          msg);
+      throw new ClientException(LDAPResultCode.ENTRY_ALREADY_EXISTS, msg);
     } catch (ConcurrentModificationException e) {
       Message msg = ERR_DSCFG_ERROR_CREATE_CME.get(d.getUserFriendlyName());
-      throw new ClientException(LDAPResultCode.CONSTRAINT_VIOLATION,
-          msg);
+      throw new ClientException(LDAPResultCode.CONSTRAINT_VIOLATION, msg);
     } catch (OperationRejectedException e) {
-      Message msg = ERR_DSCFG_ERROR_CREATE_ORE.get(
-          d.getUserFriendlyName(), e.getMessage());
-      throw new ClientException(LDAPResultCode.CONSTRAINT_VIOLATION,
-          msg);
+      Message msg = ERR_DSCFG_ERROR_CREATE_ORE.get(d.getUserFriendlyName(), e
+          .getMessage());
+      throw new ClientException(LDAPResultCode.CONSTRAINT_VIOLATION, msg);
     } catch (CommunicationException e) {
-      Message msg = ERR_DSCFG_ERROR_CREATE_CE.get(
-          d.getUserFriendlyName(), e.getMessage());
+      Message msg = ERR_DSCFG_ERROR_CREATE_CE.get(d.getUserFriendlyName(), e
+          .getMessage());
       throw new ClientException(LDAPResultCode.CLIENT_SIDE_SERVER_DOWN, msg);
     }
 
-    return 0;
+    return MenuResult.success(0);
   }
 
 
 
   // Interactively create the child by prompting for the name.
   private ManagedObject<? extends C> createChildInteractively(
-      final ManagedObject<?> parent,
+      ConsoleApplication app, final ManagedObject<?> parent,
       final InstantiableRelationDefinition<C, S> irelation,
       final ManagedObjectDefinition<? extends C, ? extends S> d,
-      final List<DefaultBehaviorException> exceptions)
-      throws ArgumentException, ClientException {
-    Message msg = INFO_DSCFG_CREATE_NAME_PROMPT.get(d.getUserFriendlyName());
+      final List<DefaultBehaviorException> exceptions) throws CLIException {
     ValidationCallback<ManagedObject<? extends C>> validator =
       new ValidationCallback<ManagedObject<? extends C>>() {
 
       public ManagedObject<? extends C> validate(ConsoleApplication app,
-          String input) throws ClientException {
+          String input) throws CLIException {
         ManagedObject<? extends C> child;
 
         // First attempt to create the child, this will guarantee that
@@ -684,10 +730,11 @@
         try {
           child = parent.createChild(irelation, d, input, exceptions);
         } catch (IllegalManagedObjectNameException e) {
-          ArgumentException ae = ArgumentExceptionFactory
+          CLIException ae = ArgumentExceptionFactory
               .adaptIllegalManagedObjectNameException(e, d);
           app.println();
-          app.printMessage(ae.getMessageObject());
+          app.println(ae.getMessageObject());
+          app.println();
           return null;
         }
 
@@ -697,19 +744,17 @@
           // Attempt to retrieve a child using this name.
           parent.getChild(irelation, input);
         } catch (AuthorizationException e) {
-          Message msg =
-              ERR_DSCFG_ERROR_CREATE_AUTHZ.get(irelation.getUserFriendlyName());
-          throw new ClientException(LDAPResultCode.INSUFFICIENT_ACCESS_RIGHTS,
-              msg);
+          Message msg = ERR_DSCFG_ERROR_CREATE_AUTHZ.get(irelation
+              .getUserFriendlyName());
+          throw new CLIException(msg);
         } catch (ConcurrentModificationException e) {
-          Message msg =
-              ERR_DSCFG_ERROR_CREATE_CME.get(irelation.getUserFriendlyName());
-          throw new ClientException(LDAPResultCode.CONSTRAINT_VIOLATION, msg);
+          Message msg = ERR_DSCFG_ERROR_CREATE_CME.get(irelation
+              .getUserFriendlyName());
+          throw new CLIException(msg);
         } catch (CommunicationException e) {
-          Message msg = ERR_DSCFG_ERROR_CREATE_CE.get(
-              irelation.getUserFriendlyName(), e.getMessage());
-          throw new ClientException(LDAPResultCode.CLIENT_SIDE_SERVER_DOWN,
-              msg);
+          Message msg = ERR_DSCFG_ERROR_CREATE_CE.get(irelation
+              .getUserFriendlyName(), e.getMessage());
+          throw new CLIException(msg);
         } catch (DefinitionDecodingException e) {
           // Do nothing.
         } catch (ManagedObjectDecodingException e) {
@@ -720,16 +765,45 @@
         }
 
         // A child with the specified name must already exist.
-        Message msg = ERR_DSCFG_ERROR_CREATE_NAME_ALREADY_EXISTS.get(
-                relation.getUserFriendlyName(), input);
+        Message msg = ERR_DSCFG_ERROR_CREATE_NAME_ALREADY_EXISTS.get(relation
+            .getUserFriendlyName(), input);
         app.println();
-        app.printMessage(msg);
+        app.println(msg);
+        app.println();
         return null;
       }
 
     };
 
-    return getConsoleApplication().readValidatedInput(msg, validator);
+    app.println();
+    app.println();
+
+    // Display additional help if the name is a naming property.
+    Message ufn = d.getUserFriendlyName();
+    PropertyDefinition<?> pd = irelation.getNamingPropertyDefinition();
+    if (pd != null) {
+      app.println(INFO_DSCFG_CREATE_NAME_PROMPT_NAMING.get(ufn, pd.getName()));
+
+      app.println();
+      app.println(pd.getSynopsis(), 4);
+
+      if (pd.getDescription() != null) {
+        app.println();
+        app.println(pd.getDescription(), 4);
+      }
+
+      PropertyDefinitionUsageBuilder b = new PropertyDefinitionUsageBuilder(
+          true);
+      app.println();
+      app.println(INFO_EDITOR_HEADING_SYNTAX.get(b.getUsage(pd)), 4);
+      app.println();
+
+      return app.readValidatedInput(INFO_DSCFG_CREATE_NAME_PROMPT_NAMING_CONT
+          .get(ufn), validator);
+    } else {
+      return app.readValidatedInput(INFO_DSCFG_CREATE_NAME_PROMPT.get(ufn),
+          validator);
+    }
   }
 
 
@@ -752,8 +826,8 @@
 
     // Process its sub-definitions.
     String suffix = "-" + d.getName();
-    for (AbstractManagedObjectDefinition<? extends C, ? extends S> c :
-        d.getAllChildren()) {
+    for (AbstractManagedObjectDefinition<? extends C, ? extends S> c : d
+        .getAllChildren()) {
       if (c instanceof ManagedObjectDefinition) {
         ManagedObjectDefinition<? extends C, ? extends S> mod =
           (ManagedObjectDefinition<? extends C, ? extends S>) c;

--
Gitblit v1.10.0