|
3 | 3 | import com.ideacrest.cycledetector.CircularReferenceChecker; |
4 | 4 | import com.ideacrest.parser.JavaProjectParser; |
5 | 5 | import java.io.IOException; |
| 6 | +import java.util.HashMap; |
6 | 7 | import java.util.Map; |
| 8 | +import java.util.Set; |
7 | 9 | import org.jgrapht.Graph; |
| 10 | +import org.jgrapht.alg.flow.GusfieldGomoryHuCutTree; |
8 | 11 | import org.jgrapht.graph.AsSubgraph; |
| 12 | +import org.jgrapht.graph.AsUndirectedGraph; |
9 | 13 | import org.jgrapht.graph.DefaultEdge; |
10 | 14 |
|
11 | 15 | /** |
|
17 | 21 | */ |
18 | 22 | public class CircularReferenceDetectorApp { |
19 | 23 |
|
| 24 | + private Map<String, AsSubgraph> renderedSubGraphs = new HashMap<>(); |
| 25 | + |
20 | 26 | public static void main(String[] args) { |
21 | 27 | CircularReferenceDetectorApp circularReferenceDetectorApp = new CircularReferenceDetectorApp(); |
22 | 28 | circularReferenceDetectorApp.launchApp(args); |
@@ -49,16 +55,47 @@ private void detectAndStoreCyclesInDirectory( |
49 | 55 | String outputDirectoryPath, Graph<String, DefaultEdge> classReferencesGraph) { |
50 | 56 | CircularReferenceChecker circularReferenceChecker = new CircularReferenceChecker(); |
51 | 57 | Map<String, AsSubgraph<String, DefaultEdge>> cyclesForEveryVertexMap = |
52 | | - circularReferenceChecker.detectCyles(classReferencesGraph); |
| 58 | + circularReferenceChecker.detectCycles(classReferencesGraph); |
53 | 59 | cyclesForEveryVertexMap.forEach((vertex, subGraph) -> { |
54 | 60 | try { |
55 | | - circularReferenceChecker.createImage(outputDirectoryPath, subGraph, vertex); |
| 61 | + int vertexCount = subGraph.vertexSet().size(); |
| 62 | + int edgeCount = subGraph.edgeSet().size(); |
| 63 | + if (vertexCount > 1 && edgeCount > 1 && !isDuplicateSubGraph(subGraph, vertex)) { |
| 64 | + circularReferenceChecker.createImage(outputDirectoryPath, subGraph, vertex); |
| 65 | + renderedSubGraphs.put(vertex, subGraph); |
| 66 | + System.out.println( |
| 67 | + "Vertex: " + vertex + " vertex count: " + vertexCount + " edge count: " + edgeCount); |
| 68 | + GusfieldGomoryHuCutTree<String, DefaultEdge> gusfieldGomoryHuCutTree = |
| 69 | + new GusfieldGomoryHuCutTree<>(new AsUndirectedGraph<>(subGraph)); |
| 70 | + double minCut = gusfieldGomoryHuCutTree.calculateMinCut(); |
| 71 | + System.out.println("Min cut weight: " + minCut); |
| 72 | + Set<DefaultEdge> minCutEdges = gusfieldGomoryHuCutTree.getCutEdges(); |
| 73 | + System.out.println("Minimum Cut Edges:"); |
| 74 | + for (DefaultEdge minCutEdge : minCutEdges) { |
| 75 | + System.out.println(minCutEdge); |
| 76 | + } |
| 77 | + } |
56 | 78 | } catch (IOException e) { |
57 | 79 | e.printStackTrace(); |
58 | 80 | } |
59 | 81 | }); |
60 | 82 | } |
61 | 83 |
|
| 84 | + private boolean isDuplicateSubGraph(AsSubgraph<String, DefaultEdge> subGraph, String vertex) { |
| 85 | + if (!renderedSubGraphs.isEmpty()) { |
| 86 | + for (AsSubgraph renderedSubGraph : renderedSubGraphs.values()) { |
| 87 | + if (renderedSubGraph.vertexSet().size() == subGraph.vertexSet().size() |
| 88 | + && renderedSubGraph.edgeSet().size() |
| 89 | + == subGraph.edgeSet().size() |
| 90 | + && renderedSubGraph.vertexSet().contains(vertex)) { |
| 91 | + return true; |
| 92 | + } |
| 93 | + } |
| 94 | + } |
| 95 | + |
| 96 | + return false; |
| 97 | + } |
| 98 | + |
62 | 99 | private boolean validateArgs(String[] args) { |
63 | 100 | return args.length == 2; |
64 | 101 | } |
|
0 commit comments