From 6439bba5cc09d6febc59bdc9e0d9bc25f1f1eb18 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Wed, 01 Sep 2010 09:04:15 +0000
Subject: [PATCH] Various improvements:

---
 sdk/tests/unit-tests-testng/src/org/opends/sdk/LDAPServer.java |  883 +++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 536 insertions(+), 347 deletions(-)

diff --git a/sdk/tests/unit-tests-testng/src/org/opends/sdk/LDAPServer.java b/sdk/tests/unit-tests-testng/src/org/opends/sdk/LDAPServer.java
index 08cf276..c6695cc 100644
--- a/sdk/tests/unit-tests-testng/src/org/opends/sdk/LDAPServer.java
+++ b/sdk/tests/unit-tests-testng/src/org/opends/sdk/LDAPServer.java
@@ -29,13 +29,19 @@
 
 
 
+import static com.sun.opends.sdk.ldap.LDAPConstants.TYPE_AUTHENTICATION_SASL;
+
 import java.io.IOException;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 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 org.opends.sdk.asn1.ASN1;
+import org.opends.sdk.asn1.ASN1Reader;
 import org.opends.sdk.controls.Control;
 import org.opends.sdk.controls.ControlDecoder;
 import org.opends.sdk.requests.*;
@@ -53,7 +59,7 @@
  * A simple ldap server that manages 1000 entries and used for running
  * testcases. //FIXME: make it MT-safe.
  */
