| | |
| | | * (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 |
| | |
| | | |
| | | 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; |
| | | } |
| | | } |