package net.mcforkage.ant;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import bytecode.BaseStreamingZipProcessor;
public class RunZipProcessorTask extends Task {
private File input, output, config;
private String processorClass;
public void setInput(File f) {input = f;}
public void setOutput(File f) {output = f;}
public void setConfig(File f) {config = f;}
public void setClass(String c) {processorClass = c;}
@Override
public void execute() throws BuildException {
if(input == null) throw new BuildException("Input not set");
if(output == null) throw new BuildException("Output not set");
if(processorClass == null) throw new BuildException("Processor class not set");
Class<? extends BaseStreamingZipProcessor> clazz;
try {
clazz = Class.forName(processorClass).asSubclass(BaseStreamingZipProcessor.class);
} catch(ClassNotFoundException | ClassCastException e) {
throw new BuildException("Class not found, or not a streaming ZIP processor: " + processorClass);
}
try {
BaseStreamingZipProcessor zp = clazz.getConstructor().newInstance();
if(zp.hasConfig()) {
if(config == null) throw new BuildException("Config not specified for "+zp.getClass().getName());
zp.loadConfig(config);
} else {
if(config != null) throw new BuildException(zp.getClass().getName()+" does not use a config");
}
try (InputStream in = new FileInputStream(input)) {
try (OutputStream out = new FileOutputStream(output)) {
zp.go(in, out);
}
}
} catch(Exception e) {
throw new BuildException(e);
}
}
}