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