diff --git a/FixPatternMiner.iml b/FixPatternMiner.iml index a1e4217..05d2946 100644 --- a/FixPatternMiner.iml +++ b/FixPatternMiner.iml @@ -56,5 +56,6 @@ + \ No newline at end of file diff --git a/pom.xml b/pom.xml index ad887f3..58211fc 100644 --- a/pom.xml +++ b/pom.xml @@ -67,6 +67,14 @@ 2.8.1 + + + org.apache.commons + commons-text + 1.3 + + + @@ -94,7 +102,7 @@ - edu.lu.uni.serval.FixPatternParser.violations.MultiThreadTreeLoader + edu.lu.uni.serval.FixPatternParser.violations.TestHunkParser diff --git a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationHunkParser.java b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationHunkParser.java index 945a73c..b768994 100644 --- a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationHunkParser.java +++ b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationHunkParser.java @@ -52,10 +52,10 @@ public class FixedViolationHunkParser extends FixedViolationParser { 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); + String hunkTreeFileName = root+pj.replace("DiffEntries","ActionSetDumps/") + diffentryFile.getName() + "_" + String.valueOf(hunkSet); f = new FileOutputStream(new File(hunkTreeFileName)); ObjectOutputStream o = new ObjectOutputStream(f); - o.writeObject(actionSet.getNode()); + o.writeObject(actionSet); o.close(); f.close(); diff --git a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/MultiThreadTreeLoader.java b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/MultiThreadTreeLoader.java index 0104ea6..9fe832f 100644 --- a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/MultiThreadTreeLoader.java +++ b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/MultiThreadTreeLoader.java @@ -243,7 +243,7 @@ public class MultiThreadTreeLoader { for (File pj : pjs) { File[] files = pj.listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { - return name.startsWith("ASTDumps"); + return name.startsWith("ActionSetDumps"); } }); Collections.addAll(fileToCompare, files[0].listFiles()); diff --git a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/MultiThreadTreeLoaderCluster.java b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/MultiThreadTreeLoaderCluster.java index 6ee554a..be1a7c0 100644 --- a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/MultiThreadTreeLoaderCluster.java +++ b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/MultiThreadTreeLoaderCluster.java @@ -5,6 +5,7 @@ import com.github.gumtreediff.actions.model.*; import com.github.gumtreediff.matchers.Matcher; import com.github.gumtreediff.matchers.Matchers; import com.github.gumtreediff.tree.ITree; +import com.github.gumtreediff.tree.Tree; import edu.lu.uni.serval.gumtree.GumTreeComparer; import edu.lu.uni.serval.gumtree.regroup.HierarchicalActionSet; import edu.lu.uni.serval.gumtree.regroup.HierarchicalRegrouper; @@ -68,7 +69,7 @@ public class MultiThreadTreeLoaderCluster { inputPath = "/Users/anilkoyuncu/bugStudy/code/python/clusterDumps"; outputPath = "/Users/anilkoyuncu/bugStudy/dataset/"; port = "6379"; - pairsCSVPath = "/Users/anilkoyuncu/bugStudy/dataset/pairs_csv/"; + pairsCSVPath = "/Users/anilkoyuncu/bugStudy/dataset/pairs-csv/"; importScript = "/Users/anilkoyuncu/bugStudy/dataset/redisSingleImport.sh"; } @@ -120,41 +121,41 @@ public class MultiThreadTreeLoaderCluster { for (File f:folders){ + if(f.getName().startsWith("cluster76")) { + try (Jedis jedis = jedisPool.getResource()) { + // do operations with jedis resource + ScanParams sc = new ScanParams(); + sc.count(150000000); + sc.match("pair_[0-9]*"); - try (Jedis jedis = jedisPool.getResource()) { - // do operations with jedis resource - ScanParams sc = new ScanParams(); - sc.count(150000000); - sc.match("pair_[0-9]*"); + log.info("Scanning"); + ScanResult scan = jedis.scan("0", sc); + int size = scan.getResult().size(); - log.info("Scanning"); - ScanResult scan = jedis.scan("0",sc); - int size = scan.getResult().size(); - log.info("Scanning " + String.valueOf(size)); - if (size == 0){ - loadRedis(cmd,f); + if (size == 0) { + loadRedis(cmd, f); + + scan = jedis.scan("0", sc); + size = scan.getResult().size(); + + } + log.info("Scanned " + String.valueOf(size)); + + + String clusterName = f.getName().replaceAll("[^0-9]+", ""); + + + //76 + + scan.getResult().parallelStream() + .forEach(m -> coreCompare(m, inputPath, jedisPool, clusterName)); + + + jedis.save(); - scan = jedis.scan("0",sc); - size = scan.getResult().size(); - log.info("Scanning " + String.valueOf(size)); } - - - - String clusterName = f.getName().replaceAll("[^0-9]+", ""); - - - - scan.getResult().parallelStream() - .forEach(m -> coreCompare(m, inputPath, jedisPool,clusterName)); - - - - - jedis.save(); - } @@ -166,6 +167,8 @@ public class MultiThreadTreeLoaderCluster { + + public static Pair getTree(String firstValue){ String gumTreeInput = "/Volumes/data/bugStudy_backup/dataset/GumTreeInputBug4/"; String[] split2 = firstValue.split("/"); @@ -195,24 +198,30 @@ public class MultiThreadTreeLoaderCluster { HierarchicalActionSet actionSet = actionSets.get(Integer.valueOf(actionSetPosition)); // for (HierarchicalActionSet actionSet : actionSets) { - ITree test = getActionTree(actionSet); - test.getLabel(); - for (ITree descendant : test.getDescendants()) { -// descendant.setLabel(""); - if(!(descendant.getType() == 100 || descendant.getType() == 101 || descendant.getType() == 102 || descendant.getType() == 103)){ - descendant.setType(104); - } + + + ITree actionTree= null; + ITree test2 = null; + getActionTree(actionSet); + ITree node = actionSet.getNode(); + List descendants = node.getDescendants(); + for (ITree descendant : descendants) { + if(descendant.getType() <= 100){ + descendant.setType(104); } - test.getDescendants(); - test.setParent(null); -// } + } + node.setParent(null); + + + // } // } - Pair pair = new Pair<>(test,project); + Pair pair = new Pair<>(node,project); return pair; } - public static ITree getActionTree(HierarchicalActionSet actionSet){ + + public static void getActionTree(HierarchicalActionSet actionSet){ int newType = 0; @@ -239,8 +248,47 @@ public class MultiThreadTreeLoaderCluster { } - return actionSet.getNode(); + } +// public static ITree getActionTree(HierarchicalActionSet actionSet, ITree parent, ITree children){ +// +// int newType = 0; +// +// Action action = actionSet.getAction(); +// if (action instanceof Update){ +// newType = 101; +// }else if(action instanceof Insert){ +// newType =100; +// }else if(action instanceof Move){ +// newType = 102; +// }else if(action instanceof Delete){ +// newType=103; +// }else{ +// new Exception("unknow action"); +// } +// if(actionSet.getParent() == null){ +// //root +// +// parent = new Tree(newType,""); +// }else{ +// children = new Tree(newType,""); +// parent.addChild(children); +// } +// List subActions = actionSet.getSubActions(); +// if (subActions.size() != 0){ +// for (HierarchicalActionSet subAction : subActions) { +// +// if(actionSet.getParent() == null){ +// children = parent; +// } +// getActionTree(subAction,children,null); +// +// } +// +// +// } +// return parent; +// } @@ -464,9 +512,9 @@ orginal calculate pairs, from all dumps of the projects String line = null; try { - FileChannel rwChannel = new RandomAccessFile(outputPath + "pairs/" +filename+".txt", "rw").getChannel(); - ByteBuffer wrBuf = rwChannel.map(FileChannel.MapMode.READ_WRITE, 0, 1000*treesFileNames.size()*treesFileNames.size()); - int fileCounter = 0; + FileOutputStream fos = new FileOutputStream(outputPath + "pairs/" +filename+".txt"); + DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(fos)); + for (int i = 0; i < treesFileNames.size(); i++) { @@ -475,22 +523,11 @@ orginal calculate pairs, from all dumps of the projects line = String.valueOf(i) +"\t" + String.valueOf(j) + "\t" + treesFileNames.get(i).replace(inputPath,"") + "\t" + treesFileNames.get(j).replace(inputPath,"")+"\n"; - buf = line.getBytes(); - if(wrBuf.remaining() > 500) { - wrBuf.put(buf); - }else{ - log.info("Next pair dump"); - fileCounter++; - rwChannel = new RandomAccessFile(outputPath+"pairs/" +filename+String.valueOf(fileCounter)+".txt", "rw").getChannel(); - wrBuf = rwChannel.map(FileChannel.MapMode.READ_WRITE, 0, Integer.MAX_VALUE); - } - - - + outStream.write(line.getBytes()); } } - rwChannel.close(); + outStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { diff --git a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/MultiThreadTreeLoaderCluster3.java b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/MultiThreadTreeLoaderCluster3.java new file mode 100644 index 0000000..4ac21e9 --- /dev/null +++ b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/MultiThreadTreeLoaderCluster3.java @@ -0,0 +1,832 @@ +package edu.lu.uni.serval.FixPatternParser.violations; + +import com.github.gumtreediff.actions.ActionGenerator; +import com.github.gumtreediff.actions.model.*; +import com.github.gumtreediff.matchers.Matcher; +import com.github.gumtreediff.matchers.Matchers; +import com.github.gumtreediff.tree.ITree; +import edu.lu.uni.serval.gumtree.GumTreeComparer; +import edu.lu.uni.serval.gumtree.regroup.HierarchicalActionSet; +import edu.lu.uni.serval.gumtree.regroup.HierarchicalRegrouper; +import edu.lu.uni.serval.utils.FileHelper; +import edu.lu.uni.serval.utils.ListSorter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import redis.clients.jedis.*; + +import java.io.*; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.time.Duration; +import java.util.*; +import java.util.concurrent.Executors; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.apache.commons.text.similarity.*; + +/** + * Created by anilkoyuncu on 19/03/2018. + */ +public class MultiThreadTreeLoaderCluster3 { + + private static int resultType; + + private static class StreamGobbler implements Runnable { + private InputStream inputStream; + private Consumer consumer; + + public StreamGobbler(InputStream inputStream, Consumer consumer) { + this.inputStream = inputStream; + this.consumer = consumer; + } + + @Override + public void run() { + new BufferedReader(new InputStreamReader(inputStream)).lines() + .forEach(consumer); + } + } + + private static Logger log = LoggerFactory.getLogger(MultiThreadTreeLoaderCluster3.class); + + public static void main(String[] args){ + + String inputPath; + String outputPath; + String port; + String pairsCSVPath; + String importScript; + String csvScript; + if (args.length > 0) { + inputPath = args[0]; + outputPath = args[1]; + port = args[2]; + pairsCSVPath = args[3]; + importScript = args[4]; + csvScript = args[5]; + } else { +// inputPath = "/Users/anilkoyuncu/bugStudy/dataset/GumTreeOutput2/"; + inputPath = "/Users/anilkoyuncu/bugStudy/code/python/cluster2L"; + outputPath = "/Users/anilkoyuncu/bugStudy/dataset/"; + port = "6379"; + pairsCSVPath = "/Users/anilkoyuncu/bugStudy/dataset/pairs-2l-csv/"; + importScript = "/Users/anilkoyuncu/bugStudy/dataset/redisSingleImport.sh"; + csvScript = "/Users/anilkoyuncu/bugStudy/dataset/transformCSV.sh"; + } + + calculatePairsOfClusters(inputPath, outputPath); + +// createCSV(csvScript,outputPath + "pairs-2l/",pairsCSVPath); + + //create csv file and move + + mainCompare(inputPath,port,pairsCSVPath,importScript); + // calculatePairs(inputPath, outputPath); +// processMessages(inputPath,outputPath); +// evaluateResults(inputPath,outputPath); + + } + + public static void createCSV(String csvScript, String f1, String f2){ + String cmd; + cmd = "bash " + csvScript +" %s %s"; + Process process = null; + File source = new File(f1); + File dest = new File(f2); + log.info(source.getName()); + log.info(dest.getName()); + try { + String comd = String.format(cmd, source.getAbsoluteFile() ,dest.getAbsoluteFile()); + process = Runtime.getRuntime() + + .exec(comd); + + + StreamGobbler streamGobbler = + new StreamGobbler(process.getInputStream(), System.out::println); + Executors.newSingleThreadExecutor().submit(streamGobbler); + int exitCode = process.waitFor(); + assert exitCode == 0; + } catch (IOException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + }finally { + process.destroyForcibly(); + } + log.info("Load done"); + + } + + public static void loadRedis(String cmd, File f){ + Process process; + log.info(f.getName()); + try { + String comd = String.format(cmd, f.getAbsoluteFile()); + process = Runtime.getRuntime() + + .exec(comd); + + + StreamGobbler streamGobbler = + new StreamGobbler(process.getInputStream(), System.out::println); + Executors.newSingleThreadExecutor().submit(streamGobbler); + int exitCode = process.waitFor(); + assert exitCode == 0; + } catch (IOException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + log.info("Load done"); + } + + public static void mainCompare(String inputPath,String port,String pairsCSVPath,String importScript) { + + String cmd; + cmd = "bash " + importScript +" %s"; + + JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1",Integer.valueOf(port),20000000); + + + File folder = new File(pairsCSVPath); + File[] listOfFiles = folder.listFiles(); + Stream stream = Arrays.stream(listOfFiles); + List folders = stream + .filter(x -> !x.getName().startsWith(".")) + .collect(Collectors.toList()); + + for (File f:folders){ + + + + + try (Jedis jedis = jedisPool.getResource()) { + // do operations with jedis resource + ScanParams sc = new ScanParams(); + sc.count(150000000); + sc.match("pair_[0-9]*"); + + log.info("Scanning"); + ScanResult scan = jedis.scan("0",sc); + int size = scan.getResult().size(); + + if (size == 0){ + loadRedis(cmd,f); + + scan = jedis.scan("0",sc); + size = scan.getResult().size(); + + } + log.info("Scanned " + String.valueOf(size)); + + + String clusterName = f.getName().split("\\.")[0].replace("cluster",""); + + + + + scan.getResult().parallelStream() + .forEach(m -> coreCompare(m, inputPath, jedisPool,clusterName)); + + + + + jedis.save(); + + } + + + + + } + + + + } + + + + + + public static ITree getTree(String firstValue){ + String gumTreeInput = "/Volumes/data/bugStudy_backup/dataset/GumTreeInputBug4/"; + String[] split2 = firstValue.split("/"); + String cluster = split2[1]; + String subCluster = split2[2]; + String filename = split2[3]; + String[] split1= filename.split(".txt_"); + String s = split1[0]; + String[] splitPJ = split1[1].split("_"); + String project = splitPJ[1]; + String actionSetPosition = splitPJ[0]; + + + File folder = new File("/Users/anilkoyuncu/bugStudy/code/python/clusterDumps/"+cluster + "/" + s + ".txt_" + actionSetPosition); + + + ITree tree = null; + try { + FileInputStream fi = new FileInputStream(folder); + ObjectInputStream oi = new ObjectInputStream(fi); + tree = (ITree) oi.readObject(); + oi.close(); + fi.close(); + + + } catch (FileNotFoundException e) { + log.error("File not found"); + e.printStackTrace(); + } catch (IOException e) { + log.error("Error initializing stream"); + e.printStackTrace(); + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return tree; + +// File[] listOfFiles = folder.listFiles(); +// Stream stream = Arrays.stream(listOfFiles); +// List folders = stream +// .filter(x -> !x.getName().startsWith(".") && x.getName().startsWith(split2[2])) +// .collect(Collectors.toList()); +// +// +// +//// String[] split1 = folders.get(0).getName().split(".txt_"); +//// String s = split1[0]; +//// String[] splitPJ = split1[1].split("_"); +//// String project = splitPJ[1]; +//// String actionSetPosition = splitPJ[0]; +// +// File prevFile = new File(gumTreeInput + project+ "/" + "prevFiles/prev_" + s + ".java");// previous file +// File revFile = new File(gumTreeInput + project+ "/" + "revFiles/" + s + ".java");//rev file +// +// List actionSets = parseChangedSourceCodeWithGumTree2(prevFile, revFile); +// +// HierarchicalActionSet actionSet = actionSets.get(Integer.valueOf(actionSetPosition)); +//// for (HierarchicalActionSet actionSet : actionSets) { +// +// ITree test = getActionTree(actionSet); +// test.getLabel(); +// for (ITree descendant : test.getDescendants()) { +//// descendant.setLabel(""); +// if(!(descendant.getType() == 100 || descendant.getType() == 101 || descendant.getType() == 102 || descendant.getType() == 103)){ +// descendant.setType(104); +// } +// } +// test.getDescendants(); +// test.setParent(null); +//// } +//// } +// +// Pair pair = new Pair<>(test,project); +// return pair; + } + + public static ITree getActionTree(HierarchicalActionSet actionSet){ + + + int newType = 0; + + Action action = actionSet.getAction(); + if (action instanceof Update){ + newType = 101; + }else if(action instanceof Insert){ + newType =100; + }else if(action instanceof Move){ + newType = 102; + }else if(action instanceof Delete){ + newType=103; + }else{ + new Exception("unknow action"); + } + actionSet.getNode().setType(newType); +// actionSet.getNode().setLabel(""); + List subActions = actionSet.getSubActions(); + if (subActions.size() != 0){ + for (HierarchicalActionSet subAction : subActions) { + getActionTree(subAction); + } + + + } + return actionSet.getNode(); + } + + private static List getNames(ITree oldTree, List oldTokens){ + if((oldTree.getType() == 42 && oldTree.getLabel().startsWith("Name:")) || oldTree.getType() == 42 && oldTree.getParent().getType() == 59 || oldTree.getType() == 43 || (oldTree.getType() == 41 && oldTree.getLabel().startsWith("SimpleName:")) ){ + + oldTokens.add(oldTree.getLabel()); + + } + for (ITree oldDescendant : oldTree.getDescendants()) { + if ((oldDescendant.getType() == 42 && oldDescendant.getLabel().startsWith("Name:") ) || oldDescendant.getType() == 42 && oldDescendant.getParent().getType() == 59 ||oldDescendant.getType() == 43 || (oldDescendant.getType() == 41 && oldDescendant.getLabel().startsWith("SimpleName:"))){ + + oldTokens.add(oldDescendant.getLabel()); + + } + } + return oldTokens; + } + + private static void coreCompare(String name , String inputPath, JedisPool jedisPool,String clusterName) { + + + try (Jedis jedis = jedisPool.getResource()) { + + + Map resultMap = jedis.hgetAll(name); + + + + + String[] split = name.split("_"); + String i = null; + String j =null; + try { + i = split[1]; + j = split[2]; + } + catch (Exception e){ + e.printStackTrace(); + } + String firstValue = resultMap.get("0"); + String secondValue = resultMap.get("1"); + + ///35/1/22b5f7_84bf27_ui#org.eclipse.pde.runtime#src#org#eclipse#pde#internal#runtime#registry#RegistryBrowserLabelProvider.txt_2_PDE + + + +// firstValue = inputPath + firstValue; +// secondValue = inputPath + secondValue; + +// String[] firstValueSplit = firstValue.split("/"); +// String[] secondValueSplit = secondValue.split("/"); +// +// if (firstValueSplit.length == 1) { +// firstValue = inputPath + firstValueSplit[0]; +// } else { +// firstValue = inputPath + firstValueSplit[1]; +// } +// +// if (secondValueSplit.length == 1) { +// secondValue = inputPath + secondValueSplit[0]; +// } else { +// secondValue = inputPath + secondValueSplit[1]; +// } + + try { + ITree oldTree = getTree(firstValue); + ITree newTree = getTree(secondValue); + +// ITree oldTree = oldPair.getValue0(); +// ITree newTree = newPair.getValue0(); +// +// String oldProject = oldPair.getValue1(); +// String newProject = newPair.getValue1(); + + List oldTokens = new ArrayList<>(); + List newTokens = new ArrayList<>(); + + +// if(secondValue.startsWith("/2/")){ +// log.info("newss"); +// } + + // 41 return statement + + oldTokens = getNames(oldTree,oldTokens); + newTokens = getNames(newTree,newTokens); + Matcher m = Matchers.getInstance().getMatcher(oldTree, newTree); + m.match(); + CharSequence[] oldSequences = oldTokens.toArray(new CharSequence[oldTokens.size()]); + CharSequence[] newSequences = newTokens.toArray(new CharSequence[newTokens.size()]); + JaroWinklerDistance jwd = new JaroWinklerDistance(); + Double overallSimi = Double.valueOf(1); + if(oldSequences.length > 0 && (oldSequences.length == newSequences.length)){ + for (int idx = 0; idx < newSequences.length; idx++) { + Double simi = jwd.apply(newSequences[idx], oldSequences[idx]); + overallSimi = simi * overallSimi; + } + }else{ + overallSimi = Double.valueOf(0); + if(oldSequences.length != 0) { + log.info("ERROR"); + } + } + if(overallSimi.equals(1.0)){ + +// log.info("YES"); +// log.info(name); +// log.info(firstValue); +// log.info(secondValue); +// log.info("************"); + String matchKey = "match-"+clusterName+"_" + (String.valueOf(i)) + "_" + String.valueOf(j); + String result = firstValue + "," + secondValue; + jedis.select(1); + jedis.set(matchKey, result); + } + jedis.select(0); + String pairKey = "pair_" + (String.valueOf(i)) + "_" + String.valueOf(j); + jedis.del(pairKey); + + + + +// ActionGenerator ag = new ActionGenerator(oldTree, newTree, m.getMappings()); +// ag.generate(); +// List actions = ag.getActions(); +// +// String resultKey = "result_" + (String.valueOf(i)) + "_" + String.valueOf(j); +// double chawatheSimilarity1 = m.chawatheSimilarity(oldTree, newTree); +// String chawatheSimilarity = String.format("%1.2f", chawatheSimilarity1); +// double diceSimilarity1 = m.diceSimilarity(oldTree, newTree); +// String diceSimilarity = String.format("%1.2f", diceSimilarity1); +// double jaccardSimilarity1 = m.jaccardSimilarity(oldTree, newTree); +// String jaccardSimilarity = String.format("%1.2f", jaccardSimilarity1); +// +// String editDistance = String.valueOf(actions.size()); +// jedis.select(1); +// String result = resultMap.get("0") + "," + oldProject +"," + resultMap.get("1") + "," +newProject+ "," + chawatheSimilarity + "," + diceSimilarity + "," + jaccardSimilarity + "," + editDistance; +//// jedis.set(resultKey, result); +// +// if (((Double) chawatheSimilarity1).equals(1.0) || ((Double) diceSimilarity1).equals(1.0) +// || ((Double) jaccardSimilarity1).equals(1.0) || actions.size() == 0) { +// String matchKey = "match-"+clusterName+"_" + (String.valueOf(i)) + "_" + String.valueOf(j); +// jedis.select(1); +// jedis.set(matchKey, result); +// } +// jedis.select(0); + +// +//// log.info("Completed " + resultKey); + + }catch (Exception e){ + log.error(e.toString() + " {}",(name)); + + + } + + + + + } + } + + + + protected static List parseChangedSourceCodeWithGumTree2(File prevFile, File revFile) { + List actionSets = new ArrayList<>(); + // GumTree results + List gumTreeResults = new GumTreeComparer().compareTwoFilesWithGumTree(prevFile, revFile); + if (gumTreeResults == null) { + resultType = 1; + return null; + } else if (gumTreeResults.size() == 0){ + resultType = 2; + return actionSets; + } else { + // Regroup GumTre results. + List allActionSets = new HierarchicalRegrouper().regroupGumTreeResults(gumTreeResults); +// for (HierarchicalActionSet actionSet : allActionSets) { +// String astNodeType = actionSet.getAstNodeType(); +// if (astNodeType.endsWith("Statement") || "FieldDeclaration".equals(astNodeType)) { +// actionSets.add(actionSet); +// } +// } + + // Filter out modified actions of changing method names, method parameters, variable names and field names in declaration part. + // variable effects range, sub-actions are these kinds of modification? +// actionSets.addAll(new ActionFilter().filterOutUselessActions(allActionSets)); + + ListSorter sorter = new ListSorter<>(allActionSets); + actionSets = sorter.sortAscending(); + + if (actionSets.size() == 0) { + resultType = 3; + } + + return actionSets; + } + } + + +/* +orginal calculate pairs, from all dumps of the projects + */ + public static void calculatePairs(String inputPath, String outputPath) { + File folder = new File(inputPath); + File[] listOfFiles = folder.listFiles(); + Stream stream = Arrays.stream(listOfFiles); + List pjs = stream + .filter(x -> !x.getName().startsWith(".")) + .collect(Collectors.toList()); + + List 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); + readMessageFiles(fileToCompare, outputPath); + } + + /* + pairs of each cluster + */ + public static void calculatePairsOfClusters(String inputPath, String outputPath) { + File folder = new File(inputPath); + File[] listOfFiles = folder.listFiles(); + Stream stream = Arrays.stream(listOfFiles); + List pjs = stream + .filter(x -> !x.getName().startsWith(".")) + .collect(Collectors.toList()); + + FileHelper.createDirectory(outputPath + "pairs-2l/"); + + for (File pj : pjs) { + File[] files = pj.listFiles(); + List fileList = Arrays.asList(files); + for (File cluster:fileList) { + if (cluster.getName().startsWith(".")){ + continue; + } + File[] clusterFiles = cluster.listFiles(); + List clusterFilesL = Arrays.asList(clusterFiles); + readMessageFilesCluster(clusterFilesL, outputPath, inputPath, pj.getName(), cluster.getName()); + + + + + } + + } + + } + + public static void processMessages(String inputPath, String outputPath) { + File folder = new File(outputPath + "pairs_splitted/"); + File[] listOfFiles = folder.listFiles(); + Stream stream = Arrays.stream(listOfFiles); + List pjs = stream + .filter(x -> !x.getName().startsWith(".")) + .collect(Collectors.toList()); + FileHelper.createDirectory(outputPath + "comparison_splitted/"); + pjs.parallelStream() + .forEach(m -> coreLoop(m, outputPath,inputPath)); + } + + private static void readMessageFilesCluster(List folders, String outputPath,String inputPath,String cluster, String subCluster) { + + List treesFileNames = new ArrayList<>(); + + + for (File target : folders) { + + treesFileNames.add(target.toString()); + } + + log.info("Calculating pairs"); +// treesFileNames = treesFileNames.subList(0,100); + + String filename = "cluster" + cluster + "_" + subCluster; + byte [] buf = new byte[0]; + String line = null; + try { + +// FileChannel rwChannel = new RandomAccessFile(outputPath + "pairs-2l/" +filename+".txt", "rw").getChannel(); +// ByteBuffer wrBuf = rwChannel.map(FileChannel.MapMode.READ_WRITE, 0, 1000*treesFileNames.size()*treesFileNames.size()); +// int fileCounter = 0; + + FileOutputStream fos = new FileOutputStream(outputPath + "pairs-2l/" +filename+".txt"); + DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(fos)); + + + + for (int i = 0; i < treesFileNames.size(); i++) { + for (int j = i + 1; j < treesFileNames.size(); j++) { + + + + line = String.valueOf(i) +"\t" + String.valueOf(j) + "\t" + treesFileNames.get(i).replace(inputPath,"") + "\t" + treesFileNames.get(j).replace(inputPath,"")+"\n"; + outStream.write(line.getBytes()); +// buf = line.getBytes(); +// if(wrBuf.remaining() > 500) { +// wrBuf.put(buf); +// }else{ +// log.info("Next pair dump"); +// fileCounter++; +// rwChannel = new RandomAccessFile(outputPath+"pairs/" +filename+String.valueOf(fileCounter)+".txt", "rw").getChannel(); +// wrBuf = rwChannel.map(FileChannel.MapMode.READ_WRITE, 0, Integer.MAX_VALUE); +// } + + + + + } + } + outStream.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + }catch (java.nio.BufferOverflowException e) { + log.error(line); + log.error(String.valueOf(buf.length)); + e.printStackTrace(); + } + + log.info("Done pairs"); + } + + + + 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) { + log.error("File not found"); + e.printStackTrace(); + } catch (IOException e) { + log.error("Error initializing stream"); + e.printStackTrace(); + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + +// tree.setLabel(""); + tree.setParent(null); +// List descendants = tree.getDescendants(); +// for (ITree descendant : descendants) { +// descendant.setLabel(""); +// } + + return tree; + + } + + + private static void coreLoop(File mes, String outputPath,String inputPath) { + try { + + log.info("Starting in coreLoop"); + + BufferedReader br = null; + String sCurrentLine = null; + BufferedWriter writer = new BufferedWriter(new FileWriter(outputPath + "comparison_splitted/" + "output_" + mes.getName())); + + br = new BufferedReader( + new FileReader(mes)); + while ((sCurrentLine = br.readLine()) != null) { + String currentLine = sCurrentLine; + String[] split = currentLine.split("\t"); + String i = split[0]; + String j = split[1]; + String firstValue = split[2]; + String secondValue = split[3]; + + firstValue = inputPath + firstValue.split("GumTreeOutput2")[1]; + secondValue = inputPath + secondValue.split("GumTreeOutput2")[1]; + + ITree oldTree = getSimpliedTree(firstValue); + + ITree newTree = getSimpliedTree(secondValue); + + Matcher m = Matchers.getInstance().getMatcher(oldTree, newTree); + m.match(); + + ActionGenerator ag = new ActionGenerator(oldTree, newTree, m.getMappings()); + ag.generate(); + List 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(firstValue); + writer.write("\t"); + writer.write(secondValue); + writer.write("\n"); + + + } + writer.close(); + } catch (FileNotFoundException e) { + log.error("File not found"); + e.printStackTrace(); + } catch (IOException e) { + log.error("Error initializing stream"); + e.printStackTrace(); + + } + log.info("Completed output_" + mes.getName()); + } + + private static void readMessageFiles(List folders, String outputPath) { + + List treesFileNames = new ArrayList<>(); + + + for (File target : folders) { + + treesFileNames.add(target.toString()); + } + FileHelper.createDirectory(outputPath + "pairs/"); + log.info("Calculating pairs"); +// treesFileNames = treesFileNames.subList(0,100); + byte [] buf = new byte[0]; + String line = null; + try { + + FileChannel rwChannel = new RandomAccessFile(outputPath + "pairs/" +"textfile.txt", "rw").getChannel(); + ByteBuffer wrBuf = rwChannel.map(FileChannel.MapMode.READ_WRITE, 0, Integer.MAX_VALUE); + int fileCounter = 0; + + + for (int i = 0; i < treesFileNames.size(); i++) { + for (int j = i + 1; j < treesFileNames.size(); j++) { + + + + line = String.valueOf(i) +"\t" + String.valueOf(j) + "\t" + treesFileNames.get(i).replace("/Users/anilkoyuncu/bugStudy/dataset/GumTreeOutput2","") + "\t" + treesFileNames.get(j).replace("/Users/anilkoyuncu/bugStudy/dataset/GumTreeOutput2","")+"\n"; + buf = line.getBytes(); + if(wrBuf.remaining() > 500) { + wrBuf.put(buf); + }else{ + log.info("Next pair dump"); + fileCounter++; + rwChannel = new RandomAccessFile(outputPath+"pairs/" +"textfile"+String.valueOf(fileCounter)+".txt", "rw").getChannel(); + wrBuf = rwChannel.map(FileChannel.MapMode.READ_WRITE, 0, Integer.MAX_VALUE); + } + + + + + } + } + rwChannel.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + }catch (java.nio.BufferOverflowException e) { + log.error(line); + log.error(String.valueOf(buf.length)); + e.printStackTrace(); + } + + log.info("Done pairs"); + } + + static final JedisPoolConfig poolConfig = buildPoolConfig(); + + + private static JedisPoolConfig buildPoolConfig() { + final JedisPoolConfig poolConfig = new JedisPoolConfig(); + poolConfig.setMaxTotal(128); + poolConfig.setMaxIdle(128); + poolConfig.setMinIdle(16); + poolConfig.setTestOnBorrow(true); + poolConfig.setTestOnReturn(true); + poolConfig.setTestWhileIdle(true); + poolConfig.setMinEvictableIdleTimeMillis(Duration.ofMinutes(60).toMillis()); + poolConfig.setTimeBetweenEvictionRunsMillis(Duration.ofHours(30).toMillis()); + poolConfig.setNumTestsPerEvictionRun(3); + poolConfig.setBlockWhenExhausted(true); + + return poolConfig; + } + + + +// return msgFiles; +} + + + + diff --git a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/TestHunkParser.java b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/TestHunkParser.java index 47d8318..d705c3b 100644 --- a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/TestHunkParser.java +++ b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/TestHunkParser.java @@ -16,15 +16,22 @@ import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; import java.util.stream.Stream; +import akka.actor.ActorRef; +import akka.actor.ActorSystem; import edu.lu.uni.serval.FixPatternParser.RunnableParser; +import edu.lu.uni.serval.MultipleThreadsParser.AkkaParser; import edu.lu.uni.serval.MultipleThreadsParser.MessageFile; +import edu.lu.uni.serval.MultipleThreadsParser.ParseFixPatternActor; +import edu.lu.uni.serval.MultipleThreadsParser.WorkMessage; import edu.lu.uni.serval.config.Configuration; import edu.lu.uni.serval.utils.FileHelper; import org.eclipse.jgit.revwalk.RevCommit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class TestHunkParser { - + private static Logger log = LoggerFactory.getLogger(TestHunkParser.class); public static void main(String[] args) { // input data @@ -80,7 +87,7 @@ public class TestHunkParser { final String alarmTypesFilePath = GUM_TREE_OUTPUT + "alarmTypes.list"; - FileHelper.createDirectory(GUM_TREE_OUTPUT + "/ASTDumps"); + FileHelper.createDirectory(GUM_TREE_OUTPUT + "/ActionSetDumps"); FileHelper.deleteDirectory(editScriptsFilePath); FileHelper.deleteDirectory(patchesSourceCodeFilePath); FileHelper.deleteDirectory(buggyTokensFilePath); @@ -94,51 +101,65 @@ public class TestHunkParser { StringBuilder alarmTypes = new StringBuilder(); int a = 0; + + ActorSystem system = null; + ActorRef parsingActor = null; + final WorkMessage msg = new WorkMessage(0, msgFiles); + try { + log.info("Akka begins..."); + system = ActorSystem.create("Mining-FixPattern-System"); + parsingActor = system.actorOf(ParseFixPatternActor.props(20, editScriptsFilePath, + patchesSourceCodeFilePath, buggyTokensFilePath, editScriptSizesFilePath), "mine-fix-pattern-actor"); + parsingActor.tell(msg, ActorRef.noSender()); + } catch (Exception e) { + system.shutdown(); + e.printStackTrace(); + } // int counter = 0; - for (MessageFile msgFile : msgFiles) { - FixedViolationHunkParser parser = new FixedViolationHunkParser(); - - final ExecutorService executor = Executors.newSingleThreadExecutor(); - // schedule the work - final Future future = executor.submit(new RunnableParser(msgFile.getPrevFile(), - msgFile.getRevFile(), msgFile.getDiffEntryFile(), parser)); - try { - // where we wait for task to complete - future.get(Configuration.SECONDS_TO_WAIT, TimeUnit.SECONDS); - String editScripts = parser.getAstEditScripts(); - if (!editScripts.equals("")) { - astEditScripts.append(editScripts); - tokens.append(parser.getTokensOfSourceCode()); - sizes.append(parser.getSizes()); - patches.append(parser.getPatchesSourceCode()); - alarmTypes.append(parser.getAlarmTypes()); - - a++; - if (a % 100 == 0) { - FileHelper.outputToFile(editScriptsFilePath, astEditScripts, true); - FileHelper.outputToFile(buggyTokensFilePath, tokens, true); - FileHelper.outputToFile(editScriptSizesFilePath, sizes, true); - FileHelper.outputToFile(patchesSourceCodeFilePath, patches, true); - FileHelper.outputToFile(alarmTypesFilePath, alarmTypes, true); - astEditScripts.setLength(0); - tokens.setLength(0); - sizes.setLength(0); - patches.setLength(0); - alarmTypes.setLength(0); - System.out.println("Finish of parsing " + a + " files......"); - } - } - } catch (TimeoutException e) { - err.println("task timed out"); - future.cancel(true /* mayInterruptIfRunning */); - } catch (InterruptedException e) { - err.println("task interrupted"); - } catch (ExecutionException e) { - err.println("task aborted"); - } finally { - executor.shutdownNow(); - } - } +// for (MessageFile msgFile : msgFiles) { +// FixedViolationHunkParser parser = new FixedViolationHunkParser(); +// +// final ExecutorService executor = Executors.newSingleThreadExecutor(); +// // schedule the work +// final Future future = executor.submit(new RunnableParser(msgFile.getPrevFile(), +// msgFile.getRevFile(), msgFile.getDiffEntryFile(), parser)); +// try { +// // where we wait for task to complete +// future.get(Configuration.SECONDS_TO_WAIT, TimeUnit.SECONDS); +// String editScripts = parser.getAstEditScripts(); +// if (!editScripts.equals("")) { +// astEditScripts.append(editScripts); +// tokens.append(parser.getTokensOfSourceCode()); +// sizes.append(parser.getSizes()); +// patches.append(parser.getPatchesSourceCode()); +// alarmTypes.append(parser.getAlarmTypes()); +// +// a++; +// if (a % 100 == 0) { +// FileHelper.outputToFile(editScriptsFilePath, astEditScripts, true); +// FileHelper.outputToFile(buggyTokensFilePath, tokens, true); +// FileHelper.outputToFile(editScriptSizesFilePath, sizes, true); +// FileHelper.outputToFile(patchesSourceCodeFilePath, patches, true); +// FileHelper.outputToFile(alarmTypesFilePath, alarmTypes, true); +// astEditScripts.setLength(0); +// tokens.setLength(0); +// sizes.setLength(0); +// patches.setLength(0); +// alarmTypes.setLength(0); +// System.out.println("Finish of parsing " + a + " files......"); +// } +// } +// } catch (TimeoutException e) { +// err.println("task timed out"); +// future.cancel(true /* mayInterruptIfRunning */); +// } catch (InterruptedException e) { +// err.println("task interrupted"); +// } catch (ExecutionException e) { +// err.println("task aborted"); +// } finally { +// executor.shutdownNow(); +// } +// } FileHelper.outputToFile(editScriptsFilePath, astEditScripts, true); FileHelper.outputToFile(buggyTokensFilePath, tokens, true); diff --git a/src/main/java/edu/lu/uni/serval/config/Configuration.java b/src/main/java/edu/lu/uni/serval/config/Configuration.java index 3325840..45e21f7 100644 --- a/src/main/java/edu/lu/uni/serval/config/Configuration.java +++ b/src/main/java/edu/lu/uni/serval/config/Configuration.java @@ -2,7 +2,7 @@ package edu.lu.uni.serval.config; public class Configuration { - public static final long SECONDS_TO_WAIT = 900L; + public static final long SECONDS_TO_WAIT = 9000L; // public static String ROOT_PATH = "/Volumes/data/bugStudy/dataset/"; // The root path of all output data. public static String ROOT_PATH = "/Users/anilkoyuncu/bugStudy/dataset/"; // The root path of all output data.