From 3384638f67ebb7895dd095433d1380dde0b40f3d Mon Sep 17 00:00:00 2001
From: Yannick Lecaillez <yannick.lecaillez@forgerock.com>
Date: Mon, 07 Nov 2016 13:59:40 +0000
Subject: [PATCH] OPENDJ-3179: Migrate LDAP Connection Handler to SDK Grizzly transport

---
 opendj-core/src/test/java/org/forgerock/opendj/ldap/TestCaseUtils.java                              |   14 ++
 opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LdapCodec.java                            |    3 
 opendj-core/src/test/java/org/forgerock/opendj/ldap/spi/BasicTransportProvider.java                 |    4 
 opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/GrizzlyLDAPListener.java                  |   14 +-
 opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/DefaultTCPNIOTransportTestCase.java       |   10 -
 opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/GrizzlyLDAPConnectionFactoryTestCase.java |    4 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/LDAPListenerImpl.java                       |    4 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/LDAPConnectionFactory.java                      |    4 
 opendj-core/src/test/java/org/forgerock/opendj/ldap/spi/BasicLDAPListener.java                      |    8 
 opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/DefaultTCPNIOTransport.java               |   39 -------
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/Utils.java                        |    5 -
 opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/ConnectionFactoryTestCase.java            |    8 
 opendj-server-legacy/src/main/java/org/forgerock/opendj/reactive/LDAPClientConnection2.java         |    4 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteSequenceReader.java                         |    4 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/LDAPClientContext.java                          |   15 +-
 opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/GrizzlyLDAPListenerTestCase.java          |   41 ++++---
 opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/LdapMessages.java                           |   29 -----
 opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LDAPServerFilter.java                     |    7 
 opendj-core/src/test/java/org/forgerock/opendj/ldap/LDAPServer.java                                 |    7 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/TransportProvider.java                      |    4 
 opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferWriter.java                     |   22 +--
 opendj-grizzly/src/main/java/com/forgerock/opendj/grizzly/GrizzlyTransportProvider.java             |   13 +-
 opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferReader.java                     |    9 +
 opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/SaslFilter.java                           |    4 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/LDAPListener.java                               |   11 -
 opendj-core/pom.xml                                                                                 |    2 
 26 files changed, 116 insertions(+), 173 deletions(-)

diff --git a/opendj-core/pom.xml b/opendj-core/pom.xml
index 34cbab4..232358f 100644
--- a/opendj-core/pom.xml
+++ b/opendj-core/pom.xml
@@ -58,7 +58,7 @@
         <dependency>
             <groupId>io.reactivex.rxjava2</groupId>
             <artifactId>rxjava</artifactId>
-            <version>2.0.0-RC3</version>
+            <version>2.0.0-RC5</version>
         </dependency>
 
         <dependency>
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteSequenceReader.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteSequenceReader.java
index 0f2531f..a9ba54f 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteSequenceReader.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteSequenceReader.java
@@ -28,7 +28,7 @@
  * {@code ByteSequenceReader} must be created using the associated
  * {@code ByteSequence}'s {@code asReader()} method.
  */
