diff --git a/cost-benefit-calculator/src/main/java/org/hjug/cbc/CostBenefitCalculator.java b/cost-benefit-calculator/src/main/java/org/hjug/cbc/CostBenefitCalculator.java index 42096a8c..91c6a737 100644 --- a/cost-benefit-calculator/src/main/java/org/hjug/cbc/CostBenefitCalculator.java +++ b/cost-benefit-calculator/src/main/java/org/hjug/cbc/CostBenefitCalculator.java @@ -342,17 +342,19 @@ private List getCBOClasses() { * Ranks candidate class edges using cycle impact, removal flags, and package relationships. * Only edges present in {@code edgeToRemoveCycleCounts} are considered. * - * @param classGraph the class dependency graph - * @param edgeToRemoveCycleCounts the candidate edges and their cycle counts - * @param dto the codebase graph containing corresponding package relationships - * @param vertexesToRemove the class vertices selected for removal - * @param packageCycles the package cycles used to count each relationship's participation + * @param classGraph the class dependency graph + * @param edgeToRemoveCycleCounts the candidate edges and their cycle counts + * @param vertexToRemoveCycleCounts + * @param dto the codebase graph containing corresponding package relationships + * @param vertexesToRemove the class vertices selected for removal + * @param packageCycles the package cycles used to count each relationship's participation * @param packageRelationshipDisharmonies the package relationships selected for removal * @return the ranked class relationships with assigned priorities */ public List calculateRelationshipCostBenefitValues( Graph classGraph, Map edgeToRemoveCycleCounts, + Map vertexToRemoveCycleCounts, CodebaseGraphDTO dto, Set vertexesToRemove, Map> packageCycles, @@ -372,16 +374,19 @@ public List calculateRelationshipCostBenefitValues( VertexInfo edgeSource = classGraph.getEdgeSource(edge); VertexInfo edgeTarget = classGraph.getEdgeTarget(edge); - boolean sourceNodeShouldBeRemoved = vertexesToRemove.contains(edgeSource); - boolean targetNodeShouldBeRemoved = vertexesToRemove.contains(edgeTarget); + int sourceNodeCycleCount = + vertexesToRemove.contains(edgeSource) ? vertexToRemoveCycleCounts.get(edgeSource) : 0; + + int targetNodeCycleCount = + vertexesToRemove.contains(edgeTarget) ? vertexToRemoveCycleCounts.get(edgeTarget) : 0; RankedDisharmony edgeThatNeedsToBeRemoved = new RankedDisharmony( edgeSource.getName(), edge, edgeToRemoveCycleCounts.get(edge), (int) classGraph.getEdgeWeight(edge), - sourceNodeShouldBeRemoved, - targetNodeShouldBeRemoved, + sourceNodeCycleCount, + targetNodeCycleCount, getPackageCycleCount(edgeSource, edgeTarget, dto, packageCycles), packageRelationshipShouldBeRemoved(edgeSource, edgeTarget, dto, packageEdgesToRemove)); @@ -482,9 +487,9 @@ static void sortEdgesThatNeedToBeRemoved(List rankedDisharmoni // then by package cycle count, with classes in more package cycles bubbling to the top .thenComparingInt(rankedDisharmony -> -1 * rankedDisharmony.getPackageCycleCount()) // then if the source node is in the list of nodes to be removed - .thenComparingInt(rankedDisharmony -> -1 * rankedDisharmony.getSourceNodeShouldBeRemoved()) + .thenComparingInt(rankedDisharmony -> -1 * rankedDisharmony.getSourceNodeCycleCount()) // then if the target node is in the list of nodes to be removed - .thenComparingInt(rankedDisharmony -> -1 * rankedDisharmony.getTargetNodeShouldBeRemoved())); + .thenComparingInt(rankedDisharmony -> -1 * rankedDisharmony.getTargetNodeCycleCount())); } private String getFileName(RuleViolation violation) { diff --git a/cost-benefit-calculator/src/main/java/org/hjug/cbc/RankedDisharmony.java b/cost-benefit-calculator/src/main/java/org/hjug/cbc/RankedDisharmony.java index 4995c015..af211261 100644 --- a/cost-benefit-calculator/src/main/java/org/hjug/cbc/RankedDisharmony.java +++ b/cost-benefit-calculator/src/main/java/org/hjug/cbc/RankedDisharmony.java @@ -41,8 +41,8 @@ public class RankedDisharmony { private DefaultWeightedEdge edge; private Integer cycleCount; - private int sourceNodeShouldBeRemoved; - private int targetNodeShouldBeRemoved; + private int sourceNodeCycleCount; + private int targetNodeCycleCount; private String edgeTargetClass; private Integer packageCycleCount; private boolean packageRelationshipShouldBeRemoved; @@ -107,8 +107,8 @@ public RankedDisharmony( DefaultWeightedEdge edge, int cycleCount, int weight, - boolean sourceNodeShouldBeRemoved, - boolean targetNodeShouldBeRemoved, + int sourceNodeCycleCount, + int targetNodeCycleCount, int packageCycleCount, boolean packageRelationshipShouldBeRemoved) { @@ -118,7 +118,7 @@ public RankedDisharmony( this.packageCycleCount = packageCycleCount; this.packageRelationshipShouldBeRemoved = packageRelationshipShouldBeRemoved; effortRank = weight; - this.sourceNodeShouldBeRemoved = sourceNodeShouldBeRemoved ? 1 : 0; - this.targetNodeShouldBeRemoved = targetNodeShouldBeRemoved ? 1 : 0; + this.sourceNodeCycleCount = sourceNodeCycleCount; + this.targetNodeCycleCount = targetNodeCycleCount; } } diff --git a/cost-benefit-calculator/src/test/java/org/hjug/cbc/CostBenefitCalculatorTest.java b/cost-benefit-calculator/src/test/java/org/hjug/cbc/CostBenefitCalculatorTest.java index e82fa540..88a4a318 100644 --- a/cost-benefit-calculator/src/test/java/org/hjug/cbc/CostBenefitCalculatorTest.java +++ b/cost-benefit-calculator/src/test/java/org/hjug/cbc/CostBenefitCalculatorTest.java @@ -118,6 +118,44 @@ void testCostBenefitCalculation() throws IOException, GitAPIException, Interrupt Assertions.assertEquals(2, disharmonies.get(1).getPriority().intValue()); } + @Test + void sortEdgesThatNeedToBeRemoved_prioritizesHigherSourceNodeCycleCounts() { + RankedDisharmony higherSourceCycleCount = + new RankedDisharmony("HigherSource", new DefaultWeightedEdge(), 5, 1, 5, 0, 0, false); + RankedDisharmony higherTargetCycleCount = + new RankedDisharmony("HigherTarget", new DefaultWeightedEdge(), 5, 1, 1, 9, 0, false); + RankedDisharmony lowerSourceCycleCount = + new RankedDisharmony("LowerSource", new DefaultWeightedEdge(), 5, 1, 0, 7, 0, false); + + List rankedDisharmonies = + new ArrayList<>(List.of(higherTargetCycleCount, higherSourceCycleCount, lowerSourceCycleCount)); + + CostBenefitCalculator.sortEdgesThatNeedToBeRemoved(rankedDisharmonies); + + Assertions.assertEquals( + List.of("HigherSource", "HigherTarget", "LowerSource"), + rankedDisharmonies.stream().map(RankedDisharmony::getClassName).toList()); + } + + @Test + void sortEdgesThatNeedToBeRemoved_prioritizesHigherTargetNodeCycleCountsWhenSourceCountsTie() { + RankedDisharmony higherTargetCycleCount = + new RankedDisharmony("HigherTarget", new DefaultWeightedEdge(), 5, 1, 2, 6, 0, false); + RankedDisharmony lowerTargetCycleCount = + new RankedDisharmony("LowerTarget", new DefaultWeightedEdge(), 5, 1, 2, 1, 0, false); + RankedDisharmony lowerSourceCycleCount = + new RankedDisharmony("LowerSource", new DefaultWeightedEdge(), 5, 1, 0, 7, 0, false); + + List rankedDisharmonies = + new ArrayList<>(List.of(lowerTargetCycleCount, higherTargetCycleCount, lowerSourceCycleCount)); + + CostBenefitCalculator.sortEdgesThatNeedToBeRemoved(rankedDisharmonies); + + Assertions.assertEquals( + List.of("HigherTarget", "LowerTarget", "LowerSource"), + rankedDisharmonies.stream().map(RankedDisharmony::getClassName).toList()); + } + /** Verifies candidate edge priorities, cycle counts, effort ranks, and endpoint removal flags. */ @Test void calculateRelationshipCostBenefitValues_filtersMissingLogInfoAndAssignsPriority() throws Exception { @@ -157,6 +195,9 @@ void calculateRelationshipCostBenefitValues_filtersMissingLogInfoAndAssignsPrior Set vertexesToRemove = new HashSet<>(Arrays.asList(VertexInfo.forName("ClassA"), VertexInfo.forName("ClassD"))); + Map vertexToRemoveCycleCounts = new HashMap<>(); + vertexToRemoveCycleCounts.put(VertexInfo.forName("ClassA"), 1); + vertexToRemoveCycleCounts.put(VertexInfo.forName("ClassD"), 1); ScmLogInfo scmLogInfo1 = new ScmLogInfo(hudsonPath + "ClassA.java", null, 1, 2, 3); scmLogInfo1.setChangePronenessRank(4); @@ -174,7 +215,13 @@ void calculateRelationshipCostBenefitValues_filtersMissingLogInfoAndAssignsPrior .thenReturn(new SimpleDirectedWeightedGraph<>(DefaultWeightedEdge.class)); List disharmonies = costBenefitCalculator.calculateRelationshipCostBenefitValues( - classGraph, edgeToRemoveCycleCounts, dto, vertexesToRemove, Collections.emptyMap(), List.of()); + classGraph, + edgeToRemoveCycleCounts, + vertexToRemoveCycleCounts, + dto, + vertexesToRemove, + Collections.emptyMap(), + List.of()); Assertions.assertEquals(2, disharmonies.size()); @@ -182,16 +229,16 @@ void calculateRelationshipCostBenefitValues_filtersMissingLogInfoAndAssignsPrior Assertions.assertEquals("ClassA", classA.getClassName()); Assertions.assertEquals(5, classA.getCycleCount().intValue()); Assertions.assertEquals(4, classA.getEffortRank().intValue()); - Assertions.assertEquals(1, classA.getSourceNodeShouldBeRemoved()); - Assertions.assertEquals(0, classA.getTargetNodeShouldBeRemoved()); + Assertions.assertEquals(1, classA.getSourceNodeCycleCount()); + Assertions.assertEquals(0, classA.getTargetNodeCycleCount()); Assertions.assertEquals(1, classA.getPriority().intValue()); RankedDisharmony classC = disharmonies.get(1); Assertions.assertEquals("ClassC", classC.getClassName()); Assertions.assertEquals(3, classC.getCycleCount().intValue()); Assertions.assertEquals(2, classC.getEffortRank().intValue()); - Assertions.assertEquals(0, classC.getSourceNodeShouldBeRemoved()); - Assertions.assertEquals(1, classC.getTargetNodeShouldBeRemoved()); + Assertions.assertEquals(0, classC.getSourceNodeCycleCount()); + Assertions.assertEquals(1, classC.getTargetNodeCycleCount()); Assertions.assertEquals(2, classC.getPriority().intValue()); Assertions.assertEquals(0, classC.getPackageCycleCount()); } @@ -232,6 +279,9 @@ void calculateRelationshipCostBenefitValues_prefersHigherChangePronenessRank() t Set vertexesToRemove = new HashSet<>(Arrays.asList(VertexInfo.forName("Alpha"), VertexInfo.forName("Gamma"))); + Map vertexToRemoveCycleCounts = new HashMap<>(); + vertexToRemoveCycleCounts.put(VertexInfo.forName("Alpha"), 2); + vertexToRemoveCycleCounts.put(VertexInfo.forName("Gamma"), 1); ScmLogInfo scmLogInfo1 = new ScmLogInfo(faceletsPath + "Alpha.java", null, 2, 3, 1); scmLogInfo1.setChangePronenessRank(2); @@ -249,7 +299,13 @@ void calculateRelationshipCostBenefitValues_prefersHigherChangePronenessRank() t .thenReturn(new SimpleDirectedWeightedGraph<>(DefaultWeightedEdge.class)); List disharmonies = costBenefitCalculator.calculateRelationshipCostBenefitValues( - classGraph, edgeToRemoveCycleCounts, dto, vertexesToRemove, Collections.emptyMap(), List.of()); + classGraph, + edgeToRemoveCycleCounts, + vertexToRemoveCycleCounts, + dto, + vertexesToRemove, + Collections.emptyMap(), + List.of()); Assertions.assertEquals(2, disharmonies.size()); Assertions.assertEquals(0, disharmonies.get(0).getPackageCycleCount()); @@ -316,7 +372,13 @@ void calculateRelationshipCostBenefitValues_packageCycleCountReflectsRelationshi new CostBenefitCalculator(git.getRepository().getDirectory().getParent(), new HashMap<>())) { List disharmonies = costBenefitCalculator.calculateRelationshipCostBenefitValues( - classGraph, edgeToRemoveCycleCounts, dto, Collections.emptySet(), packageCycles, List.of()); + classGraph, + edgeToRemoveCycleCounts, + Map.of(), + dto, + Collections.emptySet(), + packageCycles, + List.of()); Map disharmoniesByEdge = new HashMap<>(); disharmonies.forEach(d -> disharmoniesByEdge.put(d.getEdge(), d)); @@ -349,7 +411,7 @@ void calculateRelationshipCostBenefitValues_flagsClassEdgesWhosePackageRelations packageGraph.addEdge(VertexInfo.forName("pkgb"), VertexInfo.forName("pkgc")); // Only pkga -> pkgb is flagged as a package relationship that needs to be removed - RankedDisharmony packageEdgeToRemove = new RankedDisharmony("pkga", pkgaToPkgb, 1, 1, false, false, 0, false); + RankedDisharmony packageEdgeToRemove = new RankedDisharmony("pkga", pkgaToPkgb, 1, 1, 0, 0, 0, false); List packageRelationshipDisharmonies = List.of(packageEdgeToRemove); SimpleDirectedWeightedGraph classGraph = @@ -383,6 +445,7 @@ void calculateRelationshipCostBenefitValues_flagsClassEdgesWhosePackageRelations List disharmonies = costBenefitCalculator.calculateRelationshipCostBenefitValues( classGraph, edgeToRemoveCycleCounts, + Map.of(), dto, Collections.emptySet(), Collections.emptyMap(), @@ -420,26 +483,21 @@ void sortEdgesThatNeedToBeRemoved_sortsByMultipleCriteria() { // then packageRelationshipShouldBeRemoved desc (true before false), then packageCycleCount desc, // then sourceRemoved desc, then targetRemoved desc // cycle=5, source=0, target=0, packageCycleCount=6, packageRelationshipShouldBeRemoved=false - RankedDisharmony disharmony1 = - new RankedDisharmony("Class1", new DefaultWeightedEdge(), 5, 1, false, false, 6, false); + RankedDisharmony disharmony1 = new RankedDisharmony("Class1", new DefaultWeightedEdge(), 5, 1, 0, 0, 6, false); // cycle=5, source=1, target=0, packageCycleCount=1, packageRelationshipShouldBeRemoved=false - RankedDisharmony disharmony2 = - new RankedDisharmony("Class2", new DefaultWeightedEdge(), 5, 1, true, false, 1, false); + RankedDisharmony disharmony2 = new RankedDisharmony("Class2", new DefaultWeightedEdge(), 5, 1, 1, 0, 1, false); // cycle=3, source=0, target=1, packageCycleCount=5, packageRelationshipShouldBeRemoved=false - RankedDisharmony disharmony3 = - new RankedDisharmony("Class3", new DefaultWeightedEdge(), 3, 1, false, true, 5, false); + RankedDisharmony disharmony3 = new RankedDisharmony("Class3", new DefaultWeightedEdge(), 3, 1, 0, 1, 5, false); // cycle=3, source=0, target=0, packageCycleCount=0, packageRelationshipShouldBeRemoved=false - RankedDisharmony disharmony4 = - new RankedDisharmony("Class4", new DefaultWeightedEdge(), 3, 1, false, false, 0, false); + RankedDisharmony disharmony4 = new RankedDisharmony("Class4", new DefaultWeightedEdge(), 3, 1, 0, 0, 0, false); // cycle=3, source=0, target=0, packageCycleCount=2, packageRelationshipShouldBeRemoved=true // lower packageCycleCount than disharmony3, but packageRelationshipShouldBeRemoved=true must still // bubble it ahead of disharmony3, proving the new sort clause is applied before packageCycleCount - RankedDisharmony disharmony5 = - new RankedDisharmony("Class5", new DefaultWeightedEdge(), 3, 1, false, false, 2, true); + RankedDisharmony disharmony5 = new RankedDisharmony("Class5", new DefaultWeightedEdge(), 3, 1, 0, 0, 2, true); List disharmonies = Arrays.asList(disharmony4, disharmony2, disharmony1, disharmony3, disharmony5); @@ -456,8 +514,8 @@ void sortEdgesThatNeedToBeRemoved_sortsByMultipleCriteria() { System.out.println(disharmony.getClassName() + " " + disharmony.getCycleCount() + " " + disharmony.getEffortRank() + " " - + disharmony.getSourceNodeShouldBeRemoved() + " " - + disharmony.getTargetNodeShouldBeRemoved() + " " + + disharmony.getSourceNodeCycleCount() + " " + + disharmony.getTargetNodeCycleCount() + " " + disharmony.getPackageCycleCount()); } @@ -465,16 +523,16 @@ void sortEdgesThatNeedToBeRemoved_sortsByMultipleCriteria() { Assertions.assertEquals("Class1", orderedDisharmony0.getClassName()); Assertions.assertEquals(5, orderedDisharmony0.getCycleCount().intValue()); Assertions.assertEquals(1, orderedDisharmony0.getEffortRank().intValue()); - Assertions.assertEquals(0, orderedDisharmony0.getSourceNodeShouldBeRemoved()); - Assertions.assertEquals(0, orderedDisharmony0.getTargetNodeShouldBeRemoved()); + Assertions.assertEquals(0, orderedDisharmony0.getSourceNodeCycleCount()); + Assertions.assertEquals(0, orderedDisharmony0.getTargetNodeCycleCount()); Assertions.assertEquals(6, orderedDisharmony0.getPackageCycleCount()); RankedDisharmony orderedDisharmony1 = disharmonies.get(1); Assertions.assertEquals("Class2", orderedDisharmony1.getClassName()); Assertions.assertEquals(5, orderedDisharmony1.getCycleCount().intValue()); Assertions.assertEquals(1, orderedDisharmony1.getEffortRank().intValue()); - Assertions.assertEquals(1, orderedDisharmony1.getSourceNodeShouldBeRemoved()); - Assertions.assertEquals(0, orderedDisharmony1.getTargetNodeShouldBeRemoved()); + Assertions.assertEquals(1, orderedDisharmony1.getSourceNodeCycleCount()); + Assertions.assertEquals(0, orderedDisharmony1.getTargetNodeCycleCount()); Assertions.assertEquals(1, orderedDisharmony1.getPackageCycleCount()); // Class5 has a lower packageCycleCount than Class3, but packageRelationshipShouldBeRemoved=true @@ -490,8 +548,8 @@ void sortEdgesThatNeedToBeRemoved_sortsByMultipleCriteria() { Assertions.assertEquals("Class3", orderedDisharmony3.getClassName()); Assertions.assertEquals(3, orderedDisharmony3.getCycleCount().intValue()); Assertions.assertEquals(1, orderedDisharmony3.getEffortRank().intValue()); - Assertions.assertEquals(0, orderedDisharmony3.getSourceNodeShouldBeRemoved()); - Assertions.assertEquals(1, orderedDisharmony3.getTargetNodeShouldBeRemoved()); + Assertions.assertEquals(0, orderedDisharmony3.getSourceNodeCycleCount()); + Assertions.assertEquals(1, orderedDisharmony3.getTargetNodeCycleCount()); Assertions.assertFalse(orderedDisharmony3.isPackageRelationshipShouldBeRemoved()); Assertions.assertEquals(5, orderedDisharmony3.getPackageCycleCount()); @@ -499,8 +557,8 @@ void sortEdgesThatNeedToBeRemoved_sortsByMultipleCriteria() { Assertions.assertEquals("Class4", orderedDisharmony4.getClassName()); Assertions.assertEquals(1, orderedDisharmony4.getEffortRank().intValue()); Assertions.assertEquals(3, orderedDisharmony4.getCycleCount().intValue()); - Assertions.assertEquals(0, orderedDisharmony4.getSourceNodeShouldBeRemoved()); - Assertions.assertEquals(0, orderedDisharmony4.getTargetNodeShouldBeRemoved()); + Assertions.assertEquals(0, orderedDisharmony4.getSourceNodeCycleCount()); + Assertions.assertEquals(0, orderedDisharmony4.getTargetNodeCycleCount()); Assertions.assertEquals(0, orderedDisharmony4.getPackageCycleCount()); } diff --git a/graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalComputer.java b/graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalComputer.java index f039fc68..7d1fd158 100644 --- a/graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalComputer.java +++ b/graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalComputer.java @@ -29,6 +29,7 @@ public CycleRemovalResult computeCycleRemovalInformation(Graph> cycles = new CircularReferenceChecker().getCycles(graph); Map edgeCycleCounts = new HashMap<>(); + Map vertexCycleCounts = new HashMap<>(); Set vertexesToRemove = new HashSet<>(); Set edgesToRemove = new HashSet<>(); @@ -46,6 +47,17 @@ public CycleRemovalResult computeCycleRemovalInformation(Graph vertexSetResult = vertexSolver.solve(parameters.getK()); vertexesToRemove.addAll(vertexSetResult.getFeedbackVertices()); + // capture the number of cycles each vertex to remove is in + for (V vertexToRemove : vertexesToRemove) { + int cycleCount = 0; + for (AsSubgraph cycle : cycles.values()) { + if (cycle.containsVertex(vertexToRemove)) { + cycleCount++; + } + } + vertexCycleCounts.put(vertexToRemove, cycleCount); + } + // Identify edges to remove log.info("Identifying edges to remove"); PageRankFAS pageRankFAS = new PageRankFAS<>(graph, new SuperTypeToken<>() {}); @@ -63,6 +75,6 @@ public CycleRemovalResult computeCycleRemovalInformation(Graph(cycles, edgesToRemove, vertexesToRemove, edgeCycleCounts, vertexCycleCounts); } } diff --git a/graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalResult.java b/graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalResult.java index 79387bf8..9a60b3d6 100644 --- a/graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalResult.java +++ b/graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalResult.java @@ -12,4 +12,5 @@ public class CycleRemovalResult { private final Set edgesToRemove; private final Set vertexesToRemove; private final Map edgeCycleCounts; + private final Map vertexCycleCounts; } diff --git a/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java b/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java index 689ef245..55f454d1 100644 --- a/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java +++ b/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java @@ -176,6 +176,7 @@ public RefactorFirstReportDTO generateReportData( CycleRemovalResult classCycleRemovalResult = cycleRemovalComputer.computeCycleRemovalInformation(classGraph); Map classEdgeCycleCounts = classCycleRemovalResult.getEdgeCycleCounts(); + Map classVertexCycleCounts = classCycleRemovalResult.getVertexCycleCounts(); classRelationshipsToRemove = classCycleRemovalResult.getEdgesToRemove(); classesToRemove = classCycleRemovalResult.getVertexesToRemove(); classCycles = classCycleRemovalResult.getCycles(); @@ -184,6 +185,7 @@ public RefactorFirstReportDTO generateReportData( CycleRemovalResult packageCycleRemovalResult = cycleRemovalComputer.computeCycleRemovalInformation(packageGraph); Map packageEdgeCycleCounts = packageCycleRemovalResult.getEdgeCycleCounts(); + Map packageVertexCycleCounts = packageCycleRemovalResult.getVertexCycleCounts(); packageRelationshipsToRemove = packageCycleRemovalResult.getEdgesToRemove(); packagesToRemove = packageCycleRemovalResult.getVertexesToRemove(); packageCycles = packageCycleRemovalResult.getCycles(); @@ -197,6 +199,7 @@ public RefactorFirstReportDTO generateReportData( packageRelationshipDisharmonies = costBenefitCalculator.calculateRelationshipCostBenefitValues( packageGraph, packageEdgeCycleCounts, + packageVertexCycleCounts, codebaseGraphDTO, packagesToRemove, packageCycles, @@ -204,6 +207,7 @@ public RefactorFirstReportDTO generateReportData( classRelationshipDisharmonies = costBenefitCalculator.calculateRelationshipCostBenefitValues( classGraph, classEdgeCycleCounts, + classVertexCycleCounts, codebaseGraphDTO, classesToRemove, packageCycles, diff --git a/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java b/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java index 0688d1fc..83cec399 100644 --- a/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java +++ b/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java @@ -305,6 +305,7 @@ public StringBuilder generateReport( CycleRemovalResult classCycleRemovalResult = cycleRemovalComputer.computeCycleRemovalInformation(classGraph); Map classEdgeCycleCounts = classCycleRemovalResult.getEdgeCycleCounts(); + Map classVertexCycleCounts = classCycleRemovalResult.getVertexCycleCounts(); classRelationshipsToRemove = classCycleRemovalResult.getEdgesToRemove(); classesToRemove = classCycleRemovalResult.getVertexesToRemove(); classCycles = classCycleRemovalResult.getCycles(); @@ -314,6 +315,7 @@ public StringBuilder generateReport( CycleRemovalResult packageCycleRemovalResult = cycleRemovalComputer.computeCycleRemovalInformation(packageGraph); Map packageEdgeCycleCounts = packageCycleRemovalResult.getEdgeCycleCounts(); + Map packageVertexCycleCounts = packageCycleRemovalResult.getVertexCycleCounts(); packageRelationshipsToRemove = packageCycleRemovalResult.getEdgesToRemove(); packagesToRemove = packageCycleRemovalResult.getVertexesToRemove(); packageCycles = packageCycleRemovalResult.getCycles(); @@ -329,10 +331,17 @@ public StringBuilder generateReport( try (CostBenefitCalculator costBenefitCalculator = new CostBenefitCalculator(projectBaseDir, codebaseGraphDTO.getClassToSourceFilePathMapping())) { packageRelationshipDisharmonies = costBenefitCalculator.calculateRelationshipCostBenefitValues( - packageGraph, packageEdgeCycleCounts, codebaseGraphDTO, packagesToRemove, packageCycles, List.of()); + packageGraph, + packageEdgeCycleCounts, + packageVertexCycleCounts, + codebaseGraphDTO, + packagesToRemove, + packageCycles, + List.of()); classRelationshipDisharmonies = costBenefitCalculator.calculateRelationshipCostBenefitValues( classGraph, classEdgeCycleCounts, + classVertexCycleCounts, codebaseGraphDTO, classesToRemove, packageCycles,