From 584e553adecf9201dcbbc3b61c38358a777438a5 Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Tue, 13 Mar 2007 21:01:59 +0000
Subject: [PATCH] Update the LDAPConnection object and the classes that use it to ensure that it can perform an unbind before closing the connection.

---
 opendj-sdk/opends/src/server/org/opends/server/tools/LDAPSearch.java     |   14 +++++-
 opendj-sdk/opends/src/server/org/opends/server/tools/LDAPModify.java     |   13 +++++-
 opendj-sdk/opends/src/server/org/opends/server/tools/LDAPCompare.java    |   12 +++++-
 opendj-sdk/opends/src/server/org/opends/server/tools/LDAPDelete.java     |   12 +++++-
 opendj-sdk/opends/src/server/org/opends/server/tools/LDAPConnection.java |   20 +++++++++-
 opendj-sdk/opends/src/dsml/org/opends/dsml/protocol/DSMLServlet.java     |    3 +
 6 files changed, 61 insertions(+), 13 deletions(-)

diff --git a/opendj-sdk/opends/src/dsml/org/opends/dsml/protocol/DSMLServlet.java b/opendj-sdk/opends/src/dsml/org/opends/dsml/protocol/DSMLServlet.java
index c180411..f59e435 100644
--- a/opendj-sdk/opends/src/dsml/org/opends/dsml/protocol/DSMLServlet.java
+++ b/opendj-sdk/opends/src/dsml/org/opends/dsml/protocol/DSMLServlet.java
@@ -51,6 +51,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.StringTokenizer;
+import java.util.concurrent.atomic.AtomicInteger;
 
 
 /**
@@ -302,7 +303,7 @@
       }
     } finally {
       if (connection != null) {
-        connection.close();
+        connection.close(new AtomicInteger(1));
       }
     }
   }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPCompare.java b/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPCompare.java
index c27096e..c9cc832 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPCompare.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPCompare.java
@@ -808,6 +808,7 @@
       }
     }
 
+    LDAPCompare ldapCompare = null;
     try
     {
       if (initializeServer)
@@ -843,7 +844,7 @@
       connection.connectToHost(bindDNValue, bindPasswordValue, nextMessageID);
 
 
-      LDAPCompare ldapCompare = new LDAPCompare(nextMessageID, out, err);
+      ldapCompare = new LDAPCompare(nextMessageID, out, err);
       if(fileNameValue == null && dnStrings.isEmpty())
       {
         // Read from stdin.
@@ -891,7 +892,14 @@
     {
       if(connection != null)
       {
-        connection.close();
+        if (ldapCompare == null)
+        {
+          connection.close(null);
+        }
+        else
+        {
+          connection.close(ldapCompare.nextMessageID);
+        }
       }
     }
     return 0;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPConnection.java b/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPConnection.java
index c5cd8c8..738f174 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPConnection.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPConnection.java
@@ -45,6 +45,7 @@
 import org.opends.server.protocols.ldap.ExtendedResponseProtocolOp;
 import org.opends.server.protocols.ldap.LDAPControl;
 import org.opends.server.protocols.ldap.LDAPMessage;
+import org.opends.server.protocols.ldap.UnbindRequestProtocolOp;
 import org.opends.server.types.Control;
 import org.opends.server.types.DebugLogLevel;
 
@@ -418,13 +419,28 @@
   }
 
   /**
-   * Close the underlying ASN1 reader and writer.
+   * Close the underlying ASN1 reader and writer, optionally sending an unbind
+   * request before disconnecting.
    *
+   * @param  nextMessageID  The message ID counter that should be used for
+   *                        the unbind request, or {@code null} if the
+   *                        connection should be closed without an unbind
+   *                        request.
    */
-  public void close()
+  public void close(AtomicInteger nextMessageID)
   {
     if(asn1Writer != null)
     {
+      if (nextMessageID != null)
+      {
+        try
+        {
+          LDAPMessage message = new LDAPMessage(nextMessageID.getAndIncrement(),
+                                                new UnbindRequestProtocolOp());
+          asn1Writer.writeElement(message.encode());
+        } catch (Exception e) {}
+      }
+
       asn1Writer.close();
     }
     if(asn1Reader != null)
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPDelete.java b/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPDelete.java
index 4cdb3e9..5d38681 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPDelete.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPDelete.java
@@ -688,6 +688,7 @@
       }
     }
 
+    LDAPDelete ldapDelete = null;
     try
     {
       if (initializeServer)
@@ -722,7 +723,7 @@
                                       connectionOptions, out, err);
       connection.connectToHost(bindDNValue, bindPasswordValue, nextMessageID);
 
-      LDAPDelete ldapDelete = new LDAPDelete(nextMessageID, out, err);
+      ldapDelete = new LDAPDelete(nextMessageID, out, err);
       if(fileNameValue == null && dnStrings.isEmpty())
       {
         // Read from stdin.
@@ -769,7 +770,14 @@
     {
       if(connection != null)
       {
-        connection.close();
+        if (ldapDelete == null)
+        {
+          connection.close(null);
+        }
+        else
+        {
+          connection.close(ldapDelete.nextMessageID);
+        }
       }
     }
     return 0;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPModify.java b/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPModify.java
index 294f997..61da732 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPModify.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPModify.java
@@ -1051,6 +1051,7 @@
       }
     }
 
+    LDAPModify ldapModify = null;
     try
     {
       if (initializeServer)
@@ -1085,8 +1086,7 @@
                                       connectionOptions, out, err);
       connection.connectToHost(bindDNValue, bindPasswordValue, nextMessageID);
 
-      LDAPModify ldapModify = new LDAPModify(fileNameValue, nextMessageID,
-                                             out, err);
+      ldapModify = new LDAPModify(fileNameValue, nextMessageID, out, err);
       InputStream is = System.in;
       if(fileNameValue != null)
       {
@@ -1123,7 +1123,14 @@
     {
       if(connection != null)
       {
-        connection.close();
+        if (ldapModify == null)
+        {
+          connection.close(null);
+        }
+        else
+        {
+          connection.close(ldapModify.nextMessageID);
+        }
       }
     }
     return 0;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPSearch.java b/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPSearch.java
index e0f47cd..e080026 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPSearch.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/LDAPSearch.java
@@ -1329,6 +1329,7 @@
       wrapColumn = 0;
     }
 
+    LDAPSearch ldapSearch = null;
     try
     {
       if (initializeServer)
@@ -1386,7 +1387,7 @@
                new PagedResultsControl(true, pageSize, cookieValue)));
           searchOptions.setControls(newControls);
 
-          LDAPSearch ldapSearch = new LDAPSearch(nextMessageID, out, err);
+          ldapSearch = new LDAPSearch(nextMessageID, out, err);
           matchingEntries += ldapSearch.executeSearch(connection, baseDNValue,
                                                       filters, attributes,
                                                       searchOptions,
@@ -1432,7 +1433,7 @@
       }
       else
       {
-        LDAPSearch ldapSearch = new LDAPSearch(nextMessageID, out, err);
+        ldapSearch = new LDAPSearch(nextMessageID, out, err);
         matchingEntries = ldapSearch.executeSearch(connection, baseDNValue,
                                                    filters, attributes,
                                                    searchOptions, wrapColumn);
@@ -1477,7 +1478,14 @@
     {
       if(connection != null)
       {
-        connection.close();
+        if (ldapSearch == null)
+        {
+          connection.close(null);
+        }
+        else
+        {
+          connection.close(ldapSearch.nextMessageID);
+        }
       }
     }
   }

--
Gitblit v1.10.0