Skip to content

Commit

Permalink
Merge pull request #11 from danglotb/refactor-config
Browse files Browse the repository at this point in the history
refactor: remove Config singleton in order to run multiple NoPol
  • Loading branch information
tdurieux committed Sep 20, 2016
2 parents b687015 + 7bf4f24 commit 1cb07c9
Show file tree
Hide file tree
Showing 46 changed files with 1,025 additions and 904 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fr.inria.lille.commons.spoon;

import fr.inria.lille.repair.common.config.Config;
import spoon.reflect.declaration.CtType;

import java.io.File;
Expand All @@ -9,8 +10,8 @@

public class SpoonedClass extends SpoonedFile {

public SpoonedClass(SpoonedProject parentProject, CtType<?> modelledClass) {
super(new File[]{modelledClass.getPosition().getFile()}, parentProject.projectClasspath());
public SpoonedClass(SpoonedProject parentProject, CtType<?> modelledClass, Config config) {
super(new File[]{modelledClass.getPosition().getFile()}, parentProject.projectClasspath(), config);
this.simpleType = modelledClass;
this.parentProject = parentProject;
qualifiedClassName = modelledClass.getQualifiedName();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,18 +37,21 @@

public abstract class SpoonedFile {

protected final Config config;

protected abstract Collection<? extends CtType<?>> modelledClasses();

public SpoonedFile(File[] sourceFiles, URL[] projectClasspath) {
public SpoonedFile(File[] sourceFiles, URL[] projectClasspath, Config config) {
//logDebug(logger(), format("[Building Spoon model from %s]", sourceFiles));
this.config = config;
this.sourceFiles = sourceFiles;
this.projectClasspath = projectClasspath;
factory = SpoonModelLibrary.newFactory();
factory.getEnvironment().setComplianceLevel(Config.INSTANCE.getComplianceLevel());
factory.getEnvironment().setComplianceLevel(config.getComplianceLevel());
factory.getEnvironment().setGenerateJavadoc(false);
factory.getEnvironment().setLevel(Level.OFF.toString());
factory = SpoonModelLibrary.modelFor(factory, sourceFiles, projectClasspath());
compiler = new DynamicClassCompiler(compilationClasspath());
compiler = new DynamicClassCompiler(compilationClasspath(), config);
manager = new RuntimeProcessingManager(spoonFactory());
compiledClasses = MetaMap.newHashMap();
prettyPrinter = new DefaultJavaPrettyPrinter(spoonEnvironment());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fr.inria.lille.commons.spoon;

import fr.inria.lille.repair.common.config.Config;
import spoon.processing.Processor;
import spoon.reflect.declaration.CtType;
import xxl.java.container.classic.MetaList;
Expand All @@ -13,8 +14,8 @@

public class SpoonedProject extends SpoonedFile {

public SpoonedProject(File[] sourceFile, URL[] classpath) {
super(sourceFile, classpath);
public SpoonedProject(File[] sourceFile, URL[] classpath, Config config) {
super(sourceFile, classpath, config);
}

@Override
Expand All @@ -39,7 +40,7 @@ public SpoonedClass forked(String qualifiedName) {
if (modelledClass == null) {
return null;
}
return new SpoonedClass(this, modelledClass);
return new SpoonedClass(this, modelledClass, config);
}

public ClassLoader processedAndDumpedToClassLoader(String qualifiedName, Processor<?> processor) {
Expand Down
57 changes: 29 additions & 28 deletions nopol/src/main/java/fr/inria/lille/repair/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,34 +38,35 @@ public class Main {

public static void main(String[] args) {
try {
Config config = new Config();
initJSAP();
if (!parseArguments(args)) {
if (!parseArguments(args, config)) {
return;
}
File[] sourceFiles = new File[Config.INSTANCE.getProjectSourcePath().length];
for (int i = 0; i < Config.INSTANCE.getProjectSourcePath().length; i++) {
String path = Config.INSTANCE.getProjectSourcePath()[i];
File[] sourceFiles = new File[config.getProjectSourcePath().length];
for (int i = 0; i < config.getProjectSourcePath().length; i++) {
String path = config.getProjectSourcePath()[i];
File sourceFile = FileLibrary.openFrom(path);
sourceFiles[i] = sourceFile;
}

URL[] classpath = JavaLibrary.classpathFrom(Config.INSTANCE.getProjectClasspath());
URL[] classpath = JavaLibrary.classpathFrom(config.getProjectClasspath());

switch (Config.INSTANCE.getMode()) {
switch (config.getMode()) {
case REPAIR:
switch (Config.INSTANCE.getType()) {
switch (config.getType()) {
case LOOP:
ProjectReference project = new ProjectReference(sourceFiles, classpath, Config.INSTANCE.getProjectTests());
Infinitel infinitel = new Infinitel(project);
ProjectReference project = new ProjectReference(sourceFiles, classpath, config.getProjectTests());
Infinitel infinitel = new Infinitel(project, config);
infinitel.repair();
break;
default:
NoPolLauncher.launch(sourceFiles, classpath, Config.INSTANCE.getType(), Config.INSTANCE.getProjectTests());
NoPolLauncher.launch(sourceFiles, classpath, config);
break;
}
break;
case RANKING:
Ranking ranking = new Ranking(sourceFiles, classpath, Config.INSTANCE.getProjectTests());
Ranking ranking = new Ranking(sourceFiles, classpath, config.getProjectTests());
System.out.println(ranking.summary());
break;
}
Expand All @@ -84,31 +85,31 @@ private static void showUsage() {
System.err.println(jsap.getHelp());
}

private static boolean parseArguments(String[] args) {
JSAPResult config = jsap.parse(args);
if (!config.success()) {
public static boolean parseArguments(String[] args, Config config) {
JSAPResult jsapConfig = jsap.parse(args);
if (!jsapConfig.success()) {
System.err.println();
for (Iterator<?> errs = config.getErrorMessageIterator(); errs.hasNext(); ) {
for (Iterator<?> errs = jsapConfig.getErrorMessageIterator(); errs.hasNext(); ) {
System.err.println("Error: " + errs.next());
}
showUsage();
return false;
}

Config.INSTANCE.setType(strToStatementType(config.getString("type")));
Config.INSTANCE.setMode(strToMode(config.getString("mode")));
Config.INSTANCE.setSynthesis(strToSynthesis(config.getString("synthesis")));
Config.INSTANCE.setOracle(strToOracle(config.getString("oracle")));
Config.INSTANCE.setSolver(strToSolver(config.getString("solver")));
if (config.getString("solverPath") != null) {
Config.INSTANCE.setSolverPath(config.getString("solverPath"));
SolverFactory.setSolver(Config.INSTANCE.getSolver(), Config.INSTANCE.getSolverPath());
config.setType(strToStatementType(jsapConfig.getString("type")));
config.setMode(strToMode(jsapConfig.getString("mode")));
config.setSynthesis(strToSynthesis(jsapConfig.getString("synthesis")));
config.setOracle(strToOracle(jsapConfig.getString("oracle")));
config.setSolver(strToSolver(jsapConfig.getString("solver")));
if (jsapConfig.getString("solverPath") != null) {
config.setSolverPath(jsapConfig.getString("solverPath"));
SolverFactory.setSolver(config.getSolver(), config.getSolverPath());
}
Config.INSTANCE.setProjectClasspath(config.getString("classpath"));
Config.INSTANCE.setProjectSourcePath(config.getStringArray("source"));
Config.INSTANCE.setProjectTests(config.getStringArray("test"));
Config.INSTANCE.setComplianceLevel(config.getInt("complianceLevel", 7));
Config.INSTANCE.setMaxTime(config.getInt("maxTime", 60));
config.setProjectClasspath(jsapConfig.getString("classpath"));
config.setProjectSourcePath(jsapConfig.getStringArray("source"));
config.setProjectTests(jsapConfig.getStringArray("test"));
config.setComplianceLevel(jsapConfig.getInt("complianceLevel", 7));
config.setMaxTime(jsapConfig.getInt("maxTime", 60));
return true;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ public enum NopolSolver {
CVC4
}

public static Config INSTANCE = new Config();

private final String filename = "config.ini";
private final Properties p;

Expand Down Expand Up @@ -77,7 +75,7 @@ public enum NopolSolver {

private int complianceLevel;

Config() {
public Config() {
p = new Properties();
try {
ClassLoader classLoader = getClass().getClassLoader();
Expand Down Expand Up @@ -115,10 +113,6 @@ public enum NopolSolver {
}
}

public void reset() {
INSTANCE = new Config();
}

public int getSynthesisDepth() {
return synthesisDepth;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import fr.inria.lille.commons.synthesis.CodeGenesis;
import fr.inria.lille.commons.synthesis.ConstraintBasedSynthesis;
import fr.inria.lille.commons.trace.Specification;
import fr.inria.lille.repair.common.config.Config;
import fr.inria.lille.repair.infinitel.loop.While;
import fr.inria.lille.repair.infinitel.loop.examination.LoopTestResult;
import fr.inria.lille.repair.infinitel.loop.implant.MonitoringTestExecutor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package fr.inria.lille.repair.infinitel;

import fr.inria.lille.repair.ProjectReference;
import fr.inria.lille.repair.common.config.Config;
import fr.inria.lille.repair.infinitel.loop.examination.LoopTestResult;
import fr.inria.lille.repair.infinitel.loop.implant.MonitoringTestExecutor;
import fr.inria.lille.repair.infinitel.loop.implant.ProjectMonitorImplanter;
Expand All @@ -19,8 +20,10 @@

public class Infinitel {

private final Config config;

public static void run(File[] sourceFile, URL[] classpath) {
Infinitel infiniteLoopFixer = new Infinitel(sourceFile, classpath);
Infinitel infiniteLoopFixer = new Infinitel(sourceFile, classpath, new Config());
try {
infiniteLoopFixer.repair();
} catch (Exception e) {
Expand All @@ -29,12 +32,13 @@ public static void run(File[] sourceFile, URL[] classpath) {
}
}

public Infinitel(File[] sourceFile, URL[] classpath) {
this(new ProjectReference(sourceFile, classpath));
public Infinitel(File[] sourceFile, URL[] classpath, Config config) {
this(new ProjectReference(sourceFile, classpath), config);
}

public Infinitel(ProjectReference project) {
public Infinitel(ProjectReference project, Config config) {
this.project = project;
this.config = config;
}

public ProjectReference project() {
Expand All @@ -56,7 +60,7 @@ public void repair() {
}

protected MonitoringTestExecutor newTestExecutor() {
MonitoringTestExecutor executor = ProjectMonitorImplanter.implanted(project(), configuration());
MonitoringTestExecutor executor = ProjectMonitorImplanter.implanted(project(), configuration(), config);
return executor;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package fr.inria.lille.repair.infinitel;

import fr.inria.lille.repair.ProjectReference;
import fr.inria.lille.repair.common.config.Config;
import fr.inria.lille.repair.infinitel.loop.While;
import fr.inria.lille.repair.infinitel.loop.examination.LoopTestResult;
import fr.inria.lille.repair.infinitel.loop.implant.MonitoringTestExecutor;
Expand Down Expand Up @@ -46,16 +47,16 @@ public class InfinitelDiagnostician extends Infinitel {
public static void main(String[] args) {
File sourceFile = FileLibrary.openFrom(args[0]);
URL[] classpath = JavaLibrary.classpathFrom(args[1]);
new InfinitelDiagnostician(new File[]{sourceFile}, classpath).diagnose();
new InfinitelDiagnostician(new File[]{sourceFile}, classpath, new Config()).diagnose();
System.out.println("Diagnostics ended");
}

public InfinitelDiagnostician(File[] sourceFile, URL[] classpath) {
super(sourceFile, classpath);
public InfinitelDiagnostician(File[] sourceFile, URL[] classpath, Config config) {
super(sourceFile, classpath, config);
}

public InfinitelDiagnostician(ProjectReference project) {
super(project);
public InfinitelDiagnostician(ProjectReference project, Config config) {
super(project, config);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import fr.inria.lille.commons.trace.RuntimeValues;
import fr.inria.lille.commons.trace.Specification;
import fr.inria.lille.commons.trace.SpecificationTestCasesListener;
import fr.inria.lille.repair.common.config.Config;
import fr.inria.lille.repair.infinitel.loop.While;
import fr.inria.lille.repair.infinitel.loop.examination.LoopTestListener;
import fr.inria.lille.repair.infinitel.loop.examination.LoopTestResult;
Expand All @@ -19,9 +20,12 @@

public class MonitoringTestExecutor {

public MonitoringTestExecutor(ClassLoader classLoader, CentralLoopMonitor monitor) {
private final Config config;

public MonitoringTestExecutor(ClassLoader classLoader, CentralLoopMonitor monitor, Config config) {
this.monitor = monitor;
this.classLoader = classLoader;
this.config = config;
monitor().disableAll();
}

Expand Down Expand Up @@ -58,21 +62,21 @@ public Result execute(TestCase testCase, While loop, int threshold, int invocati

public Result execute(TestCase testCase, While loop, RunListener listener) {
monitor().enable(loop);
Result result = runTestCase(testCase, classLoader(), listener);
Result result = runTestCase(testCase, classLoader(), listener, config);
monitor().disable(loop);
return result;
}

public Result execute(TestCase testCase, Collection<While> loops, RunListener listener) {
monitor().enable(loops);
Result result = runTestCase(testCase, classLoader(), listener);
Result result = runTestCase(testCase, classLoader(), listener, config);
monitor().disable(loops);
return result;
}

public LoopTestResult execute(String[] testClasses) {
LoopTestListener listener = new LoopTestListener(monitor());
runCasesIn(testClasses, classLoader(), listener);
runCasesIn(testClasses, classLoader(), listener, config);
return listener.result();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import fr.inria.lille.commons.spoon.util.SpoonStatementLibrary;
import fr.inria.lille.commons.trace.RuntimeValues;
import fr.inria.lille.repair.ProjectReference;
import fr.inria.lille.repair.common.config.Config;
import fr.inria.lille.repair.infinitel.InfinitelConfiguration;
import fr.inria.lille.repair.infinitel.loop.While;
import spoon.processing.AbstractProcessor;
Expand All @@ -16,12 +17,12 @@

public class ProjectMonitorImplanter extends AbstractProcessor<CtWhile> {

public static MonitoringTestExecutor implanted(ProjectReference project, InfinitelConfiguration configuration) {
public static MonitoringTestExecutor implanted(ProjectReference project, InfinitelConfiguration configuration, Config config) {
ProjectMonitorImplanter implanter = new ProjectMonitorImplanter(configuration.iterationsThreshold());
SpoonedProject spoonedProject = new SpoonedProject(project.sourceFiles(), project.classpath());
SpoonedProject spoonedProject = new SpoonedProject(project.sourceFiles(), project.classpath(), config);
spoonedProject.process(implanter);
ClassLoader classLoader = spoonedProject.dumpedToClassLoader();
MonitoringTestExecutor testExecutor = new MonitoringTestExecutor(classLoader, implanter.implant());
MonitoringTestExecutor testExecutor = new MonitoringTestExecutor(classLoader, implanter.implant(), config);
return testExecutor;
}

Expand Down
Loading

0 comments on commit 1cb07c9

Please sign in to comment.