package tap.formats.tapproto;
import java.util.Arrays;
import org.apache.hadoop.mapred.InputFormat;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.OutputFormat;
import com.google.protobuf.Message;
import tap.Pipe;
import tap.core.mapreduce.input.TapfileInputFormat;
import tap.core.mapreduce.output.TapfileOutputFormat;
import tap.formats.FileFormat;
import tap.formats.Formats;
public class TapprotoFormat extends FileFormat {
private static final byte FILE_SIGNATURE[] = "tapproto".getBytes();
public void setupOutput(JobConf conf, Class<?> protoClass) {
setupOutputImpl(conf, protoClass);
}
public void setupInput(JobConf conf, Class<?> protoClass) {
setupInputImpl(conf, protoClass);
}
private <M extends Message> void setupOutputImpl(JobConf conf, Class<?> protoClass) {
conf.setOutputFormat((Class<? extends OutputFormat>)
TapfileOutputFormat.getOutputFormatClass((Class<M>) protoClass, conf));
}
private <M extends Message> void setupInputImpl(JobConf conf, Class<?> protoClass) {
conf.setInputFormat((Class<? extends InputFormat>)
TapfileInputFormat.getInputFormatClass((Class<M>) protoClass, conf));
}
public String fileExtension() {
return TapfileOutputFormat.EXT;
}
@Override
public void setPipeFormat(Pipe pipe) {
pipe.setFormat(Formats.TAPPROTO_FORMAT);
}
/**
* Compare file signature of Tapproto type file
*/
@Override
public boolean signature(byte[] header) {
return Arrays.equals(FILE_SIGNATURE, Arrays.copyOfRange(header, 0, FILE_SIGNATURE.length));
}
@Override
public boolean isCompatible(InputFormat format) {
return (format instanceof TapfileInputFormat);
}
@Override
public boolean instanceOfCheck(Object o) {
return o instanceof Message;
}
}