package org.opencb.hpg.bigdata.core.io;
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
import org.apache.commons.lang3.NotImplementedException;
import org.apache.commons.lang3.StringUtils;
import org.opencb.commons.io.DataWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.nio.file.Path;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
/**
* Created by mh719 on 11/05/2016.
*/
public class ProtoFileWriter<T extends com.google.protobuf.GeneratedMessageV3> implements DataWriter<T> {
private String compression = StringUtils.EMPTY;
protected Logger logger = LoggerFactory.getLogger(this.getClass().toString());
private OutputStream outputStream = null;
private Path input = null;
private final AtomicLong timeWrite = new AtomicLong(0);
public ProtoFileWriter(OutputStream outputStream) {
this.outputStream = outputStream;
}
public ProtoFileWriter(Path input) {
this.input = input;
}
public ProtoFileWriter(Path input, String compression) {
this(input);
this.compression = compression;
}
@Override
public boolean open() {
if (null != this.input) {
try {
OutputStream out = new BufferedOutputStream(new FileOutputStream(input.toFile()));
if (StringUtils.equalsIgnoreCase(compression, "gzip") || StringUtils.equalsIgnoreCase(compression, "gz")) {
out = new GzipCompressorOutputStream(out);
} else if (StringUtils.isNotBlank(compression)) {
throw new NotImplementedException("Proto compression not implemented yet: " + compression);
}
outputStream = out;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return true;
}
@Override
public boolean close() {
try {
this.outputStream.flush();
} catch (IOException e) {
logger.error("Problems flushing outputstream", e);
return false;
}
if (null != this.input) {
try {
this.outputStream.close();
} catch (IOException e) {
logger.error("Problems closing outputstream", e);
return false;
}
}
return true;
}
@Override
public boolean pre() {
return false;
}
@Override
public boolean post() {
return false;
}
@Override
public boolean write(T elem) {
try {
elem.writeDelimitedTo(this.outputStream);
} catch (IOException e) {
throw new IllegalStateException("Problems writing Proto element ot output stream!!! " + elem, e);
}
return true;
}
@Override
public boolean write(List<T> batch) {
batch.forEach(e -> write(e));
return true;
}
}