-public class LDAPServer implements ServerConnection<Integer>,
+public class LDAPServer implements
     ServerConnectionFactory<LDAPClientContext, Integer>
 {
   // Creates an abandonable request from the ordinary requests.
@@ -132,6 +138,525 @@
 
 
 
+  private class LDAPServerConnection implements ServerConnection<Integer>
+  {
+
+    private final LDAPClientContext clientContext;
+    private SaslServer saslServer;
+
+
+
+    private LDAPServerConnection(LDAPClientContext clientContext)
+    {
+      this.clientContext = clientContext;
+    }
+
+
+
+    /**
+     * 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(context);
+      if (req == null)
+      {
+        // Nothing to do here.
+        return;
+      }
+      // Cancel the request
+      req.cancel();
+      // No response is needed.
+    }
+
+
+
+    /**
+     * 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 ResultHandler<? super Result> handler,
+        final IntermediateResponseHandler intermediateResponseHandler)
+        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.wrap(result);
+        handler.handleErrorResult(ere);
+        // doesn't matter if it was canceled.
+        requestsInProgress.remove(context);
+        return;
+      }
+
+      // 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);
+      }
+
+      if (abReq.isCanceled())
+      {
+        result = Responses.newResult(ResultCode.CANCELLED);
+        final ErrorResultException ere = ErrorResultException.wrap(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 ResultHandler<? super BindResult> resultHandler,
+        final IntermediateResponseHandler intermediateResponseHandler)
+        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.wrap(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.wrap(Responses.newResult(
+                        ResultCode.OPERATIONS_ERROR).setCause(e));
+                  }
+                }
+              };
+
+              clientContext.startSASL(csl);
+            }
+
+          }
+          else
+          {
+            resultHandler.handleResult(Responses.newBindResult(
+                ResultCode.SASL_BIND_IN_PROGRESS).setServerSASLCredentials(
+                ByteString.wrap(challenge)));
+          }
+        }
+        catch (Exception e)
+        {
+          resultHandler.handleErrorResult(ErrorResultException.wrap(Responses
+              .newBindResult(ResultCode.OPERATIONS_ERROR).setCause(e)
+              .setDiagnosticMessage(e.toString())));
+        }
+      }
+      else
+      {
+        resultHandler.handleResult(Responses.newBindResult(ResultCode.SUCCESS));
+      }
+      requestsInProgress.remove(context);
+    }
+
+
+
+    /**
+     * @param context
+     * @param request
+     */
+    public void handleConnectionClosed(final Integer context,
+        final UnbindRequest request)
+    {
+      if (saslServer != null)
+      {
+        try
+        {
+          saslServer.dispose();
+        }
+        catch (SaslException e)
+        {
+          e.printStackTrace();
+        }
+      }
+    }
+
+
+
+    /**
+     * @param error
+     */
+    public void handleConnectionException(final Throwable error)
+    {
+
+    }
+
+
+
+    /**
+     * @param context
+     * @param request
+     * @param resultHandler
+     * @param intermediateResponseHandler
+     * @throws UnsupportedOperationException
+     */
+    public void handleCompare(final Integer context,
+        final CompareRequest request,
+        final ResultHandler<? super CompareResult> resultHandler,
+        final IntermediateResponseHandler intermediateResponseHandler)
+        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.wrap(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.wrap(r);
+            resultHandler.handleErrorResult(ere);
+            requestsInProgress.remove(context);
+            return;
+          }
+          if (s.equals(request.getAssertionValue()))
+          {
+            result = Responses.newCompareResult(ResultCode.COMPARE_TRUE);
+            resultHandler.handleResult(result);
+          }
+        }
+      }
+      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 ResultHandler<? super Result> handler,
+        final IntermediateResponseHandler intermediateResponseHandler)
+        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.wrap(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.wrap(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 ResultHandler<? super R> resultHandler,
+        final IntermediateResponseHandler intermediateResponseHandler)
+        throws UnsupportedOperationException
+    {
+      if (request.getOID().equals(StartTLSExtendedRequest.OID))
+      {
+        final R result = request.getResultDecoder().adaptExtendedErrorResult(
+            ResultCode.SUCCESS, "", "");
+        resultHandler.handleResult(result);
+        clientContext.startTLS(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 ResultHandler<? super Result> resultHandler,
+        final IntermediateResponseHandler intermediateResponseHandler)
+        throws UnsupportedOperationException
+    {
+      // TODO:
+    }
+
+
+
+    /**
+     * @param context
+     * @param request
+     * @param resultHandler
+     * @param intermediateResponseHandler
+     * @throws UnsupportedOperationException
+     */
+    public void handleModifyDN(final Integer context,
+        final ModifyDNRequest request,
+        final ResultHandler<? super Result> resultHandler,
+        final IntermediateResponseHandler intermediateResponseHandler)
+        throws UnsupportedOperationException
+    {
+      // TODO
+    }
+
+
+
+    /**
+     * @param context
+     * @param request
+     * @param resultHandler
+     * @param searchResulthandler
+     * @param intermediateResponseHandler
+     * @throws UnsupportedOperationException
+     */
+    public void handleSearch(final Integer context,
+        final SearchRequest request,
+        final ResultHandler<? super Result> resultHandler,
+        final SearchResultHandler searchResulthandler,
+        final IntermediateResponseHandler intermediateResponseHandler)
+        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.wrap(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.wrap(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));
+        }
+      }
+      searchResulthandler.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>();
 
@@ -152,6 +677,8 @@
   // The Set used for locking dns.
   private final HashSet<DN> lockedDNs = new HashSet<DN>();
 
+  private SSLContext sslContext;
+
 
 
   private LDAPServer()
@@ -177,258 +704,12 @@
 
 
   /**
-   * Abandons the request sent by the client.
-   *
-   * @param context
-   * @param request
-   * @throws UnsupportedOperationException
-   */
-  public void abandon(final Integer context, final AbandonRequest request)
-      throws UnsupportedOperationException
-  {
-    // Check if we have any concurrent operation with this message id.
-    final AbandonableRequest req = requestsInProgress.get(context);
-    if (req == null)
-    {
-      // Nothing to do here.
-      return;
-    }
-    // Cancel the request
-    req.cancel();
-    // No response is needed.
-  }
-
-
-
-  /**
    * @param context
    * @return
    */
   public ServerConnection<Integer> accept(final LDAPClientContext context)
   {
-    return this;
-  }
-
-
-
-  /**
-   * Adds the request sent by the client.
-   *
-   * @param context
-   * @param request
-   * @param handler
-   * @param intermediateResponseHandler
-   * @throws UnsupportedOperationException
-   */
-  public void add(final Integer context, final AddRequest request,
-      final ResultHandler<Result> handler,
-      final IntermediateResponseHandler intermediateResponseHandler)
-      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.wrap(result);
-      handler.handleErrorResult(ere);
-      // doesn't matter if it was canceled.
-      requestsInProgress.remove(context);
-      return;
-    }
-
-    // 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);
-    }
-
-    if (abReq.isCanceled())
-    {
-      result = Responses.newResult(ResultCode.CANCELLED);
-      final ErrorResultException ere = ErrorResultException.wrap(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 bind(final Integer context, final int version,
-      final BindRequest request,
-      final ResultHandler<? super BindResult> resultHandler,
-      final IntermediateResponseHandler intermediateResponseHandler)
-      throws UnsupportedOperationException
-  {
-    // TODO: all bind types.
-    final AbandonableRequest abReq = new AbandonableRequest(request);
-    requestsInProgress.put(context, abReq);
-    resultHandler.handleResult(Responses.newBindResult(ResultCode.SUCCESS));
-    requestsInProgress.remove(context);
-  }
-
-
-
-  /**
-   * @param context
-   * @param request
-   */
-  public void closed(final Integer context, final UnbindRequest request)
-  {
-
-  }
-
-
-
-  /**
-   * @param error
-   */
-  public void closed(final Throwable error)
-  {
-
-  }
-
-
-
-  /**
-   * @param context
-   * @param request
-   * @param resultHandler
-   * @param intermediateResponseHandler
-   * @throws UnsupportedOperationException
-   */
-  public void compare(final Integer context, final CompareRequest request,
-      final ResultHandler<? super CompareResult> resultHandler,
-      final IntermediateResponseHandler intermediateResponseHandler)
-      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.wrap(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.wrap(r);
-          resultHandler.handleErrorResult(ere);
-          requestsInProgress.remove(context);
-          return;
-        }
-        if (s.equals(request.getAssertionValue()))
-        {
-          result = Responses.newCompareResult(ResultCode.COMPARE_TRUE);
-          resultHandler.handleResult(result);
-        }
-      }
-    }
-    result = Responses.newCompareResult(ResultCode.COMPARE_FALSE);
-    resultHandler.handleResult(result);
-    requestsInProgress.remove(context);
-  }
-
-
-
-  /**
-   * @param context
-   * @param request
-   * @param handler
-   * @param intermediateResponseHandler
-   * @throws UnsupportedOperationException
-   */
-  public void delete(final Integer context, final DeleteRequest request,
-      final ResultHandler<Result> handler,
-      final IntermediateResponseHandler intermediateResponseHandler)
-      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.wrap(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.wrap(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 extendedRequest(final Integer context,
-      final ExtendedRequest<R> request, final ResultHandler<R> resultHandler,
-      final IntermediateResponseHandler intermediateResponseHandler)
-      throws UnsupportedOperationException
-  {
-    // TODO:
+    return new LDAPServerConnection(context);
   }
 
 
@@ -446,113 +727,21 @@
 
 
   /**
-   * @param context
-   * @param request
-   * @param resultHandler
-   * @param intermediateResponseHandler
-   * @throws UnsupportedOperationException
-   */
-  public void modify(final Integer context, final ModifyRequest request,
-      final ResultHandler<Result> resultHandler,
-      final IntermediateResponseHandler intermediateResponseHandler)
-      throws UnsupportedOperationException
-  {
-    // TODO:
-  }
-
-
-
-  /**
-   * @param context
-   * @param request
-   * @param resultHandler
-   * @param intermediateResponseHandler
-   * @throws UnsupportedOperationException
-   */
-  public void modifyDN(final Integer context, final ModifyDNRequest request,
-      final ResultHandler<Result> resultHandler,
-      final IntermediateResponseHandler intermediateResponseHandler)
-      throws UnsupportedOperationException
-  {
-    // TODO
-  }
-
-
-
-  /**
-   * @param context
-   * @param request
-   * @param resultHandler
-   * @param searchResulthandler
-   * @param intermediateResponseHandler
-   * @throws UnsupportedOperationException
-   */
-  public void search(final Integer context, final SearchRequest request,
-      final ResultHandler<Result> resultHandler,
-      final SearchResultHandler searchResulthandler,
-      final IntermediateResponseHandler intermediateResponseHandler)
-      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.wrap(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.wrap(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));
-      }
-    }
-    searchResulthandler.handleEntry(e);
-    result = Responses.newResult(ResultCode.SUCCESS);
-    resultHandler.handleResult(result);
-    requestsInProgress.remove(context);
-  }
-
-
-
-  /**
    * Starts the server.
    *
    * @param port
    * @exception IOException
    */
-  public synchronized void start(final int port) throws IOException
+  public synchronized void start(final int port) throws Exception
   {
     if (isRunning)
     {
       return;
     }
+    sslContext = new SSLContextBuilder().getSSLContext();
+
     transport.setSelectorRunnersCount(2);
-    listener = new LDAPListener(port, new LDAPServer(),
+    listener = new LDAPListener(port, getInstance(),
         new GrizzlyLDAPListenerOptions().setTCPNIOTransport(transport)
             .setBacklog(4096));
     transport.start();

--
Gitblit v1.10.0