package picard.illumina.parser.fakers;
import htsjdk.samtools.util.BlockCompressedOutputStream;
import picard.illumina.parser.readers.BclReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.Channels;
import java.nio.channels.WritableByteChannel;
import java.util.Collections;
import java.util.List;
import java.util.zip.GZIPOutputStream;
public abstract class FileFaker {
int size;
List<Integer> tiles;
protected abstract void fakeFile(ByteBuffer buffer);
protected abstract boolean addLeadingZeros();
protected abstract int bufferSize();
public void fakeFile(final File base, final int tile, final int lane, final String extension) throws IOException {
fakeFile(base, Collections.singletonList(tile), lane, extension);
}
public void fakeFile(final File base, final List<Integer> expectedTiles, final int lane, final String extension)
throws IOException {
if (base.exists() || base.mkdirs()) {
this.tiles = expectedTiles;
final File fakeFile;
if (expectedTiles.size() == 1) {
String longTileName = String.valueOf(tiles.get(0));
if (addLeadingZeros()) {
while (longTileName.length() < 4) {
longTileName = "0" + longTileName;
}
}
fakeFile = new File(base, String.format("s_%d_%s%s", lane, longTileName, extension));
} else {
fakeFile = new File(base, String.format("s_%s%s", lane, extension));
}
fakeFile(fakeFile, bufferSize());
}
}
public void fakeFile(final File cycleFile, Integer size) throws IOException {
if (size == null) {
size = 1;
}
this.size = size;
final OutputStream outputStream;
if (BclReader.isGzipped(cycleFile)) outputStream = new GZIPOutputStream(new FileOutputStream(cycleFile));
else if (BclReader.isBlockGzipped(cycleFile)) outputStream = new BlockCompressedOutputStream(cycleFile);
else outputStream = new FileOutputStream(cycleFile);
final WritableByteChannel channel = Channels.newChannel(outputStream);
final ByteBuffer buffer = ByteBuffer.allocate(this.bufferSize());
buffer.order(ByteOrder.LITTLE_ENDIAN);
fakeFile(buffer);
buffer.flip();
channel.write(buffer);
channel.close();
outputStream.close();
}
}