From 269f7aacbeb854f2bc1a20fa5d004dd8d189595e Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 19 Mar 2013 09:11:48 +0000
Subject: [PATCH] OPENDJ-808 Implement a simple commons REST based HTTP connection handler

---
 opendj-sdk/opends/src/server/org/opends/server/util/StaticUtils.java                     |   27 +++++++++++++
 opendj-sdk/opends/src/server/org/opends/server/extensions/StartTLSExtendedOperation.java |    7 +--
 opendj-sdk/opends/src/server/org/opends/server/extensions/TLSCapableConnection.java      |    3 +
 opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java  |   45 ++++++----------------
 4 files changed, 44 insertions(+), 38 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/StartTLSExtendedOperation.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/StartTLSExtendedOperation.java
index 1854c48..f4d031d 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/StartTLSExtendedOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/StartTLSExtendedOperation.java
@@ -23,6 +23,7 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2013 ForgeRock AS
  */
 package org.opends.server.extensions;
 
@@ -132,8 +133,6 @@
     if (clientConnection == null)
     {
       operation.setResultCode(ResultCode.UNAVAILABLE);
-
-
       operation.appendErrorMessage(ERR_STARTTLS_NO_CLIENT_CONNECTION.get());
       return;
     }
@@ -149,14 +148,12 @@
     else
     {
       operation.setResultCode(ResultCode.UNAVAILABLE);
-
-
       operation.appendErrorMessage(ERR_STARTTLS_NOT_TLS_CAPABLE.get());
       return;
     }
 
     MessageBuilder unavailableReason = new MessageBuilder();
-    if (! tlsCapableConnection.isTLSAvailable(unavailableReason))
+    if (! tlsCapableConnection.isStartTLSAvailable(unavailableReason))
     {
       operation.setResultCode(ResultCode.UNAVAILABLE);
       operation.setErrorMessage(unavailableReason);
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/TLSCapableConnection.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/TLSCapableConnection.java
index 9b942a0..4606e6c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/TLSCapableConnection.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/TLSCapableConnection.java
@@ -23,6 +23,7 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2013 ForgeRock AS
  */
 package org.opends.server.extensions;
 import org.opends.messages.MessageBuilder;
@@ -51,6 +52,6 @@
    * @return  <CODE>true</CODE> if TLS is available on the underlying client
    *          connection, or <CODE>false</CODE> if it is not.
    */
-  public boolean isTLSAvailable(MessageBuilder unavailableReason);
+  public boolean isStartTLSAvailable(MessageBuilder unavailableReason);
 }
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java b/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
index 882394a..3f6f0be 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
@@ -34,12 +34,10 @@
 import static org.opends.server.core.DirectoryServer.getMaxInternalBufferSize;
 import static org.opends.server.loggers.AccessLogger.logDisconnect;
 import static org.opends.server.loggers.ErrorLogger.logError;
-import static org.opends.server.loggers.debug.DebugLogger.debugEnabled;
-import static org.opends.server.loggers.debug.DebugLogger.getTracer;
+import static org.opends.server.loggers.debug.DebugLogger.*;
 import static org.opends.server.protocols.ldap.LDAPConstants.*;
 import static org.opends.server.util.ServerConstants.OID_START_TLS_REQUEST;
-import static org.opends.server.util.StaticUtils.getExceptionMessage;
-import static org.opends.server.util.StaticUtils.stackTraceToSingleLineString;
+import static org.opends.server.util.StaticUtils.*;
 
 import java.io.IOException;
 import java.net.InetAddress;
@@ -92,15 +90,15 @@
    */
   private static final class ConnectionFinalizerJob implements Runnable
   {
-    // The client connection ASN1 reader.
+    /** The client connection ASN1 reader. */
     private final ASN1Reader asn1Reader;
 
-    // The client connection socket channel.
+    /** The client connection socket channel. */
     private final SocketChannel socketChannel;
 
-    // Creates a new connection finalizer job.
-    private ConnectionFinalizerJob(long connectionID,
-        ASN1Reader asn1Reader, SocketChannel socketChannel)
+    /** Creates a new connection finalizer job. */
+    private ConnectionFinalizerJob(ASN1Reader asn1Reader,
+        SocketChannel socketChannel)
     {
       this.asn1Reader = asn1Reader;
       this.socketChannel = socketChannel;
@@ -996,16 +994,9 @@
     finally
     {
       // Clear and reset all of the internal buffers ready for the next usage.
-      try
-      {
-        // The ASN1Writer is based on a ByteStringBuilder so closing will cause
-        // the internal buffers to be resized if needed.
-        holder.writer.close();
-      }
-      catch (IOException ignored)
-      {
-        // Unreachable.
-      }
+      // The ASN1Writer is based on a ByteStringBuilder so closing will cause
+      // the internal buffers to be resized if needed.
+      close(holder.writer);
     }
  }
 
@@ -1078,16 +1069,7 @@
 
     // If there is a write selector for this connection, then close it.
     Selector selector = writeSelector.get();
-    if (selector != null)
-    {
-      try
-      {
-        selector.close();
-      }
-      catch (Exception e)
-      {
-      }
-    }
+    close(selector);
 
     // See if we should send a notification to the client. If so, then
     // construct and send a notice of disconnection unsolicited
@@ -1152,8 +1134,7 @@
     }
 
     // Enqueue the connection channels for closing by the finalizer.
-    Runnable r =
-      new ConnectionFinalizerJob(connectionID, asn1Reader, clientChannel);
+    Runnable r = new ConnectionFinalizerJob(asn1Reader, clientChannel);
     connectionHandler.registerConnectionFinalizer(r);
 
     // NYI -- Deregister the client connection from any server components that
@@ -2526,7 +2507,7 @@
    * @return <CODE>true</CODE> if TLS is available on the underlying
    *         client connection, or <CODE>false</CODE> if it is not.
    */
-  public boolean isTLSAvailable(MessageBuilder unavailableReason)
+  public boolean isStartTLSAvailable(MessageBuilder unavailableReason)
   {
     if (isSecure() && activeProvider.getName().equals("TLS"))
     {
diff --git a/opendj-sdk/opends/src/server/org/opends/server/util/StaticUtils.java b/opendj-sdk/opends/src/server/org/opends/server/util/StaticUtils.java
index 699de07..45f528d 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/util/StaticUtils.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/util/StaticUtils.java
@@ -4639,6 +4639,33 @@
   }
 
   /**
+   * Closes the provided {@link Selector}'s ignoring any errors which occurred.
+   * <p>
+   * With java 7 we will be able to use {@link StaticUtils#close(Closeable...)}
+   * </p>
+   *
+   * @param selectors
+   *          The selectors to be closed, which may be <code>null</code>.
+   */
+  public static void close(Selector... selectors)
+  {
+    for (Selector selector : selectors)
+    {
+      if (selector != null)
+      {
+        try
+        {
+          selector.close();
+        }
+        catch (IOException ignored)
+        {
+          // Ignore.
+        }
+      }
+    }
+  }
+
+  /**
    * Returns an {@link Iterable} returning the passed in {@link Iterator}. THis
    * allows using methods returning Iterators with foreach statements.
    * <p>

--
Gitblit v1.10.0