package test.beast.beast2vs1.trace; import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; import java.util.StringTokenizer; /** * @author Alexei Drummond * @author Andrew Rambaut * @author Walter Xie */ public class TrimLineReader extends BufferedReader { public TrimLineReader(Reader reader) { super(reader); } @Override public String readLine() throws IOException { lineNumber += 1; String line = super.readLine(); if (line != null) return line.trim(); return null; } public StringTokenizer tokenizeLine() throws IOException { String line = readLine(); if (line == null) return null; return new StringTokenizer(line, "\t"); } public StringTokenizer readTokensIgnoringEmptyLinesAndComments(String[] commentSigns) throws IOException { // Read through to first token StringTokenizer tokens = tokenizeLine(); if (tokens == null) { throw new IOException("File is empty."); } // read over empty lines while (!tokens.hasMoreTokens()) { tokens = tokenizeLine(); } // skip the first column which should be the state number String token = tokens.nextToken(); // lines starting with [ are ignored, assuming comments in MrBayes file // lines starting with # are ignored, assuming comments in Migrate or BEAST file while (hasComment(commentSigns, token)) { tokens = tokenizeLine(); // read over empty lines while (!tokens.hasMoreTokens()) { tokens = tokenizeLine(); } // read state token and ignore token = tokens.nextToken(); } return tokens; } private boolean hasComment(String[] commentSigns, String token) { for (String c : commentSigns) { if (token.startsWith(c)) return true; } return false; } public int getLineNumber() { return lineNumber; } private int lineNumber = 0; }