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

---
 opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/LDAPUtils.java | 1111 ++++++++++++++++++++++++----------------------------------
 1 files changed, 463 insertions(+), 648 deletions(-)

diff --git a/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/LDAPUtils.java b/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/LDAPUtils.java
index a549bac..8a8ec1d 100644
--- a/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/LDAPUtils.java
+++ b/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/LDAPUtils.java
@@ -6,17 +6,16 @@
  * (the "License").  You may not use this file except in compliance
  * with the License.
  *
- * You can obtain a copy of the license at
- * trunk/opendj3/legal-notices/CDDLv1_0.txt
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
  * or http://forgerock.org/license/CDDLv1.0.html.
  * See the License for the specific language governing permissions
  * and limitations under the License.
  *
  * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at
- * trunk/opendj3/legal-notices/CDDLv1_0.txt.  If applicable,
- * add the following below this CDDL HEADER, with the fields enclosed
- * by brackets "[]" replaced with your own identifying information:
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
  *      Portions Copyright [yyyy] [name of copyright owner]
  *
  * CDDL HEADER END
@@ -27,8 +26,6 @@
 
 package com.forgerock.opendj.ldap;
 
-
-
 import static com.forgerock.opendj.ldap.LDAPConstants.*;
 
 import java.io.IOException;
@@ -38,690 +35,508 @@
 
 import org.forgerock.opendj.asn1.ASN1Reader;
 import org.forgerock.opendj.asn1.ASN1Writer;
-import org.forgerock.opendj.ldap.*;
+import org.forgerock.opendj.ldap.ByteSequence;
+import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.DecodeOptions;
+import org.forgerock.opendj.ldap.Filter;
+import org.forgerock.opendj.ldap.FilterVisitor;
 import org.forgerock.opendj.ldap.responses.SearchResultEntry;
 
-
-
 /**
  * Common LDAP utility methods which may be used when implementing new controls
  * and extension.
  */
