From f2160f4bd1c8ac67e5a86a6710d431e8932877f9 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Fri, 28 May 2010 11:47:51 +0000
Subject: [PATCH] Synchronize SDK on java.net with internal repository.

---
 sdk/src/org/opends/sdk/requests/Requests.java |  600 +++++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 375 insertions(+), 225 deletions(-)

diff --git a/sdk/src/org/opends/sdk/requests/Requests.java b/sdk/src/org/opends/sdk/requests/Requests.java
index 66f9705..027b1eb 100644
--- a/sdk/src/org/opends/sdk/requests/Requests.java
+++ b/sdk/src/org/opends/sdk/requests/Requests.java
@@ -29,7 +29,10 @@
 
 
 
-import static com.sun.opends.sdk.messages.Messages.*;
+import static com.sun.opends.sdk.messages.Messages.WARN_READ_LDIF_RECORD_CHANGE_RECORD_WRONG_TYPE;
+
+import javax.net.ssl.SSLContext;
+import javax.security.auth.Subject;
 
 import org.opends.sdk.*;
 import org.opends.sdk.ldif.ChangeRecord;
@@ -40,8 +43,7 @@
 
 
 /**
- * This class contains various methods for creating and manipulating
- * requests.
+ * This class contains various methods for creating and manipulating requests.
  * <p>
  * TODO: search request from LDAP URL.
  * <p>
@@ -61,7 +63,7 @@
    *          The message ID of the request to be abandoned.
    * @return The new abandon request.
    */
-  public static AbandonRequest newAbandonRequest(int messageID)
+  public static AbandonRequest newAbandonRequest(final int messageID)
   {
     return new AbandonRequestImpl(messageID);
   }
@@ -77,21 +79,20 @@
    * @throws NullPointerException
    *           If {@code name} was {@code null}.
    */
-  public static AddRequest newAddRequest(DN name)
+  public static AddRequest newAddRequest(final DN name)
       throws NullPointerException
   {
-    final Entry entry = new SortedEntry().setName(name);
+    final Entry entry = new LinkedHashMapEntry().setName(name);
     return new AddRequestImpl(entry);
   }
 
 
 
   /**
-   * Creates a new add request backed by the provided entry.
-   * Modifications made to {@code entry} will be reflected in the
-   * returned add request. The returned add request supports updates to
-   * its list of controls, as well as updates to the name and attributes
-   * if the underlying entry allows.
+   * Creates a new add request backed by the provided entry. Modifications made
+   * to {@code entry} will be reflected in the returned add request. The
+   * returned add request supports updates to its list of controls, as well as
+   * updates to the name and attributes if the underlying entry allows.
    *
    * @param entry
    *          The entry to be added.
@@ -99,7 +100,7 @@
    * @throws NullPointerException
    *           If {@code entry} was {@code null} .
    */
