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/RootDSE.java |  386 ++++++++++++++++++++++++++++---------------------------
 1 files changed, 197 insertions(+), 189 deletions(-)

diff --git a/sdk/src/org/opends/sdk/RootDSE.java b/sdk/src/org/opends/sdk/RootDSE.java
index 613a8b9..9410450 100644
--- a/sdk/src/org/opends/sdk/RootDSE.java
+++ b/sdk/src/org/opends/sdk/RootDSE.java
@@ -42,12 +42,11 @@
 
 
 /**
- * The root DSE is a DSA-specific Entry (DSE) and not part of any naming
- * context (or any subtree), and which is uniquely identified by the
- * empty DN.
+ * The root DSE is a DSA-specific Entry (DSE) and not part of any naming context
+ * (or any subtree), and which is uniquely identified by the empty DN.
  * <p>
- * A Directory Server uses the root DSE to provide information about
- * itself using the following set of attributes:
+ * A Directory Server uses the root DSE to provide information about itself
+ * using the following set of attributes:
  * <ul>
  * <li>{@code altServer}: alternative Directory Servers
  * <li>{@code namingContexts}: naming contexts
@@ -57,74 +56,76 @@
  * <li>{@code supportedLDAPVersion}: LDAP versions supported
  * <li>{@code supportedSASLMechanisms}: recognized SASL authentication
  * mechanisms
- * <li>{@code supportedAuthPasswordSchemes}: recognized authentication
- * password schemes
- * <li>{@code subschemaSubentry}: the name of the subschema subentry
- * holding the schema controlling the Root DSE
+ * <li>{@code supportedAuthPasswordSchemes}: recognized authentication password
+ * schemes
+ * <li>{@code subschemaSubentry}: the name of the subschema subentry holding the
+ * schema controlling the Root DSE
  * <li>{@code vendorName}: the name of the Directory Server implementer
  * <li>{@code vendorVersion}: the version of the Directory Server
  * implementation.
  * </ul>
- * The values provided for these attributes may depend on session-
- * specific and other factors. For example, a server supporting the SASL
- * EXTERNAL mechanism might only list "EXTERNAL" when the client's
- * identity has been established by a lower level.
+ * The values provided for these attributes may depend on session- specific and
+ * other factors. For example, a server supporting the SASL EXTERNAL mechanism
+ * might only list "EXTERNAL" when the client's identity has been established by
+ * a lower level.
  * <p>
- * The root DSE may also include a {@code subschemaSubentry} attribute.
- * If it does, the attribute refers to the subschema (sub)entry holding
- * the schema controlling the root DSE. Clients SHOULD NOT assume that
- * this subschema (sub)entry controls other entries held by the server.
+ * The root DSE may also include a {@code subschemaSubentry} attribute. If it
+ * does, the attribute refers to the subschema (sub)entry holding the schema
+ * controlling the root DSE. Clients SHOULD NOT assume that this subschema
+ * (sub)entry controls other entries held by the server.
  *
- * @see <a href="http://tools.ietf.org/html/rfc4512">RFC 4512 -
- *      Lightweight Directory Access Protocol (LDAP): Directory
- *      Information Models </a>
- * @see <a href="http://tools.ietf.org/html/rfc3045">RFC 3045 - Storing
- *      Vendor Information in the LDAP Root DSE </a>
+ * @see <a href="http://tools.ietf.org/html/rfc4512">RFC 4512 - Lightweight
+ *      Directory Access Protocol (LDAP): Directory Information Models </a>
+ * @see <a href="http://tools.ietf.org/html/rfc3045">RFC 3045 - Storing Vendor
+ *      Information in the LDAP Root DSE </a>
  * @see <a href="http://tools.ietf.org/html/rfc3112">RFC 3112 - LDAP
  *      Authentication Password Schema </a>
  */
 public final class RootDSE
 {
-  private static final AttributeDescription ATTR_ALT_SERVER = AttributeDescription
-      .create(CoreSchema.getAltServerAttributeType());
+  private static final AttributeDescription ATTR_ALT_SERVER =
+    AttributeDescription.create(CoreSchema.getAltServerAttributeType());
 
-  private static final AttributeDescription ATTR_NAMING_CONTEXTS = AttributeDescription
-      .create(CoreSchema.getNamingContextsAttributeType());
+  private static final AttributeDescription ATTR_NAMING_CONTEXTS =
+    AttributeDescription.create(CoreSchema.getNamingContextsAttributeType());
 
-  private static final AttributeDescription ATTR_SUPPORTED_CONTROL = AttributeDescription
-      .create(CoreSchema.getSupportedControlAttributeType());
+  private static final AttributeDescription ATTR_SUBSCHEMA_SUBENTRY =
+    AttributeDescription.create(CoreSchema.getSubschemaSubentryAttributeType());
 
-  private static final AttributeDescription ATTR_SUPPORTED_EXTENSION = AttributeDescription
-      .create(CoreSchema.getSupportedExtensionAttributeType());
+  private static final AttributeDescription ATTR_SUPPORTED_AUTH_PASSWORD_SCHEMES =
+    AttributeDescription.create(
+        CoreSchema.getSupportedAuthPasswordSchemesAttributeType());
 
-  private static final AttributeDescription ATTR_SUPPORTED_FEATURE = AttributeDescription
-      .create(CoreSchema.getSupportedFeaturesAttributeType());
+  private static final AttributeDescription ATTR_SUPPORTED_CONTROL =
+    AttributeDescription.create(CoreSchema.getSupportedControlAttributeType());
 
-  private static final AttributeDescription ATTR_SUPPORTED_LDAP_VERSION = AttributeDescription
-      .create(CoreSchema.getSupportedLDAPVersionAttributeType());
+  private static final AttributeDescription ATTR_SUPPORTED_EXTENSION =
+    AttributeDescription.create(
+        CoreSchema.getSupportedExtensionAttributeType());
 
-  private static final AttributeDescription ATTR_SUPPORTED_SASL_MECHANISMS = AttributeDescription
-      .create(CoreSchema.getSupportedSASLMechanismsAttributeType());
+  private static final AttributeDescription ATTR_SUPPORTED_FEATURE =
+    AttributeDescription.create(CoreSchema.getSupportedFeaturesAttributeType());
 
-  private static final AttributeDescription ATTR_SUPPORTED_AUTH_PASSWORD_SCHEMES = AttributeDescription
-      .create(CoreSchema.getSupportedAuthPasswordSchemesAttributeType());
+  private static final AttributeDescription ATTR_SUPPORTED_LDAP_VERSION =
+    AttributeDescription.create(
+        CoreSchema.getSupportedLDAPVersionAttributeType());
 
-  private static final AttributeDescription ATTR_SUBSCHEMA_SUBENTRY = AttributeDescription
-      .create(CoreSchema.getSubschemaSubentryAttributeType());
+  private static final AttributeDescription ATTR_SUPPORTED_SASL_MECHANISMS =
+    AttributeDescription.create(
+        CoreSchema.getSupportedSASLMechanismsAttributeType());
 
-  private static final AttributeDescription ATTR_VENDOR_NAME = AttributeDescription
-      .create(CoreSchema.getVendorNameAttributeType());
+  private static final AttributeDescription ATTR_VENDOR_NAME =
+    AttributeDescription.create(CoreSchema.getVendorNameAttributeType());
 
-  private static final AttributeDescription ATTR_VENDOR_VERSION = AttributeDescription
-      .create(CoreSchema.getVendorNameAttributeType());
+  private static final AttributeDescription ATTR_VENDOR_VERSION =
+    AttributeDescription.create(CoreSchema.getVendorNameAttributeType());
 
   private static final SearchRequest SEARCH_REQUEST = Requests
       .newSearchRequest(DN.rootDN(), SearchScope.BASE_OBJECT, Filter
           .getObjectClassPresentFilter(), ATTR_ALT_SERVER.toString(),
-          ATTR_NAMING_CONTEXTS.toString(), ATTR_SUPPORTED_CONTROL
-              .toString(), ATTR_SUPPORTED_EXTENSION.toString(),
-          ATTR_SUPPORTED_FEATURE.toString(),
-          ATTR_SUPPORTED_LDAP_VERSION.toString(),
+          ATTR_NAMING_CONTEXTS.toString(), ATTR_SUPPORTED_CONTROL.toString(),
+          ATTR_SUPPORTED_EXTENSION.toString(), ATTR_SUPPORTED_FEATURE
+              .toString(), ATTR_SUPPORTED_LDAP_VERSION.toString(),
           ATTR_SUPPORTED_SASL_MECHANISMS.toString(), ATTR_VENDOR_NAME
               .toString(), ATTR_VENDOR_VERSION.toString(),
           ATTR_SUPPORTED_AUTH_PASSWORD_SCHEMES.toString(),
@@ -133,32 +134,29 @@
 
 
   /**
-   * Reads the Root DSE from the Directory Server using the provided
-   * connection.
+   * Reads the Root DSE from the Directory Server using the provided connection.
    * <p>
-   * If the Root DSE is not returned by the Directory Server then the
-   * request will fail with an {@link EntryNotFoundException}. More
-   * specifically, the returned future will never return {@code null}.
+   * If the Root DSE is not returned by the Directory Server then the request
+   * will fail with an {@link EntryNotFoundException}. More specifically, the
+   * returned future will never return {@code null}.
    *
    * @param connection
-   *          A connection to the Directory Server whose Root DSE is to
-   *          be read.
+   *          A connection to the Directory Server whose Root DSE is to be read.
    * @param handler
-   *          A result handler which can be used to asynchronously
-   *          process the operation result when it is received, may be
-   *          {@code null}.
+   *          A result handler which can be used to asynchronously process the
+   *          operation result when it is received, may be {@code null}.
    * @return A future representing the result of the operation.
    * @throws UnsupportedOperationException
    *           If the connection does not support search operations.
    * @throws IllegalStateException
-   *           If the connection has already been closed, i.e. if
-   *           {@code isClosed() == true}.
+   *           If the connection has already been closed, i.e. if {@code
+   *           isClosed() == true}.
    * @throws NullPointerException
    *           If the {@code connection} was {@code null}.
    */
   public static FutureResult<RootDSE> readRootDSE(
-      AsynchronousConnection connection,
-      ResultHandler<RootDSE> handler)
+      final AsynchronousConnection connection,
+      final ResultHandler<RootDSE> handler)
       throws UnsupportedOperationException, IllegalStateException,
       NullPointerException
   {
@@ -166,7 +164,8 @@
       new FutureResultTransformer<SearchResultEntry, RootDSE>(handler)
     {
 
-      protected RootDSE transformResult(SearchResultEntry result)
+      @Override
+      protected RootDSE transformResult(final SearchResultEntry result)
           throws ErrorResultException
       {
         return new RootDSE(result);
@@ -174,7 +173,7 @@
 
     };
 
-    FutureResult<SearchResultEntry> innerFuture = connection
+    final FutureResult<SearchResultEntry> innerFuture = connection
         .searchSingleEntry(SEARCH_REQUEST, future);
     future.setFutureResult(innerFuture);
     return future;
@@ -183,31 +182,29 @@
 
 
   /**
-   * Reads the Root DSE from the Directory Server using the provided
-   * connection.
+   * Reads the Root DSE from the Directory Server using the provided connection.
    * <p>
-   * If the Root DSE is not returned by the Directory Server then the
-   * request will fail with an {@link EntryNotFoundException}. More
-   * specifically, this method will never return {@code null}.
+   * If the Root DSE is not returned by the Directory Server then the request
+   * will fail with an {@link EntryNotFoundException}. More specifically, this
+   * method will never return {@code null}.
    *
    * @param connection
-   *          A connection to the Directory Server whose Root DSE is to
-   *          be read.
+   *          A connection to the Directory Server whose Root DSE is to be read.
    * @return The Directory Server's Root DSE.
    * @throws ErrorResultException
-   *           If the result code indicates that the request failed for
-   *           some reason.
+   *           If the result code indicates that the request failed for some
+   *           reason.
    * @throws InterruptedException
    *           If the current thread was interrupted while waiting.
    * @throws UnsupportedOperationException
    *           If the connection does not support search operations.
    * @throws IllegalStateException
-   *           If the connection has already been closed, i.e. if
-   *           {@code isClosed() == true}.
+   *           If the connection has already been closed, i.e. if {@code
+   *           isClosed() == true}.
    * @throws NullPointerException
    *           If the {@code connection} was {@code null}.
    */
-  public static RootDSE readRootDSE(Connection connection)
+  public static RootDSE readRootDSE(final Connection connection)
       throws ErrorResultException, InterruptedException,
       UnsupportedOperationException, IllegalStateException,
       NullPointerException
@@ -223,18 +220,18 @@
 
 
   /**
-   * Creates a new Root DSE instance backed by the provided entry.
-   * Modifications made to {@code entry} will be reflected in the
-   * returned Root DSE. The returned Root DSE instance is unmodifiable
-   * and attempts to use modify any of the returned collections will
-   * result in a {@code UnsupportedOperationException}.
+   * Creates a new Root DSE instance backed by the provided entry. Modifications
+   * made to {@code entry} will be reflected in the returned Root DSE. The
+   * returned Root DSE instance is unmodifiable and attempts to use modify any
+   * of the returned collections will result in a {@code
+   * UnsupportedOperationException}.
    *
    * @param entry
    *          The Root DSE entry.
    * @throws NullPointerException
    *           If {@code entry} was {@code null} .
    */
-  public RootDSE(Entry entry) throws NullPointerException
+  public RootDSE(final Entry entry) throws NullPointerException
   {
     Validator.ensureNotNull(entry);
     this.entry = entry;
@@ -243,97 +240,107 @@
 
 
   /**
-   * Returns an unmodifiable list of URIs referring to alternative
-   * Directory Servers that may be contacted when the Directory Server
-   * becomes unavailable.
+   * Returns an unmodifiable list of URIs referring to alternative Directory
+   * Servers that may be contacted when the Directory Server becomes
+   * unavailable.
    * <p>
-   * URIs for Directory Servers implementing the LDAP protocol are
-   * written according to RFC 4516. Other kinds of URIs may be provided.
+   * URIs for Directory Servers implementing the LDAP protocol are written
+   * according to RFC 4516. Other kinds of URIs may be provided.
    * <p>
-   * If the Directory Server does not know of any other Directory
-   * Servers that could be used, the returned list will be empty.
+   * If the Directory Server does not know of any other Directory Servers that
+   * could be used, the returned list will be empty.
    *
-   * @return An unmodifiable list of URIs referring to alternative
-   *         Directory Servers, which may be empty.
-   * @see <a href="http://tools.ietf.org/html/rfc4516">RFC 4516 -
-   *      Lightweight Directory Access Protocol (LDAP): Uniform Resource
-   *      Locator </a>
+   * @return An unmodifiable list of URIs referring to alternative Directory
+   *         Servers, which may be empty.
+   * @see <a href="http://tools.ietf.org/html/rfc4516">RFC 4516 - Lightweight
+   *      Directory Access Protocol (LDAP): Uniform Resource Locator </a>
    */
   public Collection<String> getAlternativeServers()
   {
-    return getMultiValuedAttribute(ATTR_ALT_SERVER, Functions
-        .valueToString());
+    return getMultiValuedAttribute(ATTR_ALT_SERVER, Functions.valueToString());
   }
 
 
 
   /**
-   * Returns an unmodifiable list of DNs identifying the context
-   * prefixes of the naming contexts that the Directory Server masters
-   * or shadows (in part or in whole).
-   * <p>
-   * If the Directory Server does not master or shadow any naming
-   * contexts, the returned list will be empty.
+   * Returns the entry which backs this Root DSE instance. Modifications made to
+   * the returned entry will be reflected in this Root DSE.
    *
-   * @return An unmodifiable list of DNs identifying the context
-   *         prefixes of the naming contexts, which may be empty.
+   * @return The underlying Root DSE entry.
    */
-  public Collection<String> getNamingContexts()
+  public Entry getEntry()
   {
-    return getMultiValuedAttribute(
-        ATTR_SUPPORTED_AUTH_PASSWORD_SCHEMES, Functions.valueToString());
+    return entry;
   }
 
 
 
   /**
-   * Returns a string which represents the DN of the subschema subentry
-   * holding the schema controlling the Root DSE.
+   * Returns an unmodifiable list of DNs identifying the context prefixes of the
+   * naming contexts that the Directory Server masters or shadows (in part or in
+   * whole).
    * <p>
-   * Clients SHOULD NOT assume that this subschema (sub)entry controls
-   * other entries held by the Directory Server.
+   * If the Directory Server does not master or shadow any naming contexts, the
+   * returned list will be empty.
    *
-   * @return The DN of the subschema subentry holding the schema
-   *         controlling the Root DSE, or {@code null} if the DN is not
-   *         provided.
+   * @return An unmodifiable list of DNs identifying the context prefixes of the
+   *         naming contexts, which may be empty.
    */
-  public String getSubschemaSubentry()
+  public Collection<DN> getNamingContexts()
   {
-    return getSingleValuedAttribute(ATTR_SUBSCHEMA_SUBENTRY);
+    return getMultiValuedAttribute(ATTR_NAMING_CONTEXTS, Functions.valueToDN());
   }
 
 
 
   /**
-   * Returns an unmodifiable list of supported authentication password
-   * schemes which the Directory Server supports.
+   * Returns a string which represents the DN of the subschema subentry holding
+   * the schema controlling the Root DSE.
    * <p>
-   * If the Directory Server does not support any authentication
-   * password schemes, the returned list will be empty.
+   * Clients SHOULD NOT assume that this subschema (sub)entry controls other
+   * entries held by the Directory Server.
    *
-   * @return An unmodifiable list of supported authentication password
-   *         schemes, which may be empty.
+   * @return The DN of the subschema subentry holding the schema controlling the
+   *         Root DSE, or {@code null} if the DN is not provided.
+   */
+  public DN getSubschemaSubentry()
+  {
+    return getSingleValuedAttribute(ATTR_SUBSCHEMA_SUBENTRY, Functions
+        .valueToDN());
+  }
+
+
+
+  /**
+   * Returns an unmodifiable list of supported authentication password schemes
+   * which the Directory Server supports.
+   * <p>
+   * If the Directory Server does not support any authentication password
+   * schemes, the returned list will be empty.
+   *
+   * @return An unmodifiable list of supported authentication password schemes,
+   *         which may be empty.
    * @see <a href="http://tools.ietf.org/html/rfc3112">RFC 3112 - LDAP
    *      Authentication Password Schema </a>
    */
   public Collection<String> getSupportedAuthenticationPasswordSchemes()
   {
-    return getMultiValuedAttribute(
-        ATTR_SUPPORTED_AUTH_PASSWORD_SCHEMES, Functions.valueToString());
+    return getMultiValuedAttribute(ATTR_SUPPORTED_AUTH_PASSWORD_SCHEMES,
+        Functions.valueToString());
   }
 
 
 
   /**
-   * Returns an unmodifiable list of object identifiers identifying the
-   * request controls that the Directory Server supports.
+   * Returns an unmodifiable list of object identifiers identifying the request
+   * controls that the Directory Server supports.
    * <p>
-   * If the Directory Server does not support any request controls, the
-   * returned list will be empty. Object identifiers identifying
-   * response controls may not be listed.
+   * If the Directory Server does not support any request controls, the returned
+   * list will be empty. Object identifiers identifying response controls may
+   * not be listed.
    *
-   * @return An unmodifiable list of object identifiers identifying the
-   *         request controls, which may be empty.
+   * @return An unmodifiable list of object identifiers identifying the request
+   *         controls, which may be empty.
    */
   public Collection<String> getSupportedControls()
   {
@@ -344,21 +351,21 @@
 
 
   /**
-   * Returns an unmodifiable list of object identifiers identifying the
-   * extended operations that the Directory Server supports.
+   * Returns an unmodifiable list of object identifiers identifying the extended
+   * operations that the Directory Server supports.
    * <p>
-   * If the Directory Server does not support any extended operations,
-   * the returned list will be empty.
+   * If the Directory Server does not support any extended operations, the
+   * returned list will be empty.
    * <p>
-   * An extended operation generally consists of an extended request and
-   * an extended response but may also include other protocol data units
-   * (such as intermediate responses). The object identifier assigned to
-   * the extended request is used to identify the extended operation.
-   * Other object identifiers used in the extended operation may not be
-   * listed as values of this attribute.
+   * An extended operation generally consists of an extended request and an
+   * extended response but may also include other protocol data units (such as
+   * intermediate responses). The object identifier assigned to the extended
+   * request is used to identify the extended operation. Other object
+   * identifiers used in the extended operation may not be listed as values of
+   * this attribute.
    *
-   * @return An unmodifiable list of object identifiers identifying the
-   *         extended operations, which may be empty.
+   * @return An unmodifiable list of object identifiers identifying the extended
+   *         operations, which may be empty.
    */
   public Collection<String> getSupportedExtendedOperations()
   {
@@ -369,14 +376,14 @@
 
 
   /**
-   * Returns an unmodifiable list of object identifiers identifying
-   * elective features that the Directory Server supports.
+   * Returns an unmodifiable list of object identifiers identifying elective
+   * features that the Directory Server supports.
    * <p>
-   * If the server does not support any discoverable elective features,
-   * the returned list will be empty.
+   * If the server does not support any discoverable elective features, the
+   * returned list will be empty.
    *
-   * @return An unmodifiable list of object identifiers identifying the
-   *         elective features, which may be empty.
+   * @return An unmodifiable list of object identifiers identifying the elective
+   *         features, which may be empty.
    */
   public Collection<String> getSupportedFeatures()
   {
@@ -387,39 +394,38 @@
 
 
   /**
-   * Returns an unmodifiable list of the versions of LDAP that the
-   * Directory Server supports.
+   * Returns an unmodifiable list of the versions of LDAP that the Directory
+   * Server supports.
    *
    * @return An unmodifiable list of the versions.
    */
   public Collection<Integer> getSupportedLDAPVersions()
   {
-    return getMultiValuedAttribute(ATTR_SUPPORTED_LDAP_VERSION,
-        Functions.valueToInteger());
+    return getMultiValuedAttribute(ATTR_SUPPORTED_LDAP_VERSION, Functions
+        .valueToInteger());
   }
 
 
 
   /**
-   * Returns an unmodifiable list of the SASL mechanisms that the
-   * Directory Server recognizes and/or supports.
+   * Returns an unmodifiable list of the SASL mechanisms that the Directory
+   * Server recognizes and/or supports.
    * <p>
-   * The contents of the returned list may depend on the current session
-   * state and may be empty if the Directory Server does not support any
-   * SASL mechanisms.
+   * The contents of the returned list may depend on the current session state
+   * and may be empty if the Directory Server does not support any SASL
+   * mechanisms.
    *
-   * @return An unmodifiable list of the SASL mechanisms, which may be
-   *         empty.
-   * @see <a href="http://tools.ietf.org/html/rfc4513">RFC 4513 -
-   *      Lightweight Directory Access Protocol (LDAP): Authentication
-   *      Methods and Security Mechanisms </a>
+   * @return An unmodifiable list of the SASL mechanisms, which may be empty.
+   * @see <a href="http://tools.ietf.org/html/rfc4513">RFC 4513 - Lightweight
+   *      Directory Access Protocol (LDAP): Authentication Methods and Security
+   *      Mechanisms </a>
    * @see <a href="http://tools.ietf.org/html/rfc4422">RFC 4422 - Simple
    *      Authentication and Security Layer (SASL) </a>
    */
   public Collection<String> getSupportedSASLMechanisms()
   {
-    return getMultiValuedAttribute(ATTR_SUPPORTED_SASL_MECHANISMS,
-        Functions.valueToString());
+    return getMultiValuedAttribute(ATTR_SUPPORTED_SASL_MECHANISMS, Functions
+        .valueToString());
   }
 
 
@@ -428,43 +434,44 @@
    * Returns a string which represents the name of the Directory Server
    * implementer.
    *
-   * @return The name of the Directory Server implementer, or {@code
-   *         null} if the vendor name is not provided.
-   * @see <a href="http://tools.ietf.org/html/rfc3045">RFC 3045 -
-   *      Storing Vendor Information in the LDAP Root DSE </a>
+   * @return The name of the Directory Server implementer, or {@code null} if
+   *         the vendor name is not provided.
+   * @see <a href="http://tools.ietf.org/html/rfc3045">RFC 3045 - Storing Vendor
+   *      Information in the LDAP Root DSE </a>
    */
   public String getVendorName()
   {
-    return getSingleValuedAttribute(ATTR_VENDOR_NAME);
+    return getSingleValuedAttribute(ATTR_VENDOR_NAME, Functions.valueToString());
   }
 
 
 
   /**
-   * Returns a string which represents the version of the Directory
-   * Server implementation.
+   * Returns a string which represents the version of the Directory Server
+   * implementation.
    * <p>
-   * Note that this value is typically a release value comprised of a
-   * string and/or a string of numbers used by the developer of the LDAP
-   * server product. The returned string will be unique between two
-   * versions of the Directory Server, but there are no other syntactic
-   * restrictions on the value or the way it is formatted.
+   * Note that this value is typically a release value comprised of a string
+   * and/or a string of numbers used by the developer of the LDAP server
+   * product. The returned string will be unique between two versions of the
+   * Directory Server, but there are no other syntactic restrictions on the
+   * value or the way it is formatted.
    *
-   * @return The version of the Directory Server implementation, or
-   *         {@code null} if the vendor version is not provided.
-   * @see <a href="http://tools.ietf.org/html/rfc3045">RFC 3045 -
-   *      Storing Vendor Information in the LDAP Root DSE </a>
+   * @return The version of the Directory Server implementation, or {@code null}
+   *         if the vendor version is not provided.
+   * @see <a href="http://tools.ietf.org/html/rfc3045">RFC 3045 - Storing Vendor
+   *      Information in the LDAP Root DSE </a>
    */
   public String getVendorVersion()
   {
-    return getSingleValuedAttribute(ATTR_VENDOR_VERSION);
+    return getSingleValuedAttribute(ATTR_VENDOR_VERSION, Functions
+        .valueToString());
   }
 
 
 
   private <N> Collection<N> getMultiValuedAttribute(
-      AttributeDescription attributeDescription,
-      Function<ByteString, N, Void> function)
+      final AttributeDescription attributeDescription,
+      final Function<ByteString, N, Void> function)
   {
     // The returned collection is unmodifiable because we may need to
     // return an empty collection if the attribute does not exist in the
@@ -474,8 +481,8 @@
     final Attribute attr = entry.getAttribute(attributeDescription);
     if (attr != null)
     {
-      return Collections.unmodifiableCollection(Collections2.transform(
-          attr, function, Functions.objectToByteString()));
+      return Collections.unmodifiableCollection(Collections2.transform(attr,
+          function, Functions.objectToByteString()));
     }
     else
     {
@@ -485,8 +492,9 @@
 
 
 
-  private String getSingleValuedAttribute(
-      AttributeDescription attributeDescription)
+  private <N> N getSingleValuedAttribute(
+      final AttributeDescription attributeDescription,
+      final Function<ByteString, N, Void> function)
   {
     final Attribute attr = entry.getAttribute(attributeDescription);
     if (attr == null || attr.isEmpty())
@@ -495,7 +503,7 @@
     }
     else
     {
-      return attr.firstValueAsString();
+      return function.apply(attr.firstValue(), null);
     }
   }
 

--
Gitblit v1.10.0