package net.mcforkage.ant;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import bytecode.BaseStreamingJarProcessor;
public class RunJarProcessorTask 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 BaseStreamingJarProcessor> clazz;
try {
clazz = Class.forName(processorClass).asSubclass(BaseStreamingJarProcessor.class);
} catch(ClassNotFoundException | ClassCastException e) {
throw new BuildException("Class not found, or not a streaming JAR processor: " + processorClass);
}
try {
BaseStreamingJarProcessor jp = clazz.getConstructor().newInstance();
if(jp.hasConfig()) {
if(config == null) throw new BuildException("Config not specified for "+jp.getClass().getName());
try (FileReader fr = new FileReader(config)) {
jp.loadConfig(fr);
}
} else {
if(config != null) throw new BuildException(jp.getClass().getName()+" does not use a config");
}
try (InputStream in = new FileInputStream(input)) {
try (OutputStream out = new FileOutputStream(output)) {
jp.go(in, out);
}
}
} catch(Exception e) {
throw new BuildException(e);
}
}
}