-public final class LDAPUtils
-{
+public final class LDAPUtils {
 
-  private static final FilterVisitor<IOException, ASN1Writer> ASN1_ENCODER =
-    new FilterVisitor<IOException, ASN1Writer>()
-  {
+    private static final FilterVisitor<IOException, ASN1Writer> ASN1_ENCODER =
+            new FilterVisitor<IOException, ASN1Writer>() {
 
-    public IOException visitAndFilter(final ASN1Writer writer,
-        final List<Filter> subFilters)
-    {
-      try
-      {
-        writer.writeStartSequence(TYPE_FILTER_AND);
-        for (final Filter subFilter : subFilters)
-        {
-          final IOException e = subFilter.accept(this, writer);
-          if (e != null)
-          {
-            return e;
-          }
+                public IOException visitAndFilter(final ASN1Writer writer,
+                        final List<Filter> subFilters) {
+                    try {
+                        writer.writeStartSequence(TYPE_FILTER_AND);
+                        for (final Filter subFilter : subFilters) {
+                            final IOException e = subFilter.accept(this, writer);
+                            if (e != null) {
+                                return e;
+                            }
+                        }
+                        writer.writeEndSequence();
+                        return null;
+                    } catch (final IOException e) {
+                        return e;
+                    }
+                }
+
+                public IOException visitApproxMatchFilter(final ASN1Writer writer,
+                        final String attributeDescription, final ByteString assertionValue) {
+                    try {
+                        writer.writeStartSequence(TYPE_FILTER_APPROXIMATE);
+                        writer.writeOctetString(attributeDescription);
+                        writer.writeOctetString(assertionValue);
+                        writer.writeEndSequence();
+                        return null;
+                    } catch (final IOException e) {
+                        return e;
+                    }
+                }
+
+                public IOException visitEqualityMatchFilter(final ASN1Writer writer,
+                        final String attributeDescription, final ByteString assertionValue) {
+                    try {
+                        writer.writeStartSequence(TYPE_FILTER_EQUALITY);
+                        writer.writeOctetString(attributeDescription);
+                        writer.writeOctetString(assertionValue);
+                        writer.writeEndSequence();
+                        return null;
+                    } catch (final IOException e) {
+                        return e;
+                    }
+                }
+
+                public IOException visitExtensibleMatchFilter(final ASN1Writer writer,
+                        final String matchingRule, final String attributeDescription,
+                        final ByteString assertionValue, final boolean dnAttributes) {
+                    try {
+                        writer.writeStartSequence(TYPE_FILTER_EXTENSIBLE_MATCH);
+
+                        if (matchingRule != null) {
+                            writer.writeOctetString(TYPE_MATCHING_RULE_ID, matchingRule);
+                        }
+
+                        if (attributeDescription != null) {
+                            writer.writeOctetString(TYPE_MATCHING_RULE_TYPE, attributeDescription);
+                        }
+
+                        writer.writeOctetString(TYPE_MATCHING_RULE_VALUE, assertionValue);
+
+                        if (dnAttributes) {
+                            writer.writeBoolean(TYPE_MATCHING_RULE_DN_ATTRIBUTES, true);
+                        }
+
+                        writer.writeEndSequence();
+                        return null;
+                    } catch (final IOException e) {
+                        return e;
+                    }
+                }
+
+                public IOException visitGreaterOrEqualFilter(final ASN1Writer writer,
+                        final String attributeDescription, final ByteString assertionValue) {
+                    try {
+                        writer.writeStartSequence(TYPE_FILTER_GREATER_OR_EQUAL);
+                        writer.writeOctetString(attributeDescription);
+                        writer.writeOctetString(assertionValue);
+                        writer.writeEndSequence();
+                        return null;
+                    } catch (final IOException e) {
+                        return e;
+                    }
+                }
+
+                public IOException visitLessOrEqualFilter(final ASN1Writer writer,
+                        final String attributeDescription, final ByteString assertionValue) {
+                    try {
+                        writer.writeStartSequence(TYPE_FILTER_LESS_OR_EQUAL);
+                        writer.writeOctetString(attributeDescription);
+                        writer.writeOctetString(assertionValue);
+                        writer.writeEndSequence();
+                        return null;
+                    } catch (final IOException e) {
+                        return e;
+                    }
+                }
+
+                public IOException visitNotFilter(final ASN1Writer writer, final Filter subFilter) {
+                    try {
+                        writer.writeStartSequence(TYPE_FILTER_NOT);
+                        final IOException e = subFilter.accept(this, writer);
+                        if (e != null) {
+                            return e;
+                        }
+                        writer.writeEndSequence();
+                        return null;
+                    } catch (final IOException e) {
+                        return e;
+                    }
+                }
+
+                public IOException visitOrFilter(final ASN1Writer writer,
+                        final List<Filter> subFilters) {
+                    try {
+                        writer.writeStartSequence(TYPE_FILTER_OR);
+                        for (final Filter subFilter : subFilters) {
+                            final IOException e = subFilter.accept(this, writer);
+                            if (e != null) {
+                                return e;
+                            }
+                        }
+                        writer.writeEndSequence();
+                        return null;
+                    } catch (final IOException e) {
+                        return e;
+                    }
+                }
+
+                public IOException visitPresentFilter(final ASN1Writer writer,
+                        final String attributeDescription) {
+                    try {
+                        writer.writeOctetString(TYPE_FILTER_PRESENCE, attributeDescription);
+                        return null;
+                    } catch (final IOException e) {
+                        return e;
+                    }
+                }
+
+                public IOException visitSubstringsFilter(final ASN1Writer writer,
+                        final String attributeDescription, final ByteString initialSubstring,
+                        final List<ByteString> anySubstrings, final ByteString finalSubstring) {
+                    try {
+                        writer.writeStartSequence(TYPE_FILTER_SUBSTRING);
+                        writer.writeOctetString(attributeDescription);
+
+                        writer.writeStartSequence();
+                        if (initialSubstring != null) {
+                            writer.writeOctetString(TYPE_SUBINITIAL, initialSubstring);
+                        }
+
+                        for (final ByteSequence anySubstring : anySubstrings) {
+                            writer.writeOctetString(TYPE_SUBANY, anySubstring);
+                        }
+
+                        if (finalSubstring != null) {
+                            writer.writeOctetString(TYPE_SUBFINAL, finalSubstring);
+                        }
+                        writer.writeEndSequence();
+
+                        writer.writeEndSequence();
+                        return null;
+                    } catch (final IOException e) {
+                        return e;
+                    }
+                }
+
+                public IOException visitUnrecognizedFilter(final ASN1Writer writer,
+                        final byte filterTag, final ByteString filterBytes) {
+                    try {
+                        writer.writeOctetString(filterTag, filterBytes);
+                        return null;
+                    } catch (final IOException e) {
+                        return e;
+                    }
+                }
+            };
+
+    /**
+     * Reads the next ASN.1 element from the provided {@code ASN1Reader} as a
+     * {@code Filter}.
+     *
+     * @param reader
+     *            The {@code ASN1Reader} from which the ASN.1 encoded
+     *            {@code Filter} should be read.
+     * @return The decoded {@code Filter}.
+     * @throws IOException
+     *             If an error occurs while reading from {@code reader}.
+     */
+    public static Filter decodeFilter(final ASN1Reader reader) throws IOException {
+        final byte type = reader.peekType();
+
+        switch (type) {
+        case TYPE_FILTER_AND:
+            return decodeAndFilter(reader);
+
+        case TYPE_FILTER_OR:
+            return decodeOrFilter(reader);
+
+        case TYPE_FILTER_NOT:
+            return decodeNotFilter(reader);
+
+        case TYPE_FILTER_EQUALITY:
+            return decodeEqualityMatchFilter(reader);
+
+        case TYPE_FILTER_GREATER_OR_EQUAL:
+            return decodeGreaterOrEqualMatchFilter(reader);
+
+        case TYPE_FILTER_LESS_OR_EQUAL:
+            return decodeLessOrEqualMatchFilter(reader);
+
+        case TYPE_FILTER_APPROXIMATE:
+            return decodeApproxMatchFilter(reader);
+
+        case TYPE_FILTER_SUBSTRING:
+            return decodeSubstringsFilter(reader);
+
+        case TYPE_FILTER_PRESENCE:
+            return Filter.newPresentFilter(reader.readOctetStringAsString(type));
+
+        case TYPE_FILTER_EXTENSIBLE_MATCH:
+            return decodeExtensibleMatchFilter(reader);
+
+        default:
+            return Filter.newUnrecognizedFilter(type, reader.readOctetString(type));
         }
-        writer.writeEndSequence();
-        return null;
-      }
-      catch (final IOException e)
-      {
-        return e;
-      }
     }
 
-
-
-    public IOException visitApproxMatchFilter(final ASN1Writer writer,
-        final String attributeDescription, final ByteString assertionValue)
-    {
-      try
-      {
-        writer.writeStartSequence(TYPE_FILTER_APPROXIMATE);
-        writer.writeOctetString(attributeDescription);
-        writer.writeOctetString(assertionValue);
-        writer.writeEndSequence();
-        return null;
-      }
-      catch (final IOException e)
-      {
-        return e;
-      }
+    /**
+     * Reads the next ASN.1 element from the provided {@code ASN1Reader} as a
+     * {@code SearchResultEntry}.
+     *
+     * @param reader
+     *            The {@code ASN1Reader} from which the ASN.1 encoded
+     *            {@code SearchResultEntry} should be read.
+     * @param options
+     *            The decode options to use when decoding the entry.
+     * @return The decoded {@code SearchResultEntry}.
+     * @throws IOException
+     *             If an error occurs while reading from {@code reader}.
+     */
+    public static SearchResultEntry decodeSearchResultEntry(final ASN1Reader reader,
+            final DecodeOptions options) throws IOException {
+        return LDAPReader.decodeEntry(reader, options);
     }
 
-
-
-    public IOException visitEqualityMatchFilter(final ASN1Writer writer,
-        final String attributeDescription, final ByteString assertionValue)
-    {
-      try
-      {
-        writer.writeStartSequence(TYPE_FILTER_EQUALITY);
-        writer.writeOctetString(attributeDescription);
-        writer.writeOctetString(assertionValue);
-        writer.writeEndSequence();
-        return null;
-      }
-      catch (final IOException e)
-      {
-        return e;
-      }
+    /**
+     * Writes the ASN.1 encoding of the provided {@code Filter} to the provided
+     * {@code ASN1Writer}.
+     *
+     * @param writer
+     *            The {@code ASN1Writer} to which the ASN.1 encoding of the
+     *            provided {@code Filter} should be written.
+     * @param filter
+     *            The filter to be encoded.
+     * @return The updated {@code ASN1Writer}.
+     * @throws IOException
+     *             If an error occurs while writing to {@code writer}.
+     */
+    public static ASN1Writer encodeFilter(final ASN1Writer writer, final Filter filter)
+            throws IOException {
+        final IOException e = filter.accept(ASN1_ENCODER, writer);
+        if (e != null) {
+            throw e;
+        } else {
+            return writer;
+        }
     }
 
+    /**
+     * Writes the ASN.1 encoding of the provided {@code SearchResultEntry} to
+     * the provided {@code ASN1Writer}.
+     *
+     * @param writer
+     *            The {@code ASN1Writer} to which the ASN.1 encoding of the
+     *            provided {@code SearchResultEntry} should be written.
+     * @param entry
+     *            The Search Result Entry to be encoded.
+     * @return The updated {@code ASN1Writer}.
+     * @throws IOException
+     *             If an error occurs while writing to {@code writer}.
+     */
+    public static ASN1Writer encodeSearchResultEntry(final ASN1Writer writer,
+            final SearchResultEntry entry) throws IOException {
+        // FIXME: this should include Controls.
+        LDAPWriter.encodeEntry(writer, entry);
+        return writer;
+    }
 
+    // Decodes an and filter.
+    private static Filter decodeAndFilter(final ASN1Reader reader) throws IOException {
+        Filter filter;
 
-    public IOException visitExtensibleMatchFilter(final ASN1Writer writer,
-        final String matchingRule, final String attributeDescription,
-        final ByteString assertionValue, final boolean dnAttributes)
-    {
-      try
-      {
-        writer.writeStartSequence(TYPE_FILTER_EXTENSIBLE_MATCH);
-
-        if (matchingRule != null)
-        {
-          writer.writeOctetString(TYPE_MATCHING_RULE_ID, matchingRule);
+        reader.readStartSequence(TYPE_FILTER_AND);
+        try {
+            if (reader.hasNextElement()) {
+                final List<Filter> subFilters = new LinkedList<Filter>();
+                do {
+                    subFilters.add(decodeFilter(reader));
+                } while (reader.hasNextElement());
+                filter = Filter.newAndFilter(subFilters);
+            } else {
+                // No sub-filters - this is an RFC 4526 absolute true filter.
+                filter = Filter.getAbsoluteTrueFilter();
+            }
+        } finally {
+            reader.readEndSequence();
         }
 
-        if (attributeDescription != null)
-        {
-          writer
-              .writeOctetString(TYPE_MATCHING_RULE_TYPE, attributeDescription);
+        return filter;
+    }
+
+    // Decodes an approximate match filter.
+    private static Filter decodeApproxMatchFilter(final ASN1Reader reader) throws IOException {
+        String attributeDescription;
+        ByteString assertionValue;
+
+        reader.readStartSequence(TYPE_FILTER_APPROXIMATE);
+        try {
+            attributeDescription = reader.readOctetStringAsString();
+            assertionValue = reader.readOctetString();
+        } finally {
+            reader.readEndSequence();
         }
 
-        writer.writeOctetString(TYPE_MATCHING_RULE_VALUE, assertionValue);
+        return Filter.newApproxMatchFilter(attributeDescription, assertionValue);
+    }
 
-        if (dnAttributes)
-        {
-          writer.writeBoolean(TYPE_MATCHING_RULE_DN_ATTRIBUTES, true);
+    // Decodes an equality match filter.
+    private static Filter decodeEqualityMatchFilter(final ASN1Reader reader) throws IOException {
+        String attributeDescription;
+        ByteString assertionValue;
+
+        reader.readStartSequence(TYPE_FILTER_EQUALITY);
+        try {
+            attributeDescription = reader.readOctetStringAsString();
+            assertionValue = reader.readOctetString();
+        } finally {
+            reader.readEndSequence();
         }
 
-        writer.writeEndSequence();
-        return null;
-      }
-      catch (final IOException e)
-      {
-        return e;
-      }
+        return Filter.newEqualityMatchFilter(attributeDescription, assertionValue);
     }
 
+    // Decodes an extensible match filter.
+    private static Filter decodeExtensibleMatchFilter(final ASN1Reader reader) throws IOException {
+        String matchingRule;
+        String attributeDescription;
+        boolean dnAttributes;
+        ByteString assertionValue;
 
-
-    public IOException visitGreaterOrEqualFilter(final ASN1Writer writer,
-        final String attributeDescription, final ByteString assertionValue)
-    {
-      try
-      {
-        writer.writeStartSequence(TYPE_FILTER_GREATER_OR_EQUAL);
-        writer.writeOctetString(attributeDescription);
-        writer.writeOctetString(assertionValue);
-        writer.writeEndSequence();
-        return null;
-      }
-      catch (final IOException e)
-      {
-        return e;
-      }
-    }
-
-
-
-    public IOException visitLessOrEqualFilter(final ASN1Writer writer,
-        final String attributeDescription, final ByteString assertionValue)
-    {
-      try
-      {
-        writer.writeStartSequence(TYPE_FILTER_LESS_OR_EQUAL);
-        writer.writeOctetString(attributeDescription);
-        writer.writeOctetString(assertionValue);
-        writer.writeEndSequence();
-        return null;
-      }
-      catch (final IOException e)
-      {
-        return e;
-      }
-    }
-
-
-
-    public IOException visitNotFilter(final ASN1Writer writer,
-        final Filter subFilter)
-    {
-      try
-      {
-        writer.writeStartSequence(TYPE_FILTER_NOT);
-        final IOException e = subFilter.accept(this, writer);
-        if (e != null)
-        {
-          return e;
-        }
-        writer.writeEndSequence();
-        return null;
-      }
-      catch (final IOException e)
-      {
-        return e;
-      }
-    }
-
-
-
-    public IOException visitOrFilter(final ASN1Writer writer,
-        final List<Filter> subFilters)
-    {
-      try
-      {
-        writer.writeStartSequence(TYPE_FILTER_OR);
-        for (final Filter subFilter : subFilters)
-        {
-          final IOException e = subFilter.accept(this, writer);
-          if (e != null)
-          {
-            return e;
-          }
-        }
-        writer.writeEndSequence();
-        return null;
-      }
-      catch (final IOException e)
-      {
-        return e;
-      }
-    }
-
-
-
-    public IOException visitPresentFilter(final ASN1Writer writer,
-        final String attributeDescription)
-    {
-      try
-      {
-        writer.writeOctetString(TYPE_FILTER_PRESENCE, attributeDescription);
-        return null;
-      }
-      catch (final IOException e)
-      {
-        return e;
-      }
-    }
-
-
-
-    public IOException visitSubstringsFilter(final ASN1Writer writer,
-        final String attributeDescription, final ByteString initialSubstring,
-        final List<ByteString> anySubstrings, final ByteString finalSubstring)
-    {
-      try
-      {
-        writer.writeStartSequence(TYPE_FILTER_SUBSTRING);
-        writer.writeOctetString(attributeDescription);
-
-        writer.writeStartSequence();
-        if (initialSubstring != null)
-        {
-          writer.writeOctetString(TYPE_SUBINITIAL, initialSubstring);
+        reader.readStartSequence(TYPE_FILTER_EXTENSIBLE_MATCH);
+        try {
+            matchingRule = null;
+            if (reader.peekType() == TYPE_MATCHING_RULE_ID) {
+                matchingRule = reader.readOctetStringAsString(TYPE_MATCHING_RULE_ID);
+            }
+            attributeDescription = null;
+            if (reader.peekType() == TYPE_MATCHING_RULE_TYPE) {
+                attributeDescription = reader.readOctetStringAsString(TYPE_MATCHING_RULE_TYPE);
+            }
+            dnAttributes = false;
+            if (reader.hasNextElement() && (reader.peekType() == TYPE_MATCHING_RULE_DN_ATTRIBUTES)) {
+                dnAttributes = reader.readBoolean();
+            }
+            assertionValue = reader.readOctetString(TYPE_MATCHING_RULE_VALUE);
+        } finally {
+            reader.readEndSequence();
         }
 
-        for (final ByteSequence anySubstring : anySubstrings)
-        {
-          writer.writeOctetString(TYPE_SUBANY, anySubstring);
+        return Filter.newExtensibleMatchFilter(matchingRule, attributeDescription, assertionValue,
+                dnAttributes);
+    }
+
+    // Decodes a greater than or equal filter.
+    private static Filter decodeGreaterOrEqualMatchFilter(final ASN1Reader reader)
+            throws IOException {
+        String attributeDescription;
+        ByteString assertionValue;
+
+        reader.readStartSequence(TYPE_FILTER_GREATER_OR_EQUAL);
+        try {
+            attributeDescription = reader.readOctetStringAsString();
+            assertionValue = reader.readOctetString();
+        } finally {
+            reader.readEndSequence();
+        }
+        return Filter.newGreaterOrEqualFilter(attributeDescription, assertionValue);
+    }
+
+    // Decodes a less than or equal filter.
+    private static Filter decodeLessOrEqualMatchFilter(final ASN1Reader reader) throws IOException {
+        String attributeDescription;
+        ByteString assertionValue;
+
+        reader.readStartSequence(TYPE_FILTER_LESS_OR_EQUAL);
+        try {
+            attributeDescription = reader.readOctetStringAsString();
+            assertionValue = reader.readOctetString();
+        } finally {
+            reader.readEndSequence();
         }
 
-        if (finalSubstring != null)
-        {
-          writer.writeOctetString(TYPE_SUBFINAL, finalSubstring);
+        return Filter.newLessOrEqualFilter(attributeDescription, assertionValue);
+    }
+
+    // Decodes a not filter.
+    private static Filter decodeNotFilter(final ASN1Reader reader) throws IOException {
+        Filter subFilter;
+
+        reader.readStartSequence(TYPE_FILTER_NOT);
+        try {
+            subFilter = decodeFilter(reader);
+        } finally {
+            reader.readEndSequence();
         }
-        writer.writeEndSequence();
 
-        writer.writeEndSequence();
-        return null;
-      }
-      catch (final IOException e)
-      {
-        return e;
-      }
+        return Filter.newNotFilter(subFilter);
     }
 
+    // Decodes an or filter.
+    private static Filter decodeOrFilter(final ASN1Reader reader) throws IOException {
+        Filter filter;
 
-
-    public IOException visitUnrecognizedFilter(final ASN1Writer writer,
-        final byte filterTag, final ByteString filterBytes)
-    {
-      try
-      {
-        writer.writeOctetString(filterTag, filterBytes);
-        return null;
-      }
-      catch (final IOException e)
-      {
-        return e;
-      }
-    }
-  };
-
-
-
-  /**
-   * Reads the next ASN.1 element from the provided {@code ASN1Reader} as a
-   * {@code Filter}.
-   *
-   * @param reader
-   *          The {@code ASN1Reader} from which the ASN.1 encoded {@code Filter}
-   *          should be read.
-   * @return The decoded {@code Filter}.
-   * @throws IOException
-   *           If an error occurs while reading from {@code reader}.
-   */
-  public static Filter decodeFilter(final ASN1Reader reader) throws IOException
-  {
-    final byte type = reader.peekType();
-
-    switch (type)
-    {
-    case TYPE_FILTER_AND:
-      return decodeAndFilter(reader);
-
-    case TYPE_FILTER_OR:
-      return decodeOrFilter(reader);
-
-    case TYPE_FILTER_NOT:
-      return decodeNotFilter(reader);
-
-    case TYPE_FILTER_EQUALITY:
-      return decodeEqualityMatchFilter(reader);
-
-    case TYPE_FILTER_GREATER_OR_EQUAL:
-      return decodeGreaterOrEqualMatchFilter(reader);
-
-    case TYPE_FILTER_LESS_OR_EQUAL:
-      return decodeLessOrEqualMatchFilter(reader);
-
-    case TYPE_FILTER_APPROXIMATE:
-      return decodeApproxMatchFilter(reader);
-
-    case TYPE_FILTER_SUBSTRING:
-      return decodeSubstringsFilter(reader);
-
-    case TYPE_FILTER_PRESENCE:
-      return Filter.newPresentFilter(reader.readOctetStringAsString(type));
-
-    case TYPE_FILTER_EXTENSIBLE_MATCH:
-      return decodeExtensibleMatchFilter(reader);
-
-    default:
-      return Filter.newUnrecognizedFilter(type, reader.readOctetString(type));
-    }
-  }
-
-
-
-  /**
-   * Reads the next ASN.1 element from the provided {@code ASN1Reader} as a
-   * {@code SearchResultEntry}.
-   *
-   * @param reader
-   *          The {@code ASN1Reader} from which the ASN.1 encoded {@code
-   *          SearchResultEntry} should be read.
-   * @param options
-   *          The decode options to use when decoding the entry.
-   * @return The decoded {@code SearchResultEntry}.
-   * @throws IOException
-   *           If an error occurs while reading from {@code reader}.
-   */
-  public static SearchResultEntry decodeSearchResultEntry(
-      final ASN1Reader reader, final DecodeOptions options) throws IOException
-  {
-    return LDAPReader.decodeEntry(reader, options);
-  }
-
-
-
-  /**
-   * Writes the ASN.1 encoding of the provided {@code Filter} to the provided
-   * {@code ASN1Writer}.
-   *
-   * @param writer
-   *          The {@code ASN1Writer} to which the ASN.1 encoding of the provided
-   *          {@code Filter} should be written.
-   * @param filter
-   *          The filter to be encoded.
-   * @return The updated {@code ASN1Writer}.
-   * @throws IOException
-   *           If an error occurs while writing to {@code writer}.
-   */
-  public static ASN1Writer encodeFilter(final ASN1Writer writer,
-      final Filter filter) throws IOException
-  {
-    final IOException e = filter.accept(ASN1_ENCODER, writer);
-    if (e != null)
-    {
-      throw e;
-    }
-    else
-    {
-      return writer;
-    }
-  }
-
-
-
-  /**
-   * Writes the ASN.1 encoding of the provided {@code SearchResultEntry} to the
-   * provided {@code ASN1Writer}.
-   *
-   * @param writer
-   *          The {@code ASN1Writer} to which the ASN.1 encoding of the provided
-   *          {@code SearchResultEntry} should be written.
-   * @param entry
-   *          The Search Result Entry to be encoded.
-   * @return The updated {@code ASN1Writer}.
-   * @throws IOException
-   *           If an error occurs while writing to {@code writer}.
-   */
-  public static ASN1Writer encodeSearchResultEntry(final ASN1Writer writer,
-      final SearchResultEntry entry) throws IOException
-  {
-    // FIXME: this should include Controls.
-    LDAPWriter.encodeEntry(writer, entry);
-    return writer;
-  }
-
-
-
-  // Decodes an and filter.
-  private static Filter decodeAndFilter(final ASN1Reader reader)
-      throws IOException
-  {
-    Filter filter;
-
-    reader.readStartSequence(TYPE_FILTER_AND);
-    try
-    {
-      if (reader.hasNextElement())
-      {
-        final List<Filter> subFilters = new LinkedList<Filter>();
-        do
-        {
-          subFilters.add(decodeFilter(reader));
+        reader.readStartSequence(TYPE_FILTER_OR);
+        try {
+            if (reader.hasNextElement()) {
+                final List<Filter> subFilters = new LinkedList<Filter>();
+                do {
+                    subFilters.add(decodeFilter(reader));
+                } while (reader.hasNextElement());
+                filter = Filter.newOrFilter(subFilters);
+            } else {
+                // No sub-filters - this is an RFC 4526 absolute false filter.
+                filter = Filter.getAbsoluteFalseFilter();
+            }
+        } finally {
+            reader.readEndSequence();
         }
-        while (reader.hasNextElement());
-        filter = Filter.newAndFilter(subFilters);
-      }
-      else
-      {
-        // No sub-filters - this is an RFC 4526 absolute true filter.
-        filter = Filter.getAbsoluteTrueFilter();
-      }
-    }
-    finally
-    {
-      reader.readEndSequence();
+
+        return filter;
     }
 
-    return filter;
-  }
+    // Decodes a sub-strings filter.
+    private static Filter decodeSubstringsFilter(final ASN1Reader reader) throws IOException {
+        ByteString initialSubstring = null;
+        List<ByteString> anySubstrings = null;
+        ByteString finalSubstring = null;
+        String attributeDescription;
 
-
-
-  // Decodes an approximate match filter.
-  private static Filter decodeApproxMatchFilter(final ASN1Reader reader)
-      throws IOException
-  {
-    String attributeDescription;
-    ByteString assertionValue;
-
-    reader.readStartSequence(TYPE_FILTER_APPROXIMATE);
-    try
-    {
-      attributeDescription = reader.readOctetStringAsString();
-      assertionValue = reader.readOctetString();
-    }
-    finally
-    {
-      reader.readEndSequence();
-    }
-
-    return Filter.newApproxMatchFilter(attributeDescription, assertionValue);
-  }
-
-
-
-  // Decodes an equality match filter.
-  private static Filter decodeEqualityMatchFilter(final ASN1Reader reader)
-      throws IOException
-  {
-    String attributeDescription;
-    ByteString assertionValue;
-
-    reader.readStartSequence(TYPE_FILTER_EQUALITY);
-    try
-    {
-      attributeDescription = reader.readOctetStringAsString();
-      assertionValue = reader.readOctetString();
-    }
-    finally
-    {
-      reader.readEndSequence();
-    }
-
-    return Filter.newEqualityMatchFilter(attributeDescription, assertionValue);
-  }
-
-
-
-  // Decodes an extensible match filter.
-  private static Filter decodeExtensibleMatchFilter(final ASN1Reader reader)
-      throws IOException
-  {
-    String matchingRule;
-    String attributeDescription;
-    boolean dnAttributes;
-    ByteString assertionValue;
-
-    reader.readStartSequence(TYPE_FILTER_EXTENSIBLE_MATCH);
-    try
-    {
-      matchingRule = null;
-      if (reader.peekType() == TYPE_MATCHING_RULE_ID)
-      {
-        matchingRule = reader.readOctetStringAsString(TYPE_MATCHING_RULE_ID);
-      }
-      attributeDescription = null;
-      if (reader.peekType() == TYPE_MATCHING_RULE_TYPE)
-      {
-        attributeDescription = reader
-            .readOctetStringAsString(TYPE_MATCHING_RULE_TYPE);
-      }
-      dnAttributes = false;
-      if (reader.hasNextElement()
-          && (reader.peekType() == TYPE_MATCHING_RULE_DN_ATTRIBUTES))
-      {
-        dnAttributes = reader.readBoolean();
-      }
-      assertionValue = reader.readOctetString(TYPE_MATCHING_RULE_VALUE);
-    }
-    finally
-    {
-      reader.readEndSequence();
-    }
-
-    return Filter.newExtensibleMatchFilter(matchingRule, attributeDescription,
-        assertionValue, dnAttributes);
-  }
-
-
-
-  // Decodes a greater than or equal filter.
-  private static Filter decodeGreaterOrEqualMatchFilter(final ASN1Reader reader)
-      throws IOException
-  {
-    String attributeDescription;
-    ByteString assertionValue;
-
-    reader.readStartSequence(TYPE_FILTER_GREATER_OR_EQUAL);
-    try
-    {
-      attributeDescription = reader.readOctetStringAsString();
-      assertionValue = reader.readOctetString();
-    }
-    finally
-    {
-      reader.readEndSequence();
-    }
-    return Filter.newGreaterOrEqualFilter(attributeDescription, assertionValue);
-  }
-
-
-
-  // Decodes a less than or equal filter.
-  private static Filter decodeLessOrEqualMatchFilter(final ASN1Reader reader)
-      throws IOException
-  {
-    String attributeDescription;
-    ByteString assertionValue;
-
-    reader.readStartSequence(TYPE_FILTER_LESS_OR_EQUAL);
-    try
-    {
-      attributeDescription = reader.readOctetStringAsString();
-      assertionValue = reader.readOctetString();
-    }
-    finally
-    {
-      reader.readEndSequence();
-    }
-
-    return Filter.newLessOrEqualFilter(attributeDescription, assertionValue);
-  }
-
-
-
-  // Decodes a not filter.
-  private static Filter decodeNotFilter(final ASN1Reader reader)
-      throws IOException
-  {
-    Filter subFilter;
-
-    reader.readStartSequence(TYPE_FILTER_NOT);
-    try
-    {
-      subFilter = decodeFilter(reader);
-    }
-    finally
-    {
-      reader.readEndSequence();
-    }
-
-    return Filter.newNotFilter(subFilter);
-  }
-
-
-
-  // Decodes an or filter.
-  private static Filter decodeOrFilter(final ASN1Reader reader)
-      throws IOException
-  {
-    Filter filter;
-
-    reader.readStartSequence(TYPE_FILTER_OR);
-    try
-    {
-      if (reader.hasNextElement())
-      {
-        final List<Filter> subFilters = new LinkedList<Filter>();
-        do
-        {
-          subFilters.add(decodeFilter(reader));
+        reader.readStartSequence(TYPE_FILTER_SUBSTRING);
+        try {
+            attributeDescription = reader.readOctetStringAsString();
+            reader.readStartSequence();
+            try {
+                // FIXME: There should be at least one element in this substring
+                // filter sequence.
+                if (reader.peekType() == TYPE_SUBINITIAL) {
+                    initialSubstring = reader.readOctetString(TYPE_SUBINITIAL);
+                }
+                if (reader.hasNextElement() && (reader.peekType() == TYPE_SUBANY)) {
+                    anySubstrings = new LinkedList<ByteString>();
+                    do {
+                        anySubstrings.add(reader.readOctetString(TYPE_SUBANY));
+                    } while (reader.hasNextElement() && (reader.peekType() == TYPE_SUBANY));
+                }
+                if (reader.hasNextElement() && (reader.peekType() == TYPE_SUBFINAL)) {
+                    finalSubstring = reader.readOctetString(TYPE_SUBFINAL);
+                }
+            } finally {
+                reader.readEndSequence();
+            }
+        } finally {
+            reader.readEndSequence();
         }
-        while (reader.hasNextElement());
-        filter = Filter.newOrFilter(subFilters);
-      }
-      else
-      {
-        // No sub-filters - this is an RFC 4526 absolute false filter.
-        filter = Filter.getAbsoluteFalseFilter();
-      }
-    }
-    finally
-    {
-      reader.readEndSequence();
-    }
 
-    return filter;
-  }
-
-
-
-  // Decodes a sub-strings filter.
-  private static Filter decodeSubstringsFilter(final ASN1Reader reader)
-      throws IOException
-  {
-    ByteString initialSubstring = null;
-    List<ByteString> anySubstrings = null;
-    ByteString finalSubstring = null;
-    String attributeDescription;
-
-    reader.readStartSequence(TYPE_FILTER_SUBSTRING);
-    try
-    {
-      attributeDescription = reader.readOctetStringAsString();
-      reader.readStartSequence();
-      try
-      {
-        // FIXME: There should be at least one element in this substring
-        // filter sequence.
-        if (reader.peekType() == TYPE_SUBINITIAL)
-        {
-          initialSubstring = reader.readOctetString(TYPE_SUBINITIAL);
+        if (anySubstrings == null) {
+            anySubstrings = Collections.emptyList();
         }
-        if (reader.hasNextElement() && (reader.peekType() == TYPE_SUBANY))
-        {
-          anySubstrings = new LinkedList<ByteString>();
-          do
-          {
-            anySubstrings.add(reader.readOctetString(TYPE_SUBANY));
-          }
-          while (reader.hasNextElement() && (reader.peekType() == TYPE_SUBANY));
-        }
-        if (reader.hasNextElement() && (reader.peekType() == TYPE_SUBFINAL))
-        {
-          finalSubstring = reader.readOctetString(TYPE_SUBFINAL);
-        }
-      }
-      finally
-      {
-        reader.readEndSequence();
-      }
-    }
-    finally
-    {
-      reader.readEndSequence();
+
+        return Filter.newSubstringsFilter(attributeDescription, initialSubstring, anySubstrings,
+                finalSubstring);
     }
 
-    if (anySubstrings == null)
-    {
-      anySubstrings = Collections.emptyList();
+    /**
+     * Prevent instantiation.
+     */
+    private LDAPUtils() {
+        // Nothing to do.
     }
-
-    return Filter.newSubstringsFilter(attributeDescription, initialSubstring,
-        anySubstrings, finalSubstring);
-  }
-
-
-
-  /**
-   * Prevent instantiation.
-   */
-  private LDAPUtils()
-  {
-    // Nothing to do.
-  }
 }

--
Gitblit v1.10.0