package fr.inria.diversify.factories;
import fr.inria.diversify.diversification.InputProgram;
import fr.inria.diversify.util.Log;
import spoon.compiler.SpoonCompiler;
import spoon.reflect.factory.Factory;
import spoon.reflect.factory.FactoryImpl;
import spoon.support.DefaultCoreFactory;
import spoon.support.StandardEnvironment;
import spoon.support.compiler.jdt.JDTBasedSpoonCompiler;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
/**
* Created by marodrig on 16/06/2014.
*/
public class SpoonMetaFactory {
public Factory buildNewFactory(InputProgram inputProgram, boolean withTest) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
ArrayList<String> a = new ArrayList<String>();
a.add(inputProgram.getAbsoluteSourceCodeDir());
if(withTest) {
a.add(inputProgram.getAbsoluteTestSourceCodeDir());
}
a.add(inputProgram.getExternalSourceCodeDir());
return buildNewFactory(a, inputProgram.getJavaVersion());
}
public Factory buildNewFactory(String srcDirectory, int javaVersion) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
ArrayList<String> a = new ArrayList<String>();
a.add(srcDirectory);
return buildNewFactory(a, javaVersion);
}
public Factory buildNewFactory(Collection<String> srcDirectory, int javaVersion) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
StandardEnvironment env = new StandardEnvironment();
env.setComplianceLevel(javaVersion);
env.setVerbose(false);
env.setDebug(false);
DefaultCoreFactory f = new DefaultCoreFactory();
Factory factory = new FactoryImpl(f, env);
SpoonCompiler compiler = new JDTBasedSpoonCompiler(factory);
for (String s : srcDirectory) {
for (String dir : s.split(System.getProperty("path.separator"))) {
try {
Log.debug("add {} to classpath", dir);
File dirFile = new File(dir);
if (dirFile.isDirectory()) {
compiler.addInputSource(dirFile);
}
} catch (Exception e) {
Log.error("error in initSpoon", e);
throw new RuntimeException(e);
}
}
}
try {
compiler.build();
} catch (Exception e) {
e.printStackTrace();
}
return factory;
}
}