From 95df5cfdba474acb03076953e992b898fbb277a8 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Mon, 02 Feb 2009 23:37:54 +0000
Subject: [PATCH] Fix issue 3734 - Make network group policies extensible.

---
 opends/src/server/org/opends/server/tools/dsconfig/DeleteSubCommandHandler.java |   58 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 52 insertions(+), 6 deletions(-)

diff --git a/opends/src/server/org/opends/server/tools/dsconfig/DeleteSubCommandHandler.java b/opends/src/server/org/opends/server/tools/dsconfig/DeleteSubCommandHandler.java
index cb0c959..6ab4000 100644
--- a/opends/src/server/org/opends/server/tools/dsconfig/DeleteSubCommandHandler.java
+++ b/opends/src/server/org/opends/server/tools/dsconfig/DeleteSubCommandHandler.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2009 Sun Microsystems, Inc.
  */
 package org.opends.server.tools.dsconfig;
 
@@ -31,14 +31,17 @@
 import static org.opends.messages.DSConfigMessages.*;
 
 import java.util.List;
+import java.util.SortedMap;
 
 import org.opends.messages.Message;
 import org.opends.server.admin.DefinitionDecodingException;
 import org.opends.server.admin.InstantiableRelationDefinition;
+import org.opends.server.admin.ManagedObjectDefinition;
 import org.opends.server.admin.ManagedObjectNotFoundException;
 import org.opends.server.admin.ManagedObjectPath;
 import org.opends.server.admin.OptionalRelationDefinition;
 import org.opends.server.admin.RelationDefinition;
+import org.opends.server.admin.SetRelationDefinition;
 import org.opends.server.admin.client.AuthorizationException;
 import org.opends.server.admin.client.CommunicationException;
 import org.opends.server.admin.client.ConcurrentModificationException;
@@ -122,6 +125,29 @@
     return new DeleteSubCommandHandler(parser, p, r, p.child(r));
   }
 
+
+
+  /**
+   * Creates a new delete-xxx sub-command for a set relation.
+   *
+   * @param parser
+   *          The sub-command argument parser.
+   * @param p
+   *          The parent managed object path.
+   * @param r
+   *          The set relation.
+   * @return Returns the new delete-xxx sub-command.
+   * @throws ArgumentException
+   *           If the sub-command could not be created successfully.
+   */
+  public static DeleteSubCommandHandler create(
+      SubCommandArgumentParser parser, ManagedObjectPath<?, ?> p,
+      SetRelationDefinition<?, ?> r) throws ArgumentException {
+    return new DeleteSubCommandHandler(parser, p, r, p.child(r));
+  }
+
+
+
   // The argument which should be used to force deletion.
   private final BooleanArgument forceArgument;
 
@@ -255,14 +281,13 @@
 
     ManagedObject<?> parent = result.getValue();
     try {
-      if (relation instanceof InstantiableRelationDefinition) {
-        InstantiableRelationDefinition<?, ?> irelation =
-          (InstantiableRelationDefinition<?, ?>) relation;
+      if (relation instanceof InstantiableRelationDefinition
+          || relation instanceof SetRelationDefinition) {
         String childName = names.get(names.size() - 1);
 
         if (childName == null) {
           MenuResult<String> sresult =
-            readChildName(app, parent, irelation, null);
+            readChildName(app, parent, relation, null);
 
           if (sresult.isQuit()) {
             if (!app.isMenuDrivenMode()) {
@@ -277,11 +302,32 @@
           } else {
             childName = sresult.getValue();
           }
+        } else if (relation instanceof SetRelationDefinition) {
+          // The provided type short name needs mapping to the full name.
+          String name = childName.trim();
+          SortedMap types = getSubTypes(relation.getChildDefinition());
+          ManagedObjectDefinition cd =
+            (ManagedObjectDefinition) types.get(name);
+          if (cd == null) {
+            // The name must be invalid.
+            String typeUsage = getSubTypesUsage(relation.getChildDefinition());
+            Message msg = ERR_DSCFG_ERROR_SUB_TYPE_UNRECOGNIZED.get(
+                name, relation.getUserFriendlyName(), typeUsage);
+            throw new ArgumentException(msg);
+          } else {
+            childName = cd.getName();
+          }
         }
 
         if (confirmDeletion(app)) {
           setCommandBuilderUseful(true);
-          parent.removeChild(irelation, childName);
+          if (relation instanceof InstantiableRelationDefinition) {
+            parent.removeChild((InstantiableRelationDefinition<?,?>) relation,
+                childName);
+          } else {
+            parent.removeChild((SetRelationDefinition<?,?>) relation,
+                childName);
+          }
         } else {
           return MenuResult.cancel();
         }

--
Gitblit v1.10.0