package fr.inria.diversify.exp;
import fr.inria.diversify.buildSystem.maven.MavenBuilder;
import fr.inria.diversify.sosie.compare.diff.Report;
import fr.inria.diversify.sosie.compare.stackTraceOperation.StackTrace;
import fr.inria.diversify.util.Log;
import org.apache.commons.io.FileUtils;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.*;
/**
* Created by Simon on 01/07/14.
*/
public class ComputeReportForClient extends ComputeReport {
protected File client;
Map<String, Set<String>> errorClient;
public ComputeReportForClient() {
super();
errorClient = new HashMap();
}
public static void main(String[] args) throws Exception {
String resultDirectory = args[3];
String sosiesDirectory = args[0];
ComputeReportForClient computeReport = new ComputeReportForClient();
computeReport.setClient(new File(args[1]));
// computeReport.setOriginalLogDirectory(new File(args[2]));
computeReport.buildAllReport(new File(sosiesDirectory), new File(resultDirectory));
computeReport.writeSummary(resultDirectory);
}
public void buildAllReport(File sosiesDir, File resultDir) throws IOException {
for(File sosie : sosiesDir.listFiles()) {
if(sosie.isDirectory()) {
try {
Log.info("locate report for {} with the sosie {}",client, sosie.getName());
setPartialLogging(sosie, false);
installProgram(sosie);
File sosieLogDir2 = new File(client+"/oLog");
if(sosieLogDir2.exists()) {
FileUtils.forceDelete(sosieLogDir2);
}
FileUtils.forceMkdir(sosieLogDir2);
File sosieLogDir1 = new File(makeLogFor(client));
moveLogFile(sosieLogDir2,sosieLogDir1);
makeLogFor(client);
List<StackTrace> stackTrace1 = loadLog(sosieLogDir1, false);
List<StackTrace> stackTrace2 = loadLog(sosieLogDir2, false);
Log.info("compare sosie/sosie");
Report sosieSosieReport = compareTrace(stackTrace1, stackTrace2, false);
Log.info("compare sosie/original");
Report originalSosieReport = compareTrace(stackTrace1, originalLog, false);
try {
writeGoodDiff(resultDir.getAbsolutePath(), sosie.getName(), sosieSosieReport, originalSosieReport);
} catch (Exception e) {
e.printStackTrace();
}
writeCSVReport(
originalSosieReport.buildAllTest(),
sosieSosieReport.buildAllTest(),
resultDir.getAbsolutePath() + "/" + sosie.getName()+ ".csv");
if(sosieSosieReport.size() > minReportSize
&& originalSosieReport.size() > minReportSize) {
sosieSosieSummary += sosie.getName() + ": \n" + sosieSosieReport.summary() + "\n";
globalSosieSosieReport = updateGlobalReport(globalSosieSosieReport, sosieSosieReport);
originalSosieSummary += sosie.getName() + ": \n" + originalSosieReport.summary() + "\n";
globalOriginalSosieReport = updateGlobalReport(globalOriginalSosieReport, originalSosieReport);
} else {
if(!errorClient.containsKey(client.getAbsolutePath())) {
errorClient.put(client.getAbsolutePath(),new HashSet());
}
errorClient.get(client.getAbsolutePath()).add(sosie.getAbsolutePath());
}
} catch (Exception e) {
if(!errorClient.containsKey(client.getAbsolutePath())) {
errorClient.put(client.getAbsolutePath(),new HashSet());
}
errorClient.get(client.getAbsolutePath()).add(sosie.getAbsolutePath());
}
}
}
}
protected void writeGoodDiff(String resultDir, String sosieName , Report ss, Report os) throws JSONException, IOException {
Object map = os.getDiffVarPerTestFor(ss.getSameVarPerTest());
JSONObject json = new JSONObject();
json.put("sosie",sosieName);
json.put("diff", map);
FileWriter writer = new FileWriter(resultDir+"/"+sosieName+"_good.json");
json.write(writer);
writer.close();
}
protected void installProgram(File programDirectory) throws Exception {
Log.info("install program: {}",programDirectory.getAbsoluteFile());
MavenBuilder builder = new MavenBuilder(programDirectory.getAbsolutePath());
builder.setTimeOut(600);
builder.setSetting(localRepository);
builder.setGoals(new String[]{"clean", "install" });
builder.runBuilder();
int status = builder.getStatus();
int count = 0;
while(status != 0 && count < 5) {
count++;
builder.runBuilder();
status = builder.getStatus();
}
if(status != 0) {
throw new Exception("error during the locate of " + programDirectory.getAbsolutePath());
}
}
protected void writeErrorReport(String resultDir) throws IOException {
File file = new File(resultDir + "/errorClientRepport");
file.createNewFile();
FileWriter writer = new FileWriter(file);
writer.write(errorClient.toString());
writer.close();
}
public void setClient(File client) {
this.client = client;
}
}