From 4ffd9fe47a44245d8a9f579e6e22bea655f97bbd 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.

---
 opendj-sdk/opends/src/server/org/opends/server/tools/dsconfig/DeleteSubCommandHandler.java |  218 ++++++++++++++++++++++++++++++++----------------------
 1 files changed, 130 insertions(+), 88 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/dsconfig/DeleteSubCommandHandler.java b/opendj-sdk/opends/src/server/org/opends/server/tools/dsconfig/DeleteSubCommandHandler.java
index cced653..e24bbfd 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/dsconfig/DeleteSubCommandHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/dsconfig/DeleteSubCommandHandler.java
@@ -25,14 +25,14 @@
  *      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.List;
 
+import org.opends.messages.Message;
 import org.opends.server.admin.DefinitionDecodingException;
 import org.opends.server.admin.InstantiableRelationDefinition;
 import org.opends.server.admin.ManagedObjectNotFoundException;
@@ -44,6 +44,7 @@
 import org.opends.server.admin.client.ConcurrentModificationException;
 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.OperationRejectedException;
 import org.opends.server.protocols.ldap.LDAPResultCode;
 import org.opends.server.tools.ClientException;
@@ -52,6 +53,9 @@
 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.MenuResult;
 
 
 
@@ -79,8 +83,6 @@
    * Creates a new delete-xxx sub-command for an instantiable
    * relation.
    *
-   * @param app
-   *          The console application.
    * @param parser
    *          The sub-command argument parser.
    * @param p
@@ -91,10 +93,10 @@
    * @throws ArgumentException
    *           If the sub-command could not be created successfully.
    */
