package htsjdk.samtools;
import htsjdk.samtools.util.AbstractAsyncWriter;
import htsjdk.samtools.util.ProgressLoggerInterface;
/**
* SAMFileWriter that can be wrapped around an underlying SAMFileWriter to provide asynchronous output. Records
* added are placed into a queue, the queue is then drained into the underlying SAMFileWriter by a thread owned
* by the instance.
*
* Exceptions experienced by the writer thread will be emitted back to the caller in subsequent calls to either
* addAlignment() or close().
*
* @author Tim Fennell
*/
class AsyncSAMFileWriter extends AbstractAsyncWriter<SAMRecord> implements SAMFileWriter {
private final SAMFileWriter underlyingWriter;
/**
* Creates a new AsyncSAMFileWriter wrapping the provided SAMFileWriter.
*/
public AsyncSAMFileWriter(final SAMFileWriter out) {
this(out, DEFAULT_QUEUE_SIZE);
}
/**
* Creates an AsyncSAMFileWriter wrapping the provided SAMFileWriter and using the specified
* queue size for buffer SAMRecords.
*/
public AsyncSAMFileWriter(final SAMFileWriter out, final int queueSize) {
super(queueSize);
this.underlyingWriter = out;
}
@Override protected void synchronouslyWrite(final SAMRecord item) { this.underlyingWriter.addAlignment(item); }
@Override protected void synchronouslyClose() { this.underlyingWriter.close(); }
@Override protected final String getThreadNamePrefix() { return "SAMFileWriterThread-"; }
@Override
public void setProgressLogger(final ProgressLoggerInterface progress) {
this.underlyingWriter.setProgressLogger(progress);
}
/**
* Adds an alignment to the queue to be written. Will re-throw any exception that was received when
* writing prior record(s) to the underlying SAMFileWriter.
*/
public void addAlignment(final SAMRecord alignment) {
write(alignment);
}
/** Returns the SAMFileHeader from the underlying SAMFileWriter. */
public SAMFileHeader getFileHeader() {
return this.underlyingWriter.getFileHeader();
}
}