-public class ByteSequenceReader {
+public final class ByteSequenceReader {
 
     /** The current position in the byte sequence. */
     private int pos;
@@ -55,7 +55,7 @@
      * @param sequence
      *            The byte sequence to be read.
      */
-    public ByteSequenceReader(final ByteSequence sequence) {
+    ByteSequenceReader(final ByteSequence sequence) {
         this.sequence = sequence;
     }
 
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/LDAPClientContext.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/LDAPClientContext.java
index b88edbb..bce7c18 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/LDAPClientContext.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/LDAPClientContext.java
@@ -37,17 +37,17 @@
     /** Listens for disconnection event. */
     public interface DisconnectListener {
         /**
-         * Invoked when the connection has been disconnected because of an error (i.e: message too big).
+         * Invoked when the connection has been disconnected because of an error (e.g: message too big).
          *
          * @param context
          *            The {@link LDAPClientContext} which has failed
          * @param error
          *            The error
          */
-        void exceptionOccurred(final LDAPClientContext context, final Throwable error);
+        void exceptionOccurred(LDAPClientContext context, Throwable error);
 
         /**
-         * Invoked when the client closes the connection, possibly using an unbind request.
+         * Invoked when the client closed the connection, possibly using an unbind request.
          *
          * @param context
          *            The {@link LDAPClientContext} which has been disconnected
@@ -55,7 +55,7 @@
          *            The unbind request, which may be {@code null} if one was not sent before the connection was
          *            closed.
          */
-        void connectionClosed(final LDAPClientContext context, final UnbindRequest unbindRequest);
+        void connectionClosed(LDAPClientContext context, UnbindRequest unbindRequest);
 
         /**
          * Invoked when the connection has been disconnected by the server.
@@ -68,8 +68,7 @@
          * @param diagnosticMessage
          *            The diagnostic message, which may be empty or {@code null} indicating that none was provided.
          */
-        void connectionDisconnected(final LDAPClientContext context, final ResultCode resultCode,
-                final String diagnosticMessage);
+        void connectionDisconnected(LDAPClientContext context, ResultCode resultCode, String diagnosticMessage);
     }
 
     /**
@@ -77,7 +76,7 @@
      *
      * @param listener The {@link DisconnectListener} to register.
      */
-    void onDisconnect(final DisconnectListener listener);
+    void onDisconnect(DisconnectListener listener);
 
     /**
      * Disconnects the client without sending a disconnect notification. Invoking this method causes
@@ -97,7 +96,7 @@
      * @param diagnosticMessage
      *            The diagnostic message to include with the disconnect notification
      */
-    void disconnect(final ResultCode resultCode, final String diagnosticMessage);
+    void disconnect(ResultCode resultCode, String diagnosticMessage);
 
     /**
      * Returns the {@code InetSocketAddress} associated with the local system.
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/LDAPConnectionFactory.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/LDAPConnectionFactory.java
index 599069e..2bb4497 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/LDAPConnectionFactory.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/LDAPConnectionFactory.java
@@ -17,7 +17,7 @@
 package org.forgerock.opendj.ldap;
 
 import static com.forgerock.opendj.ldap.CoreMessages.HBCF_CONNECTION_CLOSED_BY_CLIENT;
-import static com.forgerock.opendj.ldap.CoreMessages.HBCF_HEARTBEAT_FAILED;
+import static com.forgerock.opendj.ldap.CoreMessages.ERR_CONNECTION_UNEXPECTED;
 import static com.forgerock.opendj.ldap.CoreMessages.HBCF_HEARTBEAT_TIMEOUT;
 import static com.forgerock.opendj.ldap.CoreMessages.LDAP_CONNECTION_CONNECT_TIMEOUT;
 import static com.forgerock.opendj.util.StaticUtils.DEFAULT_SCHEDULER;
@@ -502,7 +502,7 @@
                         connectException = newHeartBeatTimeoutError();
                     } else {
                         connectException = newLdapException(ResultCode.CLIENT_SIDE_SERVER_DOWN,
-                                                            HBCF_HEARTBEAT_FAILED.get(),
+                                                            ERR_CONNECTION_UNEXPECTED.get(e),
                                                             e);
                     }
                     if (promise.tryHandleException(connectException)) {
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/LDAPListener.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/LDAPListener.java
index 013cd9d..6b9bee7 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/LDAPListener.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/LDAPListener.java
@@ -19,8 +19,7 @@
 import java.io.Closeable;
 import java.io.IOException;
 import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.util.HashSet;
+import java.util.Collections;
 import java.util.Set;
 
 import org.forgerock.opendj.ldap.spi.LDAPListenerImpl;
@@ -194,14 +193,12 @@
      *             If {@code address}, {code factory}, or {@code options} was
      *             {@code null}.
      */
-    public LDAPListener(final SocketAddress address,
+    public LDAPListener(final InetSocketAddress address,
             final ServerConnectionFactory<LDAPClientContext, Integer> factory,
             final Options options) throws IOException {
         Reject.ifNull(address, factory, options);
         this.provider = getTransportProvider(options);
-        final Set<SocketAddress> addresses = new HashSet<>();
-        addresses.add(address);
-        this.impl = provider.getLDAPListener(addresses, factory, options);
+        this.impl = provider.getLDAPListener(Collections.singleton(address), factory, options);
     }
 
     /**
@@ -263,7 +260,7 @@
      *
      * @return The address that this LDAP listener is listening on.
      */
-    public Set<? extends SocketAddress> getSocketAddresses() {
+    public Set<InetSocketAddress> getSocketAddresses() {
         return impl.getSocketAddresses();
     }
 
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/LDAPListenerImpl.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/LDAPListenerImpl.java
index c1b326e..48b1e98 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/LDAPListenerImpl.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/LDAPListenerImpl.java
@@ -16,7 +16,7 @@
 package org.forgerock.opendj.ldap.spi;
 
 import java.io.Closeable;
-import java.net.SocketAddress;
+import java.net.InetSocketAddress;
 import java.util.Set;
 
 /**
@@ -36,7 +36,7 @@
      *
      * @return The addresses that this LDAP listener is listening on.
      */
-    Set<? extends SocketAddress> getSocketAddresses();
+    Set<InetSocketAddress> getSocketAddresses();
 
     /**
      * Closes this stream and releases any system resources associated
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/LdapMessages.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/LdapMessages.java
index bf79eed..993aae3 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/LdapMessages.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/LdapMessages.java
@@ -18,7 +18,6 @@
 import org.forgerock.opendj.io.ASN1Reader;
 import org.forgerock.opendj.ldap.DN;
 import org.forgerock.opendj.ldap.responses.Response;
-import org.forgerock.opendj.ldap.schema.Schema;
 
 /**
  * Contains statics methods to create ldap messages.
@@ -40,15 +39,13 @@
      *            Protocol version to use (only for Bind requests)
      * @param rawDn
      *            Unparsed name contained in the request (or null if DN is not applicable)
-     * @param schema
-     *            Schema to use to parse the DN
      * @param reader
      *            An {@link ASN1Reader} containing the full encoded ldap message packet.
      * @return A new {@link LdapRawMessage}
      */
     public static LdapRawMessage newRawMessage(final byte messageType, final int messageId, final int protocolVersion,
-            final String rawDn, final Schema schema, final ASN1Reader reader) {
-        return new LdapRawMessage(messageType, messageId, protocolVersion, rawDn, schema, reader);
+            final String rawDn, final ASN1Reader reader) {
+        return new LdapRawMessage(messageType, messageId, protocolVersion, rawDn, reader);
     }
 
     /**
@@ -73,16 +70,13 @@
      */
     public static final class LdapRawMessage extends LdapMessageEnvelope<ASN1Reader> {
         private final String rawDn;
-        private final Schema schema;
         private final int version;
-        private DN dn;
 
         private LdapRawMessage(final byte messageType, final int messageId, final int version, final String rawDn,
-                final Schema schema, final ASN1Reader content) {
+                final ASN1Reader content) {
             super(messageType, messageId, content);
             this.version = version;
             this.rawDn = rawDn;
-            this.schema = schema;
         }
 
         /**
@@ -102,23 +96,6 @@
         public String getRawDn() {
             return rawDn;
         }
-
-        /**
-         * Get the decoded form of the {@link DN} contained in the message (or null if the message doesn't contains a
-         * DN).
-         *
-         * @return The decoded {@link DN} contained in the request, or null if the message doesn't contains a DN.
-         */
-        public DN getDn() {
-            if (rawDn == null) {
-                return null;
-            }
-            if (dn != null) {
-                return dn;
-            }
-            dn = DN.valueOf(rawDn.toString(), schema);
-            return dn;
-        }
     }
 
     /**
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/TransportProvider.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/TransportProvider.java
index 90949eb..37453be 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/TransportProvider.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/TransportProvider.java
@@ -16,7 +16,7 @@
 package org.forgerock.opendj.ldap.spi;
 
 import java.io.IOException;
-import java.net.SocketAddress;
+import java.net.InetSocketAddress;
 import java.util.Set;
 
 import org.forgerock.opendj.ldap.LDAPClientContext;
@@ -64,7 +64,7 @@
      *             If an error occurred while trying to listen on the provided
      *             address.
      */
-    LDAPListenerImpl getLDAPListener(Set<? extends SocketAddress> addresses,
+    LDAPListenerImpl getLDAPListener(Set<InetSocketAddress> addresses,
             ServerConnectionFactory<LDAPClientContext, Integer> factory, Options options)
             throws IOException;
 }
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/LDAPServer.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/LDAPServer.java
index 8edc028..8d15763 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/LDAPServer.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/LDAPServer.java
@@ -19,7 +19,7 @@
 
 import static org.forgerock.opendj.ldap.LDAPListener.CONNECT_MAX_BACKLOG;
 import static org.forgerock.opendj.ldap.LdapException.newLdapException;
-import static org.forgerock.opendj.ldap.TestCaseUtils.findFreeSocketAddress;
+import static org.forgerock.opendj.ldap.TestCaseUtils.loopbackWithDynamicPort;
 
 import java.io.IOException;
 import java.net.InetSocketAddress;
@@ -226,8 +226,7 @@
                         props.put(Sasl.QOP, "auth-conf,auth-int,auth");
                         saslServer =
                                 Sasl.createSaslServer(saslMech, "ldap",
-                                       ((InetSocketAddress) listener.getSocketAddresses().iterator().next())
-                                       .getHostName(),
+                                       listener.getSocketAddresses().iterator().next().getHostName(),
                                        props,
                                         new CallbackHandler() {
                                             @Override
@@ -518,7 +517,7 @@
             return;
         }
         sslContext = new SSLContextBuilder().getSSLContext();
-        listener = new LDAPListener(findFreeSocketAddress(), getInstance(),
+        listener = new LDAPListener(loopbackWithDynamicPort(), getInstance(),
                         Options.defaultOptions().set(CONNECT_MAX_BACKLOG, 4096));
         isRunning = true;
     }
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/TestCaseUtils.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/TestCaseUtils.java
index 13134d3..287eddc 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/TestCaseUtils.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/TestCaseUtils.java
@@ -12,13 +12,14 @@
  * information: "Portions Copyright [year] [name of copyright owner]".
  *
  * Copyright 2009-2010 Sun Microsystems, Inc.
- * Portions Copyright 2012-2015 ForgeRock AS.
+ * Portions Copyright 2012-2016 ForgeRock AS.
  */
 package org.forgerock.opendj.ldap;
 
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.util.List;
@@ -84,6 +85,15 @@
     }
 
     /**
+     * Create a new {@link InetSocketAddress} configured with loopback address and dynamic port 0
+     *
+     * @return A new loopback {@link InetSocketAddress}
+     */
+    public static InetSocketAddress loopbackWithDynamicPort() {
+        return new InetSocketAddress(InetAddress.getLoopbackAddress(), 0);
+    }
+
+    /**
      * Finds a free server socket port on the local host.
      *
      * @return The free port.
@@ -91,7 +101,7 @@
     public static InetSocketAddress findFreeSocketAddress() {
         try (ServerSocket serverLdapSocket = new ServerSocket()) {
             serverLdapSocket.setReuseAddress(true);
-            serverLdapSocket.bind(new InetSocketAddress("127.0.0.1", 0));
+            serverLdapSocket.bind(loopbackWithDynamicPort());
             return (InetSocketAddress) serverLdapSocket.getLocalSocketAddress();
         } catch (IOException e) {
             throw new RuntimeException(e);
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/spi/BasicLDAPListener.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/spi/BasicLDAPListener.java
index 080cbd6..bc01991 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/spi/BasicLDAPListener.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/spi/BasicLDAPListener.java
@@ -17,7 +17,7 @@
 package org.forgerock.opendj.ldap.spi;
 
 import java.io.IOException;
-import java.net.SocketAddress;
+import java.net.InetSocketAddress;
 import java.util.Set;
 
 import org.forgerock.opendj.ldap.LDAPClientContext;
@@ -29,7 +29,7 @@
  */
 public final class BasicLDAPListener implements LDAPListenerImpl {
     private final ServerConnectionFactory<LDAPClientContext, Integer> connectionFactory;
-    private final Set<? extends SocketAddress> socketAddresses;
+    private final Set<InetSocketAddress> socketAddresses;
 
     /**
      * Creates a new LDAP listener implementation which does nothing.
@@ -44,7 +44,7 @@
      * @throws IOException
      *             is never thrown with this do-nothing implementation
      */
-    public BasicLDAPListener(final Set<? extends SocketAddress> addresses,
+    public BasicLDAPListener(final Set<InetSocketAddress> addresses,
             final ServerConnectionFactory<LDAPClientContext, Integer> factory,
             final Options options) throws IOException {
         this.connectionFactory = factory;
@@ -57,7 +57,7 @@
     }
 
     @Override
-    public Set<? extends SocketAddress> getSocketAddresses() {
+    public Set<InetSocketAddress> getSocketAddresses() {
         return socketAddresses;
     }
 
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/spi/BasicTransportProvider.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/spi/BasicTransportProvider.java
index d9c03b3..f397c80 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/spi/BasicTransportProvider.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/spi/BasicTransportProvider.java
@@ -16,7 +16,7 @@
 package org.forgerock.opendj.ldap.spi;
 
 import java.io.IOException;
-import java.net.SocketAddress;
+import java.net.InetSocketAddress;
 import java.util.Set;
 
 import org.forgerock.opendj.ldap.LDAPClientContext;
@@ -44,7 +44,7 @@
     }
 
     @Override
-    public LDAPListenerImpl getLDAPListener(Set<? extends SocketAddress> addresses,
+    public LDAPListenerImpl getLDAPListener(Set<InetSocketAddress> addresses,
             ServerConnectionFactory<LDAPClientContext, Integer> factory, Options options) throws IOException {
         return new BasicLDAPListener(addresses, factory, options);
     }
diff --git a/opendj-grizzly/src/main/java/com/forgerock/opendj/grizzly/GrizzlyTransportProvider.java b/opendj-grizzly/src/main/java/com/forgerock/opendj/grizzly/GrizzlyTransportProvider.java
index c2dce7e..f3ee127 100644
--- a/opendj-grizzly/src/main/java/com/forgerock/opendj/grizzly/GrizzlyTransportProvider.java
+++ b/opendj-grizzly/src/main/java/com/forgerock/opendj/grizzly/GrizzlyTransportProvider.java
@@ -18,7 +18,7 @@
 import static com.forgerock.reactive.RxJavaStreams.*;
 
 import java.io.IOException;
-import java.net.SocketAddress;
+import java.net.InetSocketAddress;
 import java.util.Set;
 
 import org.forgerock.opendj.grizzly.GrizzlyLDAPConnectionFactory;
@@ -29,6 +29,7 @@
 import org.forgerock.opendj.io.LDAPReader;
 import org.forgerock.opendj.ldap.CommonLDAPOptions;
 import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.ldap.DecodeOptions;
 import org.forgerock.opendj.ldap.LDAPClientContext;
 import org.forgerock.opendj.ldap.LDAPClientContext.DisconnectListener;
 import org.forgerock.opendj.ldap.LdapException;
@@ -58,9 +59,9 @@
 import com.forgerock.reactive.Single;
 import com.forgerock.reactive.Stream;
 
+import io.reactivex.BackpressureStrategy;
 import io.reactivex.Flowable;
 import io.reactivex.FlowableEmitter;
-import io.reactivex.FlowableEmitter.BackpressureMode;
 import io.reactivex.FlowableOnSubscribe;
 
 /**
@@ -74,7 +75,7 @@
     }
 
     @Override
-    public LDAPListenerImpl getLDAPListener(final Set<? extends SocketAddress> addresses,
+    public LDAPListenerImpl getLDAPListener(final Set<InetSocketAddress> addresses,
             final ServerConnectionFactory<LDAPClientContext, Integer> factory, final Options options)
             throws IOException {
         return new GrizzlyLDAPListener(addresses, options,
@@ -117,12 +118,12 @@
             }
         });
 
+        final DecodeOptions decodeOptions = options.get(CommonLDAPOptions.LDAP_DECODE_OPTIONS);
         return new ReactiveHandler<LDAPClientContext, LdapRawMessage, Stream<Response>>() {
             @Override
             public Single<Stream<Response>> handle(final LDAPClientContext context,
                     final LdapRawMessage rawRequest) throws Exception {
-                final LDAPReader<ASN1Reader> reader = LDAP.getReader(rawRequest.getContent(),
-                        options.get(CommonLDAPOptions.LDAP_DECODE_OPTIONS));
+                final LDAPReader<ASN1Reader> reader = LDAP.getReader(rawRequest.getContent(), decodeOptions);
                 return singleFrom(streamFromPublisher(Flowable.create(new FlowableOnSubscribe<Response>() {
                     @Override
                     public void subscribe(final FlowableEmitter<Response> emitter) throws Exception {
@@ -189,7 +190,7 @@
                         });
                         emitter.onComplete();
                     }
-                }, BackpressureMode.ERROR)));
+                }, BackpressureStrategy.ERROR)));
             }
         };
     }
diff --git a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferReader.java b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferReader.java
index 2618456..87d9905 100644
--- a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferReader.java
+++ b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferReader.java
@@ -20,6 +20,7 @@
 
 import java.io.IOException;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
@@ -137,14 +138,14 @@
     private SequenceLimiter readLimiter;
 
     /**
-     * Creates a new ASN1 reader whose source is the provided input stream and
+     * Creates a new ASN1 reader whose source is the provided buffer and
      * having a user defined maximum BER element size.
      *
      * @param maxElementSize
      *            The maximum BER element size, or <code>0</code> to indicate
      *            that there is no limit.
-     * @param memoryManager
-     *            The memory manager to use for buffering.
+     * @param buffer
+     *            The buffer where the content will be read from.
      */
     ASN1BufferReader(final int maxElementSize, final Buffer buffer) {
         this.readLimiter = new RootSequenceLimiter();
@@ -392,7 +393,7 @@
 
         String str;
         try {
-            str = buffer.toStringContent(Charset.forName("UTF-8"), buffer.position(), buffer.position() + peekLength);
+            str = buffer.toStringContent(StandardCharsets.UTF_8, buffer.position(), buffer.position() + peekLength);
         } catch (final Exception e) {
             // TODO: I18N
             logger.warn(LocalizableMessage.raw("Unable to decode ASN.1 OCTETSTRING bytes as UTF-8 string: %s", e));
diff --git a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferWriter.java b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferWriter.java
index 1f5169d..15c3c5f 100644
--- a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferWriter.java
+++ b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferWriter.java
@@ -139,15 +139,6 @@
     /** Default maximum size for cached protocol/entry encoding buffers. */
     private static final int DEFAULT_MAX_INTERNAL_BUFFER_SIZE = 32 * 1024;
 
-    /** Reset the writer. */
-    void reset() {
-        if (outBuffer.capacity() > DEFAULT_MAX_INTERNAL_BUFFER_SIZE) {
-            outBuffer = memoryManager.allocate(BUFFER_INIT_SIZE);
-        } else {
-            outBuffer.clear();
-        }
-    }
-
     private final MemoryManager<Buffer> memoryManager;
     private SequenceBuffer sequenceBuffer;
     private Buffer outBuffer;
@@ -160,6 +151,15 @@
         this.outBuffer = memoryManager.allocate(BUFFER_INIT_SIZE);
     }
 
+    /** Reset the writer. */
+    void reset() {
+        if (outBuffer.capacity() > DEFAULT_MAX_INTERNAL_BUFFER_SIZE) {
+            outBuffer = memoryManager.allocate(BUFFER_INIT_SIZE);
+        } else {
+            outBuffer.clear();
+        }
+    }
+
     void ensureAdditionalCapacity(final int size) {
         final int newCount = outBuffer.position() + size;
         if (newCount > outBuffer.capacity()) {
@@ -386,10 +386,6 @@
         sequenceBuffer.writeByte(type);
         writeLength(sequenceBuffer, value.length());
         sequenceBuffer.writeByteSequence(value);
-//        // TODO: Is there a more efficient way to do this?
-//        for (int i = 0; i < value.length(); i++) {
-//            sequenceBuffer.writeByte(value.byteAt(i));
-//        }
 
         if (logger.isTraceEnabled()) {
             logger.trace("WRITE ASN.1 OCTETSTRING(type=0x%x, length=%d)", type, value.length());
diff --git a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/DefaultTCPNIOTransport.java b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/DefaultTCPNIOTransport.java
index 0332452..a06456c 100644
--- a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/DefaultTCPNIOTransport.java
+++ b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/DefaultTCPNIOTransport.java
@@ -23,7 +23,6 @@
 import org.glassfish.grizzly.nio.transport.TCPNIOTransport;
 import org.glassfish.grizzly.nio.transport.TCPNIOTransportBuilder;
 import org.glassfish.grizzly.strategies.SameThreadIOStrategy;
-import org.glassfish.grizzly.strategies.WorkerThreadIOStrategy;
 import org.glassfish.grizzly.threadpool.ThreadPoolConfig;
 
 import com.forgerock.opendj.util.ReferenceCountedObject;
@@ -56,24 +55,7 @@
     protected TCPNIOTransport newInstance() {
         final TCPNIOTransportBuilder builder = TCPNIOTransportBuilder.newInstance();
 
-        /*
-         * Determine which threading strategy to use, and total number of
-         * threads.
-         */
-        final String useWorkerThreadsStr =
-                System.getProperty("org.forgerock.opendj.transport.useWorkerThreads");
-        final boolean useWorkerThreadStrategy;
-        if (useWorkerThreadsStr != null) {
-            useWorkerThreadStrategy = Boolean.parseBoolean(useWorkerThreadsStr);
-        } else {
-            useWorkerThreadStrategy = false;
-        }
-
-        if (useWorkerThreadStrategy) {
-            builder.setIOStrategy(WorkerThreadIOStrategy.getInstance());
-        } else {
-            builder.setIOStrategy(SameThreadIOStrategy.getInstance());
-        }
+        builder.setIOStrategy(SameThreadIOStrategy.getInstance());
 
         // Calculate thread counts.
         final int cpus = Runtime.getRuntime().availableProcessors();
@@ -85,30 +67,13 @@
         if (selectorsStr != null) {
             selectorThreadCount = Integer.parseInt(selectorsStr);
         } else {
-            selectorThreadCount =
-                    useWorkerThreadStrategy ? Math.max(2, cpus / 4) : Math.max(5, (cpus / 2) - 1);
+            selectorThreadCount = Math.max(5, (cpus / 2) - 1);
         }
 
         builder.setSelectorThreadPoolConfig(ThreadPoolConfig.defaultConfig().setCorePoolSize(
                 selectorThreadCount).setMaxPoolSize(selectorThreadCount).setPoolName(
                 "OpenDJ LDAP SDK Grizzly selector thread"));
 
-        // Calculate the number of worker threads.
-        if (builder.getWorkerThreadPoolConfig() != null) {
-            final String workersStr = System.getProperty("org.forgerock.opendj.transport.workers");
-            final int workerThreadCount;
-
-            if (workersStr != null) {
-                workerThreadCount = Integer.parseInt(workersStr);
-            } else {
-                workerThreadCount = useWorkerThreadStrategy ? Math.max(5, (cpus * 2)) : 0;
-            }
-
-            builder.setWorkerThreadPoolConfig(ThreadPoolConfig.defaultConfig().setCorePoolSize(
-                    workerThreadCount).setMaxPoolSize(workerThreadCount).setPoolName(
-                    "OpenDJ LDAP SDK Grizzly worker thread"));
-        }
-
         // Parse IO related options.
         final String lingerStr = System.getProperty("org.forgerock.opendj.transport.linger");
         if (lingerStr != null) {
diff --git a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/GrizzlyLDAPListener.java b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/GrizzlyLDAPListener.java
index 1f77cca..810f763 100644
--- a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/GrizzlyLDAPListener.java
+++ b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/GrizzlyLDAPListener.java
@@ -21,7 +21,7 @@
 import static org.forgerock.opendj.ldap.LDAPListener.*;
 
 import java.io.IOException;
-import java.net.SocketAddress;
+import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
@@ -56,7 +56,7 @@
     private final ReferenceCountedObject<TCPNIOTransport>.Reference transport;
     private final Collection<TCPNIOServerConnection> serverConnections;
     private final AtomicBoolean isClosed = new AtomicBoolean();
-    private final Set<SocketAddress> socketAddresses;
+    private final Set<InetSocketAddress> socketAddresses;
     private final Options options;
 
     /**
@@ -72,7 +72,7 @@
      * @throws IOException
      *             If an error occurred while trying to listen on the provided address.
      */
-    public GrizzlyLDAPListener(final Set<? extends SocketAddress> addresses, final Options options,
+    public GrizzlyLDAPListener(final Set<InetSocketAddress> addresses, final Options options,
             final Function<LDAPClientContext,
                            ReactiveHandler<LDAPClientContext, LdapRawMessage, Stream<Response>>,
                            LdapException> requestHandlerFactory) throws IOException {
@@ -95,7 +95,7 @@
      * @throws IOException
      *             If an error occurred while trying to listen on the provided address.
      */
-    public GrizzlyLDAPListener(final Set<? extends SocketAddress> addresses,
+    public GrizzlyLDAPListener(final Set<InetSocketAddress> addresses,
             final Function<LDAPClientContext,
                            ReactiveHandler<LDAPClientContext, LdapRawMessage, Stream<Response>>,
                            LdapException> requestHandlerFactory,
@@ -116,10 +116,10 @@
                 .processor(ldapChain).build();
         this.serverConnections = new ArrayList<>(addresses.size());
         this.socketAddresses = new HashSet<>(addresses.size());
-        for (final SocketAddress address : addresses) {
+        for (final InetSocketAddress address : addresses) {
             final TCPNIOServerConnection bound = bindingHandler.bind(address, options.get(CONNECT_MAX_BACKLOG));
             serverConnections.add(bound);
-            socketAddresses.add(bound.getLocalAddress());
+            socketAddresses.add((InetSocketAddress) bound.getLocalAddress());
         }
     }
 
@@ -142,7 +142,7 @@
     }
 
     @Override
-    public Set<? extends SocketAddress> getSocketAddresses() {
+    public Set<InetSocketAddress> getSocketAddresses() {
         return socketAddresses;
     }
 
diff --git a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LDAPServerFilter.java b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LDAPServerFilter.java
index d2f8c98..0e5239b 100644
--- a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LDAPServerFilter.java
+++ b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LDAPServerFilter.java
@@ -71,7 +71,6 @@
 
 import com.forgerock.reactive.Action;
 import com.forgerock.reactive.Completable;
-import com.forgerock.reactive.Consumer;
 import com.forgerock.reactive.ReactiveHandler;
 import com.forgerock.reactive.Single;
 import com.forgerock.reactive.Stream;
@@ -195,10 +194,12 @@
                             });
                 }
             }, maxConcurrentRequests)
-            .onErrorDo(new Consumer<Throwable>() {
+            .onErrorResumeWith(new Function<Throwable, Publisher<Object>, Exception>() {
                 @Override
-                public void accept(final Throwable error) throws Exception {
+                public Publisher<Object> apply(Throwable error) throws Exception {
                     clientContext.notifyErrorAndCloseSilently(error);
+                    // Swallow the error to prevent the subscribe() below to report it on the console.
+                    return streamFrom(DUMMY);
                 }
             })
             .onCompleteDo(new Action() {
diff --git a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LdapCodec.java b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LdapCodec.java
index a1a7c86..1653a6b 100644
--- a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LdapCodec.java
+++ b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LdapCodec.java
@@ -119,8 +119,7 @@
                 rawDn = null;
                 protocolVersion = -1;
             }
-            return LdapMessages.newRawMessage(messageType, messageId, protocolVersion, rawDn,
-                    rawDn != null ? decodeOptions.getSchemaResolver().resolveSchema(rawDn) : null, reader);
+            return LdapMessages.newRawMessage(messageType, messageId, protocolVersion, rawDn, reader);
         } finally {
             reader.reset();
         }
diff --git a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/SaslFilter.java b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/SaslFilter.java
index 90734d2..a723c70 100644
--- a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/SaslFilter.java
+++ b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/SaslFilter.java
@@ -30,10 +30,12 @@
 
 final class SaslFilter extends BaseFilter {
 
+    private static final int INT_SIZE = 4;
+
     @Override
     public NextAction handleRead(final FilterChainContext ctx) throws IOException {
         final Buffer message = ctx.getMessage();
-        if (message.remaining() < 4) {
+        if (message.remaining() < INT_SIZE) {
             return ctx.getStopAction(message);
         }
 
diff --git a/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/ConnectionFactoryTestCase.java b/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/ConnectionFactoryTestCase.java
index 73c026e..0d1933b 100644
--- a/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/ConnectionFactoryTestCase.java
+++ b/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/ConnectionFactoryTestCase.java
@@ -544,7 +544,7 @@
                     }
                 });
 
-        LDAPListener listener = new LDAPListener(findFreeSocketAddress(), mockServer);
+        LDAPListener listener = new LDAPListener(new InetSocketAddress("127.0.0.1", 0), mockServer);
         try {
             LDAPConnectionFactory clientFactory = new LDAPConnectionFactory(
                     ((InetSocketAddress) listener.getSocketAddresses().iterator().next()).getHostName(),
@@ -627,12 +627,12 @@
                     }
                 });
 
-        LDAPListener listener = new LDAPListener(findFreeSocketAddress(), mockServer);
+        LDAPListener listener = new LDAPListener(new InetSocketAddress("127.0.0.1", 0), mockServer);
         try {
             LDAPConnectionFactory clientFactory =
                     new LDAPConnectionFactory(
-                            ((InetSocketAddress) listener.getSocketAddresses().iterator().next()).getHostName(),
-                            ((InetSocketAddress) listener.getSocketAddresses().iterator().next()).getPort());
+                            listener.getSocketAddresses().iterator().next().getHostName(),
+                            listener.getSocketAddresses().iterator().next().getPort());
             final Connection client = clientFactory.getConnection();
             connectLatch.await(TEST_TIMEOUT, TimeUnit.SECONDS);
             try {
diff --git a/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/DefaultTCPNIOTransportTestCase.java b/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/DefaultTCPNIOTransportTestCase.java
index 605f748..af31270 100644
--- a/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/DefaultTCPNIOTransportTestCase.java
+++ b/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/DefaultTCPNIOTransportTestCase.java
@@ -12,13 +12,13 @@
  * information: "Portions Copyright [year] [name of copyright owner]".
  *
  * Copyright 2010 Sun Microsystems, Inc.
- * Portions copyright 2012-2013 ForgeRock AS.
+ * Portions copyright 2012-2016 ForgeRock AS.
  */
 
 package org.forgerock.opendj.grizzly;
 
 import static org.forgerock.opendj.grizzly.DefaultTCPNIOTransport.DEFAULT_TRANSPORT;
-import static org.forgerock.opendj.ldap.TestCaseUtils.findFreeSocketAddress;
+import static org.forgerock.opendj.ldap.TestCaseUtils.loopbackWithDynamicPort;
 import static org.testng.Assert.assertTrue;
 
 import java.net.Socket;
@@ -46,10 +46,8 @@
     @Test(enabled = false)
     public void testGetInstance() throws Exception {
         // Create a transport.
-        final ReferenceCountedObject<TCPNIOTransport>.Reference transport =
-                DEFAULT_TRANSPORT.acquire();
-        SocketAddress socketAddress = findFreeSocketAddress();
-        transport.get().bind(socketAddress);
+        final ReferenceCountedObject<TCPNIOTransport>.Reference transport = DEFAULT_TRANSPORT.acquire();
+        SocketAddress socketAddress = transport.get().bind(loopbackWithDynamicPort()).getLocalAddress();
 
         // Establish a socket connection to see if the transport factory works.
         final Socket socket = new Socket();
diff --git a/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/GrizzlyLDAPConnectionFactoryTestCase.java b/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/GrizzlyLDAPConnectionFactoryTestCase.java
index 0546413..454b641 100644
--- a/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/GrizzlyLDAPConnectionFactoryTestCase.java
+++ b/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/GrizzlyLDAPConnectionFactoryTestCase.java
@@ -19,7 +19,7 @@
 import static org.fest.assertions.Fail.fail;
 import static org.forgerock.opendj.ldap.CommonLDAPOptions.*;
 import static org.forgerock.opendj.ldap.LDAPConnectionFactory.*;
-import static org.forgerock.opendj.ldap.TestCaseUtils.findFreeSocketAddress;
+import static org.forgerock.opendj.ldap.TestCaseUtils.*;
 import static org.forgerock.opendj.ldap.requests.Requests.newSimpleBindRequest;
 import static org.forgerock.util.time.Duration.duration;
 import static org.mockito.Matchers.*;
@@ -349,7 +349,7 @@
 
     private LDAPListener createServer() {
         try {
-            return new LDAPListener(findFreeSocketAddress(),
+            return new LDAPListener(loopbackWithDynamicPort(),
                     new ServerConnectionFactory<LDAPClientContext, Integer>() {
                         @Override
                         public ServerConnection<Integer> handleAccept(
diff --git a/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/GrizzlyLDAPListenerTestCase.java b/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/GrizzlyLDAPListenerTestCase.java
index 8890a14..13dabe0 100644
--- a/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/GrizzlyLDAPListenerTestCase.java
+++ b/opendj-grizzly/src/test/java/org/forgerock/opendj/grizzly/GrizzlyLDAPListenerTestCase.java
@@ -201,7 +201,7 @@
     public void testCreateLDAPListener() throws Exception {
         // test no exception is thrown, which means transport provider is
         // correctly loaded
-        LDAPListener listener = new LDAPListener(findFreeSocketAddress(), mock(ServerConnectionFactory.class));
+        LDAPListener listener = new LDAPListener(loopbackWithDynamicPort(), mock(ServerConnectionFactory.class));
         listener.close();
     }
 
@@ -212,8 +212,8 @@
         // test no exception is thrown, which means transport provider is correctly loaded
         Options options = defaultOptions().set(TRANSPORT_PROVIDER_CLASS_LOADER,
                                                        Thread.currentThread().getContextClassLoader());
-        LDAPListener listener = new LDAPListener(findFreeSocketAddress(),
-                mock(ServerConnectionFactory.class), options);
+        LDAPListener listener =
+                new LDAPListener(loopbackWithDynamicPort(), mock(ServerConnectionFactory.class), options);
         listener.close();
     }
 
@@ -223,7 +223,8 @@
         expectedExceptionsMessageRegExp = "^The requested provider 'unknown' .*")
     public void testCreateLDAPListenerFailureProviderNotFound() throws Exception {
         Options options = defaultOptions().set(TRANSPORT_PROVIDER, "unknown");
-        LDAPListener listener = new LDAPListener(findFreeSocketAddress(), mock(ServerConnectionFactory.class), options);
+        LDAPListener listener
+            = new LDAPListener(loopbackWithDynamicPort(), mock(ServerConnectionFactory.class), options);
         listener.close();
     }
 
@@ -238,7 +239,7 @@
         final MockServerConnection serverConnection = new MockServerConnection();
         final MockServerConnectionFactory serverConnectionFactory =
                 new MockServerConnectionFactory(serverConnection);
-        final LDAPListener listener = new LDAPListener(new InetSocketAddress(0), serverConnectionFactory);
+        final LDAPListener listener = new LDAPListener(loopbackWithDynamicPort(), serverConnectionFactory);
         final InetSocketAddress addr = (InetSocketAddress) listener.getSocketAddresses().iterator().next();
         try {
             // Connect and close.
@@ -267,9 +268,9 @@
         final MockServerConnection onlineServerConnection = new MockServerConnection();
         final MockServerConnectionFactory onlineServerConnectionFactory =
                 new MockServerConnectionFactory(onlineServerConnection);
-        final InetSocketAddress onlineAddr = findFreeSocketAddress();
         final LDAPListener onlineServerListener =
-                new LDAPListener(onlineAddr, onlineServerConnectionFactory);
+                new LDAPListener(loopbackWithDynamicPort(), onlineServerConnectionFactory);
+        final InetSocketAddress onlineAddr = onlineServerListener.getSocketAddresses().iterator().next();
 
         try {
             // Connection pool and load balancing tests.
@@ -311,9 +312,9 @@
 
                     };
 
-            final InetSocketAddress proxyAddr = findFreeSocketAddress();
             final LDAPListener proxyListener =
-                    new LDAPListener(proxyAddr, proxyServerConnectionFactory);
+                    new LDAPListener(loopbackWithDynamicPort(), proxyServerConnectionFactory);
+            final InetSocketAddress proxyAddr = proxyListener.getSocketAddresses().iterator().next();
             try {
                 // Connect and close.
                 final Connection connection =
@@ -350,8 +351,7 @@
                 new MockServerConnectionFactory(onlineServerConnection);
         final LDAPListener onlineServerListener =
                 new LDAPListener(new InetSocketAddress(0), onlineServerConnectionFactory);
-        final InetSocketAddress onlineServerAddr =
-                (InetSocketAddress) onlineServerListener.getSocketAddresses().iterator().next();
+        final InetSocketAddress onlineServerAddr = onlineServerListener.getSocketAddresses().iterator().next();
 
         try {
             // Connection pool and load balancing tests.
@@ -444,9 +444,9 @@
         final MockServerConnection onlineServerConnection = new MockServerConnection();
         final MockServerConnectionFactory onlineServerConnectionFactory =
                 new MockServerConnectionFactory(onlineServerConnection);
-        final InetSocketAddress onlineServerAddr = new InetSocketAddress(0);
         final LDAPListener onlineServerListener =
-                new LDAPListener(onlineServerAddr, onlineServerConnectionFactory);
+                new LDAPListener(loopbackWithDynamicPort(), onlineServerConnectionFactory);
+        final InetSocketAddress onlineServerAddr = onlineServerListener.getSocketAddresses().iterator().next();
 
         try {
             final MockServerConnection proxyServerConnection = new MockServerConnection();
@@ -493,8 +493,9 @@
                         }
 
                     };
+
             final LDAPListener proxyListener =
-                    new LDAPListener(findFreeSocketAddress(), proxyServerConnectionFactory);
+                    new LDAPListener(loopbackWithDynamicPort(), proxyServerConnectionFactory);
             try {
                 // Connect and close.
                 final Connection connection =
@@ -528,9 +529,9 @@
         final MockServerConnection onlineServerConnection = new MockServerConnection();
         final MockServerConnectionFactory onlineServerConnectionFactory =
                 new MockServerConnectionFactory(onlineServerConnection);
-        final InetSocketAddress onlineServerAddr = findFreeSocketAddress();
         final LDAPListener onlineServerListener =
-                new LDAPListener(onlineServerAddr, onlineServerConnectionFactory);
+                new LDAPListener(loopbackWithDynamicPort(), onlineServerConnectionFactory);
+        final InetSocketAddress onlineServerAddr = onlineServerListener.getSocketAddresses().iterator().next();
 
         try {
             final MockServerConnection proxyServerConnection = new MockServerConnection() {
@@ -610,7 +611,7 @@
      * @throws Exception
      *             If an unexpected error occurred.
      */
-    @Test
+    @Test(expectedExceptions = LdapException.class)
     public void testMaxRequestSize() throws Exception {
         final MockServerConnection serverConnection = new MockServerConnection();
         final MockServerConnectionFactory factory =
@@ -654,6 +655,7 @@
                         .isTrue();
                 assertThat(serverConnection.isClosed.getCount()).isEqualTo(1);
                 assertThat(serverConnection.context.get().isClosed()).isTrue();
+                throw e;
             }
         } finally {
             if (connection != null) {
@@ -674,8 +676,9 @@
         final MockServerConnection serverConnection = new MockServerConnection();
         final MockServerConnectionFactory factory =
                 new MockServerConnectionFactory(serverConnection);
-        final InetSocketAddress listenerAddr = findFreeSocketAddress();
-        final LDAPListener listener = new LDAPListener(listenerAddr, factory);
+        final LDAPListener listener =
+                new LDAPListener(loopbackWithDynamicPort(), factory);
+        final InetSocketAddress listenerAddr = listener.getSocketAddresses().iterator().next();
 
         final Connection connection;
         try {
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/Utils.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/Utils.java
index 4e62063..d0eb549 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/Utils.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/Utils.java
@@ -215,11 +215,6 @@
      * Sets default system property settings for the xxxrate performance tools.
      */
     static void setDefaultPerfToolProperties() {
-        // Use SameThreadStrategy by default.
-        if (System.getProperty("org.forgerock.opendj.transport.useWorkerThreads") == null) {
-            System.setProperty("org.forgerock.opendj.transport.useWorkerThreads", "false");
-        }
-
         /* Configure connections to be terminate immediately after closing (this
          prevents port exhaustion in xxxrate tools when
          connecting/disconnecting).*/
diff --git a/opendj-server-legacy/src/main/java/org/forgerock/opendj/reactive/LDAPClientConnection2.java b/opendj-server-legacy/src/main/java/org/forgerock/opendj/reactive/LDAPClientConnection2.java
index 96304a7..593a92b 100644
--- a/opendj-server-legacy/src/main/java/org/forgerock/opendj/reactive/LDAPClientConnection2.java
+++ b/opendj-server-legacy/src/main/java/org/forgerock/opendj/reactive/LDAPClientConnection2.java
@@ -99,9 +99,9 @@
 import com.forgerock.reactive.Stream;
 
 import io.reactivex.BackpressureOverflowStrategy;
+import io.reactivex.BackpressureStrategy;
 import io.reactivex.Flowable;
 import io.reactivex.FlowableEmitter;
-import io.reactivex.FlowableEmitter.BackpressureMode;
 import io.reactivex.FlowableOnSubscribe;
 
 /**
@@ -954,7 +954,7 @@
             public void subscribe(FlowableEmitter<Response> emitter) throws Exception {
                 processLDAPMessage(queueingStrategy, LDAPReader.readMessage(message.getContent()), emitter);
             }
-        }, BackpressureMode.NONE).onBackpressureBuffer(64, null, BackpressureOverflowStrategy.ERROR)));
+        }, BackpressureStrategy.NONE).onBackpressureBuffer(64, null, BackpressureOverflowStrategy.ERROR)));
     }
 
     private boolean processLDAPMessage(final QueueingStrategy queueingStrategy, final LDAPMessage message,

--
Gitblit v1.10.0