-  public static DeleteSubCommandHandler create(ConsoleApplication app,
+  public static DeleteSubCommandHandler create(
       SubCommandArgumentParser parser, ManagedObjectPath<?, ?> p,
       InstantiableRelationDefinition<?, ?> r) throws ArgumentException {
-    return new DeleteSubCommandHandler(app, parser, p, r, p.child(r, "DUMMY"));
+    return new DeleteSubCommandHandler(parser, p, r, p.child(r, "DUMMY"));
   }
 
 
@@ -102,8 +104,6 @@
   /**
    * Creates a new delete-xxx sub-command for an optional relation.
    *
-   * @param app
-   *          The console application.
    * @param parser
    *          The sub-command argument parser.
    * @param p
@@ -114,10 +114,10 @@
    * @throws ArgumentException
    *           If the sub-command could not be created successfully.
    */
-  public static DeleteSubCommandHandler create(ConsoleApplication app,
+  public static DeleteSubCommandHandler create(
       SubCommandArgumentParser parser, ManagedObjectPath<?, ?> p,
       OptionalRelationDefinition<?, ?> r) throws ArgumentException {
-    return new DeleteSubCommandHandler(app, parser, p, r, p.child(r));
+    return new DeleteSubCommandHandler(parser, p, r, p.child(r));
   }
 
   // The argument which should be used to force deletion.
@@ -139,12 +139,10 @@
 
 
   // Private constructor.
-  private DeleteSubCommandHandler(ConsoleApplication app,
+  private DeleteSubCommandHandler(
       SubCommandArgumentParser parser, ManagedObjectPath<?, ?> p,
       RelationDefinition<?, ?> r, ManagedObjectPath<?, ?> c)
       throws ArgumentException {
-    super(app);
-
     this.path = p;
     this.relation = r;
 
@@ -171,6 +169,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
@@ -184,19 +195,21 @@
    * {@inheritDoc}
    */
   @Override
-  public int run() throws ArgumentException, ClientException {
+  public MenuResult<Integer> run(ConsoleApplication app,
+      ManagementContextFactory factory) throws ArgumentException,
+      ClientException, CLIException {
     // Get the naming argument values.
-    List<String> names = getNamingArgValues(namingArgs);
+    List<String> names = getNamingArgValues(app, namingArgs);
 
     // Delete the child managed object.
-    ManagedObject<?> parent = null;
+    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_DELETE_AUTHZ.get(relation.getUserFriendlyName());
-      throw new ClientException(LDAPResultCode.INSUFFICIENT_ACCESS_RIGHTS,
-          msg);
+      Message msg = ERR_DSCFG_ERROR_DELETE_AUTHZ.get(relation
+          .getUserFriendlyName());
+      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);
@@ -206,95 +219,124 @@
       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_DELETE_CE.get(
-          relation.getUserFriendlyName(), e.getMessage());
+      Message msg = ERR_DSCFG_ERROR_DELETE_CE.get(relation
+          .getUserFriendlyName(), e.getMessage());
       throw new ClientException(LDAPResultCode.CLIENT_SIDE_SERVER_DOWN, msg);
     } catch (ConcurrentModificationException e) {
-      Message msg =
-          ERR_DSCFG_ERROR_DELETE_CME.get(relation.getUserFriendlyName());
-      throw new ClientException(LDAPResultCode.CONSTRAINT_VIOLATION,
-          msg);
+      Message msg = ERR_DSCFG_ERROR_DELETE_CME.get(relation
+          .getUserFriendlyName());
+      throw new ClientException(LDAPResultCode.CONSTRAINT_VIOLATION, msg);
     } catch (ManagedObjectNotFoundException e) {
       // Ignore the error if the deletion is being forced.
       if (!forceArgument.isPresent()) {
         Message ufn = path.getManagedObjectDefinition().getUserFriendlyName();
         Message msg = ERR_DSCFG_ERROR_GET_PARENT_MONFE.get(ufn);
         throw new ClientException(LDAPResultCode.NO_SUCH_OBJECT, msg);
+      } else {
+        return MenuResult.success(0);
       }
     }
 
-    if (parent != null) {
-      try {
-        if (relation instanceof InstantiableRelationDefinition) {
-          InstantiableRelationDefinition<?, ?> irelation =
-            (InstantiableRelationDefinition<?, ?>) relation;
-          String childName = names.get(names.size() - 1);
-          if (childName == null) {
-            childName = readChildName(parent, irelation, null);
-          }
-
-          if (confirmDeletion()) {
-            parent.removeChild(irelation, childName);
-          } else {
-            return 1;
-          }
-        } else if (relation instanceof OptionalRelationDefinition) {
-          OptionalRelationDefinition<?, ?> orelation =
-            (OptionalRelationDefinition<?, ?>) relation;
-
-          if (confirmDeletion()) {
-            parent.removeChild(orelation);
-          } else {
-            return 1;
-          }
-        }
-      } catch (AuthorizationException e) {
-        Message msg =
-            ERR_DSCFG_ERROR_DELETE_AUTHZ.get(relation.getUserFriendlyName());
-        throw new ClientException(LDAPResultCode.INSUFFICIENT_ACCESS_RIGHTS,
-            msg);
-      } catch (OperationRejectedException e) {
-        Message msg = ERR_DSCFG_ERROR_DELETE_ORE.get(
-            relation.getUserFriendlyName(), e.getMessage());
-        throw new ClientException(LDAPResultCode.CONSTRAINT_VIOLATION, msg);
-      } catch (ManagedObjectNotFoundException e) {
-        // Ignore the error if the deletion is being forced.
-        if (!forceArgument.isPresent()) {
-          Message msg =
-              ERR_DSCFG_ERROR_DELETE_MONFE.get(relation.getUserFriendlyName());
-          throw new ClientException(LDAPResultCode.NO_SUCH_OBJECT, msg);
-        }
-      } catch (ConcurrentModificationException e) {
-        Message msg =
-            ERR_DSCFG_ERROR_DELETE_CME.get(relation.getUserFriendlyName());
-        throw new ClientException(LDAPResultCode.CONSTRAINT_VIOLATION, msg);
-      } catch (CommunicationException e) {
-        Message msg = ERR_DSCFG_ERROR_DELETE_CE.get(
-            relation.getUserFriendlyName(), e.getMessage());
-        throw new ClientException(LDAPResultCode.CLIENT_SIDE_SERVER_DOWN,
-            msg);
+    if (result.isQuit()) {
+      if (!app.isMenuDrivenMode()) {
+        // User chose to cancel deletion.
+        Message msg = INFO_DSCFG_CONFIRM_DELETE_FAIL.get(relation
+            .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 {
+      if (relation instanceof InstantiableRelationDefinition) {
+        InstantiableRelationDefinition<?, ?> irelation =
+          (InstantiableRelationDefinition<?, ?>) relation;
+        String childName = names.get(names.size() - 1);
+
+        if (childName == null) {
+          MenuResult<String> sresult =
+            readChildName(app, parent, irelation, null);
+
+          if (sresult.isQuit()) {
+            if (!app.isMenuDrivenMode()) {
+              // User chose to cancel deletion.
+              Message msg = INFO_DSCFG_CONFIRM_DELETE_FAIL.get(relation
+                  .getUserFriendlyName());
+              app.printVerboseMessage(msg);
+            }
+            return MenuResult.quit();
+          } else if (sresult.isCancel()) {
+            // Must be menu driven, so no need for error message.
+            return MenuResult.cancel();
+          } else {
+            childName = sresult.getValue();
+          }
+        }
+
+        if (confirmDeletion(app)) {
+          parent.removeChild(irelation, childName);
+        } else {
+          return MenuResult.cancel();
+        }
+      } else if (relation instanceof OptionalRelationDefinition) {
+        OptionalRelationDefinition<?, ?> orelation =
+          (OptionalRelationDefinition<?, ?>) relation;
+
+        if (confirmDeletion(app)) {
+          parent.removeChild(orelation);
+        } else {
+          return MenuResult.cancel();
+        }
+      }
+    } catch (AuthorizationException e) {
+      Message msg = ERR_DSCFG_ERROR_DELETE_AUTHZ.get(relation
+          .getUserFriendlyName());
+      throw new ClientException(LDAPResultCode.INSUFFICIENT_ACCESS_RIGHTS, msg);
+    } catch (OperationRejectedException e) {
+      Message msg = ERR_DSCFG_ERROR_DELETE_ORE.get(relation
+          .getUserFriendlyName(), e.getMessage());
+      throw new ClientException(LDAPResultCode.CONSTRAINT_VIOLATION, msg);
+    } catch (ManagedObjectNotFoundException e) {
+      // Ignore the error if the deletion is being forced.
+      if (!forceArgument.isPresent()) {
+        Message msg = ERR_DSCFG_ERROR_DELETE_MONFE.get(relation
+            .getUserFriendlyName());
+        throw new ClientException(LDAPResultCode.NO_SUCH_OBJECT, msg);
+      }
+    } catch (ConcurrentModificationException e) {
+      Message msg = ERR_DSCFG_ERROR_DELETE_CME.get(relation
+          .getUserFriendlyName());
+      throw new ClientException(LDAPResultCode.CONSTRAINT_VIOLATION, msg);
+    } catch (CommunicationException e) {
+      Message msg = ERR_DSCFG_ERROR_DELETE_CE.get(relation
+          .getUserFriendlyName(), e.getMessage());
+      throw new ClientException(LDAPResultCode.CLIENT_SIDE_SERVER_DOWN, msg);
     }
 
     // Output success message.
-    Message msg =
-        INFO_DSCFG_CONFIRM_DELETE_SUCCESS.get(relation.getUserFriendlyName());
-    getConsoleApplication().printVerboseMessage(msg);
+    Message msg = INFO_DSCFG_CONFIRM_DELETE_SUCCESS.get(relation
+        .getUserFriendlyName());
+    app.printVerboseMessage(msg);
 
-    return 0;
+    return MenuResult.success(0);
   }
 
 
 
   // Confirm deletion.
-  private boolean confirmDeletion() throws ArgumentException {
-    Message prompt =
-        INFO_DSCFG_CONFIRM_DELETE.get(relation.getUserFriendlyName());
-    if (!getConsoleApplication().confirmAction(prompt)) {
+  private boolean confirmDeletion(ConsoleApplication app) throws CLIException {
+    Message prompt = INFO_DSCFG_CONFIRM_DELETE.get(relation
+        .getUserFriendlyName());
+    app.println();
+    if (!app.confirmAction(prompt, false)) {
       // Output failure message.
-      Message msg =
-          INFO_DSCFG_CONFIRM_DELETE_FAIL.get(relation.getUserFriendlyName());
-      getConsoleApplication().printVerboseMessage(msg);
+      Message msg = INFO_DSCFG_CONFIRM_DELETE_FAIL.get(relation
+          .getUserFriendlyName());
+      app.printVerboseMessage(msg);
       return false;
     } else {
       return true;

--
Gitblit v1.10.0