package htsjdk.samtools.cram.paralell;
import htsjdk.samtools.cram.io.InputStreamUtils;
import htsjdk.samtools.cram.structure.Container;
import htsjdk.samtools.cram.structure.ContainerIO;
import htsjdk.samtools.cram.structure.CramHeader;
import htsjdk.samtools.util.Log;
import htsjdk.samtools.util.RuntimeIOException;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.function.Supplier;
class CramContainer_OBA_Supplier implements Supplier<OrderedByteArray> {
private static final int MAX_CONTAINER_HEADER_BYTESIZE = 1024 * 10;
private Log log = Log.getInstance(CramContainer_OBA_Supplier.class);
private DataInputStream is;
private long order = 0;
private CramHeader cramHeader;
public CramContainer_OBA_Supplier(InputStream is, CramHeader cramHeader) {
if (is.markSupported())
this.is = new DataInputStream(is);
else
this.is = new DataInputStream(new BufferedInputStream(is, MAX_CONTAINER_HEADER_BYTESIZE));
this.cramHeader = cramHeader;
}
@Override
public OrderedByteArray get() {
OrderedByteArray cb = new OrderedByteArray();
Container containerHeader;
try {
containerHeader = ContainerIO.readContainerHeader(cramHeader.getVersion().major, is);
log.debug("Read container: " + containerHeader.toString());
if (containerHeader.isEOF()) {
log.info("EOF container");
return null;
}
ByteArrayOutputStream baos = new ByteArrayOutputStream(containerHeader.containerByteSize + 1024 * 10);
ContainerIO.writeContainerHeader(cramHeader.getVersion().major, containerHeader, baos);
byte[] blocks = InputStreamUtils.readFully(is, containerHeader.containerByteSize);
baos.write(blocks);
cb.bytes = baos.toByteArray();
cb.order = order++;
return cb;
} catch (IOException e) {
throw new RuntimeIOException(e);
}
}
}