-  public static AddRequest newAddRequest(Entry entry)
+  public static AddRequest newAddRequest(final Entry entry)
       throws NullPointerException
   {
     Validator.ensureNotNull(entry);
@@ -109,46 +110,45 @@
 
 
   /**
-   * Creates a new add request using the provided distinguished name
-   * decoded using the default schema.
+   * Creates a new add request using the provided distinguished name decoded
+   * using the default schema.
    *
    * @param name
    *          The distinguished name of the entry to be added.
    * @return The new add request.
    * @throws LocalizedIllegalArgumentException
-   *           If {@code name} could not be decoded using the default
-   *           schema.
+   *           If {@code name} could not be decoded using the default schema.
    * @throws NullPointerException
    *           If {@code name} was {@code null}.
    */
-  public static AddRequest newAddRequest(String name)
+  public static AddRequest newAddRequest(final String name)
       throws LocalizedIllegalArgumentException, NullPointerException
   {
-    final Entry entry = new SortedEntry().setName(name);
+    final Entry entry = new LinkedHashMapEntry().setName(name);
     return new AddRequestImpl(entry);
   }
 
 
 
   /**
-   * Creates a new add request using the provided lines of LDIF decoded
-   * using the default schema.
+   * Creates a new add request using the provided lines of LDIF decoded using
+   * the default schema.
    *
    * @param ldifLines
-   *          Lines of LDIF containing an LDIF add change record or an
-   *          LDIF entry record.
+   *          Lines of LDIF containing an LDIF add change record or an LDIF
+   *          entry record.
    * @return The new add request.
    * @throws LocalizedIllegalArgumentException
-   *           If {@code ldifLines} was empty, or contained invalid
-   *           LDIF, or could not be decoded using the default schema.
+   *           If {@code ldifLines} was empty, or contained invalid LDIF, or
+   *           could not be decoded using the default schema.
    * @throws NullPointerException
    *           If {@code ldifLines} was {@code null} .
    */
-  public static AddRequest newAddRequest(String... ldifLines)
+  public static AddRequest newAddRequest(final String... ldifLines)
       throws LocalizedIllegalArgumentException, NullPointerException
   {
     // LDIF change record reader is tolerant to missing change types.
-    ChangeRecord record = LDIFChangeRecordReader
+    final ChangeRecord record = LDIFChangeRecordReader
         .valueOfLDIFChangeRecord(ldifLines);
 
     if (record instanceof AddRequest)
@@ -158,7 +158,7 @@
     else
     {
       // Wrong change type.
-      LocalizableMessage message = WARN_READ_LDIF_RECORD_CHANGE_RECORD_WRONG_TYPE
+      final LocalizableMessage message = WARN_READ_LDIF_RECORD_CHANGE_RECORD_WRONG_TYPE
           .get("add");
       throw new LocalizedIllegalArgumentException(message);
     }
@@ -167,21 +167,53 @@
 
 
   /**
-   * Creates a new change record (an add, delete, modify, or modify DN
-   * request) using the provided lines of LDIF decoded using the default
-   * schema.
+   * Creates a new anonymous SASL bind request having the provided trace string.
+   *
+   * @param traceString
+   *          The trace information, which has no semantic value, and can be
+   *          used by administrators in order to identify the user.
+   * @return The new anonymous SASL bind request.
+   * @throws NullPointerException
+   *           If {@code traceString} was {@code null}.
+   */
+  public static AnonymousSASLBindRequest newAnonymousSASLBindRequest(
+      final String traceString) throws NullPointerException
+  {
+    return new AnonymousSASLBindRequestImpl(traceString);
+  }
+
+
+
+  /**
+   * Creates a new cancel extended request using the provided message ID.
+   *
+   * @param messageID
+   *          The message ID of the request to be abandoned.
+   * @return The new cancel extended request.
+   */
+  public static CancelExtendedRequest newCancelExtendedRequest(
+      final int messageID)
+  {
+    return new CancelExtendedRequestImpl(messageID);
+  }
+
+
+
+  /**
+   * Creates a new change record (an add, delete, modify, or modify DN request)
+   * using the provided lines of LDIF decoded using the default schema.
    *
    * @param ldifLines
-   *          Lines of LDIF containing an LDIF change record or an LDIF
-   *          entry record.
+   *          Lines of LDIF containing an LDIF change record or an LDIF entry
+   *          record.
    * @return The new change record.
    * @throws LocalizedIllegalArgumentException
-   *           If {@code ldifLines} was empty, or contained invalid
-   *           LDIF, or could not be decoded using the default schema.
+   *           If {@code ldifLines} was empty, or contained invalid LDIF, or
+   *           could not be decoded using the default schema.
    * @throws NullPointerException
    *           If {@code ldifLines} was {@code null} .
    */
-  public static ChangeRecord newChangeRecord(String... ldifLines)
+  public static ChangeRecord newChangeRecord(final String... ldifLines)
       throws LocalizedIllegalArgumentException, NullPointerException
   {
     // LDIF change record reader is tolerant to missing change types.
@@ -191,8 +223,8 @@
 
 
   /**
-   * Creates a new compare request using the provided distinguished
-   * name, attribute name, and assertion value.
+   * Creates a new compare request using the provided distinguished name,
+   * attribute name, and assertion value.
    *
    * @param name
    *          The distinguished name of the entry to be compared.
@@ -205,25 +237,22 @@
    *           If {@code name}, {@code attributeDescription}, or {@code
    *           assertionValue} was {@code null}.
    */
-  public static CompareRequest newCompareRequest(DN name,
-      AttributeDescription attributeDescription,
-      ByteString assertionValue) throws NullPointerException
+  public static CompareRequest newCompareRequest(final DN name,
+      final AttributeDescription attributeDescription,
+      final ByteString assertionValue) throws NullPointerException
   {
     Validator.ensureNotNull(name, attributeDescription, assertionValue);
-    return new CompareRequestImpl(name, attributeDescription,
-        assertionValue);
+    return new CompareRequestImpl(name, attributeDescription, assertionValue);
   }
 
 
 
   /**
-   * Creates a new compare request using the provided distinguished
-   * name, attribute name, and assertion value decoded using the default
-   * schema.
+   * Creates a new compare request using the provided distinguished name,
+   * attribute name, and assertion value decoded using the default schema.
    * <p>
-   * If the assertion value is not an instance of {@code ByteString}
-   * then it will be converted using the
-   * {@link ByteString#valueOf(Object)} method.
+   * If the assertion value is not an instance of {@code ByteString} then it
+   * will be converted using the {@link ByteString#valueOf(Object)} method.
    *
    * @param name
    *          The distinguished name of the entry to be compared.
@@ -233,20 +262,44 @@
    *          The assertion value to be compared.
    * @return The new compare request.
    * @throws LocalizedIllegalArgumentException
-   *           If {@code name} or {@code attributeDescription} could not
-   *           be decoded using the default schema.
+   *           If {@code name} or {@code attributeDescription} could not be
+   *           decoded using the default schema.
    * @throws NullPointerException
    *           If {@code name}, {@code attributeDescription}, or {@code
    *           assertionValue} was {@code null}.
    */
-  public static CompareRequest newCompareRequest(String name,
-      String attributeDescription, Object assertionValue)
+  public static CompareRequest newCompareRequest(final String name,
+      final String attributeDescription, final Object assertionValue)
       throws LocalizedIllegalArgumentException, NullPointerException
   {
     Validator.ensureNotNull(name, attributeDescription, assertionValue);
-    return new CompareRequestImpl(DN.valueOf(name),
-        AttributeDescription.valueOf(attributeDescription), ByteString
-            .valueOf(assertionValue));
+    return new CompareRequestImpl(DN.valueOf(name), AttributeDescription
+        .valueOf(attributeDescription), ByteString.valueOf(assertionValue));
+  }
+
+
+
+  /**
+   * Creates a new CRAM-MD5 SASL bind request having the provided authentication
+   * ID and password.
+   *
+   * @param authenticationID
+   *          The authentication ID of the user. The authentication ID usually
+   *          has the form "dn:" immediately followed by the distinguished name
+   *          of the user, or "u:" followed by a user ID string, but other forms
+   *          are permitted.
+   * @param password
+   *          The password of the user that the client wishes to bind as. The
+   *          password will be converted to a UTF-8 octet string.
+   * @return The new CRAM-MD5 SASL bind request.
+   * @throws NullPointerException
+   *           If {@code authenticationID} or {@code password} was {@code null}.
+   */
+  public static CRAMMD5SASLBindRequest newCRAMMD5SASLBindRequest(
+      final String authenticationID, final ByteString password)
+      throws NullPointerException
+  {
+    return new CRAMMD5SASLBindRequestImpl(authenticationID, password);
   }
 
 
@@ -260,7 +313,7 @@
    * @throws NullPointerException
    *           If {@code name} was {@code null}.
    */
-  public static DeleteRequest newDeleteRequest(DN name)
+  public static DeleteRequest newDeleteRequest(final DN name)
       throws NullPointerException
   {
     Validator.ensureNotNull(name);
@@ -270,19 +323,18 @@
 
 
   /**
-   * Creates a new delete request using the provided distinguished name
-   * decoded using the default schema.
+   * Creates a new delete request using the provided distinguished name decoded
+   * using the default schema.
    *
    * @param name
    *          The distinguished name of the entry to be deleted.
    * @return The new delete request.
    * @throws LocalizedIllegalArgumentException
-   *           If {@code name} could not be decoded using the default
-   *           schema.
+   *           If {@code name} could not be decoded using the default schema.
    * @throws NullPointerException
    *           If {@code name} was {@code null}.
    */
-  public static DeleteRequest newDeleteRequest(String name)
+  public static DeleteRequest newDeleteRequest(final String name)
       throws LocalizedIllegalArgumentException, NullPointerException
   {
     Validator.ensureNotNull(name);
@@ -292,50 +344,90 @@
 
 
   /**
-   * Creates a new generic bind request using an empty distinguished
-   * name, authentication type, and authentication information.
+   * Creates a new DIGEST-MD5 SASL bind request having the provided
+   * authentication ID and password, but no realm or authorization ID.
+   *
+   * @param authenticationID
+   *          The authentication ID of the user. The authentication ID usually
+   *          has the form "dn:" immediately followed by the distinguished name
+   *          of the user, or "u:" followed by a user ID string, but other forms
+   *          are permitted.
+   * @param password
+   *          The password of the user that the client wishes to bind as. The
+   *          password will be converted to a UTF-8 octet string.
+   * @return The new DIGEST-MD5 SASL bind request.
+   * @throws NullPointerException
+   *           If {@code authenticationID} or {@code password} was {@code null}.
+   */
+  public static DigestMD5SASLBindRequest newDigestMD5SASLBindRequest(
+      final String authenticationID, final ByteString password)
+      throws NullPointerException
+  {
+    return new DigestMD5SASLBindRequestImpl(authenticationID, password);
+  }
+
+
+
+  /**
+   * Creates a new External SASL bind request with no authorization ID.
+   *
+   * @return The new External SASL bind request.
+   */
+  public static ExternalSASLBindRequest newExternalSASLBindRequest()
+  {
+    return new ExternalSASLBindRequestImpl();
+  }
+
+
+
+  /**
+   * Creates a new generic bind request using an empty distinguished name,
+   * authentication type, and authentication information.
    *
    * @param authenticationType
-   *          The authentication mechanism identifier for this generic
-   *          bind request.
+   *          The authentication mechanism identifier for this generic bind
+   *          request.
    * @param authenticationValue
-   *          The authentication information for this generic bind
-   *          request in a form defined by the authentication mechanism.
+   *          The authentication information for this generic bind request in a
+   *          form defined by the authentication mechanism.
    * @return The new generic bind request.
    * @throws NullPointerException
    *           If {@code authenticationValue} was {@code null}.
    */
   public static GenericBindRequest newGenericBindRequest(
-      byte authenticationType, ByteString authenticationValue)
+      final byte authenticationType, final ByteString authenticationValue)
       throws NullPointerException
   {
     Validator.ensureNotNull(authenticationValue);
-    return new GenericBindRequestImpl(DN.rootDN(), authenticationType,
+    return new GenericBindRequestImpl("", authenticationType,
         authenticationValue);
   }
 
 
 
   /**
-   * Creates a new generic bind request using the provided distinguished
-   * name, authentication type, and authentication information.
+   * Creates a new generic bind request using the provided name, authentication
+   * type, and authentication information.
+   * <p>
+   * The LDAP protocol defines the Bind name to be a distinguished name, however
+   * some LDAP implementations have relaxed this constraint and allow other
+   * identities to be used, such as the user's email address.
    *
    * @param name
-   *          The distinguished name of the Directory object that the
-   *          client wishes to bind as (may be empty).
+   *          The name of the Directory object that the client wishes to bind as
+   *          (may be empty).
    * @param authenticationType
-   *          The authentication mechanism identifier for this generic
-   *          bind request.
+   *          The authentication mechanism identifier for this generic bind
+   *          request.
    * @param authenticationValue
-   *          The authentication information for this generic bind
-   *          request in a form defined by the authentication mechanism.
+   *          The authentication information for this generic bind request in a
+   *          form defined by the authentication mechanism.
    * @return The new generic bind request.
    * @throws NullPointerException
-   *           If {@code name} or {@code authenticationValue} was
-   *           {@code null}.
+   *           If {@code name} or {@code authenticationValue} was {@code null}.
    */
-  public static GenericBindRequest newGenericBindRequest(DN name,
-      byte authenticationType, ByteString authenticationValue)
+  public static GenericBindRequest newGenericBindRequest(final String name,
+      final byte authenticationType, final ByteString authenticationValue)
       throws NullPointerException
   {
     Validator.ensureNotNull(name, authenticationValue);
@@ -346,50 +438,18 @@
 
 
   /**
-   * Creates a new generic bind request using the provided distinguished
-   * name, authentication type, and authentication information.
-   *
-   * @param name
-   *          The distinguished name of the Directory object that the
-   *          client wishes to bind as (may be empty).
-   * @param authenticationType
-   *          The authentication mechanism identifier for this generic
-   *          bind request.
-   * @param authenticationValue
-   *          The authentication information for this generic bind
-   *          request in a form defined by the authentication mechanism.
-   * @return The new generic bind request.
-   * @throws LocalizedIllegalArgumentException
-   *           If {@code name} could not be decoded using the default
-   *           schema.
-   * @throws NullPointerException
-   *           If {@code name} or {@code authenticationValue} was
-   *           {@code null}.
-   */
-  public static GenericBindRequest newGenericBindRequest(String name,
-      byte authenticationType, ByteString authenticationValue)
-      throws LocalizedIllegalArgumentException, NullPointerException
-  {
-    Validator.ensureNotNull(name, authenticationValue);
-    return new GenericBindRequestImpl(DN.valueOf(name),
-        authenticationType, authenticationValue);
-  }
-
-
-
-  /**
-   * Creates a new generic extended request using the provided name and
-   * no value.
+   * Creates a new generic extended request using the provided name and no
+   * value.
    *
    * @param requestName
-   *          The dotted-decimal representation of the unique OID
-   *          corresponding to this extended request.
+   *          The dotted-decimal representation of the unique OID corresponding
+   *          to this extended request.
    * @return The new generic extended request.
    * @throws NullPointerException
    *           If {@code requestName} was {@code null}.
    */
   public static GenericExtendedRequest newGenericExtendedRequest(
-      String requestName) throws NullPointerException
+      final String requestName) throws NullPointerException
   {
     Validator.ensureNotNull(requestName);
     return new GenericExtendedRequestImpl(requestName, null);
@@ -398,22 +458,21 @@
 
 
   /**
-   * Creates a new generic extended request using the provided name and
-   * optional value.
+   * Creates a new generic extended request using the provided name and optional
+   * value.
    *
    * @param requestName
-   *          The dotted-decimal representation of the unique OID
-   *          corresponding to this extended request.
+   *          The dotted-decimal representation of the unique OID corresponding
+   *          to this extended request.
    * @param requestValue
-   *          The content of this generic extended request in a form
-   *          defined by the extended operation, or {@code null} if
-   *          there is no content.
+   *          The content of this generic extended request in a form defined by
+   *          the extended operation, or {@code null} if there is no content.
    * @return The new generic extended request.
    * @throws NullPointerException
    *           If {@code requestName} was {@code null}.
    */
   public static GenericExtendedRequest newGenericExtendedRequest(
-      String requestName, ByteString requestValue)
+      final String requestName, final ByteString requestValue)
       throws NullPointerException
   {
     Validator.ensureNotNull(requestName);
@@ -423,8 +482,51 @@
 
 
   /**
-   * Creates a new modify DN request using the provided distinguished
-   * name and new RDN.
+   * Creates a new GSSAPI SASL bind request having the provided authentication
+   * ID and password, but no realm, KDC address, or authorization ID.
+   *
+   * @param authenticationID
+   *          The authentication ID of the user. The authentication ID usually
+   *          has the form "dn:" immediately followed by the distinguished name
+   *          of the user, or "u:" followed by a user ID string, but other forms
+   *          are permitted.
+   * @param password
+   *          The password of the user that the client wishes to bind as. The
+   *          password will be converted to a UTF-8 octet string.
+   * @return The new GSSAPI SASL bind request.
+   * @throws NullPointerException
+   *           If {@code authenticationID} or {@code password} was {@code null}.
+   */
+  public static GSSAPISASLBindRequest newGSSAPISASLBindRequest(
+      final String authenticationID, final ByteString password)
+      throws NullPointerException
+  {
+    return new GSSAPISASLBindRequestImpl(authenticationID, password);
+  }
+
+
+
+  /**
+   * Creates a new GSSAPI SASL bind request having the provided subject, but no
+   * authorization ID.
+   *
+   * @param subject
+   *          The Kerberos subject of the user to be authenticated.
+   * @return The new GSSAPI SASL bind request.
+   * @throws NullPointerException
+   *           If {@code subject} was {@code null}.
+   */
+  public static GSSAPISASLBindRequest newGSSAPISASLBindRequest(
+      final Subject subject) throws NullPointerException
+  {
+    return new GSSAPISASLBindRequestImpl(subject);
+  }
+
+
+
+  /**
+   * Creates a new modify DN request using the provided distinguished name and
+   * new RDN.
    *
    * @param name
    *          The distinguished name of the entry to be renamed.
@@ -434,8 +536,8 @@
    * @throws NullPointerException
    *           If {@code name} or {@code newRDN} was {@code null}.
    */
-  public static ModifyDNRequest newModifyDNRequest(DN name, RDN newRDN)
-      throws NullPointerException
+  public static ModifyDNRequest newModifyDNRequest(final DN name,
+      final RDN newRDN) throws NullPointerException
   {
     Validator.ensureNotNull(name, newRDN);
     return new ModifyDNRequestImpl(name, newRDN);
@@ -444,8 +546,8 @@
 
 
   /**
-   * Creates a new modify DN request using the provided distinguished
-   * name and new RDN decoded using the default schema.
+   * Creates a new modify DN request using the provided distinguished name and
+   * new RDN decoded using the default schema.
    *
    * @param name
    *          The distinguished name of the entry to be renamed.
@@ -453,18 +555,17 @@
    *          The new RDN of the entry.
    * @return The new modify DN request.
    * @throws LocalizedIllegalArgumentException
-   *           If {@code name} or {@code newRDN} could not be decoded
-   *           using the default schema.
+   *           If {@code name} or {@code newRDN} could not be decoded using the
+   *           default schema.
    * @throws NullPointerException
    *           If {@code name} or {@code newRDN} was {@code null}.
    */
-  public static ModifyDNRequest newModifyDNRequest(String name,
-      String newRDN) throws LocalizedIllegalArgumentException,
+  public static ModifyDNRequest newModifyDNRequest(final String name,
+      final String newRDN) throws LocalizedIllegalArgumentException,
       NullPointerException
   {
     Validator.ensureNotNull(name, newRDN);
-    return new ModifyDNRequestImpl(DN.valueOf(name), RDN
-        .valueOf(newRDN));
+    return new ModifyDNRequestImpl(DN.valueOf(name), RDN.valueOf(newRDN));
   }
 
 
@@ -478,7 +579,7 @@
    * @throws NullPointerException
    *           If {@code name} was {@code null}.
    */
-  public static ModifyRequest newModifyRequest(DN name)
+  public static ModifyRequest newModifyRequest(final DN name)
       throws NullPointerException
   {
     Validator.ensureNotNull(name);
@@ -488,19 +589,18 @@
 
 
   /**
-   * Creates a new modify request using the provided distinguished name
-   * decoded using the default schema.
+   * Creates a new modify request using the provided distinguished name decoded
+   * using the default schema.
    *
    * @param name
    *          The distinguished name of the entry to be modified.
    * @return The new modify request.
    * @throws LocalizedIllegalArgumentException
-   *           If {@code name} could not be decoded using the default
-   *           schema.
+   *           If {@code name} could not be decoded using the default schema.
    * @throws NullPointerException
    *           If {@code name} was {@code null}.
    */
-  public static ModifyRequest newModifyRequest(String name)
+  public static ModifyRequest newModifyRequest(final String name)
       throws LocalizedIllegalArgumentException, NullPointerException
   {
     Validator.ensureNotNull(name);
@@ -510,24 +610,23 @@
 
 
   /**
-   * Creates a new modify request using the provided lines of LDIF
-   * decoded using the default schema.
+   * Creates a new modify request using the provided lines of LDIF decoded using
+   * the default schema.
    *
    * @param ldifLines
-   *          Lines of LDIF containing a single LDIF modify change
-   *          record.
+   *          Lines of LDIF containing a single LDIF modify change record.
    * @return The new modify request.
    * @throws LocalizedIllegalArgumentException
-   *           If {@code ldifLines} was empty, or contained invalid
-   *           LDIF, or could not be decoded using the default schema.
+   *           If {@code ldifLines} was empty, or contained invalid LDIF, or
+   *           could not be decoded using the default schema.
    * @throws NullPointerException
    *           If {@code ldifLines} was {@code null} .
    */
-  public static ModifyRequest newModifyRequest(String... ldifLines)
+  public static ModifyRequest newModifyRequest(final String... ldifLines)
       throws LocalizedIllegalArgumentException, NullPointerException
   {
     // LDIF change record reader is tolerant to missing change types.
-    ChangeRecord record = LDIFChangeRecordReader
+    final ChangeRecord record = LDIFChangeRecordReader
         .valueOfLDIFChangeRecord(ldifLines);
 
     if (record instanceof ModifyRequest)
@@ -537,7 +636,7 @@
     else
     {
       // Wrong change type.
-      LocalizableMessage message = WARN_READ_LDIF_RECORD_CHANGE_RECORD_WRONG_TYPE
+      final LocalizableMessage message = WARN_READ_LDIF_RECORD_CHANGE_RECORD_WRONG_TYPE
           .get("modify");
       throw new LocalizedIllegalArgumentException(message);
     }
@@ -546,67 +645,113 @@
 
 
   /**
-   * Creates a new search request using the provided distinguished name,
-   * scope, and filter, decoded using the default schema.
+   * Creates a new password modify extended request, with no user identity, old
+   * password, or new password.
    *
-   * @param name
-   *          The distinguished name of the base entry relative to which
-   *          the search is to be performed.
-   * @param scope
-   *          The scope of the search.
-   * @param filter
-   *          The filter that defines the conditions that must be
-   *          fulfilled in order for an entry to be returned.
-   * @param attributeDescriptions
-   *          The names of the attributes to be included with each
-   *          entry.
-   * @return The new search request.
-   * @throws NullPointerException
-   *           If the {@code name}, {@code scope}, or {@code filter}
-   *           were {@code null}.
+   * @return The new password modify extended request.
    */
-  public static SearchRequest newSearchRequest(DN name,
-      SearchScope scope, Filter filter, String... attributeDescriptions)
-      throws NullPointerException
+  public static PasswordModifyExtendedRequest newPasswordModifyExtendedRequest()
   {
-    Validator.ensureNotNull(name, scope, filter);
-    return new SearchRequestImpl(name, scope, filter)
-        .addAttribute(attributeDescriptions);
+    return new PasswordModifyExtendedRequestImpl();
   }
 
 
 
   /**
-   * Creates a new search request using the provided distinguished name,
-   * scope, and filter, decoded using the default schema.
+   * Creates a new Plain SASL bind request having the provided authentication ID
+   * and password, but no authorization ID.
+   *
+   * @param authenticationID
+   *          The authentication ID of the user. The authentication ID usually
+   *          has the form "dn:" immediately followed by the distinguished name
+   *          of the user, or "u:" followed by a user ID string, but other forms
+   *          are permitted.
+   * @param password
+   *          The password of the user that the client wishes to bind as. The
+   *          password will be converted to a UTF-8 octet string.
+   * @return The new Plain SASL bind request.
+   * @throws NullPointerException
+   *           If {@code authenticationID} or {@code password} was {@code null}.
+   */
+  public static PlainSASLBindRequest newPlainSASLBindRequest(
+      final String authenticationID, final ByteString password)
+      throws NullPointerException
+  {
+    return new PlainSASLBindRequestImpl(authenticationID, password);
+  }
+
+
+
+  /**
+   * Creates a new search request using the provided distinguished name, scope,
+   * and filter, decoded using the default schema.
    *
    * @param name
-   *          The distinguished name of the base entry relative to which
-   *          the search is to be performed.
+   *          The distinguished name of the base entry relative to which the
+   *          search is to be performed.
    * @param scope
    *          The scope of the search.
    * @param filter
-   *          The filter that defines the conditions that must be
-   *          fulfilled in order for an entry to be returned.
+   *          The filter that defines the conditions that must be fulfilled in
+   *          order for an entry to be returned.
    * @param attributeDescriptions
-   *          The names of the attributes to be included with each
-   *          entry.
+   *          The names of the attributes to be included with each entry.
+   * @return The new search request.
+   * @throws NullPointerException
+   *           If the {@code name}, {@code scope}, or {@code filter} were
+   *           {@code null}.
+   */
+  public static SearchRequest newSearchRequest(final DN name,
+      final SearchScope scope, final Filter filter,
+      final String... attributeDescriptions) throws NullPointerException
+  {
+    Validator.ensureNotNull(name, scope, filter);
+    final SearchRequest request = new SearchRequestImpl(name, scope, filter);
+    for (final String attributeDescription : attributeDescriptions)
+    {
+      request.addAttribute(attributeDescription);
+    }
+    return request;
+  }
+
+
+
+  /**
+   * Creates a new search request using the provided distinguished name, scope,
+   * and filter, decoded using the default schema.
+   *
+   * @param name
+   *          The distinguished name of the base entry relative to which the
+   *          search is to be performed.
+   * @param scope
+   *          The scope of the search.
+   * @param filter
+   *          The filter that defines the conditions that must be fulfilled in
+   *          order for an entry to be returned.
+   * @param attributeDescriptions
+   *          The names of the attributes to be included with each entry.
    * @return The new search request.
    * @throws LocalizedIllegalArgumentException
-   *           If {@code name} could not be decoded using the default
-   *           schema, or if {@code filter} is not a valid LDAP string
-   *           representation of a filter.
+   *           If {@code name} could not be decoded using the default schema, or
+   *           if {@code filter} is not a valid LDAP string representation of a
+   *           filter.
    * @throws NullPointerException
-   *           If the {@code name}, {@code scope}, or {@code filter}
-   *           were {@code null}.
+   *           If the {@code name}, {@code scope}, or {@code filter} were
+   *           {@code null}.
    */
-  public static SearchRequest newSearchRequest(String name,
-      SearchScope scope, String filter, String... attributeDescriptions)
+  public static SearchRequest newSearchRequest(final String name,
+      final SearchScope scope, final String filter,
+      final String... attributeDescriptions)
       throws LocalizedIllegalArgumentException, NullPointerException
   {
     Validator.ensureNotNull(name, scope, filter);
-    return new SearchRequestImpl(DN.valueOf(name), scope, Filter
-        .valueOf(filter)).addAttribute(attributeDescriptions);
+    final SearchRequest request = new SearchRequestImpl(DN.valueOf(name),
+        scope, Filter.valueOf(filter));
+    for (final String attributeDescription : attributeDescriptions)
+    {
+      request.addAttribute(attributeDescription);
+    }
+    return request;
   }
 
 
@@ -619,61 +764,54 @@
    */
   public static SimpleBindRequest newSimpleBindRequest()
   {
-    return new SimpleBindRequestImpl(DN.rootDN(), ByteString.empty());
+    return new SimpleBindRequestImpl("", ByteString.empty());
   }
 
 
 
   /**
-   * Creates a new simple bind request having the provided name and
-   * password suitable for name/password authentication.
+   * Creates a new simple bind request having the provided name and password
+   * suitable for name/password authentication. The name will be decoded using
+   * the default schema.
+   * <p>
+   * The LDAP protocol defines the Bind name to be a distinguished name, however
+   * some LDAP implementations have relaxed this constraint and allow other
+   * identities to be used, such as the user's email address.
    *
    * @param name
-   *          The distinguished name of the Directory object that the
-   *          client wishes to bind as, which may be empty.
+   *          The name of the Directory object that the client wishes to bind
+   *          as, which may be empty.
    * @param password
-   *          The password of the Directory object that the client
-   *          wishes to bind as, which may be empty indicating that an
-   *          unauthenticated bind is to be performed.
+   *          The password of the Directory object that the client wishes to
+   *          bind as, which may be empty indicating that an unauthenticated
+   *          bind is to be performed.
    * @return The new simple bind request.
    * @throws NullPointerException
    *           If {@code name} or {@code password} was {@code null}.
    */
-  public static SimpleBindRequest newSimpleBindRequest(DN name,
-      ByteString password) throws NullPointerException
+  public static SimpleBindRequest newSimpleBindRequest(final String name,
+      final String password) throws NullPointerException
   {
     Validator.ensureNotNull(name, password);
-    return new SimpleBindRequestImpl(name, password);
+    return new SimpleBindRequestImpl(name, ByteString.valueOf(password));
   }
 
 
 
   /**
-   * Creates a new simple bind request having the provided name and
-   * password suitable for name/password authentication. The name will
-   * be decoded using the default schema.
+   * Creates a new start TLS extended request which will use the provided SSL
+   * context.
    *
-   * @param name
-   *          The distinguished name of the Directory object that the
-   *          client wishes to bind as, which may be empty..
-   * @param password
-   *          The password of the Directory object that the client
-   *          wishes to bind as, which may be empty indicating that an
-   *          unauthenticated bind is to be performed.
-   * @return The new simple bind request.
-   * @throws LocalizedIllegalArgumentException
-   *           If {@code name} could not be decoded using the default
-   *           schema.
+   * @param sslContext
+   *          The SSLContext that should be used when installing the TLS layer.
+   * @return The new start TLS extended request.
    * @throws NullPointerException
-   *           If {@code name} or {@code password} was {@code null}.
+   *           If {@code sslContext} was {@code null}.
    */
-  public static SimpleBindRequest newSimpleBindRequest(String name,
-      String password) throws LocalizedIllegalArgumentException,
-      NullPointerException
+  public static StartTLSExtendedRequest newStartTLSExtendedRequest(
+      final SSLContext sslContext) throws NullPointerException
   {
-    Validator.ensureNotNull(name, password);
-    return new SimpleBindRequestImpl(DN.valueOf(name), ByteString
-        .valueOf(password));
+    return new StartTLSExtendedRequestImpl(sslContext);
   }
 
 
@@ -690,6 +828,18 @@
 
 
 
+  /**
+   * Creates a new Who Am I extended request.
+   *
+   * @return The new Who Am I extended request.
+   */
+  public static WhoAmIExtendedRequest newWhoAmIExtendedRequest()
+  {
+    return new WhoAmIExtendedRequestImpl();
+  }
+
+
+
   private Requests()
   {
     // Prevent instantiation.

--
Gitblit v1.10.0