package fr.inria.diversify.transformation.query; import fr.inria.diversify.codeFragment.Statement; import fr.inria.diversify.coverage.MultiCoverageReport; import fr.inria.diversify.diversification.InputProgram; import fr.inria.diversify.transformation.Transformation; import fr.inria.diversify.transformation.TransformationParser; import fr.inria.diversify.transformation.TransformationParserException; import fr.inria.diversify.transformation.ast.ASTTransformation; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * User: Simon * Date: 19/02/14 * Time: 14:49 */ public class MutationToSosieQuery extends TransformationQuery { protected boolean subType; protected List<Transformation> mutations; protected String classesDir; protected File jacocoDir; protected InputProgram inputProgram; public MutationToSosieQuery(InputProgram inputProgram) throws TransformationParserException { super(inputProgram); this.classesDir = inputProgram.getProgramDir() + "/" + inputProgram.getClassesDir(); this.jacocoDir = new File(inputProgram.getCoverageDir()); init(inputProgram.getPreviousTransformationsPath()); } protected void init(String mutationDirectory) throws TransformationParserException { TransformationParser tf = new TransformationParser(true, inputProgram); mutations = new ArrayList(tf.parseDir(mutationDirectory)); } public Transformation query() throws QueryException { Random r = new Random(); Transformation mutation = null; ASTTransformation transformation = null; try { while (transformation == null) { mutation = mutations.get(r.nextInt(mutations.size())); while (mutation.getStatus() != -1) mutation = mutations.get(r.nextInt(mutations.size())); MultiCoverageReport coverageReport = new MultiCoverageReport(classesDir); for (String failure : mutation.getFailures()) { String test = formatTest(failure); for (File jacocoFile : jacocoDir.listFiles()) { if (test.equals(jacocoFile.getName())) coverageReport.addJacocoFile(jacocoFile); } } T thread = new T(new ADRTransformationQuery(inputProgram, Statement.class, subType, false)); thread.start(); int count = 0; while (thread.trans == null && count < 50) { Thread.sleep(100); count++; } thread.interrupt(); transformation = thread.trans; } transformation.setParent(mutation); } catch (Exception e) { throw new QueryException(e); } return transformation; } protected String formatTest(String failure) { String[] tmp = failure.split("\\."); String ret = tmp[0]; for(int i = 1; i < tmp.length - 1; i++) { ret += "." + tmp[i]; } return ret + "#" +tmp[tmp.length - 1] + ".exec"; } class T extends Thread { public ASTTransformation trans; ADRTransformationQuery query; public T(ADRTransformationQuery query) { this.query = query; } public void run() { try { trans = (ASTTransformation) query.query(); } catch (Exception e) { } } } }