Skip to content

Commit ea817cd

Browse files
#92 Correctly capturing edge weights
Now correctly capturing edge weights that represent the number of field declarations and method argument formal parameter type declarations of one class in another.
1 parent cb5f997 commit ea817cd

File tree

3 files changed

+34
-49
lines changed

3 files changed

+34
-49
lines changed

circular-reference-detector/src/main/java/org/hjug/parser/JavaProjectParser.java

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
import java.util.stream.Collectors;
1616
import java.util.stream.Stream;
1717
import org.jgrapht.Graph;
18+
import org.jgrapht.graph.DefaultDirectedWeightedGraph;
1819
import org.jgrapht.graph.DefaultWeightedEdge;
19-
import org.jgrapht.graph.builder.GraphTypeBuilder;
2020

2121
public class JavaProjectParser {
2222

@@ -28,12 +28,7 @@ public class JavaProjectParser {
2828
*/
2929
public Graph<String, DefaultWeightedEdge> getClassReferences(String srcDirectory) throws IOException {
3030
Graph<String, DefaultWeightedEdge> classReferencesGraph =
31-
GraphTypeBuilder.<String, DefaultWeightedEdge>directed()
32-
.allowingMultipleEdges(false)
33-
.allowingSelfLoops(true)
34-
.edgeClass(DefaultWeightedEdge.class)
35-
.weighted(true)
36-
.buildGraph();
31+
new DefaultDirectedWeightedGraph<>(DefaultWeightedEdge.class);
3732
if (srcDirectory == null || srcDirectory.isEmpty()) {
3833
throw new IllegalArgumentException();
3934
} else {
@@ -42,20 +37,20 @@ public Graph<String, DefaultWeightedEdge> getClassReferences(String srcDirectory
4237
filesStream
4338
.filter(path -> path.getFileName().toString().endsWith(".java"))
4439
.forEach(path -> {
45-
Set<String> varTypes = getInstanceVarTypes(classNames, path.toFile());
46-
varTypes.addAll(getMethodTypes(classNames, path.toFile()));
47-
if (!varTypes.isEmpty()) {
40+
List<String> types = getInstanceVarTypes(classNames, path.toFile());
41+
types.addAll(getMethodArgumentTypes(classNames, path.toFile()));
42+
if (!types.isEmpty()) {
4843
String className =
4944
getClassName(path.getFileName().toString());
5045
classReferencesGraph.addVertex(className);
51-
varTypes.forEach(classReferencesGraph::addVertex);
52-
varTypes.forEach(varType -> {
53-
DefaultWeightedEdge weightedEdge = classReferencesGraph.addEdge(className, varType);
54-
55-
// not sure why some edges are null, but let's ignore them for now
56-
if (null != weightedEdge) {
46+
types.forEach(classReferencesGraph::addVertex);
47+
types.forEach(type -> {
48+
if (!classReferencesGraph.containsEdge(className, type)) {
49+
classReferencesGraph.addEdge(className, type);
50+
} else {
51+
DefaultWeightedEdge edge = classReferencesGraph.getEdge(className, type);
5752
classReferencesGraph.setEdgeWeight(
58-
weightedEdge, classReferencesGraph.getEdgeWeight(weightedEdge) + 1);
53+
edge, classReferencesGraph.getEdgeWeight(edge) + 1);
5954
}
6055
});
6156
}
@@ -65,10 +60,6 @@ public Graph<String, DefaultWeightedEdge> getClassReferences(String srcDirectory
6560
}
6661
}
6762

68-
for (DefaultWeightedEdge weightedEdge : classReferencesGraph.edgeSet()) {
69-
System.out.println(weightedEdge.toString() + ":" + classReferencesGraph.getEdgeWeight(weightedEdge));
70-
}
71-
7263
return classReferencesGraph;
7364
}
7465

@@ -78,7 +69,7 @@ public Graph<String, DefaultWeightedEdge> getClassReferences(String srcDirectory
7869
* @param file
7970
* @return
8071
*/
81-
private Set<String> getInstanceVarTypes(List<String> classNamesToFilterBy, File javaSrcFile) {
72+
private List<String> getInstanceVarTypes(List<String> classNamesToFilterBy, File javaSrcFile) {
8273
CompilationUnit compilationUnit;
8374
try {
8475
compilationUnit = StaticJavaParser.parse(javaSrcFile);
@@ -87,11 +78,11 @@ private Set<String> getInstanceVarTypes(List<String> classNamesToFilterBy, File
8778
.filter(v -> !v.isPrimitiveType())
8879
.map(Object::toString)
8980
.filter(classNamesToFilterBy::contains)
90-
.collect(Collectors.toSet());
81+
.collect(Collectors.toList());
9182
} catch (FileNotFoundException e) {
9283
e.printStackTrace();
9384
}
94-
return new HashSet<>();
85+
return new ArrayList<>();
9586
}
9687

9788
/**
@@ -100,23 +91,23 @@ private Set<String> getInstanceVarTypes(List<String> classNamesToFilterBy, File
10091
* @param file
10192
* @return
10293
*/
103-
private Set<String> getMethodTypes(List<String> classNamesToFilterBy, File javaSrcFile) {
94+
private List<String> getMethodArgumentTypes(List<String> classNamesToFilterBy, File javaSrcFile) {
10495
CompilationUnit compilationUnit;
10596
try {
10697
compilationUnit = StaticJavaParser.parse(javaSrcFile);
10798
return compilationUnit.findAll(MethodDeclaration.class).stream()
10899
.flatMap(f -> f.getParameters().stream()
109100
.map(Parameter::getType)
110101
.filter(type -> !type.isPrimitiveType())
111-
.collect(Collectors.toSet())
102+
.collect(Collectors.toList())
112103
.stream())
113104
.map(Object::toString)
114105
.filter(classNamesToFilterBy::contains)
115-
.collect(Collectors.toSet());
106+
.collect(Collectors.toList());
116107
} catch (FileNotFoundException e) {
117108
e.printStackTrace();
118109
}
119-
return new HashSet<>();
110+
return new ArrayList<>();
120111
}
121112

122113
/**

circular-reference-detector/src/test/java/org/hjug/parser/JavaProjectParserTests.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ class JavaProjectParserTests {
1616

1717
@DisplayName("When source directory input param is empty or null throw IllegalArgumentException.")
1818
@Test
19-
public void parseSourceDirectoryEmptyTest() {
19+
void parseSourceDirectoryEmptyTest() {
2020
Assertions.assertThrows(IllegalArgumentException.class, () -> sutJavaProjectParser.getClassReferences(""));
2121
Assertions.assertThrows(IllegalArgumentException.class, () -> sutJavaProjectParser.getClassReferences(null));
2222
}
2323

2424
@DisplayName("Given a valid source directory input parameter return a valid graph.")
2525
@Test
26-
public void parseSourceDirectoryTest() throws IOException {
26+
void parseSourceDirectoryTest() throws IOException {
2727
File srcDirectory = new File("src/test/resources/javaSrcDirectory");
2828
Graph<String, DefaultWeightedEdge> classReferencesGraph =
2929
sutJavaProjectParser.getClassReferences(srcDirectory.getAbsolutePath());
@@ -42,7 +42,14 @@ public void parseSourceDirectoryTest() throws IOException {
4242
assertTrue(classReferencesGraph.containsEdge("D", "A"));
4343
assertTrue(classReferencesGraph.containsEdge("D", "C"));
4444
assertTrue(classReferencesGraph.containsEdge("E", "D"));
45-
DefaultWeightedEdge edge = classReferencesGraph.getEdge("E", "D");
46-
assertEquals(2, classReferencesGraph.getEdgeWeight(edge));
45+
46+
// confirm edge weight calculations
47+
assertEquals(1, getEdgeWeight(classReferencesGraph, "A", "B"));
48+
assertEquals(2, getEdgeWeight(classReferencesGraph, "E", "D"));
49+
}
50+
51+
private static double getEdgeWeight(
52+
Graph<String, DefaultWeightedEdge> classReferencesGraph, String sourceVertex, String targetVertex) {
53+
return classReferencesGraph.getEdgeWeight(classReferencesGraph.getEdge(sourceVertex, targetVertex));
4754
}
4855
}

cost-benefit-calculator/src/main/java/org/hjug/cbc/CostBenefitCalculator.java

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
@Slf4j
3636
public class CostBenefitCalculator {
3737

38-
private final Map<String, AsSubgraph> renderedSubGraphs = new HashMap<>();
38+
private final Map<String, AsSubgraph<String, DefaultWeightedEdge>> renderedSubGraphs = new HashMap<>();
3939

4040
private Report report;
4141
private String repositoryPath;
@@ -93,21 +93,8 @@ public List<RankedCycle> runCycleAnalysis(String outputDirectoryPath, boolean re
9393
GusfieldGomoryHuCutTree<String, DefaultWeightedEdge> gusfieldGomoryHuCutTree =
9494
new GusfieldGomoryHuCutTree<>(new AsUndirectedGraph<>(subGraph));
9595
minCut = gusfieldGomoryHuCutTree.calculateMinCut();
96-
log.info("Min cut weight: " + minCut);
9796
minCutEdges = gusfieldGomoryHuCutTree.getCutEdges();
9897

99-
log.info("Minimum Cut Edges:");
100-
for (DefaultWeightedEdge minCutEdge : minCutEdges) {
101-
log.info(minCutEdge.toString());
102-
}
103-
104-
log.info("All edge weights:");
105-
for (DefaultWeightedEdge weightedEdge :
106-
gusfieldGomoryHuCutTree.getGomoryHuTree().edgeSet()) {
107-
log.info(weightedEdge.toString() + ":"
108-
+ gusfieldGomoryHuCutTree.getGomoryHuTree().getEdgeWeight(weightedEdge));
109-
}
110-
11198
List<CycleNode> cycleNodes = subGraph.vertexSet().stream()
11299
.map(classInCycle -> new CycleNode(classInCycle, classNamesAndPaths.get(classInCycle)))
113100
.collect(Collectors.toList());
@@ -120,8 +107,8 @@ public List<RankedCycle> runCycleAnalysis(String outputDirectoryPath, boolean re
120107
}
121108

122109
for (ScmLogInfo changeRank : changeRanks) {
123-
CycleNode cn = cycleNodeMap.get(changeRank.getPath());
124-
cn.setScmLogInfo(changeRank);
110+
CycleNode cycleNode = cycleNodeMap.get(changeRank.getPath());
111+
cycleNode.setScmLogInfo(changeRank);
125112
}
126113

127114
// sum change proneness ranks
@@ -161,7 +148,7 @@ public List<RankedCycle> runCycleAnalysis(String outputDirectoryPath, boolean re
161148

162149
private boolean isDuplicateSubGraph(AsSubgraph<String, DefaultWeightedEdge> subGraph, String vertex) {
163150
if (!renderedSubGraphs.isEmpty()) {
164-
for (AsSubgraph renderedSubGraph : renderedSubGraphs.values()) {
151+
for (AsSubgraph<String, DefaultWeightedEdge> renderedSubGraph : renderedSubGraphs.values()) {
165152
if (renderedSubGraph.vertexSet().size() == subGraph.vertexSet().size()
166153
&& renderedSubGraph.edgeSet().size()
167154
== subGraph.edgeSet().size()

0 commit comments

Comments
 (0)