package com.illumina.basespace.igv.vcf; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.logging.Logger; import org.broad.tribble.CloseableTribbleIterator; import org.broad.tribble.Feature; import org.broad.tribble.FeatureCodec; import org.broad.tribble.readers.AsciiLineReader; import org.broad.tribble.readers.LineReader; import org.broad.tribble.readers.PositionalBufferedStream; import com.illumina.basespace.igv.BaseSpaceUtil; public class BaseSpaceQueryIterator<T extends Feature> implements CloseableTribbleIterator { private Logger log = Logger.getLogger(BaseSpaceQueryIterator.class.getPackage().getName()); private List<String>records = new ArrayList<String>(); private FeatureCodec codec; private int currentIndex = 0; public BaseSpaceQueryIterator(String rawData,FeatureCodec codec) { this.codec = codec; loadRecords(rawData); } @Override public boolean hasNext() { boolean hasNext = currentIndex < records.size(); return hasNext; } @Override public T next() { try { String currentRecord = records.get(currentIndex); Feature f = codec.decode(new PositionalBufferedStream(new ByteArrayInputStream(currentRecord.getBytes()))); currentIndex++; return (T)f; } catch(IOException ioe) { throw new RuntimeException("Error reading vcf record: " + ioe.getMessage()); } } @Override public void remove() { throw new UnsupportedOperationException("Remove is not supported."); } @Override public Iterator iterator() { return this; } private void loadRecords(String raw) { records.clear(); LineReader lineReader = null; InputStream stream = null; try { stream = new ByteArrayInputStream(raw.getBytes()); lineReader = new AsciiLineReader(stream); String nextLine; while ((nextLine = lineReader.readLine()) != null) { //System.out.println("BaseSpaceQueryIterator.loadRecords.readline->" + nextLine); records.add(nextLine); } lineReader.close(); lineReader = null; } catch(Throwable t) { } finally { BaseSpaceUtil.dispose(stream); if (lineReader != null)try{lineReader.close();}catch(Throwable t){} } /* StringTokenizer st = new StringTokenizer(raw,"\r\n"); while(st.hasMoreTokens()) { records.add(st.nextToken()); }*/ currentIndex = 0; } @Override public void close() { } }