/**
* Copyright (c) 2002-2014 "Neo Technology,"
* Network Engine for Objects in Lund AB [http://neotechnology.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.ldbc.driver.csv.charseeker;
import java.io.Closeable;
import java.io.IOException;
import java.io.Reader;
/**
* Seeks for specific characters in a stream of characters, e.g. a {@link Reader}. Uses a {@link Mark}
* as keeper of position. Once a {@link #seek(Mark, int[])} has succeeded the characters specified by
* the mark can be {@link #extract(Mark, Extractor) extracted} into a value of an arbitrary type.
* <p/>
* Typical usage is:
* <p/>
* <pre>
* CharSeeker seeker = ...
* Mark mark = new Mark();
* int[] delimiters = new int[] {'\t',','};
*
* while ( seeker.seek( mark, delimiters ) )
* {
* String value = seeker.extract( mark, Extractors.STRING );
* // ... somehow manage the value
* if ( mark.isEndOfLine() )
* {
* // ... end of line, put some logic to handle that here
* }
* }
* </pre>
* <p/>
* The {@link Reader} that gets passed in will be closed in {@link #close()}.
*
* @author Mattias Persson
*/
public interface CharSeeker extends Closeable {
/**
* Seeks the next occurrence of any of the characters in {@code untilOneOfChars}, or if end-of-line,
* or even end-of-file.
*
* @param mark the mutable {@link Mark} which will be updated with the findings, if any.
* @param untilOneOfChars array of characters to seek.
* @return {@code false} if the end was reached and hence no value found, otherwise {@code true}.
* @throws IOException in case of I/O error.
*/
boolean seek(Mark mark, int[] untilOneOfChars) throws IOException;
/**
* Extracts the value specified by the {@link Mark}, previously populated by a call to {@link #seek(Mark, int[])}.
*
* @param mark the {@link Mark} specifying which part of a bigger piece of data contains the found value.
* @param extractor {@link Extractor} capable of extracting the value.
* @return the supplied {@link Extractor}, which after the call carries the extracted value itself,
* where either {@link Extractor#value()} or a more specific accessor method can be called to access the value.
*/
<EXTRACTOR extends Extractor<?>> EXTRACTOR extract(Mark mark, EXTRACTOR extractor);
public static final CharSeeker EMPTY = new CharSeeker() {
@Override
public boolean seek(Mark mark, int[] untilOneOfChars) {
return false;
}
@Override
public <EXTRACTOR extends Extractor<?>> EXTRACTOR extract(Mark mark, EXTRACTOR extractor) {
throw new IllegalStateException("Nothing to extract");
}
@Override
public void close() { // Nothing to close
}
};
}