From 5d9f190f1cb83d0c4f9c5e83079fa6dabf8bb5a5 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Fri, 10 Feb 2012 11:34:37 +0000
Subject: [PATCH] Preparation work for OPENDJ-420: Rare SSLExceptions while handling LDAPS connections and big LDAP searches

---
 opends/src/server/org/opends/server/extensions/ConnectionSecurityProvider.java |   95 +++++++++++-------
 opends/src/server/org/opends/server/extensions/RedirectingByteChannel.java     |  180 ++++++++++++++++++++++-------------
 2 files changed, 169 insertions(+), 106 deletions(-)

diff --git a/opends/src/server/org/opends/server/extensions/ConnectionSecurityProvider.java b/opends/src/server/org/opends/server/extensions/ConnectionSecurityProvider.java
index e2bfa0e..dbe19d4 100644
--- a/opends/src/server/org/opends/server/extensions/ConnectionSecurityProvider.java
+++ b/opends/src/server/org/opends/server/extensions/ConnectionSecurityProvider.java
@@ -23,59 +23,76 @@
  *
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Portions copyright 2012 ForgeRock AS.
  */
 
 package org.opends.server.extensions;
 
+
+
 import java.nio.channels.ByteChannel;
 import java.security.cert.Certificate;
 
+
+
 /**
  * This interface can be used to define connection security providers.
- *
  */
