From 6978c3adccbd29e60533b93befef69419fbb3def Mon Sep 17 00:00:00 2001 From: Benjamin DANGLOT Date: Wed, 30 Jun 2021 15:34:42 +0200 Subject: [PATCH] fix: use concurrent map and synchonized methods (#992) --- .../coverage/Coverage.java | 5 +- .../coverage/DiffCoverage.java | 1 + .../coverage/TestClassCoverage.java | 5 +- .../coverage/TestMethodCoverage.java | 6 +- .../diff/ModifiedLinesTool.java | 64 ++++++++++++------- .../maven/DiffTestSelectionMojo.java | 6 +- 6 files changed, 54 insertions(+), 33 deletions(-) diff --git a/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/Coverage.java b/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/Coverage.java index bae9efbd3..e2fb3d22f 100644 --- a/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/Coverage.java +++ b/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/Coverage.java @@ -1,6 +1,7 @@ package eu.stamp_project.diff_test_selection.coverage; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; /** @@ -13,10 +14,10 @@ public class Coverage { public final Map testClassCoverage; public Coverage() { - this.testClassCoverage = new LinkedHashMap<>(); + this.testClassCoverage = new ConcurrentHashMap<>(); } - public void addCoverage(String testClassName, String testMethodName, String className, int line, int hitCounts) { + public synchronized void addCoverage(String testClassName, String testMethodName, String className, int line, int hitCounts) { if (!this.testClassCoverage.containsKey(testClassName)) { this.testClassCoverage.put(testClassName, new TestClassCoverage(testClassName)); } diff --git a/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/DiffCoverage.java b/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/DiffCoverage.java index c2a93a9fd..a3c6339b8 100644 --- a/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/DiffCoverage.java +++ b/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/DiffCoverage.java @@ -4,6 +4,7 @@ import org.slf4j.LoggerFactory; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; /** * created by Benjamin DANGLOT diff --git a/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/TestClassCoverage.java b/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/TestClassCoverage.java index 26e0dc2d8..b14dcf2ec 100644 --- a/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/TestClassCoverage.java +++ b/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/TestClassCoverage.java @@ -1,6 +1,7 @@ package eu.stamp_project.diff_test_selection.coverage; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; /** * @author Benjamin DANGLOT @@ -15,10 +16,10 @@ public class TestClassCoverage { public TestClassCoverage(String testClassName) { this.testClassName = testClassName; - this.testMethodsCoverage = new LinkedHashMap<>(); + this.testMethodsCoverage = new ConcurrentHashMap<>(); } - public void addCoverage(String testMethodName, String className, int line, int hitCounts) { + public synchronized void addCoverage(String testMethodName, String className, int line, int hitCounts) { if (!this.testMethodsCoverage.containsKey(testMethodName)) { this.testMethodsCoverage.put(testMethodName, new TestMethodCoverage(testMethodName)); } diff --git a/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/TestMethodCoverage.java b/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/TestMethodCoverage.java index 743831768..bfbcf20ed 100644 --- a/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/TestMethodCoverage.java +++ b/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/coverage/TestMethodCoverage.java @@ -1,6 +1,7 @@ package eu.stamp_project.diff_test_selection.coverage; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; /** * @author Benjamin DANGLOT @@ -15,13 +16,14 @@ public class TestMethodCoverage { public TestMethodCoverage(String testMethodName) { this.testMethodName = testMethodName; - this.classCoverageList = new LinkedHashMap<>(); + this.classCoverageList = new ConcurrentHashMap<>(); } - public void addCoverage(String className, int line, int hitCounts) { + public synchronized void addCoverage(String className, int line, int hitCounts) { if (!this.classCoverageList.containsKey(className)) { this.classCoverageList.put(className, new ClassCoverage(className)); } + System.out.println(this.classCoverageList.get(className)); this.classCoverageList.get(className).addCoverage(line, hitCounts); } diff --git a/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/diff/ModifiedLinesTool.java b/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/diff/ModifiedLinesTool.java index 5d4ea6065..2ce733191 100644 --- a/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/diff/ModifiedLinesTool.java +++ b/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/diff/ModifiedLinesTool.java @@ -1,9 +1,6 @@ package eu.stamp_project.diff_test_selection.diff; -import com.github.gumtreediff.actions.model.Action; -import com.github.gumtreediff.actions.model.Delete; -import com.github.gumtreediff.actions.model.Insert; -import eu.stamp_project.diff_test_selection.selector.DiffTestSelectionImpl; +import com.github.gumtreediff.actions.model.*; import gumtree.spoon.AstComparator; import gumtree.spoon.diff.Diff; @@ -17,6 +14,8 @@ import java.io.File; import java.util.*; +import static eu.stamp_project.diff_test_selection.diff.ModifiedLinesUtils.filterOperationFromNode; + public class ModifiedLinesTool { private static final Logger LOGGER = LoggerFactory.getLogger(ModifiedLinesTool.class); @@ -105,31 +104,48 @@ private void buildMap(Diff compare) { final List allOperations = compare.getAllOperations(); final List statements = new ArrayList<>(); for (Operation operation : allOperations) { - if (!isDeletionOrAddition(operation.getAction())) { - continue; - } - final CtElement node = ModifiedLinesUtils.filterOperation(operation); - if (node != null && !statements.contains(node.getParent(CtStatement.class))) { - final int line = node.getPosition().getLine(); - final String qualifiedName = node - .getPosition() - .getCompilationUnit() - .getMainType() - .getQualifiedName(); - this.addToCorrespondingMap(operation.getAction(), qualifiedName, line); - // TODO -// if (!(node.getParent(CtStatement.class) instanceof CtBlock)) { -// this.coverage.addModifiedLine(qualifiedName, line); -// } - statements.add(node.getParent(CtStatement.class)); + CtElement node = null; + Class actionClass = null; + if (isDeletionOrAddition(operation.getAction())) { + node = ModifiedLinesUtils.filterOperation(operation); + actionClass = operation.getAction().getClass(); + } else if (operation.getAction() instanceof Move || operation.getAction() instanceof Update) { + if (filterOperationFromNode(operation.getSrcNode())) { + node = operation.getSrcNode(); + actionClass = Addition.class; + computeLineAndAddToMap(statements, node, actionClass, operation); + node = null; + } + if (filterOperationFromNode(operation.getDstNode())) { + node = operation.getDstNode(); + actionClass = Delete.class; + } } + computeLineAndAddToMap(statements, node, actionClass, operation); + } + } + + private void computeLineAndAddToMap(List statements, + CtElement node, + Class actionClass, + Operation operation) { + if (node != null && !statements.contains(node.getParent(CtStatement.class))) { + final int line = node.getPosition().getLine(); + final String qualifiedName = node + .getPosition() + .getCompilationUnit() + .getMainType() + .getQualifiedName(); + this.addToCorrespondingMap(actionClass, qualifiedName, line + + ((operation.getAction() instanceof Move || operation.getAction() instanceof Update) ? 1 : 0)); + statements.add(node.getParent(CtStatement.class)); } } - private void addToCorrespondingMap(Action action, String qualifiedName, int line) { - if (action instanceof Insert) { + private void addToCorrespondingMap(Class actionClass, String qualifiedName, int line) { + if (Addition.class.isAssignableFrom(actionClass)) { this.addToGivenMap(this.additionPerQualifiedName, qualifiedName, line); - } else { + } else if (Delete.class.isAssignableFrom(actionClass)) { this.addToGivenMap(this.deletionPerQualifiedName, qualifiedName, line); } } diff --git a/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/maven/DiffTestSelectionMojo.java b/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/maven/DiffTestSelectionMojo.java index 5cd286034..ae0f1826b 100644 --- a/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/maven/DiffTestSelectionMojo.java +++ b/dspot-diff-test-selection/src/main/java/eu/stamp_project/diff_test_selection/maven/DiffTestSelectionMojo.java @@ -54,14 +54,14 @@ public class DiffTestSelectionMojo extends AbstractMojo { @Override public void execute() throws MojoExecutionException, MojoFailureException { if (new File(this.project.getBasedir().getAbsolutePath() + "/src").exists()) { - final String module = this.project.getBasedir().getAbsolutePath().substring(this.pathDirSecondVersion.length()); + //final String module = this.project.getBasedir().getAbsolutePath().substring(this.pathDirSecondVersion.length()); getLog().info("Running on:"); getLog().info(this.project.getBasedir().getAbsolutePath()); - getLog().info(this.pathDirSecondVersion + "/" + module); + //getLog().info(this.pathDirSecondVersion + "/" + module); Main.run( new Configuration( this.project.getBasedir().getAbsolutePath(), - this.pathDirSecondVersion + "/" + module, + this.pathDirSecondVersion,// + "/" + module, this.outputPath, this.outputFormat, this.pathToDiff,