mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Matthew Swift
25.33.2012 263d085885df024dca9250cc03c807912b0a7662
opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/util/SubstringReader.java
@@ -6,17 +6,16 @@
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at
 * trunk/opendj3/legal-notices/CDDLv1_0.txt
 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at
 * trunk/opendj3/legal-notices/CDDLv1_0.txt.  If applicable,
 * add the following below this CDDL HEADER, with the fields enclosed
 * by brackets "[]" replaced with your own identifying information:
 * file and include the License file at legal-notices/CDDLv1_0.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
@@ -28,158 +27,125 @@
package com.forgerock.opendj.util;
/**
 * A sub-string reader.
 */
public class SubstringReader
{
  // The source string.
  private final String source;
  // The current position.
  private int pos;
  // The marked position.
  private int mark;
  // The length of the source.
  private final int length;
public class SubstringReader {
    // The source string.
    private final String source;
    // The current position.
    private int pos;
    // The marked position.
    private int mark;
    // The length of the source.
    private final int length;
  /**
   * Creates an instance of SubstringReader.
   *
   * @param s
   *          the source of the reader.
   */
  public SubstringReader(final String s)
  {
    Validator.ensureNotNull(s);
    source = s;
    length = s.length();
    pos = 0;
    mark = 0;
  }
  /**
   * Returns the source string.
   *
   * @return source string.
   */
  public String getString()
  {
    return source;
  }
  /**
   * Marks the present position in the stream. Subsequent calls to reset() will
   * reposition the stream to this point.
   */
  public void mark()
  {
    mark = pos;
  }
  /**
   * Returns the current position of the reader.
   *
   * @return current position of the reader.
   */
  public int pos()
  {
    return pos;
  }
  /**
   * Attempts to read a character from the current position. The caller must
   * ensure that the source string has the data available from the current
   * position.
   *
   * @return The character at the current position.
   * @throws StringIndexOutOfBoundsException If there is no more data
   *            available to read.
   */
  public char read()
  {
    if (pos >= length)
    {
      throw new StringIndexOutOfBoundsException();
    /**
     * Creates an instance of SubstringReader.
     *
     * @param s
     *            the source of the reader.
     */
    public SubstringReader(final String s) {
        Validator.ensureNotNull(s);
        source = s;
        length = s.length();
        pos = 0;
        mark = 0;
    }
    return source.charAt(pos++);
  }
  /**
   * Attempts to read a substring of the specified length from the current
   * position. The caller must ensure that the requested length is within the
   * bounds i.e. the requested length from the current position should not
   * exceed the length of the source string.
   *
   * @param length
   *          The number of characters to read.
   * @return The substring.
   * @throws StringIndexOutOfBoundsException If the length exceeds the
   *            allowed length.
   */
  public String read(final int length)
  {
    if (length > this.length || pos + length > this.length)
    {
      throw new StringIndexOutOfBoundsException();
    /**
     * Returns the source string.
     *
     * @return source string.
     */
    public String getString() {
        return source;
    }
    final String substring = source.substring(pos, pos + length);
    pos += length;
    return substring;
  }
  /**
   * Returns the remaining length of the available data.
   *
   * @return remaining length.
   */
  public int remaining()
  {
    return length - pos;
  }
  /**
   * Resets the stream to the most recent mark, or to the beginning of the
   * string if it has never been marked.
   */
  public void reset()
  {
    pos = mark;
  }
  /**
   * Skips the whitespace characters and advances the reader to the next non
   * whitespace character.
   *
   * @return number of whitespace characters skipped.
   */
  public int skipWhitespaces()
  {
    int skipped = 0;
    while (pos < length && source.charAt(pos) == ' ')
    {
      skipped++;
      pos++;
    /**
     * Marks the present position in the stream. Subsequent calls to reset()
     * will reposition the stream to this point.
     */
    public void mark() {
        mark = pos;
    }
    return skipped;
  }
    /**
     * Returns the current position of the reader.
     *
     * @return current position of the reader.
     */
    public int pos() {
        return pos;
    }
    /**
     * Attempts to read a character from the current position. The caller must
     * ensure that the source string has the data available from the current
     * position.
     *
     * @return The character at the current position.
     * @throws StringIndexOutOfBoundsException
     *             If there is no more data available to read.
     */
    public char read() {
        if (pos >= length) {
            throw new StringIndexOutOfBoundsException();
        }
        return source.charAt(pos++);
    }
    /**
     * Attempts to read a substring of the specified length from the current
     * position. The caller must ensure that the requested length is within the
     * bounds i.e. the requested length from the current position should not
     * exceed the length of the source string.
     *
     * @param length
     *            The number of characters to read.
     * @return The substring.
     * @throws StringIndexOutOfBoundsException
     *             If the length exceeds the allowed length.
     */
    public String read(final int length) {
        if (length > this.length || pos + length > this.length) {
            throw new StringIndexOutOfBoundsException();
        }
        final String substring = source.substring(pos, pos + length);
        pos += length;
        return substring;
    }
    /**
     * Returns the remaining length of the available data.
     *
     * @return remaining length.
     */
    public int remaining() {
        return length - pos;
    }
    /**
     * Resets the stream to the most recent mark, or to the beginning of the
     * string if it has never been marked.
     */
    public void reset() {
        pos = mark;
    }
    /**
     * Skips the whitespace characters and advances the reader to the next non
     * whitespace character.
     *
     * @return number of whitespace characters skipped.
     */
    public int skipWhitespaces() {
        int skipped = 0;
        while (pos < length && source.charAt(pos) == ' ') {
            skipped++;
            pos++;
        }
        return skipped;
    }
}