treedumps

This commit is contained in:
Anil Koyuncu
2018-03-19 11:45:46 +01:00
parent 9322b35b48
commit 175d70b9c3
9 changed files with 619 additions and 122 deletions
+1 -1
View File
@@ -87,7 +87,7 @@
<archive>
<manifest>
<mainClass>
edu.lu.uni.serval.FixPatternParser.violations.TestHunkParser
edu.lu.uni.serval.FixPatternParser.violations.MultiThreadTreeLoader
</mainClass>
</manifest>
</archive>
@@ -1,11 +1,12 @@
package edu.lu.uni.serval.FixPatternParser.violations;
import java.io.File;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.github.gumtreediff.actions.model.Update;
import com.github.gumtreediff.tree.ITree;
import edu.lu.uni.serval.FixPatternParser.Tokenizer;
@@ -38,124 +39,181 @@ public class FixedViolationHunkParser extends FixedViolationParser {
@Override
public void parseFixPatterns(File prevFile, File revFile, File diffentryFile) {
// GumTree results
List<HierarchicalActionSet> actionSets = parseChangedSourceCodeWithGumTree2(prevFile, revFile);
if (this.resultType != 0) {
// String type = "";
// if (this.resultType == 1) {
// type = "#NullGumTreeResult:";
// } else if (this.resultType == 2) {
// type = "#NoSourceCodeChange:";
// } else if (this.resultType == 3) {
// type = "#NoStatementChange:";
// }
} else {
List<DiffEntryHunk> diffentryHunks = new DiffEntryReader().readHunks3(diffentryFile);
List<HierarchicalActionSet> actionSets = parseChangedSourceCodeWithGumTree2(prevFile, revFile);
//Filter out the modify actions, which are not in the DiffEntry hunks.
HunkActionFilter hunkFilter = new HunkActionFilter();
List<DiffEntryHunk> selectedPatchHunks = hunkFilter.filterActionsByModifiedRange2(diffentryHunks, actionSets, revFile, prevFile);
boolean isUpdate =
actionSets.stream().allMatch(p -> p.getAction() instanceof Update);
int hunkSet = 0;
if(isUpdate){
for (HierarchicalActionSet actionSet : actionSets) {
for (DiffEntryHunk patchHunk : selectedPatchHunks) {
List<HierarchicalActionSet> hunkActionSets = patchHunk.getActionSets();
// multiple UPD, and some UPD contain other UPD.
removeOverlapperdUPD(hunkActionSets);
// Range of buggy source code
int bugStartLine = 0;
int bugEndLine = 0;
// Range of fixing source code
int fixStartLine = 0;
int fixEndLine = 0;
int bugEndPosition = 0;
int fixEndPosition = 0;
for (HierarchicalActionSet hunkActionSet : hunkActionSets) {
int actionBugStart = hunkActionSet.getBugStartLineNum();
int actionBugEnd = hunkActionSet.getBugEndLineNum();
int actionFixStart = hunkActionSet.getFixStartLineNum();
int actionFixEnd = hunkActionSet.getFixEndLineNum();
if (bugStartLine == 0) {
bugStartLine = actionBugStart;
} else if (actionBugStart != 0 && actionBugStart < bugStartLine) {
bugStartLine = actionBugStart;
}
if (fixStartLine == 0) {
fixStartLine = actionFixStart;
} else if (actionFixStart != 0 && actionFixStart < fixStartLine) {
fixStartLine = actionFixStart;
}
if (bugEndLine < actionBugEnd) {
bugEndLine = actionBugEnd;
bugEndPosition = hunkActionSet.getBugEndPosition();
}
if (fixEndLine < actionFixEnd) {
fixEndLine = actionFixEnd;
fixEndPosition = hunkActionSet.getFixEndPosition();
}
FileOutputStream f = null;
try {
String pj = diffentryFile.getParent().split("GumTreeInputBug4")[1];
String root = "/Users/anilkoyuncu/bugStudy/dataset/GumTreeOutput2";
String hunkTreeFileName = root+pj.replace("DiffEntries","ASTDumps/") + diffentryFile.getName() + "_" + String.valueOf(hunkSet);
f = new FileOutputStream(new File(hunkTreeFileName));
ObjectOutputStream o = new ObjectOutputStream(f);
o.writeObject(actionSet.getNode());
o.close();
f.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (fixStartLine == 0 && bugStartLine == 0) {
this.unfixedViolations += "#WRONG: " + revFile.getName() + ":" + patchHunk.getBugLineStartNum() + ", " + patchHunk.getBuggyHunkSize() + "\n";
this.nullMappingGumTreeResult ++;
continue;
}
if (fixStartLine == 0 && bugStartLine != 0) {// pure delete actions.
// get the exact buggy code by violation's position. TODO later
}
// if (children.size() == 0) continue;
boolean isPureInsert = false;
if (bugStartLine == 0 && patchHunk.getBugLineStartNum() > 0) {
bugStartLine = patchHunk.getBugLineStartNum();
bugEndLine = bugStartLine + patchHunk.getBuggyHunkSize() - 1;
isPureInsert = true;
// continue;
}
// if ((bugEndLine - bugStartLine > Configuration.HUNK_SIZE ) || fixEndLine - fixStartLine > Configuration.HUNK_SIZE) {
// continue; //TODO hunk size
// }
if(patchHunk.getBuggyHunkSize() > Configuration.HUNK_SIZE || patchHunk.getFixedHunkSize() > Configuration.HUNK_SIZE){
continue;
}
/**
* Select edit scripts for deep learning.
* Edit scripts will be used to mine common fix patterns.
*/
// 1. First level: AST node type.
String astEditScripts = getASTEditScriptsDeepFirst(hunkActionSets, bugEndPosition, fixEndPosition);
if (astEditScripts.contains("\n") || astEditScripts.split(" ").length % 3 != 0) {
System.err.println("===+++===: " + revFile.getName() + ":" +patchHunk.getBugLineStartNum() + ", " + patchHunk.getBuggyHunkSize());
}
// 2. source code: raw tokens
// 3. abstract identifiers:
// 4. semi-source code:
String[] editScriptTokens = astEditScripts.split(" ");
int size = editScriptTokens.length;
if (size == 1) {
this.nullMappingGumTreeResult ++;
this.unfixedViolations += "#NullMatchedGumTreeResult1:" + revFile.getName() + ":" + patchHunk.getBugLineStartNum() + ", " + patchHunk.getBuggyHunkSize() + "\n";
continue;
}
String patchPosition = "\n" + revFile.getName() + "\n@@ -" + bugStartLine + ", " + bugEndLine + " +" + fixStartLine + ", " + fixEndLine + "@@\n";
// String info = Configuration.PATCH_SIGNAL + "\n" + patchPosition + patchHunk.getHunk() + "\nAST Diff###:\n" + getAstEditScripts(hunkActionSets, bugEndPosition, fixEndPosition) + "\n";
//TODO uncomment the line below for more detailed gumtree input.
String info = Configuration.PATCH_SIGNAL + "\n" + patchPosition + patchHunk.getHunk() + "\nAST Diff###:\n" + getAstEditScripts(hunkActionSets) + "\n";
// if (noUpdate(editScriptTokens)) {
// }
String canonicalVariableNames = getBuggyCodeTree(patchHunk, prevFile, revFile);
this.patchesSourceCode += info;
this.patchesSourceCode += "\nRenamed_Variables###:\n" + canonicalVariableNames;
this.sizes += size + "\n";
this.astEditScripts += astEditScripts + "\n";
// String tokens = Tokenizer.getTokensDeepFirst(simpleTree).trim();
// this.tokensOfSourceCode += tokens + "\n";
hunkSet++;
}
}
}
// public void parseFixPatterns(File prevFile, File revFile, File diffentryFile) {
// // GumTree results
// List<HierarchicalActionSet> actionSets = parseChangedSourceCodeWithGumTree2(prevFile, revFile);
//
//
// if (this.resultType != 0) {
//// String type = "";
//// if (this.resultType == 1) {
//// type = "#NullGumTreeResult:";
//// } else if (this.resultType == 2) {
//// type = "#NoSourceCodeChange:";
//// } else if (this.resultType == 3) {
//// type = "#NoStatementChange:";
//// }
// } else {
// List<DiffEntryHunk> diffentryHunks = new DiffEntryReader().readHunks3(diffentryFile);
//
// //Filter out the modify actions, which are not in the DiffEntry hunks.
// HunkActionFilter hunkFilter = new HunkActionFilter();
// List<DiffEntryHunk> selectedPatchHunks = hunkFilter.filterActionsByModifiedRange2(diffentryHunks, actionSets, revFile, prevFile);
//
// for (DiffEntryHunk patchHunk : selectedPatchHunks) {
// List<HierarchicalActionSet> hunkActionSets = patchHunk.getActionSets();
// // multiple UPD, and some UPD contain other UPD.
// removeOverlapperdUPD(hunkActionSets);
//
// // Range of buggy source code
// int bugStartLine = 0;
// int bugEndLine = 0;
// // Range of fixing source code
// int fixStartLine = 0;
// int fixEndLine = 0;
// int bugEndPosition = 0;
// int fixEndPosition = 0;
// int hunkSet = 0;
// for (HierarchicalActionSet hunkActionSet : hunkActionSets) {
//
//
// FileOutputStream f = null;
// try {
// String pj = diffentryFile.getParent().split("GumTreeInputBug4")[1];
// String root = "/Users/anilkoyuncu/bugStudy/dataset/GumTreeOutput2";
// String hunkTreeFileName = root+pj.replace("DiffEntries","ASTDumps/") + diffentryFile.getName() + "_" + String.valueOf(hunkSet);
// f = new FileOutputStream(new File(hunkTreeFileName));
// ObjectOutputStream o = new ObjectOutputStream(f);
// o.writeObject(hunkActionSet.getNode());
//
// o.close();
// f.close();
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// }
// hunkSet++;
//
//
//
// int actionBugStart = hunkActionSet.getBugStartLineNum();
// int actionBugEnd = hunkActionSet.getBugEndLineNum();
// int actionFixStart = hunkActionSet.getFixStartLineNum();
// int actionFixEnd = hunkActionSet.getFixEndLineNum();
// if (bugStartLine == 0) {
// bugStartLine = actionBugStart;
// } else if (actionBugStart != 0 && actionBugStart < bugStartLine) {
// bugStartLine = actionBugStart;
// }
// if (fixStartLine == 0) {
// fixStartLine = actionFixStart;
// } else if (actionFixStart != 0 && actionFixStart < fixStartLine) {
// fixStartLine = actionFixStart;
// }
// if (bugEndLine < actionBugEnd) {
// bugEndLine = actionBugEnd;
// bugEndPosition = hunkActionSet.getBugEndPosition();
// }
// if (fixEndLine < actionFixEnd) {
// fixEndLine = actionFixEnd;
// fixEndPosition = hunkActionSet.getFixEndPosition();
// }
// }
//
// if (fixStartLine == 0 && bugStartLine == 0) {
// this.unfixedViolations += "#WRONG: " + revFile.getName() + ":" + patchHunk.getBugLineStartNum() + ", " + patchHunk.getBuggyHunkSize() + "\n";
// this.nullMappingGumTreeResult ++;
// continue;
// }
//
// if (fixStartLine == 0 && bugStartLine != 0) {// pure delete actions.
// // get the exact buggy code by violation's position. TODO later
// }
//
//// if (children.size() == 0) continue;
// boolean isPureInsert = false;
// if (bugStartLine == 0 && patchHunk.getBugLineStartNum() > 0) {
// bugStartLine = patchHunk.getBugLineStartNum();
// bugEndLine = bugStartLine + patchHunk.getBuggyHunkSize() - 1;
// isPureInsert = true;
//// continue;
// }
//// if ((bugEndLine - bugStartLine > Configuration.HUNK_SIZE ) || fixEndLine - fixStartLine > Configuration.HUNK_SIZE) {
//// continue; //TODO hunk size
//// }
// if(patchHunk.getBuggyHunkSize() > Configuration.HUNK_SIZE || patchHunk.getFixedHunkSize() > Configuration.HUNK_SIZE){
// continue;
// }
//
// /**
// * Select edit scripts for deep learning.
// * Edit scripts will be used to mine common fix patterns.
// */
// // 1. First level: AST node type.
// String astEditScripts = getASTEditScriptsDeepFirst(hunkActionSets, bugEndPosition, fixEndPosition);
// if (astEditScripts.contains("\n") || astEditScripts.split(" ").length % 3 != 0) {
// System.err.println("===+++===: " + revFile.getName() + ":" +patchHunk.getBugLineStartNum() + ", " + patchHunk.getBuggyHunkSize());
// }
// // 2. source code: raw tokens
// // 3. abstract identifiers:
// // 4. semi-source code:
// String[] editScriptTokens = astEditScripts.split(" ");
// int size = editScriptTokens.length;
// if (size == 1) {
// this.nullMappingGumTreeResult ++;
// this.unfixedViolations += "#NullMatchedGumTreeResult1:" + revFile.getName() + ":" + patchHunk.getBugLineStartNum() + ", " + patchHunk.getBuggyHunkSize() + "\n";
// continue;
// }
//
// String patchPosition = "\n" + revFile.getName() + "\n@@ -" + bugStartLine + ", " + bugEndLine + " +" + fixStartLine + ", " + fixEndLine + "@@\n";
//// String info = Configuration.PATCH_SIGNAL + "\n" + patchPosition + patchHunk.getHunk() + "\nAST Diff###:\n" + getAstEditScripts(hunkActionSets, bugEndPosition, fixEndPosition) + "\n";
////TODO uncomment the line below for more detailed gumtree input.
// String info = Configuration.PATCH_SIGNAL + "\n" + patchPosition + patchHunk.getHunk() + "\nAST Diff###:\n" + getAstEditScripts(hunkActionSets) + "\n";
//// if (noUpdate(editScriptTokens)) {
//// }
//
// String canonicalVariableNames = getBuggyCodeTree(patchHunk, prevFile, revFile);
// this.patchesSourceCode += info;
// this.patchesSourceCode += "\nRenamed_Variables###:\n" + canonicalVariableNames;
// this.sizes += size + "\n";
// this.astEditScripts += astEditScripts + "\n";
//// String tokens = Tokenizer.getTokensDeepFirst(simpleTree).trim();
//// this.tokensOfSourceCode += tokens + "\n";
// }
// }
// }
private String getAstEditScripts(List<HierarchicalActionSet> hunkActionSets) {
String scripts = "";
@@ -0,0 +1,32 @@
package edu.lu.uni.serval.FixPatternParser.violations;
import javafx.util.Pair;
import java.io.Serializable;
/**
* Created by anilkoyuncu on 19/03/2018.
*/
public class Message implements Serializable{
Pair<Integer, String> first;
Pair<Integer, String> second;
Pair<Pair,Pair> p;
public Pair<Pair, Pair> getPair() {
return p;
}
public void setPair(Pair<Pair, Pair> p) {
this.p = p;
}
public Message(Integer keyFirst, String valueFirst, Integer keySecond, String valueSecond ){
first = new Pair<>(keyFirst,valueFirst);
second = new Pair<>(keySecond,valueSecond);
p = new Pair<>(first,second);
}
}
@@ -0,0 +1,168 @@
package edu.lu.uni.serval.FixPatternParser.violations;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import com.github.gumtreediff.actions.ActionGenerator;
import com.github.gumtreediff.actions.model.Action;
import com.github.gumtreediff.matchers.Matcher;
import com.github.gumtreediff.matchers.Matchers;
import com.github.gumtreediff.tree.ITree;
import edu.lu.uni.serval.MultipleThreadsParser.MessageFile;
import edu.lu.uni.serval.MultipleThreadsParser.WorkMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* Created by anilkoyuncu on 19/03/2018.
*/
public class MultiThreadTreeLoader {
private static Logger log = LoggerFactory.getLogger(MultiThreadTreeLoader.class);
public static void main(String[] args) {
String inputPath;
String outputPath;
if(args.length > 0){
inputPath = args[0];
outputPath = args[1];
}else{
inputPath = "/Users/anilkoyuncu/bugStudy/dataset/GumTreeOutput2/";
outputPath = "/Users/anilkoyuncu/bugStudy/dataset/";
}
// String inputPath = "/Users/anilkoyuncu/bugStudy/dataset/GumTreeOutput2/";
File folder = new File(inputPath);
File[] listOfFiles = folder.listFiles();
Stream<File> stream = Arrays.stream(listOfFiles);
List<File> pjs = stream
.filter(x -> !x.getName().startsWith("."))
.collect(Collectors.toList());
List<File> fileToCompare = new ArrayList<>();
for (File pj : pjs) {
File[] files = pj.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.startsWith("ASTDumps");
}
});
Collections.addAll(fileToCompare, files[0].listFiles());
}
System.out.println("a");
// compareAll(fileToCompare);
final List<Message> msgFiles = readMessageFiles(fileToCompare);
FileOutputStream f = null;
try {
f = new FileOutputStream(new File(outputPath + "messageFile"));
ObjectOutputStream o = new ObjectOutputStream(f);
o.writeObject(msgFiles);
o.close();
f.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
List<Message> loaded = null;
try {
FileInputStream fi = new FileInputStream(new File(outputPath + "messageFile"));
ObjectInputStream oi = new ObjectInputStream(fi);
loaded = (List<Message>) oi.readObject();
oi.close();
fi.close();
} catch (FileNotFoundException e) {
System.out.println("File not found");
} catch (IOException e) {
System.out.println("Error initializing stream");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
log.info(String.valueOf(msgFiles.size()));
log.info(String.valueOf(loaded.size()));
// msgFiles.parallelStream()
// .forEach(m -> m.dosomething()));
}
// private static coreLoop(){
// try {
// BufferedWriter writer = new BufferedWriter(new FileWriter("output2.txt", true));
// ITree oldTree = getSimpliedTree(treesFileNames.get(i));
//
// ITree newTree = getSimpliedTree(treesFileNames.get(j));
//
// Matcher m = Matchers.getInstance().getMatcher(oldTree, newTree);
// m.match();
//
// ActionGenerator ag = new ActionGenerator(oldTree, newTree, m.getMappings());
// ag.generate();
// List<Action> actions = ag.getActions();
// writer.write(String.valueOf(i));
// writer.write("\t");
// writer.write(String.valueOf(j));
// writer.write("\t");
//
// writer.write(String.format("%1.2f", m.chawatheSimilarity(oldTree, newTree)));
// writer.write("\t");
// writer.write(String.format("%1.2f", m.diceSimilarity(oldTree, newTree)));
// writer.write("\t");
// writer.write(String.format("%1.2f", m.jaccardSimilarity(oldTree, newTree)));
// writer.write("\t");
// writer.write(String.valueOf(actions.size()));
// writer.write("\t");
// writer.write(treesFileNames.get(i));
// writer.write("\t");
// writer.write(treesFileNames.get(j));
// writer.write("\n");
//
// writer.close();
// } catch (FileNotFoundException e) {
// System.out.println("File not found");
// } catch (IOException e) {
// System.out.println("Error initializing stream");
//
// }
// }
private static List<Message> readMessageFiles(List<File> folders) {
List<String> treesFileNames = new ArrayList<>();
List<Message> msgFiles = new ArrayList<>();
for (File target : folders) {
treesFileNames.add(target.toString());
}
log.info("Calculating pairs");
for (int i = 0; i < treesFileNames.size(); i++) {
for (int j = i + 1; j < treesFileNames.size(); j++) {
Message msgFile = new Message(i, treesFileNames.get(i), j, treesFileNames.get(j));
msgFiles.add(msgFile);
}
}
return msgFiles;
}
}
@@ -35,8 +35,10 @@ public class TestHunkParser {
inputPath = args[1];
outputPath = args[0] + "/GumTreeOutputBug/";
}else{
inputPath = "/Users/anilkoyuncu/bugStudy/dataset/GumTreeInputBug";
outputPath = "/Users/anilkoyuncu/bugStudy/dataset" + "/GumTreeOutputBug2/";
// inputPath = "/Users/anilkoyuncu/bugStudy/dataset/GumTreeInputBug4";
inputPath = "/Volumes/data/bugStudy_backup/dataset/GumTreeInputBug4";
// outputPath = "/Users/anilkoyuncu/bugStudy/code/python/GumTreeOutput2/";
outputPath = "/Users/anilkoyuncu/bugStudy/dataset/GumTreeOutput2";
}
@@ -57,14 +59,20 @@ public class TestHunkParser {
// }
// }
// List<String> pjList = Arrays.asList("DATAJPA","ZXing","PDE","SWS","SWT", "SWF", "COLLECTIONS", "JDT");
for (File target : folders) {
String pjName = target.getName();
// if (!pjList.contains(pjName)){
// continue;
// }
final List<MessageFile> msgFiles = getMessageFiles(target.toString() + "/"); //"/Users/anilkoyuncu/bugStudy/code/python/GumTreeInput/Apache/CAMEL/"
System.out.println(msgFiles.size());
if(msgFiles.size() == 0)
continue;
String pjName = target.getName();
// output path
String GUM_TREE_OUTPUT = outputPath + pjName + "/";
String GUM_TREE_OUTPUT = outputPath + "/"+ pjName + "/";
final String editScriptsFilePath = GUM_TREE_OUTPUT + "editScripts.list";
final String patchesSourceCodeFilePath =GUM_TREE_OUTPUT + "patchSourceCode.list";
final String buggyTokensFilePath = GUM_TREE_OUTPUT + "tokens.list";
@@ -72,7 +80,7 @@ public class TestHunkParser {
final String alarmTypesFilePath = GUM_TREE_OUTPUT + "alarmTypes.list";
FileHelper.createDirectory(GUM_TREE_OUTPUT + "/ASTDumps");
FileHelper.deleteDirectory(editScriptsFilePath);
FileHelper.deleteDirectory(patchesSourceCodeFilePath);
FileHelper.deleteDirectory(buggyTokensFilePath);
@@ -106,7 +114,7 @@ public class TestHunkParser {
alarmTypes.append(parser.getAlarmTypes());
a++;
if (a % 10 == 0) {
if (a % 100 == 0) {
FileHelper.outputToFile(editScriptsFilePath, astEditScripts, true);
FileHelper.outputToFile(buggyTokensFilePath, tokens, true);
FileHelper.outputToFile(editScriptSizesFilePath, sizes, true);
@@ -0,0 +1,229 @@
package edu.lu.uni.serval.FixPatternParser.violations;
import com.github.gumtreediff.actions.ActionGenerator;
import com.github.gumtreediff.actions.model.Action;
import com.github.gumtreediff.matchers.Mapping;
import com.github.gumtreediff.matchers.Matcher;
import com.github.gumtreediff.matchers.Matchers;
import com.github.gumtreediff.tree.ITree;
import edu.lu.uni.serval.gumtree.regroup.SimplifyTree;
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* Created by anilkoyuncu on 17/03/2018.
*/
public class TestTreeLoader {
public static void main(String[] args) {
// String inputPath = "/Users/anilkoyuncu/bugStudy/dataset/GumTreeOutput/ENTESB/ASTDumps";
String inputPath = "/Users/anilkoyuncu/bugStudy/dataset/GumTreeOutput2/";
File folder = new File(inputPath);
File[] listOfFiles = folder.listFiles();
Stream<File> stream = Arrays.stream(listOfFiles);
List<File> pjs = stream
.filter(x -> !x.getName().startsWith("."))
.collect(Collectors.toList());
List<File> fileToCompare = new ArrayList<>();
for(File pj:pjs){
File[] files = pj.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.startsWith("ASTDumps");
}
});
Collections.addAll(fileToCompare, files[0].listFiles());
}
System.out.println("a");
// compareAll(fileToCompare);
memoryFriendlyCompare(fileToCompare);
}
public static ITree getSimpliedTree(String fn) {
ITree tree = null;
try {
FileInputStream fi = new FileInputStream(new File(fn));
ObjectInputStream oi = new ObjectInputStream(fi);
tree = (ITree) oi.readObject();
oi.close();
fi.close();
} catch (FileNotFoundException e) {
System.out.println("File not found");
} catch (IOException e) {
System.out.println("Error initializing stream");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tree.setLabel("");
tree.setParent(null);
List<ITree> descendants = tree.getDescendants();
for (ITree descendant : descendants) {
descendant.setLabel("");
}
return tree;
}
public static void memoryFriendlyCompare(List<File> folders){
List<String> treesFileNames = new ArrayList<>();
// HashMap<Integer, String> hmap = new HashMap<Integer, String>();
for (File target : folders) {
// hmap.put(folders.indexOf(target), target.toString());
treesFileNames.add(target.toString());
}
for (int i = 0; i < treesFileNames.size(); i++) {
for (int j = i + 1; j < treesFileNames.size(); j++) {
// compare list.get(i) and list.get(j)
try {
BufferedWriter writer = new BufferedWriter(new FileWriter("output2.txt", true));
ITree oldTree = getSimpliedTree(treesFileNames.get(i));
ITree newTree = getSimpliedTree(treesFileNames.get(j));
Matcher m = Matchers.getInstance().getMatcher(oldTree, newTree);
m.match();
ActionGenerator ag = new ActionGenerator(oldTree, newTree, m.getMappings());
ag.generate();
List<Action> actions = ag.getActions();
writer.write(String.valueOf(i));
writer.write("\t");
writer.write(String.valueOf(j));
writer.write("\t");
writer.write(String.format("%1.2f", m.chawatheSimilarity(oldTree, newTree)));
writer.write("\t");
writer.write(String.format("%1.2f", m.diceSimilarity(oldTree, newTree)));
writer.write("\t");
writer.write(String.format("%1.2f", m.jaccardSimilarity(oldTree, newTree)));
writer.write("\t");
writer.write(String.valueOf(actions.size()));
writer.write("\t");
writer.write(treesFileNames.get(i));
writer.write("\t");
writer.write(treesFileNames.get(j));
writer.write("\n");
writer.close();
} catch (FileNotFoundException e) {
System.out.println("File not found");
} catch (IOException e) {
System.out.println("Error initializing stream");
}
}
}
}
public static void compareAll(List<File> folders){
List<ITree> trees = new ArrayList<>();
HashMap<Integer, String> hmap = new HashMap<Integer, String>();
for (File target : folders) {
try {
FileInputStream fi = new FileInputStream(new File(target.toString()));
ObjectInputStream oi = new ObjectInputStream(fi);
ITree pr1 = (ITree) oi.readObject();
oi.close();
fi.close();
trees.add(pr1);
hmap.put(folders.indexOf(target), target.toString());
} catch (FileNotFoundException e) {
System.out.println("File not found");
} catch (IOException e) {
System.out.println("Error initializing stream");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (ITree tree : trees) {
// SimplifyTree simplifyTree = new SimplifyTree();
// simplifyTree.canonicalizeSourceCodeTree(tree);
tree.setLabel("");
tree.setParent(null);
List<ITree> descendants = tree.getDescendants();
for (ITree descendant : descendants) {
descendant.setLabel("");
}
}
System.out.println("a");
try {
for (int i = 0; i < trees.size(); i++) {
for (int j = i + 1; j < trees.size(); j++) {
// compare list.get(i) and list.get(j)
BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt",true));
ITree oldTree = trees.get(i);
ITree newTree = trees.get(j);
Matcher m = Matchers.getInstance().getMatcher(oldTree, newTree);
m.match();
ActionGenerator ag = new ActionGenerator(oldTree, newTree, m.getMappings());
ag.generate();
List<Action> actions = ag.getActions();
writer.write(String.valueOf(i));
writer.write("\t");
writer.write(String.valueOf(j));
writer.write("\t");
writer.write(String.format("%1.2f", m.chawatheSimilarity(oldTree, newTree)));
writer.write("\t");
writer.write(String.format("%1.2f", m.diceSimilarity(oldTree, newTree)));
writer.write("\t");
writer.write(String.format("%1.2f", m.jaccardSimilarity(oldTree, newTree)));
writer.write("\t");
writer.write(String.valueOf(actions.size()));
writer.write("\t");
writer.write(hmap.get(i));
writer.write("\t");
writer.write(hmap.get(j));
writer.write("\n");
writer.close();
}
}
} catch (FileNotFoundException e) {
System.out.println("File not found");
} catch (IOException e) {
System.out.println("Error initializing stream");
}
// if (actions.size() > 1) {
// Matcher m1 = Matchers.getInstance().getMatcher(actions.get(0).getNode(), actions.get(0).getNode());
// m1.match();
// Set<Mapping> mappingSet1 = m1.getMappingSet();
//
// }
}
}
@@ -16,7 +16,7 @@ public class Configuration {
// the output path of GumTree results.
private static final String GUM_TREE_OUTPUT = ROOT_PATH + "GumTreeResults/";
public static final String GUM_TREE_OUTPUT = ROOT_PATH + "GumTreeResults/";
public static final String EDITSCRIPTS_FILE_PATH = GUM_TREE_OUTPUT + "editScripts/";
public static final String PATCH_SOURCECODE_FILE_PATH = GUM_TREE_OUTPUT + "sourceCode/";
public static final String BUGGYTREE_FILE_PATH = GUM_TREE_OUTPUT + "buggyTrees/";
@@ -1,5 +1,6 @@
package edu.lu.uni.serval.gumtree.regroup;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@@ -12,7 +13,7 @@ import com.github.gumtreediff.tree.ITree;
* @author kui.liu
*
*/
public class HierarchicalActionSet implements Comparable<HierarchicalActionSet> {
public class HierarchicalActionSet implements Comparable<HierarchicalActionSet>,Serializable {
private String astNodeType;
private Action action;
@@ -72,6 +72,7 @@ public class HierarchicalRegrouper {
}
}
}
return reActionSets;
}