-public interface ConnectionSecurityProvider {
+public interface ConnectionSecurityProvider
+{
 
-    /**
-     * Factory method: creates a new security ByteChannel
-     * layer wrapping the provided ByteChannel.
-     *
-     * @param channel The byte channel to be wrapped.
-     * @return A byte channel wrapping the specified byte channel.
-     */
-    ByteChannel wrapChannel(ByteChannel channel);
+  /**
+   * Return a buffer size of the byte channel.
+   *
+   * @return Integer representing the byte channel application buffer size.
+   */
+  int getAppBufSize();
 
-    /**
-     * Return a buffer size of the byte channel.
-     * @return Integer representing the byte channel application buffer size.
-     */
-    int getAppBufSize();
 
-    /**
-     * Return a certificate chain array.
-     *
-     * @return A certificate chain array.
-     */
-    Certificate[] getClientCertificateChain();
 
-    /**
-     * Return a Security Strength Factor.
-     *
-     * @return Integer representing the current SSF of a provider.
-     */
-    int getSSF();
+  /**
+   * Return a certificate chain array.
+   *
+   * @return A certificate chain array.
+   */
+  Certificate[] getClientCertificateChain();
 
-    /**
-     * Return <CODE>true</CODE> if a provider is secure.
-     *
-     * @return <CODE>true</CODE> if a provider is secure.
-     */
-    boolean isSecure();
 
-    /**
-     * Return the name of a provider.
-     *
-     * @return String representing the name of a provider.
-     */
-    String getName();
+
+  /**
+   * Return the name of a provider.
+   *
+   * @return String representing the name of a provider.
+   */
+  String getName();
+
+
+
+  /**
+   * Return a Security Strength Factor.
+   *
+   * @return Integer representing the current SSF of a provider.
+   */
+  int getSSF();
+
+
+
+  /**
+   * Return <CODE>true</CODE> if a provider is secure.
+   *
+   * @return <CODE>true</CODE> if a provider is secure.
+   */
+  boolean isSecure();
+
+
+
+  /**
+   * Factory method: creates a new security ByteChannel layer wrapping the
+   * provided ByteChannel.
+   *
+   * @param channel
+   *          The byte channel to be wrapped.
+   * @return A byte channel wrapping the specified byte channel.
+   */
+  ByteChannel wrapChannel(ByteChannel channel);
 }
diff --git a/opends/src/server/org/opends/server/extensions/RedirectingByteChannel.java b/opends/src/server/org/opends/server/extensions/RedirectingByteChannel.java
index 2ea8332..f93abd2 100644
--- a/opends/src/server/org/opends/server/extensions/RedirectingByteChannel.java
+++ b/opends/src/server/org/opends/server/extensions/RedirectingByteChannel.java
@@ -23,92 +23,138 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
+ *      Portions copyright 2012 ForgeRock AS.
  */
 
 package org.opends.server.extensions;
 
+
+
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.ByteChannel;
 
+
+
 /**
  * This class redirects read and write requests either to a child byte channel,
  * or a byte channel to be redirected to.
- *
  */
-public class RedirectingByteChannel implements ByteChannel {
-    private final ByteChannel child;
-    private volatile ByteChannel redirect = null;
+public class RedirectingByteChannel implements ByteChannel
+{
+  /**
+   * Create an instance of a redirecting byte channel using the specified byte
+   * channel as the child.
+   *
+   * @param bc
+   *          A byte channel to use as the child.
+   * @return A redirecting byte channel.
+   */
+  public static RedirectingByteChannel getRedirectingByteChannel(
+      final ByteChannel bc)
+  {
+    return new RedirectingByteChannel(bc);
+  }
 
-    private RedirectingByteChannel(ByteChannel child) {
-        this.child = child;
-    }
 
-    /**
-     * Create an instance of a redirecting byte channel using the specified
-     * byte channel as the child.
-     *
-     * @param bc A byte channel to use as the child.
-     * @return A redirecting byte channel.
-     */
-    public static
-    RedirectingByteChannel getRedirectingByteChannel(ByteChannel bc) {
-        return new RedirectingByteChannel(bc);
-    }
 
-    /**
-     * {@inheritDoc}
-     */
-    public int read(ByteBuffer buffer) throws IOException {
-        if (redirect != null)
-            return redirect.read(buffer);
-        else
-            return child.read(buffer);
-    }
+  private final ByteChannel child;
 
-    /**
-     * {@inheritDoc}
-     */
-    public void close() throws IOException {
-        if(redirect != null)
-            redirect.close();
-        else
-            child.close();
-    }
+  private volatile ByteChannel redirect = null;
 
-    /**
-     * {@inheritDoc}
-     */
-    public boolean isOpen() {
-        if(redirect != null)
-            return redirect.isOpen();
-        return child.isOpen();
-    }
 
-    /**
-     * {@inheritDoc}
-     */
-    public int write(ByteBuffer buffer) throws IOException {
-        if (redirect != null)
-            return redirect.write(buffer);
-        else
-            return child.write(buffer);
-    }
 
-    /**
-     * Redirects a byte channel to a byte channel associated with the specified
-     * provider.
-     *
-     * @param provider The provider to redirect to.
-     */
-    public final void redirect(ConnectionSecurityProvider provider) {
-      redirect = provider.wrapChannel(child);
-    }
+  private RedirectingByteChannel(final ByteChannel child)
+  {
+    this.child = child;
+  }
 
-    /**
-     * Disable redirection.
-     */
-    public final void disable() {
-        redirect = null;
+
+
+  /**
+   * {@inheritDoc}
+   */
+  public void close() throws IOException
+  {
+    if (redirect != null)
+    {
+      redirect.close();
     }
+    else
+    {
+      child.close();
+    }
+  }
+
+
+
+  /**
+   * Disable redirection.
+   */
+  public final void disable()
+  {
+    redirect = null;
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean isOpen()
+  {
+    if (redirect != null)
+    {
+      return redirect.isOpen();
+    }
+    return child.isOpen();
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  public int read(final ByteBuffer buffer) throws IOException
+  {
+    if (redirect != null)
+    {
+      return redirect.read(buffer);
+    }
+    else
+    {
+      return child.read(buffer);
+    }
+  }
+
+
+
+  /**
+   * Redirects a byte channel to a byte channel associated with the specified
+   * provider.
+   *
+   * @param provider
+   *          The provider to redirect to.
+   */
+  public final void redirect(final ConnectionSecurityProvider provider)
+  {
+    redirect = provider.wrapChannel(child);
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  public int write(final ByteBuffer buffer) throws IOException
+  {
+    if (redirect != null)
+    {
+      return redirect.write(buffer);
+    }
+    else
+    {
+      return child.write(buffer);
+    }
+  }
 }

--
Gitblit v1.10.0