From f2160f4bd1c8ac67e5a86a6710d431e8932877f9 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Fri, 28 May 2010 11:47:51 +0000
Subject: [PATCH] Synchronize SDK on java.net with internal repository.
---
sdk/src/com/sun/opends/sdk/ldap/LDAPConnectionFactoryImpl.java | 403 ++++++++++++++-------------------------------------------
1 files changed, 100 insertions(+), 303 deletions(-)
diff --git a/sdk/src/com/sun/opends/sdk/ldap/LDAPConnectionFactoryImpl.java b/sdk/src/com/sun/opends/sdk/ldap/LDAPConnectionFactoryImpl.java
index 71f0d08..ce244bb 100644
--- a/sdk/src/com/sun/opends/sdk/ldap/LDAPConnectionFactoryImpl.java
+++ b/sdk/src/com/sun/opends/sdk/ldap/LDAPConnectionFactoryImpl.java
@@ -30,94 +30,66 @@
import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.util.HashMap;
-import java.util.Map;
+import java.net.SocketAddress;
import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
import org.opends.sdk.*;
-import org.opends.sdk.controls.*;
-import org.opends.sdk.extensions.StartTLSRequest;
-import org.opends.sdk.ldap.LDAPConnectionOptions;
+import org.opends.sdk.requests.Requests;
+import org.opends.sdk.requests.StartTLSExtendedRequest;
+import org.opends.sdk.responses.ExtendedResult;
import org.opends.sdk.responses.Responses;
import org.opends.sdk.responses.Result;
import com.sun.grizzly.CompletionHandler;
import com.sun.grizzly.Connection;
-import com.sun.grizzly.TransportFactory;
-import com.sun.grizzly.attributes.Attribute;
-import com.sun.grizzly.filterchain.PatternFilterChainFactory;
+import com.sun.grizzly.EmptyCompletionHandler;
+import com.sun.grizzly.filterchain.DefaultFilterChain;
+import com.sun.grizzly.filterchain.FilterChain;
+import com.sun.grizzly.filterchain.TransportFilter;
import com.sun.grizzly.nio.transport.TCPNIOTransport;
-import com.sun.grizzly.ssl.BlockingSSLHandshaker;
-import com.sun.grizzly.ssl.SSLEngineConfigurator;
-import com.sun.grizzly.ssl.SSLFilter;
-import com.sun.grizzly.ssl.SSLHandshaker;
-import com.sun.grizzly.streams.StreamWriter;
import com.sun.opends.sdk.util.CompletedFutureResult;
import com.sun.opends.sdk.util.FutureResultTransformer;
import com.sun.opends.sdk.util.RecursiveFutureResult;
-import com.sun.opends.sdk.util.Validator;
/**
* LDAP connection factory implementation.
*/
-public final class LDAPConnectionFactoryImpl extends
- AbstractConnectionFactory implements ConnectionFactory
+public final class LDAPConnectionFactoryImpl extends AbstractConnectionFactory
+ implements ConnectionFactory
{
- private final class LDAPTransport extends AbstractLDAPTransport
- {
- @Override
- protected LDAPMessageHandler getMessageHandler(
- Connection<?> connection)
- {
- return ldapConnectionAttr.get(connection).getLDAPMessageHandler();
- }
-
-
-
- @Override
- protected void removeMessageHandler(Connection<?> connection)
- {
- ldapConnectionAttr.remove(connection);
- }
-
- }
-
-
-
- private final class FutureResultImpl implements
- CompletionHandler<Connection>
+ @SuppressWarnings("unchecked")
+ private final class FutureResultImpl implements CompletionHandler<Connection>
{
private final FutureResultTransformer<Result, AsynchronousConnection> futureStartTLSResult;
- private final RecursiveFutureResult<LDAPConnection, Result> futureConnectionResult;
+ private final RecursiveFutureResult<LDAPConnection, ExtendedResult> futureConnectionResult;
private LDAPConnection connection;
private FutureResultImpl(
- ResultHandler<? super AsynchronousConnection> handler)
+ final ResultHandler<? super AsynchronousConnection> handler)
{
this.futureStartTLSResult = new FutureResultTransformer<Result, AsynchronousConnection>(
handler)
{
+ @Override
protected ErrorResultException transformErrorResult(
- ErrorResultException errorResult)
+ final ErrorResultException errorResult)
{
// Ensure that the connection is closed.
try
{
connection.close();
}
- catch (Exception e)
+ catch (final Exception e)
{
// Ignore.
}
@@ -126,7 +98,8 @@
- protected LDAPConnection transformResult(Result result)
+ @Override
+ protected LDAPConnection transformResult(final Result result)
throws ErrorResultException
{
return connection;
@@ -134,21 +107,22 @@
};
- this.futureConnectionResult = new RecursiveFutureResult<LDAPConnection, Result>(
+ this.futureConnectionResult = new RecursiveFutureResult<LDAPConnection, ExtendedResult>(
futureStartTLSResult)
{
- protected FutureResult<? extends Result> chainResult(
- LDAPConnection innerResult,
- ResultHandler<? super Result> handler)
+ @Override
+ protected FutureResult<? extends ExtendedResult> chainResult(
+ final LDAPConnection innerResult,
+ final ResultHandler<? super ExtendedResult> handler)
throws ErrorResultException
{
connection = innerResult;
if (options.getSSLContext() != null && options.useStartTLS())
{
- StartTLSRequest startTLS = new StartTLSRequest(options
- .getSSLContext());
+ final StartTLSExtendedRequest startTLS = Requests
+ .newStartTLSExtendedRequest(options.getSSLContext());
return connection.extendedRequest(startTLS, handler);
}
@@ -156,26 +130,41 @@
{
try
{
- connection.installFilter(sslFilter);
- connection.performSSLHandshake(sslHandshaker,
- sslEngineConfigurator);
+ connection.startTLS(options.getSSLContext(),
+ new EmptyCompletionHandler<SSLEngine>()
+ {
+ @Override
+ public void completed(final SSLEngine result)
+ {
+ handler.handleResult(null);
+ }
+
+
+
+ @Override
+ public void failed(final Throwable throwable)
+ {
+ final Result errorResult = Responses.newResult(
+ ResultCode.CLIENT_SIDE_CONNECT_ERROR).setCause(
+ throwable).setDiagnosticMessage(
+ throwable.getMessage());
+ handler.handleErrorResult(ErrorResultException
+ .wrap(errorResult));
+ }
+ });
+ return null;
}
- catch (ErrorResultException errorResult)
+ catch (final IOException ioe)
{
- try
- {
- connection.close();
- connection = null;
- }
- catch (Exception ignored)
- {
- }
- throw errorResult;
+ final Result errorResult = Responses.newResult(
+ ResultCode.CLIENT_SIDE_CONNECT_ERROR).setCause(ioe)
+ .setDiagnosticMessage(ioe.getMessage());
+ throw ErrorResultException.wrap(errorResult);
}
}
-
handler.handleResult(null);
- return new CompletedFutureResult<Result>((Result) null);
+ return new CompletedFutureResult<ExtendedResult>(
+ (ExtendedResult) null);
}
};
@@ -188,7 +177,7 @@
/**
* {@inheritDoc}
*/
- public void cancelled(Connection connection)
+ public void cancelled()
{
// Ignore this.
}
@@ -198,7 +187,7 @@
/**
* {@inheritDoc}
*/
- public void completed(Connection connection, Connection result)
+ public void completed(final Connection connection)
{
futureConnectionResult.handleResult(adaptConnection(connection));
}
@@ -208,7 +197,7 @@
/**
* {@inheritDoc}
*/
- public void failed(Connection connection, Throwable throwable)
+ public void failed(final Throwable throwable)
{
futureConnectionResult
.handleErrorResult(adaptConnectionException(throwable));
@@ -219,7 +208,7 @@
/**
* {@inheritDoc}
*/
- public void updated(Connection connection, Connection result)
+ public void updated(final Connection connection)
{
// Ignore this.
}
@@ -228,142 +217,49 @@
- private static final String LDAP_CONNECTION_OBJECT_ATTR = "LDAPConnAtr";
-
- private static TCPNIOTransport TCP_NIO_TRANSPORT = null;
-
-
-
- // FIXME: Need to figure out how this can be configured without
- // exposing internal implementation details to application.
- private static synchronized TCPNIOTransport getTCPNIOTransport()
- {
- if (TCP_NIO_TRANSPORT == null)
- {
- // Create a default transport using the Grizzly framework.
- TCP_NIO_TRANSPORT = TransportFactory.getInstance()
- .createTCPTransport();
- try
- {
- TCP_NIO_TRANSPORT.start();
- }
- catch (IOException e)
- {
- throw new RuntimeException(
- "Unable to create default connection factory provider", e);
- }
-
- Runtime.getRuntime().addShutdownHook(new Thread()
- {
-
- @Override
- public void run()
- {
- ShutdownTCPNIOTransport();
- }
-
- });
- }
- return TCP_NIO_TRANSPORT;
- }
-
-
-
- private synchronized static void ShutdownTCPNIOTransport()
- {
- if (TCP_NIO_TRANSPORT != null)
- {
- try
- {
- TCP_NIO_TRANSPORT.stop();
- }
- catch (Exception e)
- {
- // Ignore.
- }
-
- // try
- // {
- // TCP_NIO_TRANSPORT.getWorkerThreadPool().shutdown();
- // }
- // catch (Exception e)
- // {
- // // Ignore.
- // }
-
- TCP_NIO_TRANSPORT = null;
- }
- }
-
-
-
- private final Attribute<LDAPConnection> ldapConnectionAttr;
-
- private final InetSocketAddress socketAddress;
+ private final SocketAddress socketAddress;
private final TCPNIOTransport transport;
- private final SSLHandshaker sslHandshaker = new BlockingSSLHandshaker();
+ private final FilterChain defaultFilterChain;
- private final SSLEngineConfigurator sslEngineConfigurator;
+ private final LDAPClientFilter clientFilter;
- private final SSLFilter sslFilter;
-
- private final Map<String, ControlDecoder<?>> knownControls;
-
- private final LDAPTransport ldapTransport = new LDAPTransport();
-
- private final LDAPConnectionOptions options;
+ private final LDAPOptions options;
/**
- * Creates a new LDAP connection factory implementation which can be
- * used to create connections to the Directory Server at the provided
- * host and port address using provided connection options.
+ * Creates a new LDAP connection factory implementation which can be used to
+ * create connections to the Directory Server at the provided host and port
+ * address using provided connection options.
*
- * @param host
- * The host name.
- * @param port
- * The port number.
+ * @param address
+ * The address of the Directory Server to connect to.
* @param options
- * The LDAP connection options to use when creating
- * connections.
- * @throws NullPointerException
- * If {@code host} or {@code options} was {@code null}.
+ * The LDAP connection options to use when creating connections.
*/
- public LDAPConnectionFactoryImpl(String host, int port,
- LDAPConnectionOptions options) throws NullPointerException
+ public LDAPConnectionFactoryImpl(final SocketAddress address,
+ final LDAPOptions options)
{
- this(host, port, options, getTCPNIOTransport());
- }
-
-
-
- private LDAPConnectionFactoryImpl(String host, int port,
- LDAPConnectionOptions options, TCPNIOTransport transport)
- {
- Validator.ensureNotNull(host, transport, options);
-
- this.transport = transport;
- this.ldapConnectionAttr = transport.getAttributeBuilder()
- .createAttribute(LDAP_CONNECTION_OBJECT_ATTR);
- this.socketAddress = new InetSocketAddress(host, port);
- this.options = LDAPConnectionOptions.copyOf(options);
- if (this.options.getSSLContext() == null)
+ TCPNIOTransport tmpTransport = null;
+ if (options instanceof GrizzlyLDAPOptions)
{
- this.sslEngineConfigurator = null;
- this.sslFilter = null;
+ tmpTransport = ((GrizzlyLDAPOptions) options).getTCPNIOTransport();
}
- else
+ if (tmpTransport == null)
{
- this.sslEngineConfigurator = new SSLEngineConfigurator(
- this.options.getSSLContext(), true, false, false);
- this.sslFilter = new SSLFilter(sslEngineConfigurator,
- sslHandshaker);
+ tmpTransport = GlobalTransportFactory.getInstance().createTCPTransport();
}
- this.knownControls = new HashMap<String, ControlDecoder<?>>();
- initControls();
+ this.transport = tmpTransport;
+
+ this.socketAddress = address;
+ this.options = new LDAPOptions(options);
+ this.clientFilter = new LDAPClientFilter(new LDAPReader(this.options
+ .getDecodeOptions()), 0);
+ this.defaultFilterChain = new DefaultFilterChain();
+ this.defaultFilterChain.add(new TransportFilter());
+ this.defaultFilterChain.add(clientFilter);
}
@@ -371,10 +267,11 @@
/**
* {@inheritDoc}
*/
+ @Override
public FutureResult<AsynchronousConnection> getAsynchronousConnection(
- ResultHandler<AsynchronousConnection> handler)
+ final ResultHandler<AsynchronousConnection> handler)
{
- FutureResultImpl future = new FutureResultImpl(handler);
+ final FutureResultImpl future = new FutureResultImpl(handler);
try
{
@@ -382,85 +279,25 @@
socketAddress, future));
return future.futureStartTLSResult;
}
- catch (IOException e)
+ catch (final IOException e)
{
- ErrorResultException result = adaptConnectionException(e);
+ final ErrorResultException result = adaptConnectionException(e);
return new CompletedFutureResult<AsynchronousConnection>(result);
}
}
- ExecutorService getHandlerInvokers()
- {
- // TODO: Threading strategies?
- return null;
- }
-
-
-
- SSLHandshaker getSslHandshaker()
- {
- return sslHandshaker;
- }
-
-
-
- SSLFilter getSSlFilter()
- {
- return sslFilter;
- }
-
-
-
- SSLContext getSSLContext()
- {
- return options.getSSLContext();
- }
-
-
-
- SSLEngineConfigurator getSSlEngineConfigurator()
- {
- return sslEngineConfigurator;
- }
-
-
-
- ASN1StreamWriter getASN1Writer(StreamWriter streamWriter)
- {
- return ldapTransport.getASN1Writer(streamWriter);
- }
-
-
-
- void releaseASN1Writer(ASN1StreamWriter asn1Writer)
- {
- ldapTransport.releaseASN1Writer(asn1Writer);
- }
-
-
-
- PatternFilterChainFactory getDefaultFilterChainFactory()
- {
- return ldapTransport.getDefaultFilterChainFactory();
- }
-
-
-
- private LDAPConnection adaptConnection(Connection<?> connection)
+ private LDAPConnection adaptConnection(final Connection<?> connection)
{
// Test shows that its much faster with non block writes but risk
// running out of memory if the server is slow.
connection.configureBlocking(true);
- connection.getStreamReader().setBlocking(true);
- connection.getStreamWriter().setBlocking(true);
- connection.setProcessor(ldapTransport
- .getDefaultFilterChainFactory().getFilterChainPattern());
+ connection.setProcessor(defaultFilterChain);
- LDAPConnection ldapConnection = new LDAPConnection(connection,
- socketAddress, options.getSchema(), this);
- ldapConnectionAttr.set(connection, ldapConnection);
+ final LDAPConnection ldapConnection = new LDAPConnection(connection,
+ options);
+ clientFilter.registerConnection(connection, ldapConnection);
return ldapConnection;
}
@@ -473,49 +310,9 @@
t = t.getCause();
}
- Result result = Responses.newResult(
- ResultCode.CLIENT_SIDE_CONNECT_ERROR).setCause(t)
- .setDiagnosticMessage(t.getMessage());
+ final Result result = Responses.newResult(
+ ResultCode.CLIENT_SIDE_CONNECT_ERROR).setCause(t).setDiagnosticMessage(
+ t.getMessage());
return ErrorResultException.wrap(result);
}
-
-
-
- ControlDecoder<?> getControlDecoder(String oid)
- {
- return knownControls.get(oid);
- }
-
-
-
- private void initControls()
- {
- knownControls.put(
- AccountUsabilityControl.OID_ACCOUNT_USABLE_CONTROL,
- AccountUsabilityControl.RESPONSE_DECODER);
- knownControls.put(
- AuthorizationIdentityControl.OID_AUTHZID_RESPONSE,
- AuthorizationIdentityControl.RESPONSE_DECODER);
- knownControls.put(
- EntryChangeNotificationControl.OID_ENTRY_CHANGE_NOTIFICATION,
- EntryChangeNotificationControl.DECODER);
- knownControls.put(PagedResultsControl.OID_PAGED_RESULTS_CONTROL,
- PagedResultsControl.DECODER);
- knownControls.put(PasswordExpiredControl.OID_NS_PASSWORD_EXPIRED,
- PasswordExpiredControl.DECODER);
- knownControls.put(PasswordExpiringControl.OID_NS_PASSWORD_EXPIRING,
- PasswordExpiringControl.DECODER);
- knownControls.put(
- PasswordPolicyControl.OID_PASSWORD_POLICY_CONTROL,
- PasswordPolicyControl.RESPONSE_DECODER);
- knownControls.put(PostReadControl.OID_LDAP_READENTRY_POSTREAD,
- PostReadControl.RESPONSE_DECODER);
- knownControls.put(PreReadControl.OID_LDAP_READENTRY_PREREAD,
- PreReadControl.RESPONSE_DECODER);
- knownControls.put(
- ServerSideSortControl.OID_SERVER_SIDE_SORT_RESPONSE_CONTROL,
- ServerSideSortControl.RESPONSE_DECODER);
- knownControls.put(VLVControl.OID_VLV_RESPONSE_CONTROL,
- VLVControl.RESPONSE_DECODER);
- }
}
--
Gitblit v1.10.0