From 263d085885df024dca9250cc03c807912b0a7662 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 24 Apr 2012 22:33:21 +0000
Subject: [PATCH] Reformat to comply with new Checkstyle rules.

---
 opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/LDAPServer.java | 1264 +++++++++++++++++++++++++--------------------------------
 1 files changed, 559 insertions(+), 705 deletions(-)

diff --git a/opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/LDAPServer.java b/opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/LDAPServer.java
index 9dd693a..c24add4 100644
--- a/opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/LDAPServer.java
+++ b/opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/LDAPServer.java
@@ -6,17 +6,16 @@
  * (the "License").  You may not use this file except in compliance
  * with the License.
  *
- * You can obtain a copy of the license at
- * trunk/opendj3/legal-notices/CDDLv1_0.txt
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
  * or http://forgerock.org/license/CDDLv1.0.html.
  * See the License for the specific language governing permissions
  * and limitations under the License.
  *
  * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at
- * trunk/opendj3/legal-notices/CDDLv1_0.txt.  If applicable,
- * add the following below this CDDL HEADER, with the fields enclosed
- * by brackets "[]" replaced with your own identifying information:
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
  *      Portions Copyright [yyyy] [name of copyright owner]
  *
  * CDDL HEADER END
@@ -28,31 +27,55 @@
 
 package org.forgerock.opendj.ldap;
 
-
-
 import static com.forgerock.opendj.ldap.LDAPConstants.TYPE_AUTHENTICATION_SASL;
 
 import java.io.IOException;
-import java.util.*;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.net.ssl.SSLContext;
-import javax.security.auth.callback.*;
-import javax.security.sasl.*;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.sasl.AuthorizeCallback;
+import javax.security.sasl.RealmCallback;
+import javax.security.sasl.Sasl;
+import javax.security.sasl.SaslException;
+import javax.security.sasl.SaslServer;
 
 import org.forgerock.opendj.asn1.ASN1;
 import org.forgerock.opendj.asn1.ASN1Reader;
 import org.forgerock.opendj.ldap.controls.Control;
 import org.forgerock.opendj.ldap.controls.ControlDecoder;
-import org.forgerock.opendj.ldap.requests.*;
-import org.forgerock.opendj.ldap.responses.*;
+import org.forgerock.opendj.ldap.requests.AbandonRequest;
+import org.forgerock.opendj.ldap.requests.AddRequest;
+import org.forgerock.opendj.ldap.requests.BindRequest;
+import org.forgerock.opendj.ldap.requests.CompareRequest;
+import org.forgerock.opendj.ldap.requests.DeleteRequest;
+import org.forgerock.opendj.ldap.requests.ExtendedRequest;
+import org.forgerock.opendj.ldap.requests.GenericBindRequest;
+import org.forgerock.opendj.ldap.requests.ModifyDNRequest;
+import org.forgerock.opendj.ldap.requests.ModifyRequest;
+import org.forgerock.opendj.ldap.requests.Request;
+import org.forgerock.opendj.ldap.requests.SearchRequest;
+import org.forgerock.opendj.ldap.requests.StartTLSExtendedRequest;
+import org.forgerock.opendj.ldap.requests.UnbindRequest;
+import org.forgerock.opendj.ldap.responses.BindResult;
+import org.forgerock.opendj.ldap.responses.CompareResult;
+import org.forgerock.opendj.ldap.responses.ExtendedResult;
+import org.forgerock.opendj.ldap.responses.Responses;
+import org.forgerock.opendj.ldap.responses.Result;
+import org.forgerock.opendj.ldap.responses.SearchResultEntry;
 
 import com.forgerock.opendj.ldap.controls.AccountUsabilityRequestControl;
 import com.forgerock.opendj.ldap.controls.AccountUsabilityResponseControl;
 
-
-
 /**
  * A simple ldap server that manages 1000 entries and used for running
  * testcases.
@@ -60,725 +83,556 @@
  * FIXME: make it MT-safe.
  */
 @SuppressWarnings("javadoc")
