/*
|
* CDDL HEADER START
|
*
|
* The contents of this file are subject to the terms of the
|
* Common Development and Distribution License, Version 1.0 only
|
* (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
|
* 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:
|
* Portions Copyright [yyyy] [name of copyright owner]
|
*
|
* CDDL HEADER END
|
*
|
*
|
* Copyright 2009-2010 Sun Microsystems, Inc.
|
* Portions copyright 2012 ForgeRock AS.
|
*/
|
|
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;
|
|
|
|
/**
|
* 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();
|
}
|
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;
|
}
|
}
|