IOUtil.java
package gov.usgs.earthquake.product.io;
import gov.usgs.util.StreamUtils;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.InflaterInputStream;
import java.util.zip.ZipException;
/**
* Class with main method for converting from one product format to another.
*/
public class IOUtil {
/** Argument for input file */
public static final String INFILE_ARGUMENT = "--infile=";
/** Argument for input format */
public static final String INFORMAT_ARGUMENT = "--informat=";
/** Argument for output file */
public static final String OUTFILE_ARGUMENT = "--outfile=";
/** Argument for output format */
public static final String OUTFORMAT_ARGUMENT = "--outformat=";
/** Zip format */
public static final String ZIP_FORMAT = "zip";
/** XML format */
public static final String XML_FORMAT = "xml";
/** Directory format */
public static final String DIRECTORY_FORMAT = "directory";
/** Binary format */
public static final String BINARY_FORMAT = "binary";
/**
* Returns a ProductHandler based on the output format
* @param outformat Output format
* @param outfile Output file
* @return a Product Handler
* @throws IOException if IO error occurs
*/
public static ProductHandler getProductHandler(final String outformat,
final File outfile) throws IOException {
ProductHandler out = null;
if (outformat.equals(XML_FORMAT)) {
out = new XmlProductHandler(StreamUtils.getOutputStream(outfile));
} else if (outformat.equals(ZIP_FORMAT)) {
out = new ZipProductHandler(StreamUtils.getOutputStream(outfile));
} else if (outformat.equals(DIRECTORY_FORMAT)) {
out = new DirectoryProductHandler(outfile);
} else if (outformat.equals(BINARY_FORMAT)) {
out = new BinaryProductHandler(StreamUtils.getOutputStream(outfile));
} else {
throw new IllegalArgumentException("unknown product format '"
+ outformat + "'");
}
return out;
}
/**
* Returns a product source based on input format
* @param informat input file format
* @param infile input file
* @return a Productsource
* @throws IllegalArgumentException if informat argument error
* @throws IOException if error occurs
*/
public static ProductSource getProductSource(final String informat,
final File infile) throws IllegalArgumentException, IOException {
ProductSource in = null;
if (informat.equals(XML_FORMAT)) {
in = new XmlProductSource(StreamUtils.getInputStream(infile));
} else if (informat.equals(ZIP_FORMAT)) {
in = new ZipProductSource(infile);
} else if (informat.equals(DIRECTORY_FORMAT)) {
in = new DirectoryProductSource(infile);
} else if (informat.equals(BINARY_FORMAT)) {
in = new BinaryProductSource(StreamUtils.getInputStream(infile));
} else {
throw new IllegalArgumentException("unknown product format '"
+ informat + "'");
}
return in;
}
/**
* Auto detect an Xml or Binary product source, that is optionally deflated.
*
* @param in
* input stream containing optionally deflated xml or binary
* product stream.
* @return ProductSource object.
* @throws IOException
* if neither binary or xml product source is in stream.
*/
public static ProductSource autoDetectProductSource(final InputStream in)
throws IOException {
BufferedInputStream bufferedIn = autoDetectDeflate(in);
int ch = -1;
bufferedIn.mark(1024);
// peek at first character in stream
ch = bufferedIn.read();
bufferedIn.reset();
ProductSource productSource = null;
// determine product format based on first character in stream
if (((char) ch) == '<') {
// xml format
productSource = new XmlProductSource(bufferedIn);
} else {
// binary format
productSource = new BinaryProductSource(bufferedIn);
}
return productSource;
}
/**
* Auto detect an optionally deflated stream.
*
* @param in
* input stream containing optionally deflated xml or binary
* product stream.
* @return ProductSource object.
* @throws IOException
* if neither binary or xml product source is in stream.
*/
public static BufferedInputStream autoDetectDeflate(final InputStream in)
throws IOException {
// stream used to read product
BufferedInputStream bufferedIn = new BufferedInputStream(in);
// detect whether incoming stream is compressed
bufferedIn.mark(1024);
try {
InflaterInputStream iis = new InflaterInputStream(bufferedIn);
iis.read();
// must be a deflated stream, reset for reading
bufferedIn.reset();
bufferedIn = new BufferedInputStream(new InflaterInputStream(bufferedIn));
} catch (ZipException ze) {
// not a deflated stream
bufferedIn.reset();
}
return bufferedIn;
}
/**
* Access into IOUtil
* Takes arguments, gets product source and handler
* Streams source to handler
* @param args CLI args for infile, informat, outfile, outformat
* @throws Exception if error occurs
*/
public static void main(final String[] args) throws Exception {
File infile = null;
File outfile = null;
String informat = null;
String outformat = null;
// parse arguments
for (String arg : args) {
if (arg.startsWith(INFILE_ARGUMENT)) {
infile = new File(arg.replace(INFILE_ARGUMENT, ""));
} else if (arg.startsWith(OUTFILE_ARGUMENT)) {
outfile = new File(arg.replace(OUTFILE_ARGUMENT, ""));
} else if (arg.startsWith(INFORMAT_ARGUMENT)) {
informat = arg.replace(INFORMAT_ARGUMENT, "");
} else if (arg.startsWith(OUTFORMAT_ARGUMENT)) {
outformat = arg.replace(OUTFORMAT_ARGUMENT, "");
}
}
if (infile == null || informat == null) {
printUsage();
System.exit(1);
}
if (outfile == null || outformat == null) {
printUsage();
System.exit(1);
}
ProductSource in = getProductSource(informat, infile);
ProductHandler out = getProductHandler(outformat, outfile);
in.streamTo(out);
}
/** CLI usage */
public static void printUsage() {
System.err
.println("IOUtil --infile=FILE --informat=(xml|directory|zip|binary) --outfile=FILE --outformat=(xml|directory|zip|binary)");
}
}