-public class LDAPServer implements
-    ServerConnectionFactory<LDAPClientContext, Integer>
-{
-  // Creates an abandonable request from the ordinary requests.
-  private static class AbandonableRequest implements Request
-  {
-    // the request.
-    private final Request request;
+public class LDAPServer implements ServerConnectionFactory<LDAPClientContext, Integer> {
+    // Creates an abandonable request from the ordinary requests.
+    private static class AbandonableRequest implements Request {
+        // the request.
+        private final Request request;
 
-    // whether is has been cancelled.
-    private final AtomicBoolean isCanceled;
+        // whether is has been cancelled.
+        private final AtomicBoolean isCanceled;
 
+        // Ctor.
+        AbandonableRequest(final Request request) {
+            this.request = request;
+            this.isCanceled = new AtomicBoolean(false);
+        }
 
+        public Request addControl(final Control cntrl) {
+            return request.addControl(cntrl);
+        }
 
-    // Ctor.
-    AbandonableRequest(final Request request)
-    {
-      this.request = request;
-      this.isCanceled = new AtomicBoolean(false);
+        public <C extends Control> C getControl(final ControlDecoder<C> decoder,
+                final DecodeOptions options) throws DecodeException {
+            return request.getControl(decoder, options);
+        }
+
+        public List<Control> getControls() {
+            return request.getControls();
+        }
+
+        void cancel() {
+            isCanceled.set(true);
+        }
+
+        boolean isCanceled() {
+            return isCanceled.get();
+        }
     }
 
-
-
-    public Request addControl(final Control cntrl)
-    {
-      return request.addControl(cntrl);
-    }
-
-
-
-    public <C extends Control> C getControl(final ControlDecoder<C> decoder,
-        final DecodeOptions options) throws DecodeException
-    {
-      return request.getControl(decoder, options);
-    }
-
-
-
-    public List<Control> getControls()
-    {
-      return request.getControls();
-    }
-
-
-
-    void cancel()
-    {
-      isCanceled.set(true);
-    }
-
-
-
-    boolean isCanceled()
-    {
-      return isCanceled.get();
-    }
-  }
-
-
-
-  // The singleton instance.
-  private static final LDAPServer instance = new LDAPServer();
-
-
-
-  /**
-   * Returns the singleton instance.
-   *
-   * @return Singleton instance.
-   */
-  public static LDAPServer getInstance()
-  {
-    return instance;
-  }
-
-
-
-  private class LDAPServerConnection implements ServerConnection<Integer>
-  {
-
-    private final LDAPClientContext clientContext;
-    private SaslServer saslServer;
-
-
-
-    private LDAPServerConnection(LDAPClientContext clientContext)
-    {
-      this.clientContext = clientContext;
-    }
-
-
+    // The singleton instance.
+    private static final LDAPServer INSTANCE = new LDAPServer();
 
     /**
-     * Abandons the request sent by the client.
+     * Returns the singleton instance.
      *
-     * @param context
-     * @param request
-     * @throws UnsupportedOperationException
+     * @return Singleton instance.
      */
-    public void handleAbandon(final Integer context,
-        final AbandonRequest request) throws UnsupportedOperationException
-    {
-      // Check if we have any concurrent operation with this message id.
-      final AbandonableRequest req = requestsInProgress.get(request
-          .getRequestID());
-      if (req == null)
-      {
-        // Nothing to do here.
-        return;
-      }
-      // Cancel the request
-      req.cancel();
-      // No response is needed.
+    public static LDAPServer getInstance() {
+        return INSTANCE;
     }
 
+    private class LDAPServerConnection implements ServerConnection<Integer> {
 
+        private final LDAPClientContext clientContext;
+        private SaslServer saslServer;
 
-    /**
-     * Adds the request sent by the client.
-     *
-     * @param context
-     * @param request
-     * @param handler
-     * @param intermediateResponseHandler
-     * @throws UnsupportedOperationException
-     */
-    public void handleAdd(final Integer context, final AddRequest request,
-        final IntermediateResponseHandler intermediateResponseHandler,
-        final ResultHandler<? super Result> handler)
-        throws UnsupportedOperationException
-    {
-      Result result = null;
-      final AbandonableRequest abReq = new AbandonableRequest(request);
-      requestsInProgress.put(context, abReq);
-      // Get the DN.
-      final DN dn = request.getName();
-      if (entryMap.containsKey(dn))
-      {
-        // duplicate entry.
-        result = Responses.newResult(ResultCode.ENTRY_ALREADY_EXISTS);
-        final ErrorResultException ere = ErrorResultException
-            .newErrorResult(result);
-        handler.handleErrorResult(ere);
-        // doesn't matter if it was canceled.
-        requestsInProgress.remove(context);
-        return;
-      }
+        private LDAPServerConnection(LDAPClientContext clientContext) {
+            this.clientContext = clientContext;
+        }
 
-      // Create an entry out of this request.
-      final SearchResultEntry entry = Responses.newSearchResultEntry(dn);
-      for (final Control control : request.getControls())
-      {
-        entry.addControl(control);
-      }
+        /**
+         * Abandons the request sent by the client.
+         *
+         * @param context
+         * @param request
+         * @throws UnsupportedOperationException
+         */
+        public void handleAbandon(final Integer context, final AbandonRequest request)
+                throws UnsupportedOperationException {
+            // Check if we have any concurrent operation with this message id.
+            final AbandonableRequest req = requestsInProgress.get(request.getRequestID());
+            if (req == null) {
+                // Nothing to do here.
+                return;
+            }
+            // Cancel the request
+            req.cancel();
+            // No response is needed.
+        }
 
-      for (final Attribute attr : request.getAllAttributes())
-      {
-        entry.addAttribute(attr);
-      }
-
-      if (abReq.isCanceled())
-      {
-        result = Responses.newResult(ResultCode.CANCELLED);
-        final ErrorResultException ere = ErrorResultException
-            .newErrorResult(result);
-        handler.handleErrorResult(ere);
-        requestsInProgress.remove(context);
-        return;
-      }
-      // Add this to the map.
-      entryMap.put(dn, entry);
-      requestsInProgress.remove(context);
-      result = Responses.newResult(ResultCode.SUCCESS);
-      handler.handleResult(result);
-    }
-
-
-
-    /**
-     * @param context
-     * @param version
-     * @param request
-     * @param resultHandler
-     * @param intermediateResponseHandler
-     * @throws UnsupportedOperationException
-     */
-    public void handleBind(final Integer context, final int version,
-        final BindRequest request,
-        final IntermediateResponseHandler intermediateResponseHandler,
-        final ResultHandler<? super BindResult> resultHandler)
-        throws UnsupportedOperationException
-    {
-      // TODO: all bind types.
-      final AbandonableRequest abReq = new AbandonableRequest(request);
-      requestsInProgress.put(context, abReq);
-      if (request.getAuthenticationType() == TYPE_AUTHENTICATION_SASL
-          && request instanceof GenericBindRequest)
-      {
-        ASN1Reader reader = ASN1.getReader(((GenericBindRequest) request)
-            .getAuthenticationValue());
-        try
-        {
-          String saslMech = reader.readOctetStringAsString();
-          ByteString saslCred;
-          if (reader.hasNextElement())
-          {
-            saslCred = reader.readOctetString();
-          }
-          else
-          {
-            saslCred = ByteString.empty();
-          }
-
-          if (saslServer == null
-              || !saslServer.getMechanismName().equalsIgnoreCase(saslMech))
-          {
-            final Map<String, String> props = new HashMap<String, String>();
-            props.put(Sasl.QOP, "auth-conf,auth-int,auth");
-            saslServer = Sasl.createSaslServer(saslMech, "ldap", clientContext
-                .getLocalAddress().getHostName(), props, new CallbackHandler()
-            {
-              public void handle(Callback[] callbacks) throws IOException,
-                  UnsupportedCallbackException
-              {
-                for (final Callback callback : callbacks)
-                {
-                  if (callback instanceof NameCallback)
-                  {
-                    // Do nothing
-                  }
-                  else if (callback instanceof PasswordCallback)
-                  {
-                    ((PasswordCallback) callback).setPassword("password"
-                        .toCharArray());
-                  }
-                  else if (callback instanceof AuthorizeCallback)
-                  {
-                    ((AuthorizeCallback) callback).setAuthorized(true);
-                  }
-                  else if (callback instanceof RealmCallback)
-                  {
-                    // Do nothing
-                  }
-                  else
-                  {
-                    throw new UnsupportedCallbackException(callback);
-
-                  }
-                }
-              }
-            });
-          }
-
-          byte[] challenge = saslServer
-              .evaluateResponse(saslCred.toByteArray());
-          if (saslServer.isComplete())
-          {
-            resultHandler.handleResult(Responses.newBindResult(
-                ResultCode.SUCCESS).setServerSASLCredentials(
-                ByteString.wrap(challenge)));
-
-            String qop = (String) saslServer.getNegotiatedProperty(Sasl.QOP);
-            if (qop != null
-                && (qop.equalsIgnoreCase("auth-int") || qop
-                    .equalsIgnoreCase("auth-conf")))
-            {
-              ConnectionSecurityLayer csl = new ConnectionSecurityLayer()
-              {
-                public void dispose()
-                {
-                  try
-                  {
-                    saslServer.dispose();
-                  }
-                  catch (SaslException e)
-                  {
-                    e.printStackTrace();
-                  }
-                }
-
-
-
-                public byte[] unwrap(byte[] incoming, int offset, int len)
-                    throws ErrorResultException
-                {
-                  try
-                  {
-                    return saslServer.unwrap(incoming, offset, len);
-                  }
-                  catch (SaslException e)
-                  {
-                    throw ErrorResultException.newErrorResult(Responses
-                        .newResult(ResultCode.OPERATIONS_ERROR).setCause(e));
-                  }
-                }
-
-
-
-                public byte[] wrap(byte[] outgoing, int offset, int len)
-                    throws ErrorResultException
-                {
-                  try
-                  {
-                    return saslServer.wrap(outgoing, offset, len);
-                  }
-                  catch (SaslException e)
-                  {
-                    throw ErrorResultException.newErrorResult(Responses
-                        .newResult(ResultCode.OPERATIONS_ERROR).setCause(e));
-                  }
-                }
-              };
-
-              clientContext.enableConnectionSecurityLayer(csl);
+        /**
+         * Adds the request sent by the client.
+         *
+         * @param context
+         * @param request
+         * @param handler
+         * @param intermediateResponseHandler
+         * @throws UnsupportedOperationException
+         */
+        public void handleAdd(final Integer context, final AddRequest request,
+                final IntermediateResponseHandler intermediateResponseHandler,
+                final ResultHandler<? super Result> handler) throws UnsupportedOperationException {
+            Result result = null;
+            final AbandonableRequest abReq = new AbandonableRequest(request);
+            requestsInProgress.put(context, abReq);
+            // Get the DN.
+            final DN dn = request.getName();
+            if (entryMap.containsKey(dn)) {
+                // duplicate entry.
+                result = Responses.newResult(ResultCode.ENTRY_ALREADY_EXISTS);
+                final ErrorResultException ere = ErrorResultException.newErrorResult(result);
+                handler.handleErrorResult(ere);
+                // doesn't matter if it was canceled.
+                requestsInProgress.remove(context);
+                return;
             }
 
-          }
-          else
-          {
-            resultHandler.handleResult(Responses.newBindResult(
-                ResultCode.SASL_BIND_IN_PROGRESS).setServerSASLCredentials(
-                ByteString.wrap(challenge)));
-          }
-        }
-        catch (Exception e)
-        {
-          resultHandler.handleErrorResult(ErrorResultException
-              .newErrorResult(Responses
-                  .newBindResult(ResultCode.OPERATIONS_ERROR).setCause(e)
-                  .setDiagnosticMessage(e.toString())));
-        }
-      }
-      else
-      {
-        resultHandler.handleResult(Responses.newBindResult(ResultCode.SUCCESS));
-      }
-      requestsInProgress.remove(context);
-    }
+            // Create an entry out of this request.
+            final SearchResultEntry entry = Responses.newSearchResultEntry(dn);
+            for (final Control control : request.getControls()) {
+                entry.addControl(control);
+            }
 
+            for (final Attribute attr : request.getAllAttributes()) {
+                entry.addAttribute(attr);
+            }
 
-
-    /**
-     * {@inheritDoc}
-     */
-    public void handleConnectionClosed(final Integer context,
-        final UnbindRequest request)
-    {
-      close();
-    }
-
-
-
-    private void close()
-    {
-      if (saslServer != null)
-      {
-        try
-        {
-          saslServer.dispose();
-        }
-        catch (SaslException e)
-        {
-          e.printStackTrace();
-        }
-      }
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public void handleConnectionDisconnected(ResultCode resultCode,
-        String message)
-    {
-      close();
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public void handleConnectionError(final Throwable error)
-    {
-      close();
-    }
-
-
-
-    /**
-     * @param context
-     * @param request
-     * @param resultHandler
-     * @param intermediateResponseHandler
-     * @throws UnsupportedOperationException
-     */
-    public void handleCompare(final Integer context,
-        final CompareRequest request,
-        final IntermediateResponseHandler intermediateResponseHandler,
-        final ResultHandler<? super CompareResult> resultHandler)
-        throws UnsupportedOperationException
-    {
-      CompareResult result = null;
-      final AbandonableRequest abReq = new AbandonableRequest(request);
-      requestsInProgress.put(context, abReq);
-      // Get the DN.
-      final DN dn = request.getName();
-      if (!entryMap.containsKey(dn))
-      {
-        // entry not found.
-        result = Responses.newCompareResult(ResultCode.NO_SUCH_ATTRIBUTE);
-        final ErrorResultException ere = ErrorResultException
-            .newErrorResult(result);
-        resultHandler.handleErrorResult(ere);
-        // doesn't matter if it was canceled.
-        requestsInProgress.remove(context);
-        return;
-      }
-
-      // Get the entry.
-      final Entry entry = entryMap.get(dn);
-      final AttributeDescription attrDesc = request.getAttributeDescription();
-      for (final Attribute attr : entry.getAllAttributes(attrDesc))
-      {
-        final Iterator<ByteString> it = attr.iterator();
-        while (it.hasNext())
-        {
-          final ByteString s = it.next();
-          if (abReq.isCanceled())
-          {
-            final Result r = Responses.newResult(ResultCode.CANCELLED);
-            final ErrorResultException ere = ErrorResultException
-                .newErrorResult(r);
-            resultHandler.handleErrorResult(ere);
+            if (abReq.isCanceled()) {
+                result = Responses.newResult(ResultCode.CANCELLED);
+                final ErrorResultException ere = ErrorResultException.newErrorResult(result);
+                handler.handleErrorResult(ere);
+                requestsInProgress.remove(context);
+                return;
+            }
+            // Add this to the map.
+            entryMap.put(dn, entry);
             requestsInProgress.remove(context);
-            return;
-          }
-          if (s.equals(request.getAssertionValue()))
-          {
-            result = Responses.newCompareResult(ResultCode.COMPARE_TRUE);
+            result = Responses.newResult(ResultCode.SUCCESS);
+            handler.handleResult(result);
+        }
+
+        /**
+         * @param context
+         * @param version
+         * @param request
+         * @param resultHandler
+         * @param intermediateResponseHandler
+         * @throws UnsupportedOperationException
+         */
+        public void handleBind(final Integer context, final int version, final BindRequest request,
+                final IntermediateResponseHandler intermediateResponseHandler,
+                final ResultHandler<? super BindResult> resultHandler)
+                throws UnsupportedOperationException {
+            // TODO: all bind types.
+            final AbandonableRequest abReq = new AbandonableRequest(request);
+            requestsInProgress.put(context, abReq);
+            if (request.getAuthenticationType() == TYPE_AUTHENTICATION_SASL
+                    && request instanceof GenericBindRequest) {
+                ASN1Reader reader =
+                        ASN1.getReader(((GenericBindRequest) request).getAuthenticationValue());
+                try {
+                    String saslMech = reader.readOctetStringAsString();
+                    ByteString saslCred;
+                    if (reader.hasNextElement()) {
+                        saslCred = reader.readOctetString();
+                    } else {
+                        saslCred = ByteString.empty();
+                    }
+
+                    if (saslServer == null
+                            || !saslServer.getMechanismName().equalsIgnoreCase(saslMech)) {
+                        final Map<String, String> props = new HashMap<String, String>();
+                        props.put(Sasl.QOP, "auth-conf,auth-int,auth");
+                        saslServer =
+                                Sasl.createSaslServer(saslMech, "ldap", clientContext
+                                        .getLocalAddress().getHostName(), props,
+                                        new CallbackHandler() {
+                                            public void handle(Callback[] callbacks)
+                                                    throws IOException,
+                                                    UnsupportedCallbackException {
+                                                for (final Callback callback : callbacks) {
+                                                    if (callback instanceof NameCallback) {
+                                                        // Do nothing
+                                                    } else if (callback instanceof PasswordCallback) {
+                                                        ((PasswordCallback) callback)
+                                                                .setPassword("password"
+                                                                        .toCharArray());
+                                                    } else if (callback instanceof AuthorizeCallback) {
+                                                        ((AuthorizeCallback) callback)
+                                                                .setAuthorized(true);
+                                                    } else if (callback instanceof RealmCallback) {
+                                                        // Do nothing
+                                                    } else {
+                                                        throw new UnsupportedCallbackException(
+                                                                callback);
+
+                                                    }
+                                                }
+                                            }
+                                        });
+                    }
+
+                    byte[] challenge = saslServer.evaluateResponse(saslCred.toByteArray());
+                    if (saslServer.isComplete()) {
+                        resultHandler.handleResult(Responses.newBindResult(ResultCode.SUCCESS)
+                                .setServerSASLCredentials(ByteString.wrap(challenge)));
+
+                        String qop = (String) saslServer.getNegotiatedProperty(Sasl.QOP);
+                        if (qop != null
+                                && (qop.equalsIgnoreCase("auth-int") || qop
+                                        .equalsIgnoreCase("auth-conf"))) {
+                            ConnectionSecurityLayer csl = new ConnectionSecurityLayer() {
+                                public void dispose() {
+                                    try {
+                                        saslServer.dispose();
+                                    } catch (SaslException e) {
+                                        e.printStackTrace();
+                                    }
+                                }
+
+                                public byte[] unwrap(byte[] incoming, int offset, int len)
+                                        throws ErrorResultException {
+                                    try {
+                                        return saslServer.unwrap(incoming, offset, len);
+                                    } catch (SaslException e) {
+                                        throw ErrorResultException
+                                                .newErrorResult(Responses.newResult(
+                                                        ResultCode.OPERATIONS_ERROR).setCause(e));
+                                    }
+                                }
+
+                                public byte[] wrap(byte[] outgoing, int offset, int len)
+                                        throws ErrorResultException {
+                                    try {
+                                        return saslServer.wrap(outgoing, offset, len);
+                                    } catch (SaslException e) {
+                                        throw ErrorResultException
+                                                .newErrorResult(Responses.newResult(
+                                                        ResultCode.OPERATIONS_ERROR).setCause(e));
+                                    }
+                                }
+                            };
+
+                            clientContext.enableConnectionSecurityLayer(csl);
+                        }
+
+                    } else {
+                        resultHandler.handleResult(Responses.newBindResult(
+                                ResultCode.SASL_BIND_IN_PROGRESS).setServerSASLCredentials(
+                                ByteString.wrap(challenge)));
+                    }
+                } catch (Exception e) {
+                    resultHandler.handleErrorResult(ErrorResultException.newErrorResult(Responses
+                            .newBindResult(ResultCode.OPERATIONS_ERROR).setCause(e)
+                            .setDiagnosticMessage(e.toString())));
+                }
+            } else {
+                resultHandler.handleResult(Responses.newBindResult(ResultCode.SUCCESS));
+            }
+            requestsInProgress.remove(context);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void handleConnectionClosed(final Integer context, final UnbindRequest request) {
+            close();
+        }
+
+        private void close() {
+            if (saslServer != null) {
+                try {
+                    saslServer.dispose();
+                } catch (SaslException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void handleConnectionDisconnected(ResultCode resultCode, String message) {
+            close();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void handleConnectionError(final Throwable error) {
+            close();
+        }
+
+        /**
+         * @param context
+         * @param request
+         * @param resultHandler
+         * @param intermediateResponseHandler
+         * @throws UnsupportedOperationException
+         */
+        public void handleCompare(final Integer context, final CompareRequest request,
+                final IntermediateResponseHandler intermediateResponseHandler,
+                final ResultHandler<? super CompareResult> resultHandler)
+                throws UnsupportedOperationException {
+            CompareResult result = null;
+            final AbandonableRequest abReq = new AbandonableRequest(request);
+            requestsInProgress.put(context, abReq);
+            // Get the DN.
+            final DN dn = request.getName();
+            if (!entryMap.containsKey(dn)) {
+                // entry not found.
+                result = Responses.newCompareResult(ResultCode.NO_SUCH_ATTRIBUTE);
+                final ErrorResultException ere = ErrorResultException.newErrorResult(result);
+                resultHandler.handleErrorResult(ere);
+                // doesn't matter if it was canceled.
+                requestsInProgress.remove(context);
+                return;
+            }
+
+            // Get the entry.
+            final Entry entry = entryMap.get(dn);
+            final AttributeDescription attrDesc = request.getAttributeDescription();
+            for (final Attribute attr : entry.getAllAttributes(attrDesc)) {
+                final Iterator<ByteString> it = attr.iterator();
+                while (it.hasNext()) {
+                    final ByteString s = it.next();
+                    if (abReq.isCanceled()) {
+                        final Result r = Responses.newResult(ResultCode.CANCELLED);
+                        final ErrorResultException ere = ErrorResultException.newErrorResult(r);
+                        resultHandler.handleErrorResult(ere);
+                        requestsInProgress.remove(context);
+                        return;
+                    }
+                    if (s.equals(request.getAssertionValue())) {
+                        result = Responses.newCompareResult(ResultCode.COMPARE_TRUE);
+                        resultHandler.handleResult(result);
+                        requestsInProgress.remove(context);
+                        return;
+                    }
+                }
+            }
+            result = Responses.newCompareResult(ResultCode.COMPARE_FALSE);
             resultHandler.handleResult(result);
             requestsInProgress.remove(context);
+        }
+
+        /**
+         * @param context
+         * @param request
+         * @param handler
+         * @param intermediateResponseHandler
+         * @throws UnsupportedOperationException
+         */
+        public void handleDelete(final Integer context, final DeleteRequest request,
+                final IntermediateResponseHandler intermediateResponseHandler,
+                final ResultHandler<? super Result> handler) throws UnsupportedOperationException {
+            Result result = null;
+            final AbandonableRequest abReq = new AbandonableRequest(request);
+            requestsInProgress.put(context, abReq);
+            // Get the DN.
+            final DN dn = request.getName();
+            if (!entryMap.containsKey(dn)) {
+                // entry is not found.
+                result = Responses.newResult(ResultCode.NO_SUCH_OBJECT);
+                final ErrorResultException ere = ErrorResultException.newErrorResult(result);
+                handler.handleErrorResult(ere);
+                // doesn't matter if it was canceled.
+                requestsInProgress.remove(context);
+                return;
+            }
+
+            if (abReq.isCanceled()) {
+                result = Responses.newResult(ResultCode.CANCELLED);
+                final ErrorResultException ere = ErrorResultException.newErrorResult(result);
+                handler.handleErrorResult(ere);
+                requestsInProgress.remove(context);
+                return;
+            }
+            // Remove this from the map.
+            entryMap.remove(dn);
+            requestsInProgress.remove(context);
+        }
+
+        /**
+         * @param context
+         * @param request
+         * @param resultHandler
+         * @param intermediateResponseHandler
+         * @throws UnsupportedOperationException
+         */
+        public <R extends ExtendedResult> void handleExtendedRequest(final Integer context,
+                final ExtendedRequest<R> request,
+                final IntermediateResponseHandler intermediateResponseHandler,
+                final ResultHandler<? super R> resultHandler) throws UnsupportedOperationException {
+            if (request.getOID().equals(StartTLSExtendedRequest.OID)) {
+                final R result =
+                        request.getResultDecoder().newExtendedErrorResult(ResultCode.SUCCESS, "",
+                                "");
+                resultHandler.handleResult(result);
+                clientContext.enableTLS(sslContext, null, sslContext.getSocketFactory()
+                        .getSupportedCipherSuites(), false, false);
+            }
+        }
+
+        /**
+         * @param context
+         * @param request
+         * @param resultHandler
+         * @param intermediateResponseHandler
+         * @throws UnsupportedOperationException
+         */
+        public void handleModify(final Integer context, final ModifyRequest request,
+                final IntermediateResponseHandler intermediateResponseHandler,
+                final ResultHandler<? super Result> resultHandler)
+                throws UnsupportedOperationException {
+            // TODO:
+        }
+
+        /**
+         * @param context
+         * @param request
+         * @param resultHandler
+         * @param intermediateResponseHandler
+         * @throws UnsupportedOperationException
+         */
+        public void handleModifyDN(final Integer context, final ModifyDNRequest request,
+                final IntermediateResponseHandler intermediateResponseHandler,
+                final ResultHandler<? super Result> resultHandler)
+                throws UnsupportedOperationException {
+            // TODO
+        }
+
+        /**
+         * @param request
+         * @param intermediateResponseHandler
+         * @param resultHandler
+         * @param context
+         * @throws UnsupportedOperationException
+         */
+        public void handleSearch(final Integer context, final SearchRequest request,
+                final IntermediateResponseHandler intermediateResponseHandler,
+                final SearchResultHandler resultHandler) throws UnsupportedOperationException {
+            Result result = null;
+            final AbandonableRequest abReq = new AbandonableRequest(request);
+            requestsInProgress.put(context, abReq);
+            // Get the DN.
+            final DN dn = request.getName();
+            if (!entryMap.containsKey(dn)) {
+                // Entry not found.
+                result = Responses.newResult(ResultCode.NO_SUCH_OBJECT);
+                final ErrorResultException ere = ErrorResultException.newErrorResult(result);
+                resultHandler.handleErrorResult(ere);
+                // Should searchResultHandler handle anything?
+
+                // doesn't matter if it was canceled.
+                requestsInProgress.remove(context);
+                return;
+            }
+
+            if (abReq.isCanceled()) {
+                result = Responses.newResult(ResultCode.CANCELLED);
+                final ErrorResultException ere = ErrorResultException.newErrorResult(result);
+                resultHandler.handleErrorResult(ere);
+                requestsInProgress.remove(context);
+                return;
+            }
+
+            final SearchResultEntry e =
+                    Responses.newSearchResultEntry(new LinkedHashMapEntry(entryMap.get(dn)));
+            // Check we have had any controls in the request.
+            for (final Control control : request.getControls()) {
+                if (control.getOID().equals(AccountUsabilityRequestControl.OID)) {
+                    e.addControl(AccountUsabilityResponseControl.newControl(false, false, false,
+                            10, false, 0));
+                }
+            }
+            resultHandler.handleEntry(e);
+            result = Responses.newResult(ResultCode.SUCCESS);
+            resultHandler.handleResult(result);
+            requestsInProgress.remove(context);
+        }
+    }
+
+    // The mapping between entry DNs and the corresponding entries.
+    private final ConcurrentHashMap<DN, Entry> entryMap = new ConcurrentHashMap<DN, Entry>();
+
+    // The LDAP listener.
+    private LDAPListener listener = null;
+
+    // whether the server is running.
+    private volatile boolean isRunning;
+
+    // The mapping between the message id and the requests the server is
+    // currently
+    // handling.
+    private final ConcurrentHashMap<Integer, AbandonableRequest> requestsInProgress =
+            new ConcurrentHashMap<Integer, AbandonableRequest>();
+
+    private SSLContext sslContext;
+
+    private LDAPServer() {
+        // Add the root dse first.
+        entryMap.put(DN.rootDN(), Entries.unmodifiableEntry(new LinkedHashMapEntry()));
+        for (int i = 0; i < 1000; i++) {
+            final String dn = String.format("uid=user.%d,ou=people,o=test", i);
+            final String cn = String.format("cn: user.%d", i);
+            final String sn = String.format("sn: %d", i);
+            final String uid = String.format("uid: user.%d", i);
+
+            // See
+            // org.forgerock.opendj.ldap.ConnectionFactoryTestCase.testSchemaUsage().
+            final String mail = String.format("mail: user.%d@example.com", i);
+
+            final DN d = DN.valueOf(dn);
+            final Entry e =
+                    new LinkedHashMapEntry("dn: " + dn, "objectclass: person",
+                            "objectclass: inetorgperson", "objectclass: top", cn, sn, uid, mail);
+            entryMap.put(d, Entries.unmodifiableEntry(e));
+        }
+    }
+
+    /**
+     * @param context
+     * @return
+     */
+    public ServerConnection<Integer> handleAccept(final LDAPClientContext context) {
+        return new LDAPServerConnection(context);
+    }
+
+    /**
+     * Returns whether the server is running or not.
+     *
+     * @return Whether the server is running.
+     */
+    public boolean isRunning() {
+        return isRunning;
+    }
+
+    /**
+     * Starts the server.
+     *
+     * @param port
+     * @exception IOException
+     */
+    public synchronized void start(final int port) throws Exception {
+        if (isRunning) {
             return;
-          }
         }
-      }
-      result = Responses.newCompareResult(ResultCode.COMPARE_FALSE);
-      resultHandler.handleResult(result);
-      requestsInProgress.remove(context);
+        sslContext = new SSLContextBuilder().getSSLContext();
+        listener =
+                new LDAPListener(port, getInstance(), new LDAPListenerOptions().setBacklog(4096));
+        isRunning = true;
     }
 
-
-
     /**
-     * @param context
-     * @param request
-     * @param handler
-     * @param intermediateResponseHandler
-     * @throws UnsupportedOperationException
+     * Stops the server.
      */
-    public void handleDelete(final Integer context,
-        final DeleteRequest request,
-        final IntermediateResponseHandler intermediateResponseHandler,
-        final ResultHandler<? super Result> handler)
-        throws UnsupportedOperationException
-    {
-      Result result = null;
-      final AbandonableRequest abReq = new AbandonableRequest(request);
-      requestsInProgress.put(context, abReq);
-      // Get the DN.
-      final DN dn = request.getName();
-      if (!entryMap.containsKey(dn))
-      {
-        // entry is not found.
-        result = Responses.newResult(ResultCode.NO_SUCH_OBJECT);
-        final ErrorResultException ere = ErrorResultException
-            .newErrorResult(result);
-        handler.handleErrorResult(ere);
-        // doesn't matter if it was canceled.
-        requestsInProgress.remove(context);
-        return;
-      }
-
-      if (abReq.isCanceled())
-      {
-        result = Responses.newResult(ResultCode.CANCELLED);
-        final ErrorResultException ere = ErrorResultException
-            .newErrorResult(result);
-        handler.handleErrorResult(ere);
-        requestsInProgress.remove(context);
-        return;
-      }
-      // Remove this from the map.
-      entryMap.remove(dn);
-      requestsInProgress.remove(context);
-    }
-
-
-
-    /**
-     * @param context
-     * @param request
-     * @param resultHandler
-     * @param intermediateResponseHandler
-     * @throws UnsupportedOperationException
-     */
-    public <R extends ExtendedResult> void handleExtendedRequest(
-        final Integer context, final ExtendedRequest<R> request,
-        final IntermediateResponseHandler intermediateResponseHandler,
-        final ResultHandler<? super R> resultHandler)
-        throws UnsupportedOperationException
-    {
-      if (request.getOID().equals(StartTLSExtendedRequest.OID))
-      {
-        final R result = request.getResultDecoder().newExtendedErrorResult(
-            ResultCode.SUCCESS, "", "");
-        resultHandler.handleResult(result);
-        clientContext.enableTLS(sslContext, null, sslContext.getSocketFactory()
-            .getSupportedCipherSuites(), false, false);
-      }
-    }
-
-
-
-    /**
-     * @param context
-     * @param request
-     * @param resultHandler
-     * @param intermediateResponseHandler
-     * @throws UnsupportedOperationException
-     */
-    public void handleModify(final Integer context,
-        final ModifyRequest request,
-        final IntermediateResponseHandler intermediateResponseHandler,
-        final ResultHandler<? super Result> resultHandler)
-        throws UnsupportedOperationException
-    {
-      // TODO:
-    }
-
-
-
-    /**
-     * @param context
-     * @param request
-     * @param resultHandler
-     * @param intermediateResponseHandler
-     * @throws UnsupportedOperationException
-     */
-    public void handleModifyDN(final Integer context,
-        final ModifyDNRequest request,
-        final IntermediateResponseHandler intermediateResponseHandler,
-        final ResultHandler<? super Result> resultHandler)
-        throws UnsupportedOperationException
-    {
-      // TODO
-    }
-
-
-
-    /**
-     * @param request
-     * @param intermediateResponseHandler
-     * @param resultHandler
-     * @param context
-     * @throws UnsupportedOperationException
-     */
-    public void handleSearch(final Integer context,
-        final SearchRequest request,
-        final IntermediateResponseHandler intermediateResponseHandler,
-        final SearchResultHandler resultHandler)
-        throws UnsupportedOperationException
-    {
-      Result result = null;
-      final AbandonableRequest abReq = new AbandonableRequest(request);
-      requestsInProgress.put(context, abReq);
-      // Get the DN.
-      final DN dn = request.getName();
-      if (!entryMap.containsKey(dn))
-      {
-        // Entry not found.
-        result = Responses.newResult(ResultCode.NO_SUCH_OBJECT);
-        final ErrorResultException ere = ErrorResultException
-            .newErrorResult(result);
-        resultHandler.handleErrorResult(ere);
-        // Should searchResultHandler handle anything?
-
-        // doesn't matter if it was canceled.
-        requestsInProgress.remove(context);
-        return;
-      }
-
-      if (abReq.isCanceled())
-      {
-        result = Responses.newResult(ResultCode.CANCELLED);
-        final ErrorResultException ere = ErrorResultException
-            .newErrorResult(result);
-        resultHandler.handleErrorResult(ere);
-        requestsInProgress.remove(context);
-        return;
-      }
-
-      final SearchResultEntry e = Responses
-          .newSearchResultEntry(new LinkedHashMapEntry(entryMap.get(dn)));
-      // Check we have had any controls in the request.
-      for (final Control control : request.getControls())
-      {
-        if (control.getOID().equals(AccountUsabilityRequestControl.OID))
-        {
-          e.addControl(AccountUsabilityResponseControl.newControl(false, false,
-              false, 10, false, 0));
+    public synchronized void stop() {
+        if (!isRunning) {
+            return;
         }
-      }
-      resultHandler.handleEntry(e);
-      result = Responses.newResult(ResultCode.SUCCESS);
-      resultHandler.handleResult(result);
-      requestsInProgress.remove(context);
+        listener.close();
+        isRunning = false;
     }
-  }
-
-
-
-  // The mapping between entry DNs and the corresponding entries.
-  private final ConcurrentHashMap<DN, Entry> entryMap = new ConcurrentHashMap<DN, Entry>();
-
-  // The LDAP listener.
-  private LDAPListener listener = null;
-
-  // whether the server is running.
-  private volatile boolean isRunning;
-
-  // The mapping between the message id and the requests the server is currently
-  // handling.
-  private final ConcurrentHashMap<Integer, AbandonableRequest> requestsInProgress = new ConcurrentHashMap<Integer, AbandonableRequest>();
-
-  private SSLContext sslContext;
-
-
-
-  private LDAPServer()
-  {
-    // Add the root dse first.
-    entryMap.put(DN.rootDN(),
-        Entries.unmodifiableEntry(new LinkedHashMapEntry()));
-    for (int i = 0; i < 1000; i++)
-    {
-      final String dn = String.format("uid=user.%d,ou=people,o=test", i);
-      final String cn = String.format("cn: user.%d", i);
-      final String sn = String.format("sn: %d", i);
-      final String uid = String.format("uid: user.%d", i);
-
-      // See
-      // org.forgerock.opendj.ldap.ConnectionFactoryTestCase.testSchemaUsage().
-      final String mail = String.format("mail: user.%d@example.com", i);
-
-      final DN d = DN.valueOf(dn);
-      final Entry e = new LinkedHashMapEntry("dn: " + dn,
-          "objectclass: person", "objectclass: inetorgperson",
-          "objectclass: top", cn, sn, uid, mail);
-      entryMap.put(d, Entries.unmodifiableEntry(e));
-    }
-  }
-
-
-
-  /**
-   * @param context
-   * @return
-   */
-  public ServerConnection<Integer> handleAccept(final LDAPClientContext context)
-  {
-    return new LDAPServerConnection(context);
-  }
-
-
-
-  /**
-   * Returns whether the server is running or not.
-   *
-   * @return Whether the server is running.
-   */
-  public boolean isRunning()
-  {
-    return isRunning;
-  }
-
-
-
-  /**
-   * Starts the server.
-   *
-   * @param port
-   * @exception IOException
-   */
-  public synchronized void start(final int port) throws Exception
-  {
-    if (isRunning)
-    {
-      return;
-    }
-    sslContext = new SSLContextBuilder().getSSLContext();
-    listener = new LDAPListener(port, getInstance(),
-        new LDAPListenerOptions().setBacklog(4096));
-    isRunning = true;
-  }
-
-
-
-  /**
-   * Stops the server.
-   */
-  public synchronized void stop()
-  {
-    if (!isRunning)
-    {
-      return;
-    }
-    listener.close();
-    isRunning = false;
-  }
 }

--
Gitblit v1.10.0