package org.docear.plugin.core.util; import java.io.EOFException; import java.io.IOException; import java.io.StringReader; public abstract class CharSequenceFilter { private final CharSequenceFilter previousFilter; private StringReader reader; public CharSequenceFilter(CharSequenceFilter filter) { this.previousFilter = filter; } protected Character next() throws IOException, EOFException { if(previousFilter == null) { if(reader == null) { throw new IllegalStateException("no String input was set"); } int chr = reader.read(); if(chr > -1) { return (char) chr; } throw new EOFException(); } else { return previousFilter.next(); } } private void propagateText(String text) { if(previousFilter == null) { reader = new StringReader(text); } else { previousFilter.propagateText(text); } } public final String filter(String text) throws IOException { propagateText(text); StringBuffer buffer = new StringBuffer(); Character chr; boolean eof = false; while(!eof) { try { chr = next(); if(chr == null) { continue; } else { buffer.append(filterCharacter(chr)); } } catch (EOFException e) { eof = true; } } return buffer.toString(); } public abstract Character filterCharacter(Character chr); }