package com.scaleunlimited.cascading;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.commons.io.IOUtils;
import org.apache.tools.ant.AntClassLoader;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import com.scaleunlimited.cascading.DatumCompiler.CompiledDatum;
public class DatumCompilerAntTask extends Task {
private String _classname;
private String _srcDir;
public void execute() throws BuildException {
File outputFile;
CompiledDatum compiledDatum;
AntClassLoader cl = new AntClassLoader(getClass().getClassLoader(), true);
try {
// Class clazz = loader.loadClass(_classname);
Class clazz = cl.loadClass(_classname);
compiledDatum = DatumCompiler.generate(clazz);
File baseDir = new File(_srcDir);
if (!baseDir.exists()) {
throw new BuildException("Destination source dir doesn't exist: " + baseDir.getAbsolutePath());
}
if (!baseDir.isDirectory()) {
throw new BuildException("Destination source dir isn't a directory: " + baseDir.getAbsolutePath());
}
File outputDir = new File(baseDir, compiledDatum.getPackageName().replaceAll("\\.", "/"));
if (!outputDir.mkdirs()) {
throw new BuildException("Can't create output directory for class: " + outputDir.getAbsolutePath());
}
outputFile = new File(outputDir, compiledDatum.getClassName() + ".java");
} catch (ClassNotFoundException e) {
throw new BuildException("Can't find datum reference class: " + _classname, e);
}
OutputStream os = null;
try {
os = new FileOutputStream(outputFile);
IOUtils.write(compiledDatum.getClassCode(), os, "UTF-8");
} catch (FileNotFoundException e) {
throw new BuildException("Unable to create output file: " + outputFile, e);
} catch (IOException e) {
throw new BuildException("Unable to write to output file: " + outputFile, e);
} finally {
IOUtils.closeQuietly(os);
}
}
public void setClassname(String classname) {
_classname = classname;
}
public void setSrcDir(String srcDir) {
_srcDir = srcDir;
}
}