/******************************************************************************* * Copyright (c) 2010 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.usage.util.reader; import java.io.IOException; import java.io.Reader; /** * @author Andre Dietisheim */ public class ReadUntilImpl implements ReaderVisitor { /** returned by a stream if the end of the stream is reached. */ private static final char EOS = (char) -1; private Reader reader; private boolean matched = false; private int numberOfCharactersRead; private char[] characters; private int matchingCharactersIndex = 0; public ReadUntilImpl(Reader reader, char... characters) { this.reader = reader; this.numberOfCharactersRead = 0; this.characters = characters; } public final boolean continueRead(char character, int numberOfCharactersRead) throws IOException { this.numberOfCharactersRead = numberOfCharactersRead; return doContinueRead(character, numberOfCharactersRead); } protected boolean doContinueRead(char character, int numberOfCharactersRead) throws IOException { boolean continueRead = false; boolean matches = doesMatch(character); if (!matches) { continueRead = !matches; } else { int matchingIndex = getMatchingIndex() + 1; setMatchingIndex(matchingIndex); continueRead = matches && matchingIndex < getNumberOfCharactersToMatch(); } setMatches(matches); return continueRead; } public boolean isMatching() { return matched; } public int getNumberOfCharactersRead() { return this.numberOfCharactersRead; } public void read() throws IOException { char character = 0; while ((character = (char) reader.read()) != EOS) { if (!continueRead(character, ++numberOfCharactersRead)) { return; } } } protected void setMatchingIndex(int index) { this.matchingCharactersIndex = index; } protected int getMatchingIndex() { return matchingCharactersIndex; } protected boolean doesMatch(char character) { return characters[matchingCharactersIndex] == character; } protected int getNumberOfCharactersToMatch() { return characters.length; } protected char[] getCharactersToMatch() { return characters; } protected void setMatches(boolean matches) { matched = matches; } }