From c950fe2ad987d5669df1927ba79d4c4080fc55e9 Mon Sep 17 00:00:00 2001
From: jcambon <jcambon@localhost>
Date: Thu, 22 Nov 2007 14:12:42 +0000
Subject: [PATCH] 

---
 opends/src/server/org/opends/server/admin/client/ldap/LDAPConnection.java                             |    7 +++
 opends/src/server/org/opends/server/admin/client/spi/Driver.java                                      |    7 +++
 opends/src/server/org/opends/server/admin/client/ldap/JNDIDirContextAdaptor.java                      |   12 ++++++
 opends/tests/unit-tests-testng/src/server/org/opends/server/admin/client/ldap/MockLDAPConnection.java |    5 ++
 opends/src/server/org/opends/server/admin/client/ManagementContext.java                               |   11 +++++
 opends/src/server/org/opends/server/tools/dsconfig/DSConfig.java                                      |   36 +++++++++++------
 opends/src/server/org/opends/server/admin/client/ldap/LDAPDriver.java                                 |    9 ++++
 7 files changed, 74 insertions(+), 13 deletions(-)

diff --git a/opends/src/server/org/opends/server/admin/client/ManagementContext.java b/opends/src/server/org/opends/server/admin/client/ManagementContext.java
index ca4771c..1849260 100644
--- a/opends/src/server/org/opends/server/admin/client/ManagementContext.java
+++ b/opends/src/server/org/opends/server/admin/client/ManagementContext.java
@@ -422,4 +422,15 @@
    *         context.
    */
   protected abstract Driver getDriver();
+
+
+
+ /**
+   * Close the associated management context.
+   *
+   */
+  public void close() {
+    this.getDriver().close();
+  }
+
 }
diff --git a/opends/src/server/org/opends/server/admin/client/ldap/JNDIDirContextAdaptor.java b/opends/src/server/org/opends/server/admin/client/ldap/JNDIDirContextAdaptor.java
index 23ff928..00ca737 100644
--- a/opends/src/server/org/opends/server/admin/client/ldap/JNDIDirContextAdaptor.java
+++ b/opends/src/server/org/opends/server/admin/client/ldap/JNDIDirContextAdaptor.java
@@ -240,4 +240,16 @@
     return dirContext.getAttributes(dn, attrIdList);
   }
 
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void unbind() {
+    try {
+      dirContext.close();
+    } catch (NamingException e) {
+      // nothing to do
+    }
+  }
 }
diff --git a/opends/src/server/org/opends/server/admin/client/ldap/LDAPConnection.java b/opends/src/server/org/opends/server/admin/client/ldap/LDAPConnection.java
index 0fc5487..5e1f207 100644
--- a/opends/src/server/org/opends/server/admin/client/ldap/LDAPConnection.java
+++ b/opends/src/server/org/opends/server/admin/client/ldap/LDAPConnection.java
@@ -139,4 +139,11 @@
    */
   public abstract Attributes readEntry(LdapName dn, Collection<String> attrIds)
       throws NamingException;
+
+
+  /**
+   * Close the associated management context.
+   *
+   */
+  public abstract void unbind();
 }
diff --git a/opends/src/server/org/opends/server/admin/client/ldap/LDAPDriver.java b/opends/src/server/org/opends/server/admin/client/ldap/LDAPDriver.java
index 8b90e8e..7f790ec 100644
--- a/opends/src/server/org/opends/server/admin/client/ldap/LDAPDriver.java
+++ b/opends/src/server/org/opends/server/admin/client/ldap/LDAPDriver.java
@@ -408,6 +408,15 @@
   }
 
 
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void close() {
+    connection.unbind();
+  }
+
+
 
   /**
    * {@inheritDoc}
diff --git a/opends/src/server/org/opends/server/admin/client/spi/Driver.java b/opends/src/server/org/opends/server/admin/client/spi/Driver.java
index 64ff4e9..c4ae4ea 100644
--- a/opends/src/server/org/opends/server/admin/client/spi/Driver.java
+++ b/opends/src/server/org/opends/server/admin/client/spi/Driver.java
@@ -656,6 +656,13 @@
       CommunicationException;
 
 
+  /**
+   * Close the associated management context.
+   *
+   */
+  public void close() {
+    // do nothing by default
+  }
 
   /**
    * Deletes the named managed object.
diff --git a/opends/src/server/org/opends/server/tools/dsconfig/DSConfig.java b/opends/src/server/org/opends/server/tools/dsconfig/DSConfig.java
index 60caf23..b069817 100644
--- a/opends/src/server/org/opends/server/tools/dsconfig/DSConfig.java
+++ b/opends/src/server/org/opends/server/tools/dsconfig/DSConfig.java
@@ -719,26 +719,36 @@
       return 1;
     }
 
+    int retCode = 0;
     if (parser.getSubCommand() == null) {
       hasSubCommand = false;
 
       if (isInteractive()) {
-        // Top-level interactive mode.
-        return runInteractiveMode();
+          // Top-level interactive mode.
+          retCode = runInteractiveMode();
+        } else {
+          Message message = ERR_ERROR_PARSING_ARGS
+              .get(ERR_DSCFG_ERROR_MISSING_SUBCOMMAND.get());
+          displayMessageAndUsageReference(message);
+          retCode = 1;
+        }
       } else {
-        Message message = ERR_ERROR_PARSING_ARGS
-            .get(ERR_DSCFG_ERROR_MISSING_SUBCOMMAND.get());
-        displayMessageAndUsageReference(message);
-        return 1;
-      }
-    } else {
-      hasSubCommand = true;
+        hasSubCommand = true;
 
-      // Retrieve the sub-command implementation and run it.
-      SubCommandHandler handler = handlers.get(parser.getSubCommand());
-      return runSubCommand(handler);
+        // Retrieve the sub-command implementation and run it.
+        SubCommandHandler handler = handlers.get(parser.getSubCommand());
+        retCode = runSubCommand(handler);
+      }
+
+      try {
+        // Close the Management context ==> an LDAP UNBIND is sent
+        factory.getManagementContext(this).close();
+      } catch (Exception e) {
+      // Nothing to report in this case
+      }
+
+      return retCode;
     }
-  }
 
 
 
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/admin/client/ldap/MockLDAPConnection.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/admin/client/ldap/MockLDAPConnection.java
index 1b2589d..e48a481 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/admin/client/ldap/MockLDAPConnection.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/admin/client/ldap/MockLDAPConnection.java
@@ -355,4 +355,9 @@
     return entries.get(name);
   }
 
+  @Override
+  public void unbind() {
+    // nothing to do
+  }
+
 }

--
Gitblit v1.10.0