package org.genedb.db.loading.auxiliary;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Date;
import java.util.Set;
import java.util.zip.GZIPInputStream;
/**
* Run the specified loader on the specified files or directories.
* Valid loaders are Spring beans, defined in <code>PolyPeptideContext.xml</code>.
* If the name of a specified file ends with <code>.gz</code>, it is assumed
* to be GZip-compressed, and is decompressed before loading. If a directory
* is specified, the contents of the directory are processed recursively,
* ignoring files or subdirectories whose name ends with a tilde (<code>~</code>).
* <p>
* This class is ordinarily invoked from ant via a loader-specific target, for example:
* <p>
* <code>ant -Dload=test -Dorganism=Pfalciparum -Dfile=PlasmoAP.txt reload-plasmoap</code>
*
* @author art
* @author rh11
*/
public class Load {
private static void dieUsage() {
System.err.println("Usage: java FileProcessor <loaderName> [<options>] <files>");
System.exit(1);
}
private static void invalidOption(String invalidOption, Set<String> validOptions) {
System.err.printf("Invalid option --%s\n", invalidOption);
if (validOptions.isEmpty())
System.err.println("(There are no valid options for this loader type)");
else {
System.err.println("Valid options are:");
for (String validOption: validOptions)
System.err.printf("\t--%s\n", validOption);
}
System.exit(1);
}
/**
* Entry-point for command-line usage of auxiliary loaders.
* @see Load
*/
public static void main(String[] args) throws IOException {
if (args.length < 1)
dieUsage();
String loaderBeanName = args[0];
ApplicationContext ctx = new ClassPathXmlApplicationContext(
new String[] {"Load.xml"});
Loader loader = ctx.getBean(loaderBeanName, Loader.class);
Load load = new Load(loader);
Set<String> validOptions = loader.getOptionNames();
int firstFilename = -1;
for (int i=1; i < args.length; i++) {
String option = args[i];
if (!option.startsWith("--")) {
firstFilename = i;
break;
}
option = option.substring(2);
int equalsIndex = option.indexOf('=');
boolean optionAccepted;
if (equalsIndex < 0)
optionAccepted = loader.processOptionIfValid(option, null);
else
optionAccepted = loader.processOptionIfValid(option.substring(0, equalsIndex), option.substring(equalsIndex + 1));
if (!optionAccepted)
invalidOption(option, validOptions);
}
long startTime = new Date().getTime();
if (loader.loadsFromFile()) {
if (firstFilename == -1)
dieUsage();
String[] filePaths = Arrays.copyOfRange(args, firstFilename, args.length);
for (String filePath: filePaths)
load.load(filePath);
}
else {
loader.load(null);
}
long elapsedMilliseconds = new Date().getTime() - startTime;
float elapsedSeconds = (float) elapsedMilliseconds / 1000;
System.out.printf("Total time taken: %.0fh %.0fm %.2fs\n",
elapsedSeconds / 3600, (elapsedSeconds / 60) % 60, elapsedSeconds % 60);
}
private static final Logger logger = Logger.getLogger(Load.class);
private Loader loader;
Load (Loader loader) {
this.loader = loader;
}
private static FilenameFilter doesNotEndWithTilde = new FilenameFilter() {
public boolean accept(File dir, String name) {
return !name.endsWith("~");
}
};
public void load(String filename) throws IOException {
File file = new File(filename);
if (!file.exists()) {
logger.error("No such file/directory: "+filename);
return;
}
if ( file.isDirectory() ) {
for (String filteredFilename: file.list(doesNotEndWithTilde))
load(filename+"/"+filteredFilename);
return;
}
logger.info(String.format("Loading file '%s'", filename));
InputStream inputStream = new FileInputStream(file);
if (filename.endsWith(".gz")) {
logger.info("Treating as a GZIP file");
inputStream = new GZIPInputStream(inputStream);
}
loader.load(inputStream);
}
}