package org.shanbo.feluca.data2.util; import java.io.BufferedReader; import java.io.Closeable; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.shanbo.feluca.data2.Tuple; import org.shanbo.feluca.data2.Tuple.AlignColumn; import org.shanbo.feluca.data2.Tuple.TupleType; public class TextReader implements Closeable{ BufferedReader reader; boolean isTupleLine; NumericTokenizer lineParser; List<Tuple> tuples; int lastColumn = Integer.MIN_VALUE; Tuple.AlignColumn alignColumn; Tuple.TupleType tupleType; public TextReader(BufferedReader reader, Tuple.TupleType tupleType, Tuple.AlignColumn alignColumn){ this.reader = reader; this.tupleType = tupleType; lineParser = new NumericTokenizer(); tuples = new ArrayList<Tuple>(); this.alignColumn = alignColumn; } public TextReader(BufferedReader reader){ this(reader, TupleType.NOT_TUPLE, Tuple.AlignColumn.FIRST); } public String readLine() throws IOException{ if (tupleType == TupleType.NOT_TUPLE){ return reader.readLine(); }else{ for(String line = reader.readLine(); line!= null; line = reader.readLine() ){ Tuple newTuple = Tuple.convert(this.tupleType, line); if (isSameAlignAndSet(newTuple)){ tuples.add(newTuple); }else{ if (tuples.isEmpty()){ //first line continue; } String merged = mergeTuplesToLine(tuples); tuples.add(newTuple); return merged; } } if (tuples.isEmpty()){ return null; } String last = mergeTuplesToLine(tuples); return last; } } private String mergeTuplesToLine(List<Tuple> tuples){ StringBuilder builder = new StringBuilder(); if (this.alignColumn == AlignColumn.FIRST){ builder.append(tuples.get(0).getFirstColumn()); for(Tuple tuple : tuples){ builder.append(" ").append(tuple.getSecondColumn()).append(":").append(tuple.payload()); } }else{ builder.append(tuples.get(0).getSecondColumn()); for(Tuple tuple : tuples){ builder.append(" ").append(tuple.getFirstColumn()).append(":").append(tuple.payload()); } } tuples.clear(); return builder.toString(); } private boolean isSameAlignAndSet(Tuple tuple){ int columnCompare = (alignColumn == AlignColumn.FIRST) ? tuple.getFirstColumn() : tuple.getSecondColumn(); if (columnCompare == lastColumn){ this.lastColumn = columnCompare; return true; }else { this.lastColumn = columnCompare; return false; } } public void close() throws IOException{ reader.close(); } }