package htsjdk.variant.vcf;
import htsjdk.samtools.util.SortingCollection;
import htsjdk.variant.variantcontext.VariantContext;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
/**
* Writes VariantContext instances to an OutputStream without headers or metadata. For use
* with SortingCollection ONLY.
*/
public class VCFRecordCodec implements SortingCollection.Codec<VariantContext> {
final VCFCodec vcfDecoder = new VCFCodec();
final VCFEncoder vcfEncoder;
private PrintStream outputStream = null;
private BufferedReader inputReader = null;
public VCFRecordCodec(final VCFHeader header) {
this.vcfEncoder = new VCFEncoder(header, false, false);
// Explicitly set the version because it's not available in the header itself.
this.vcfDecoder.setVCFHeader(header, VCFHeaderVersion.VCF4_1);
}
@Override
public void setOutputStream(final OutputStream stream) {
this.outputStream = new PrintStream(stream);
}
@Override
public void setInputStream(final InputStream stream) {
this.inputReader = new BufferedReader(new InputStreamReader(stream));
}
@Override
public void encode(final VariantContext context) {
this.outputStream.println(this.vcfEncoder.encode(context));
}
@Override
public VariantContext decode() {
try {
final String line;
return ((line = inputReader.readLine()) != null) ? this.vcfDecoder.decode(line) : null;
} catch (final IOException ioe) {
throw new RuntimeException("Could not decode/read a VCF record for a sorting collection: " + ioe.getMessage(), ioe);
}
}
@Override
public VCFRecordCodec clone() {
return new VCFRecordCodec(this.vcfEncoder.getVCFHeader());
}
}