package fr.inria.diversify.transformation.query; import fr.inria.diversify.diversification.InputProgram; import fr.inria.diversify.transformation.Transformation; import fr.inria.diversify.util.Log; import java.util.Random; /** * Composite executeQuery to composite multiple types of queries * * Created by Simon on 19/03/14. */ public class CompositeQuery extends TransformationQuery { /** * Mutation executeQuery of the composite */ protected MutationQuery mutation; /** * Ast executeQuery of the composite */ protected ADRTransformationQuery ast; public CompositeQuery(InputProgram inputProgram) { super(inputProgram); ast = new ADRTransformationQuery(inputProgram); mutation = new MutationQuery(inputProgram); } @Override public Transformation query() { try { Transformation transformation = null; Random r = new Random(); while (transformation == null) { T thread = new T(ast, mutation, r.nextDouble()); thread.start(); int count = 0; while (thread.trans == null && count < 50) { Thread.sleep(100); count++; } thread.interrupt(); transformation = thread.trans; } return transformation; } catch (Exception e) { throw new RuntimeException(e); } } class T extends Thread { public Transformation trans; ADRTransformationQuery query; MutationQuery mutation; double r; public T(ADRTransformationQuery query, MutationQuery mutation, double r) { this.query = query; this.mutation = mutation; this.r = r; } public void run() { try { if(r < 0.05) trans = mutation.query(); else trans = ast.query(); } catch (Exception e) { Log.warn("Exception while running transformation: " + trans); e.printStackTrace(); } } } }