/** * */ package xhail.core.parser; import java.io.IOException; import java.io.InputStream; import java.util.Collection; import java.util.LinkedHashSet; import java.util.Set; import xhail.core.Logger; /** * @author stefano * */ public class Splitter implements Context { private State state; private Set<String> statements; private InputStream stream; private final State initial; public Splitter(State initial) { if (null == initial) throw new IllegalArgumentException("Illegal 'initial' argument in Splitter(State): " + initial); this.initial = initial; } @Override public void append(final String statement) { if (null == statement) throw new IllegalArgumentException("Illegal 'statement' argument in Splitter.append(String): " + statement); if (null != statement && !statement.isEmpty()) statements.add(statement); } @Override public Collection<String> parse(InputStream stream) { statements = new LinkedHashSet<>(); this.stream = stream; setState(initial); boolean finished = false; while (!finished) finished = state.process(this); return statements; } @Override public int read() { try { if (null == stream) return -1; return stream.read(); } catch (IOException e) { Logger.error("cannot read for the input stream"); return -1; } } @Override public void setState(final State next) { if (null == next) throw new IllegalArgumentException("Illegal 'next' argument in Splitter.setState(State): " + next); state = next; } }