/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package neembuu.uploader.zip.generator;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import neembuu.uploader.zip.generator.utils.CompilerUtils;
import neembuu.uploader.zip.generator.utils.NUFileUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.filefilter.TrueFileFilter;
/**
* Compiler class. It compiles files from the packages.
*
* @author davidepastore
*/
public class NUCompiler {
private File gitDirectory;
/**
* The directory for the api project.
*/
public static final String API_DIRECTORY = "\\modules\\neembuu-uploader-api\\src";
/**
* The directory for the interface abstractimpl project.
*/
public static final String INTERFACE_ABSTRACT_IMPL_DIRECTORY = "\\modules\\neembuu-uploader-interfaces-abstractimpl\\src";
/**
* The directory for the plugins project.
*/
public static final String UPLOADERS_DIRECTORY = "\\modules\\neembuu-uploader-uploaders\\src";
/**
* The directory for the utils project.
*/
public static final String UTILS_DIRECTORY = "\\modules\\neembuu-uploader-utils\\src";
/**
* The classpath.
*/
private String classPath = "";
/**
* Constructor of the NUCompiler class.
*
* @param gitDirectory The git directory.
*/
public NUCompiler(File gitDirectory) {
this.gitDirectory = gitDirectory;
addJarToClasspath();
}
/**
* Compile all the api.
*
* @throws IOException
*/
public void compileApi() throws IOException {
File srcDir = new File(gitDirectory.getAbsolutePath() + API_DIRECTORY);
compileFiles(NUFileUtils.listAllJavaFiles(srcDir));
}
/**
* Compile all the interfaces and the abstract implementations.
*
* @throws IOException
*/
public void compileIntAbsImpl() throws IOException {
File srcDir = new File(gitDirectory.getAbsolutePath() + INTERFACE_ABSTRACT_IMPL_DIRECTORY);
compileFiles(NUFileUtils.listAllJavaFiles(srcDir));
}
/**
* Compile all the uploaders/accounts.
*
* @throws java.io.IOException
*/
public void compileUploaders() throws IOException {
File srcDir = new File(gitDirectory.getAbsolutePath() + UPLOADERS_DIRECTORY);
compileFiles(NUFileUtils.listAllJavaFiles(srcDir));
}
/**
* Compile all the utils.
*
* @throws IOException
*/
public void compileUtils() throws IOException {
File srcDir = new File(gitDirectory.getAbsolutePath() + UTILS_DIRECTORY);
compileFiles(NUFileUtils.listAllJavaFiles(srcDir));
}
/**
* Compile all the given files.
*
* @param files All the files.
*/
private void compileFiles(Collection files) throws IOException {
File[] resultFiles = (File[]) files.toArray(new File[files.size()]);
File buildDir = CompilerUtils.getBuildDirectory(resultFiles[0]);
compileFiles(resultFiles, buildDir);
//Add to the classpath
classPath += buildDir.getAbsolutePath() + ";";
}
/**
* Compile all the given files in the given build directory.
*
* @param files The array of files to compiles.
* @param buildDirectory The build directory in which put all the compiled
* files.
* @throws FileNotFoundException
* @throws IOException
*/
private void compileFiles(File[] files, File buildDirectory) throws FileNotFoundException, IOException {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
buildDirectory.mkdir();
/**/
List<String> optionList = new ArrayList<String>();
// set compiler's classpath to be same as the runtime's
//optionList.addAll(Arrays.asList("-classpath", "C:\\neembuuuploader\\modules\\libs\\jsoup-1.7.2.jar;C:\\neembuuuploader\\modules\\libs\\ApacheHttpComponent-4.2.5\\commons-codec-1.6.jar;C:\\neembuuuploader\\modules\\libs\\ApacheHttpComponent-4.2.5\\commons-logging-1.1.1.jar;C:\\neembuuuploader\\modules\\libs\\ApacheHttpComponent-4.2.5\\httpclient-4.2.5.jar;C:\\neembuuuploader\\modules\\libs\\ApacheHttpComponent-4.2.5\\httpclient-cache-4.2.5.jar;C:\\neembuuuploader\\modules\\libs\\ApacheHttpComponent-4.2.5\\httpcore-4.2.4.jar;C:\\neembuuuploader\\modules\\libs\\ApacheHttpComponent-4.2.5\\httpmime-4.2.5.jar;C:\\neembuuuploader\\modules\\libs\\json-java.jar;C:\\neembuuuploader\\modules\\neembuu-uploader-utils\\build\\classes;C:\\neembuuuploader\\modules\\neembuu-uploader-api\\build\\classes;C:\\neembuuuploader\\modules\\neembuu-uploader-interfaces-abstractimpl\\build\\classes;C:\\neembuuuploader\\modules\\libs\\neembuu-now-api-ui.jar;C:\\neembuuuploader\\modules\\libs\\neembuu-release1-ui-mc.jar;C:\\neembuuuploader\\modules\\neembuu-uploader-uploaders\\build\\classes;C:\\neembuuuploader\\modules\\NeembuuUploader\\build\\classes"));
optionList.addAll(Arrays.asList("-classpath", classPath));
optionList.addAll(Arrays.asList("-d", buildDirectory.getAbsolutePath()));
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
Iterable<? extends JavaFileObject> compilationUnits
= fileManager.getJavaFileObjectsFromFiles(Arrays.asList(files));
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
JavaCompiler.CompilationTask task = compiler.getTask(null, null, diagnostics, optionList, null, compilationUnits);
boolean result = task.call();
if (result) {
System.out.println("Compilation was successful");
} else {
System.out.println("Compilation failed");
for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
System.out.format("Error on line %d in %s", diagnostic.getLineNumber(), diagnostic);
}
}
}
/**
* Add all the jar to the classpath.
*/
private void addJarToClasspath() {
Collection<File> filesList = NUFileUtils.listAllFilesWithExt(gitDirectory, "jar");
for (File file : filesList) {
classPath += file.getAbsolutePath() + ";";
}
System.out.println("Classpath: " + classPath);
}
}