diff --git a/.refactorfirst/refactor-first.json b/.refactorfirst/refactor-first.json
index 3fe42c4a..b400a4a1 100644
--- a/.refactorfirst/refactor-first.json
+++ b/.refactorfirst/refactor-first.json
@@ -2,9 +2,9 @@
"project" : {
"name" : "RefactorFirst",
"version" : "0.11.0-SNAPSHOT",
- "repoUrl" : "https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/",
+ "repoUrl" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/",
"baseDir" : "C:\\Code\\RefactorFirst",
- "scanTimestamp" : "9/30/26, 9:13 PM",
+ "scanTimestamp" : "10/2/26, 6:03 AM",
"hasAnyDisharmony" : true,
"analysisFailed" : false
},
@@ -14,7 +14,7 @@
"relationshipCount" : 299,
"dotThreshold" : 4000,
"dotThresholdExceeded" : false,
- "dot" : "strict digraph G {\nChangePronenessRanker -> ScmLogInfo [ label = \"5\" weight = \"5\" ];\nChangePronenessRanker -> GitLogReader [ label = \"2\" weight = \"2\" ];\nGitLogReader -> org_hjug_git_GitLogReader_CommitWalkStats [ label = \"4\" weight = \"4\" ];\nGitLogReader -> ScmLogInfo [ label = \"3\" weight = \"3\" ];\nMain -> ReportCommand [ label = \"1\" weight = \"1\" ];\nReportCommand -> ReportType [ label = \"1\" weight = \"1\" ];\nReportCommand -> ReportWriter [ label = \"1\" weight = \"1\" ];\nReportCommand -> SimpleHtmlReport [ label = \"4\" weight = \"4\" ];\nReportCommand -> HtmlReport [ label = \"2\" weight = \"2\" ];\nReportCommand -> JsonReportExecutor [ label = \"3\" weight = \"3\" ];\nReportCommand -> CsvReport [ label = \"3\" weight = \"3\" ];\nCodebaseGraphDTO -> org_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony [ label = \"4\" weight = \"4\" ];\nCodebaseGraphDTO -> org_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony [ label = \"4\" weight = \"4\" ];\nCompositeGraphBuilder -> GraphBuilderConfig [ label = \"4\" weight = \"4\" ];\nCompositeGraphBuilder -> CodebaseGraphDTO [ label = \"10\" weight = \"10\" ];\nCompositeGraphBuilder -> JavaSourceFileGraphBuilder [ label = \"3\" weight = \"3\" ];\nCompositeGraphBuilder -> KotlinSourceFileGraphBuilder [ label = \"3\" weight = \"3\" ];\nCompositeGraphBuilder -> org_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony [ label = \"2\" weight = \"2\" ];\nCompositeGraphBuilder -> org_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony [ label = \"2\" weight = \"2\" ];\nJavaSourceFileGraphBuilder -> SourceFileGraphBuilder [ label = \"2\" weight = \"2\" ];\nJavaSourceFileGraphBuilder -> GraphBuilderConfig [ label = \"1\" weight = \"1\" ];\nJavaSourceFileGraphBuilder -> GraphDependencyCollector [ label = \"2\" weight = \"2\" ];\nJavaSourceFileGraphBuilder -> JavaVisitor [ label = \"1\" weight = \"1\" ];\nJavaSourceFileGraphBuilder -> GraphMetricsCollector [ label = \"5\" weight = \"5\" ];\nJavaSourceFileGraphBuilder -> MetricsCollectingVisitor [ label = \"2\" weight = \"2\" ];\nJavaSourceFileGraphBuilder -> AbstractDependencyVisitor [ label = \"1\" weight = \"1\" ];\nJavaSourceFileGraphBuilder -> CodebaseGraphDTO [ label = \"2\" weight = \"2\" ];\nJavaSourceFileGraphBuilder -> Java25ParserFactory [ label = \"1\" weight = \"1\" ];\nJavaSourceFileGraphBuilder -> DisharmonyDetector [ label = \"18\" weight = \"18\" ];\nJavaSourceFileGraphBuilder -> ClassMetrics [ label = \"3\" weight = \"3\" ];\nJavaSourceFileGraphBuilder -> org_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony [ label = \"3\" weight = \"3\" ];\nJavaSourceFileGraphBuilder -> org_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony [ label = \"3\" weight = \"3\" ];\nKotlinSourceFileGraphBuilder -> SourceFileGraphBuilder [ label = \"2\" weight = \"2\" ];\nKotlinSourceFileGraphBuilder -> GraphBuilderConfig [ label = \"1\" weight = \"1\" ];\nKotlinSourceFileGraphBuilder -> GraphDependencyCollector [ label = \"1\" weight = \"1\" ];\nKotlinSourceFileGraphBuilder -> KotlinDependencyVisitor [ label = \"2\" weight = \"2\" ];\nKotlinSourceFileGraphBuilder -> GraphMetricsCollector [ label = \"1\" weight = \"1\" ];\nKotlinSourceFileGraphBuilder -> KotlinMetricsCollectingVisitor [ label = \"2\" weight = \"2\" ];\nKotlinSourceFileGraphBuilder -> JavaSourceFileGraphBuilder [ label = \"1\" weight = \"1\" ];\nKotlinSourceFileGraphBuilder -> CodebaseGraphDTO [ label = \"1\" weight = \"1\" ];\nSourceFileGraphBuilder -> GraphBuilderConfig [ label = \"1\" weight = \"1\" ];\nSourceFileGraphBuilder -> CodebaseGraphDTO [ label = \"1\" weight = \"1\" ];\nGraphDependencyCollector -> DependencyCollector [ label = \"1\" weight = \"1\" ];\nClassMetrics -> MethodMetrics [ label = \"13\" weight = \"13\" ];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony -> ClassMetrics [ label = \"1\" weight = \"1\" ];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony -> DisharmonyMetric [ label = \"1\" weight = \"1\" ];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony -> MethodMetrics [ label = \"1\" weight = \"1\" ];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony -> DisharmonyMetric [ label = \"1\" weight = \"1\" ];\nDisharmonyDetector -> ClassMetrics [ label = \"99\" weight = \"99\" ];\nDisharmonyDetector -> org_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony [ label = \"30\" weight = \"30\" ];\nDisharmonyDetector -> DisharmonyMetric [ label = \"44\" weight = \"44\" ];\nDisharmonyDetector -> org_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony [ label = \"15\" weight = \"15\" ];\nDisharmonyDetector -> MethodMetrics [ label = \"40\" weight = \"40\" ];\nDisharmonyDetector -> org_hjug_graphbuilder_metrics_DisharmonyDetector_MethodEntry [ label = \"5\" weight = \"5\" ];\nDisharmonyDetector -> org_hjug_graphbuilder_metrics_DisharmonyDetector_FlaggedClassData [ label = \"10\" weight = \"10\" ];\nDisharmonyDetector -> org_hjug_graphbuilder_metrics_DisharmonyDetector_Clone [ label = \"20\" weight = \"20\" ];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodEntry -> ClassMetrics [ label = \"2\" weight = \"2\" ];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodEntry -> MethodMetrics [ label = \"2\" weight = \"2\" ];\nDisharmonyMetric -> org_hjug_graphbuilder_metrics_DisharmonyMetric_Direction [ label = \"1\" weight = \"1\" ];\nGraphMetricsCollector -> DependencyCollector [ label = \"1\" weight = \"1\" ];\nGraphMetricsCollector -> ClassMetrics [ label = \"33\" weight = \"33\" ];\nGraphMetricsCollector -> MethodMetrics [ label = \"10\" weight = \"10\" ];\nKotlinMetricsCollectingVisitor -> GraphMetricsCollector [ label = \"2\" weight = \"2\" ];\nKotlinMetricsCollectingVisitor -> MetricsVisitorState [ label = \"2\" weight = \"2\" ];\nKotlinMetricsCollectingVisitor -> MetricsVisitorLogic [ label = \"17\" weight = \"17\" ];\nKotlinMetricsCollectingVisitor -> org_hjug_graphbuilder_metrics_MetricsVisitorLogic_ClassStateSnapshot [ label = \"1\" weight = \"1\" ];\nKotlinMetricsCollectingVisitor -> org_hjug_graphbuilder_metrics_MetricsVisitorLogic_MethodStateSnapshot [ label = \"1\" weight = \"1\" ];\nKotlinMetricsCollectingVisitor -> ClassMetrics [ label = \"2\" weight = \"2\" ];\nMetricsCollectingVisitor -> GraphMetricsCollector [ label = \"2\" weight = \"2\" ];\nMetricsCollectingVisitor -> MetricsVisitorState [ label = \"2\" weight = \"2\" ];\nMetricsCollectingVisitor -> MetricsVisitorLogic [ label = \"10\" weight = \"10\" ];\nMetricsCollectingVisitor -> org_hjug_graphbuilder_metrics_MetricsVisitorLogic_ClassStateSnapshot [ label = \"1\" weight = \"1\" ];\nMetricsCollectingVisitor -> org_hjug_graphbuilder_metrics_MetricsVisitorLogic_MethodStateSnapshot [ label = \"1\" weight = \"1\" ];\nMetricsVisitorLogic -> MetricsVisitorState [ label = \"12\" weight = \"12\" ];\nMetricsVisitorLogic -> GraphMetricsCollector [ label = \"13\" weight = \"13\" ];\nMetricsVisitorLogic -> org_hjug_graphbuilder_metrics_MetricsVisitorLogic_ClassStateSnapshot [ label = \"4\" weight = \"4\" ];\nMetricsVisitorLogic -> ClassMetrics [ label = \"28\" weight = \"28\" ];\nMetricsVisitorLogic -> org_hjug_graphbuilder_metrics_MetricsVisitorLogic_OverridePredicate [ label = \"2\" weight = \"2\" ];\nMetricsVisitorLogic -> MethodMetrics [ label = \"31\" weight = \"31\" ];\nMetricsVisitorLogic -> ComplexityCalculator [ label = \"4\" weight = \"4\" ];\nMetricsVisitorLogic -> org_hjug_graphbuilder_metrics_MetricsVisitorLogic_MethodStateSnapshot [ label = \"3\" weight = \"3\" ];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_ClassStateSnapshot -> ClassMetrics [ label = \"2\" weight = \"2\" ];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_MethodStateSnapshot -> MethodMetrics [ label = \"2\" weight = \"2\" ];\nMetricsVisitorState -> ClassMetrics [ label = \"1\" weight = \"1\" ];\nMetricsVisitorState -> MethodMetrics [ label = \"1\" weight = \"1\" ];\nAbstractDependencyVisitor -> DependencyVisitorState [ label = \"2\" weight = \"2\" ];\nAbstractDependencyVisitor -> DependencyCollector [ label = \"1\" weight = \"1\" ];\norg_hjug_graphbuilder_visitor_AbstractDependencyVisitor_1 -> DependencyCollector [ label = \"1\" weight = \"1\" ];\nAbstractDependencyVisitor -> org_hjug_graphbuilder_visitor_AbstractDependencyVisitor_1 [ label = \"1\" weight = \"1\" ];\nAbstractDependencyVisitor -> BaseTypeProcessor [ label = \"1\" weight = \"1\" ];\nAbstractDependencyVisitor -> DependencyVisitorLogic [ label = \"14\" weight = \"14\" ];\nBaseTypeProcessor -> TypeDependencyExtractor [ label = \"3\" weight = \"3\" ];\nBaseTypeProcessor -> DependencyCollector [ label = \"3\" weight = \"3\" ];\nDependencyVisitorLogic -> DependencyVisitorState [ label = \"14\" weight = \"14\" ];\nDependencyVisitorLogic -> SourcePathResolver [ label = \"2\" weight = \"2\" ];\nDependencyVisitorLogic -> org_hjug_graphbuilder_visitor_DependencyVisitorLogic_ClassSnapshot [ label = \"3\" weight = \"3\" ];\nDependencyVisitorLogic -> UnattributedTypeFqnResolver [ label = \"1\" weight = \"1\" ];\nDependencyVisitorState -> BaseTypeProcessor [ label = \"2\" weight = \"2\" ];\nJavaVisitor -> AbstractDependencyVisitor [ label = \"2\" weight = \"2\" ];\nJavaVisitor -> DependencyCollector [ label = \"1\" weight = \"1\" ];\nKotlinDependencyVisitor -> DependencyCollector [ label = \"7\" weight = \"7\" ];\nKotlinDependencyVisitor -> BaseTypeProcessor [ label = \"8\" weight = \"8\" ];\nKotlinDependencyVisitor -> DependencyVisitorState [ label = \"2\" weight = \"2\" ];\norg_hjug_graphbuilder_visitor_KotlinDependencyVisitor_1 -> DependencyCollector [ label = \"1\" weight = \"1\" ];\nKotlinDependencyVisitor -> org_hjug_graphbuilder_visitor_KotlinDependencyVisitor_1 [ label = \"1\" weight = \"1\" ];\nKotlinDependencyVisitor -> DependencyVisitorLogic [ label = \"17\" weight = \"17\" ];\nCostBenefitCalculator -> GitLogReader [ label = \"4\" weight = \"4\" ];\nCostBenefitCalculator -> ChangePronenessRanker [ label = \"3\" weight = \"3\" ];\nCostBenefitCalculator -> CBORule [ label = \"1\" weight = \"1\" ];\nCostBenefitCalculator -> GodClass [ label = \"10\" weight = \"10\" ];\nCostBenefitCalculator -> ScmLogInfo [ label = \"16\" weight = \"16\" ];\nCostBenefitCalculator -> RankedDisharmony [ label = \"20\" weight = \"20\" ];\nCostBenefitCalculator -> CodebaseGraphDTO [ label = \"10\" weight = \"10\" ];\nCostBenefitCalculator -> org_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony [ label = \"4\" weight = \"4\" ];\nCostBenefitCalculator -> GodClassRanker [ label = \"6\" weight = \"6\" ];\nCostBenefitCalculator -> DisharmonyInstance [ label = \"11\" weight = \"11\" ];\nCostBenefitCalculator -> DisharmonyRanker [ label = \"4\" weight = \"4\" ];\nCostBenefitCalculator -> org_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony [ label = \"2\" weight = \"2\" ];\nCostBenefitCalculator -> Disharmony [ label = \"5\" weight = \"5\" ];\nCostBenefitCalculator -> CBOClass [ label = \"6\" weight = \"6\" ];\nCycleNode -> Disharmony [ label = \"1\" weight = \"1\" ];\nCycleNode -> ScmLogInfo [ label = \"1\" weight = \"1\" ];\nCycleRanker -> CodebaseGraphDTO [ label = \"2\" weight = \"2\" ];\nCycleRanker -> CompositeGraphBuilder [ label = \"3\" weight = \"3\" ];\nCycleRanker -> GraphBuilderConfig [ label = \"1\" weight = \"1\" ];\nCycleRanker -> RankedCycle [ label = \"7\" weight = \"7\" ];\nCycleRanker -> CircularReferenceChecker [ label = \"2\" weight = \"2\" ];\nCycleRanker -> CycleNode [ label = \"3\" weight = \"3\" ];\nRankedCycle -> CycleNode [ label = \"2\" weight = \"2\" ];\nRankedDisharmony -> DisharmonyMetric [ label = \"1\" weight = \"1\" ];\nRankedDisharmony -> GodClass [ label = \"1\" weight = \"1\" ];\nRankedDisharmony -> ScmLogInfo [ label = \"3\" weight = \"3\" ];\nRankedDisharmony -> CBOClass [ label = \"1\" weight = \"1\" ];\nRankedDisharmony -> DisharmonyInstance [ label = \"1\" weight = \"1\" ];\nCBOClass -> Disharmony [ label = \"1\" weight = \"1\" ];\nDisharmonyInstance -> Disharmony [ label = \"1\" weight = \"1\" ];\nDisharmonyInstance -> DisharmonyMetric [ label = \"1\" weight = \"1\" ];\nDisharmonyRanker -> DisharmonyInstance [ label = \"7\" weight = \"7\" ];\nDisharmonyRanker -> DisharmonyMetric [ label = \"1\" weight = \"1\" ];\nDisharmonyRanker -> org_hjug_metrics_DisharmonyRanker_ValueExtractor [ label = \"3\" weight = \"3\" ];\nDisharmonyRanker -> org_hjug_metrics_DisharmonyRanker_RankSetter [ label = \"3\" weight = \"3\" ];\nGodClass -> Disharmony [ label = \"1\" weight = \"1\" ];\nGodClassRanker -> GodClass [ label = \"18\" weight = \"18\" ];\nEdgeRemovalCalculator -> DSM [ label = \"4\" weight = \"4\" ];\nEdgeRemovalCalculator -> CircularReferenceChecker [ label = \"6\" weight = \"6\" ];\nEdgeRemovalCalculator -> EdgeToRemoveInfo [ label = \"7\" weight = \"7\" ];\nSparseIntDWGEdgeRemovalCalculator -> EdgeToRemoveInfo [ label = \"3\" weight = \"3\" ];\nFeedbackArcSetSolver -> org_hjug_feedback_arc_approximate_FeedbackArcSetResult [ label = \"2\" weight = \"2\" ];\nEdgeInfoCalculator -> EdgeInfo [ label = \"4\" weight = \"4\" ];\nMinimumFeedbackArcSetSolver -> SuperTypeToken [ label = \"2\" weight = \"2\" ];\nMinimumFeedbackArcSetSolver -> org_hjug_feedback_arc_exact_FeedbackArcSetResult [ label = \"2\" weight = \"2\" ];\nLineDigraph -> LineVertex [ label = \"68\" weight = \"68\" ];\nPageRankFAS -> SuperTypeToken [ label = \"3\" weight = \"3\" ];\nPageRankFAS -> LineDigraph [ label = \"13\" weight = \"13\" ];\nPageRankFAS -> LineVertex [ label = \"25\" weight = \"25\" ];\nCycleRemovalComputer -> CircularReferenceChecker [ label = \"2\" weight = \"2\" ];\nCycleRemovalComputer -> EnhancedParameterComputer [ label = \"2\" weight = \"2\" ];\nCycleRemovalComputer -> org_hjug_feedback_vertex_kernelized_EnhancedParameterComputer_EnhancedParameters [ label = \"4\" weight = \"4\" ];\nCycleRemovalComputer -> DirectedFeedbackVertexSetSolver [ label = \"2\" weight = \"2\" ];\nCycleRemovalComputer -> DirectedFeedbackVertexSetResult [ label = \"2\" weight = \"2\" ];\nCycleRemovalComputer -> PageRankFAS [ label = \"2\" weight = \"2\" ];\nCycleRemovalComputer -> CycleRemovalResult [ label = \"1\" weight = \"1\" ];\nFeedbackVertexSetSolver -> FeedbackVertexSetResult [ label = \"16\" weight = \"16\" ];\nFeedbackVertexSetSolver -> org_hjug_feedback_vertex_approximate_FeedbackVertexSetSolver_CutCandidate [ label = \"5\" weight = \"5\" ];\nDirectedFeedbackVertexSetSolver -> SuperTypeToken [ label = \"2\" weight = \"2\" ];\nDirectedFeedbackVertexSetSolver -> DirectedFeedbackVertexSetResult [ label = \"4\" weight = \"4\" ];\nDirectedFeedbackVertexSetSolver -> org_hjug_feedback_vertex_kernelized_DirectedFeedbackVertexSetSolver_PathComputationStats [ label = \"4\" weight = \"4\" ];\nDirectedFeedbackVertexSetSolver -> org_hjug_feedback_vertex_kernelized_DirectedFeedbackVertexSetSolver_PathContext [ label = \"1\" weight = \"1\" ];\nEnhancedParameterComputer -> TreewidthComputer [ label = \"6\" weight = \"6\" ];\nEnhancedParameterComputer -> FeedbackVertexSetComputer [ label = \"6\" weight = \"6\" ];\nEnhancedParameterComputer -> ModulatorComputer [ label = \"5\" weight = \"5\" ];\nEnhancedParameterComputer -> SuperTypeToken [ label = \"2\" weight = \"2\" ];\nEnhancedParameterComputer -> org_hjug_feedback_vertex_kernelized_EnhancedParameterComputer_EnhancedParameters [ label = \"14\" weight = \"14\" ];\nEnhancedParameterComputer -> org_hjug_feedback_vertex_kernelized_ModulatorComputer_ModulatorResult [ label = \"6\" weight = \"6\" ];\nFeedbackVertexSetComputer -> SuperTypeToken [ label = \"4\" weight = \"4\" ];\nModulatorComputer -> TreewidthComputer [ label = \"14\" weight = \"14\" ];\nModulatorComputer -> FeedbackVertexSetComputer [ label = \"5\" weight = \"5\" ];\nModulatorComputer -> SuperTypeToken [ label = \"2\" weight = \"2\" ];\nModulatorComputer -> org_hjug_feedback_vertex_kernelized_ModulatorComputer_ModulatorResult [ label = \"2\" weight = \"2\" ];\nParameterComputer -> TreewidthComputer [ label = \"7\" weight = \"7\" ];\nParameterComputer -> FeedbackVertexSetComputer [ label = \"6\" weight = \"6\" ];\nParameterComputer -> SuperTypeToken [ label = \"2\" weight = \"2\" ];\nParameterComputer -> org_hjug_feedback_vertex_kernelized_ParameterComputer_Parameters [ label = \"4\" weight = \"4\" ];\nGraphDataGenerator -> RankedDisharmony [ label = \"2\" weight = \"2\" ];\nCsvReportTask -> RefactorFirstExtension [ label = \"8\" weight = \"8\" ];\nCsvReportTask -> CsvReport [ label = \"3\" weight = \"3\" ];\nCsvReportTask -> RefactorFirstPlugin [ label = \"1\" weight = \"1\" ];\nHtmlReportTask -> RefactorFirstExtension [ label = \"13\" weight = \"13\" ];\nHtmlReportTask -> HtmlReport [ label = \"2\" weight = \"2\" ];\nHtmlReportTask -> RefactorFirstPlugin [ label = \"1\" weight = \"1\" ];\nHtmlReportTask -> SimpleHtmlReport [ label = \"1\" weight = \"1\" ];\nJsonReportTask -> RefactorFirstExtension [ label = \"3\" weight = \"3\" ];\nJsonReportTask -> JsonReportExecutor [ label = \"3\" weight = \"3\" ];\nJsonReportTask -> RefactorFirstPlugin [ label = \"1\" weight = \"1\" ];\nSimpleHtmlReportTask -> RefactorFirstExtension [ label = \"13\" weight = \"13\" ];\nSimpleHtmlReportTask -> SimpleHtmlReport [ label = \"3\" weight = \"3\" ];\nSimpleHtmlReportTask -> RefactorFirstPlugin [ label = \"1\" weight = \"1\" ];\nMavenReportOutputDirectory -> ReportWriter [ label = \"1\" weight = \"1\" ];\nRefactorFirstHtmlReport -> HtmlReport [ label = \"2\" weight = \"2\" ];\nRefactorFirstHtmlReport -> MavenReportOutputDirectory [ label = \"1\" weight = \"1\" ];\nRefactorFirstHtmlReport -> SimpleHtmlReport [ label = \"1\" weight = \"1\" ];\nRefactorFirstMavenCsvReport -> CsvReport [ label = \"3\" weight = \"3\" ];\nRefactorFirstMavenCsvReport -> MavenReportOutputDirectory [ label = \"1\" weight = \"1\" ];\nRefactorFirstMavenJsonGenerator -> JsonGenerator [ label = \"3\" weight = \"3\" ];\nRefactorFirstMavenJsonReport -> JsonReportExecutor [ label = \"3\" weight = \"3\" ];\nRefactorFirstMavenJsonReport -> MavenReportOutputDirectory [ label = \"1\" weight = \"1\" ];\nRefactorFirstMavenReport -> HtmlReport [ label = \"2\" weight = \"2\" ];\nRefactorFirstMavenReport -> SimpleHtmlReport [ label = \"1\" weight = \"1\" ];\nRefactorFirstSimpleHtmlReport -> SimpleHtmlReport [ label = \"3\" weight = \"3\" ];\nRefactorFirstSimpleHtmlReport -> MavenReportOutputDirectory [ label = \"1\" weight = \"1\" ];\nCsvReport -> GitLogReader [ label = \"4\" weight = \"4\" ];\nCsvReport -> ReportWriter [ label = \"3\" weight = \"3\" ];\nCsvReport -> RankedDisharmony [ label = \"3\" weight = \"3\" ];\nCsvReport -> CostBenefitCalculator [ label = \"5\" weight = \"5\" ];\nHtmlReport -> SimpleHtmlReport [ label = \"9\" weight = \"9\" ];\nHtmlReport -> RankedDisharmony [ label = \"1\" weight = \"1\" ];\nHtmlReport -> GraphDataGenerator [ label = \"5\" weight = \"5\" ];\nHtmlReport -> CodebaseGraphDTO [ label = \"17\" weight = \"17\" ];\nHtmlReport -> RankedCycle [ label = \"3\" weight = \"3\" ];\nJsonReport -> JsonReportDisharmonyEntry [ label = \"1\" weight = \"1\" ];\nJsonReportDisharmonyEntry -> RankedDisharmony [ label = \"1\" weight = \"1\" ];\nJsonReportExecutor -> CostBenefitCalculator [ label = \"5\" weight = \"5\" ];\nJsonReportExecutor -> RankedDisharmony [ label = \"2\" weight = \"2\" ];\nJsonReportExecutor -> JsonReportDisharmonyEntry [ label = \"2\" weight = \"2\" ];\nJsonReportExecutor -> JsonReport [ label = \"3\" weight = \"3\" ];\nJsonReportExecutor -> ReportWriter [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> HtmlReport [ label = \"4\" weight = \"4\" ];\nJsonGenerator -> RefactorFirstReportDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> GitLogReader [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> CycleRanker [ label = \"5\" weight = \"5\" ];\nJsonGenerator -> RankedCycle [ label = \"3\" weight = \"3\" ];\nJsonGenerator -> CodebaseGraphDTO [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> CycleRemovalComputer [ label = \"4\" weight = \"4\" ];\nJsonGenerator -> CycleRemovalResult [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> RankedDisharmony [ label = \"10\" weight = \"10\" ];\nJsonGenerator -> CostBenefitCalculator [ label = \"6\" weight = \"6\" ];\nJsonGenerator -> org_hjug_refactorfirst_report_SimpleHtmlReport_DisharmonySpec [ label = \"17\" weight = \"17\" ];\nJsonGenerator -> DisharmonyInstance [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> SimpleHtmlReport [ label = \"21\" weight = \"21\" ];\nJsonGenerator -> ProjectMetadataDTO [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> GraphVisualDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> ClassRelationshipDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> ClassRelationshipsToRemoveDTO [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> PackageRelationshipDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> PackageRelationshipsToRemoveDTO [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> DisharmonySectionDTO [ label = \"3\" weight = \"3\" ];\nJsonGenerator -> CycleSummaryDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> LargestCycleDTO [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> CycleBreakdownRowDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> ClassCyclesDTO [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> ChartJsBubbleDTO [ label = \"3\" weight = \"3\" ];\nJsonGenerator -> DisharmonyChartDTO [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> DisharmonyMetric [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> DisharmonyTableRowDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> DisharmonyTableCellDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> DisharmonyTableDTO [ label = \"1\" weight = \"1\" ];\nClassCyclesDTO -> CycleSummaryDTO [ label = \"2\" weight = \"2\" ];\nClassCyclesDTO -> LargestCycleDTO [ label = \"1\" weight = \"1\" ];\nClassRelationshipsToRemoveDTO -> ClassRelationshipDTO [ label = \"2\" weight = \"2\" ];\nDisharmonyChartDTO -> ChartJsBubbleDTO [ label = \"2\" weight = \"2\" ];\nDisharmonySectionDTO -> DisharmonyChartDTO [ label = \"1\" weight = \"1\" ];\nDisharmonySectionDTO -> DisharmonyTableDTO [ label = \"1\" weight = \"1\" ];\nDisharmonyTableDTO -> DisharmonyTableRowDTO [ label = \"2\" weight = \"2\" ];\nDisharmonyTableRowDTO -> DisharmonyTableCellDTO [ label = \"2\" weight = \"2\" ];\nLargestCycleDTO -> CycleBreakdownRowDTO [ label = \"2\" weight = \"2\" ];\nPackageRelationshipsToRemoveDTO -> PackageRelationshipDTO [ label = \"2\" weight = \"2\" ];\nRefactorFirstReportDTO -> ProjectMetadataDTO [ label = \"1\" weight = \"1\" ];\nRefactorFirstReportDTO -> GraphVisualDTO [ label = \"2\" weight = \"2\" ];\nRefactorFirstReportDTO -> ClassRelationshipsToRemoveDTO [ label = \"1\" weight = \"1\" ];\nRefactorFirstReportDTO -> PackageRelationshipsToRemoveDTO [ label = \"1\" weight = \"1\" ];\nRefactorFirstReportDTO -> DisharmonySectionDTO [ label = \"2\" weight = \"2\" ];\nRefactorFirstReportDTO -> ClassCyclesDTO [ label = \"1\" weight = \"1\" ];\nReportWriter -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [ label = \"3\" weight = \"3\" ];\nReportWriter -> org_hjug_refactorfirst_report_ReportWriter_ReportWriteException [ label = \"3\" weight = \"3\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps -> org_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [ label = \"1\" weight = \"1\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl -> ReportWriter [ label = \"1\" weight = \"1\" ];\norg_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [ label = \"1\" weight = \"1\" ];\norg_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps -> ReportWriter [ label = \"1\" weight = \"1\" ];\nSimpleHtmlReport -> org_hjug_refactorfirst_report_SimpleHtmlReport_DisharmonySpec [ label = \"34\" weight = \"34\" ];\nSimpleHtmlReport -> ReportWriter [ label = \"1\" weight = \"1\" ];\nSimpleHtmlReport -> GitLogReader [ label = \"5\" weight = \"5\" ];\nSimpleHtmlReport -> CycleRanker [ label = \"5\" weight = \"5\" ];\nSimpleHtmlReport -> RankedCycle [ label = \"10\" weight = \"10\" ];\nSimpleHtmlReport -> CodebaseGraphDTO [ label = \"13\" weight = \"13\" ];\nSimpleHtmlReport -> CycleRemovalComputer [ label = \"4\" weight = \"4\" ];\nSimpleHtmlReport -> CycleRemovalResult [ label = \"2\" weight = \"2\" ];\nSimpleHtmlReport -> RankedDisharmony [ label = \"16\" weight = \"16\" ];\nSimpleHtmlReport -> CostBenefitCalculator [ label = \"6\" weight = \"6\" ];\nSimpleHtmlReport -> DisharmonyInstance [ label = \"1\" weight = \"1\" ];\nSimpleHtmlReport -> DisharmonyMetric [ label = \"3\" weight = \"3\" ];\nConsole -> io_confluent_ksql_cli_console_Console_RowCaptor [ label = \"4\" weight = \"4\" ];\nConsole -> io_confluent_ksql_cli_console_Console_NoOpRowCaptor [ label = \"1\" weight = \"1\" ];\nConsole -> io_confluent_ksql_cli_console_Console_CliCmdExecutor [ label = \"4\" weight = \"4\" ];\nio_confluent_ksql_cli_console_Console_NoOpRowCaptor -> io_confluent_ksql_cli_console_Console_RowCaptor [ label = \"1\" weight = \"1\" ];\norg_hjug_graphbuilder_visitor_AbstractDependencyVisitor_1 [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/AbstractDependencyVisitor.java\" target=\"_blank\" label=\"AbstractDependencyVisitor$1\"];\nCycleSummaryDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/CycleSummaryDTO.java\" target=\"_blank\" label=\"CycleSummaryDTO\"];\nJsonReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/json/JsonReport.java\" target=\"_blank\" label=\"JsonReport\"];\nDisharmonyTableCellDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/DisharmonyTableCellDTO.java\" target=\"_blank\" label=\"DisharmonyTableCellDTO\"];\nEdgeRemovalCalculator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/dsm/EdgeRemovalCalculator.java\" target=\"_blank\" label=\"EdgeRemovalCalculator\"];\nSimpleHtmlReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java\" target=\"_blank\" label=\"SimpleHtmlReport\"];\nLineDigraph [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/LineDigraph.java\" target=\"_blank\" label=\"LineDigraph\"];\nCsvReportTask [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/CsvReportTask.java\" target=\"_blank\" label=\"CsvReportTask\"];\nRefactorFirstExtension [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/RefactorFirstExtension.java\" target=\"_blank\" label=\"RefactorFirstExtension\"];\norg_hjug_refactorfirst_report_SimpleHtmlReport_DisharmonySpec [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java\" target=\"_blank\" label=\"SimpleHtmlReport$DisharmonySpec\"];\nGraphMetricsCollector [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/GraphMetricsCollector.java\" target=\"_blank\" label=\"GraphMetricsCollector\"];\nDisharmonyInstance [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/effort-ranker/src/main/java/org/hjug/metrics/DisharmonyInstance.java\" target=\"_blank\" label=\"DisharmonyInstance\"];\norg_hjug_feedback_vertex_kernelized_DirectedFeedbackVertexSetSolver_PathContext [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java\" target=\"_blank\" label=\"DirectedFeedbackVertexSetSolver$PathContext\"];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_ClassStateSnapshot [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java\" target=\"_blank\" label=\"MetricsVisitorLogic$ClassStateSnapshot\"];\nDisharmonySectionDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/DisharmonySectionDTO.java\" target=\"_blank\" label=\"DisharmonySectionDTO\"];\nMavenReportOutputDirectory [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/refactor-first-maven-plugin/src/main/java/org/hjug/mavenreport/MavenReportOutputDirectory.java\" target=\"_blank\" label=\"MavenReportOutputDirectory\"];\nPackageRelationshipsToRemoveDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/PackageRelationshipsToRemoveDTO.java\" target=\"_blank\" label=\"PackageRelationshipsToRemoveDTO\"];\nCompositeGraphBuilder [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java\" target=\"_blank\" label=\"CompositeGraphBuilder\"];\nPackageRelationshipDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/PackageRelationshipDTO.java\" target=\"_blank\" label=\"PackageRelationshipDTO\"];\nMetricsCollectingVisitor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsCollectingVisitor.java\" target=\"_blank\" label=\"MetricsCollectingVisitor\"];\nKotlinSourceFileGraphBuilder [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/graphbuilder/KotlinSourceFileGraphBuilder.java\" target=\"_blank\" label=\"KotlinSourceFileGraphBuilder\"];\nMethodMetrics [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MethodMetrics.java\" target=\"_blank\" label=\"MethodMetrics\"];\nCodebaseGraphDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CodebaseGraphDTO.java\" target=\"_blank\" label=\"CodebaseGraphDTO\"];\nRankedDisharmony [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/cost-benefit-calculator/src/main/java/org/hjug/cbc/RankedDisharmony.java\" target=\"_blank\" label=\"RankedDisharmony\"];\nFeedbackVertexSetResult [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetResult.java\" target=\"_blank\" label=\"FeedbackVertexSetResult\"];\nRefactorFirstMavenJsonReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/refactor-first-maven-plugin/src/main/java/org/hjug/mavenreport/RefactorFirstMavenJsonReport.java\" target=\"_blank\" label=\"RefactorFirstMavenJsonReport\"];\nCycleRemovalComputer [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalComputer.java\" target=\"_blank\" label=\"CycleRemovalComputer\"];\nJsonReportTask [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/JsonReportTask.java\" target=\"_blank\" label=\"JsonReportTask\"];\nDSM [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/dsm/DSM.java\" target=\"_blank\" label=\"DSM\"];\nJsonReportDisharmonyEntry [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/json/JsonReportDisharmonyEntry.java\" target=\"_blank\" label=\"JsonReportDisharmonyEntry\"];\norg_hjug_graphbuilder_metrics_DisharmonyMetric_Direction [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyMetric.java\" target=\"_blank\" label=\"DisharmonyMetric$Direction\"];\nio_confluent_ksql_cli_console_Console_RowCaptor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/test-resources/src/main/resources/Console.java\" target=\"_blank\" label=\"Console$RowCaptor\"];\nCycleBreakdownRowDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/CycleBreakdownRowDTO.java\" target=\"_blank\" label=\"CycleBreakdownRowDTO\"];\nDisharmonyDetector [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java\" target=\"_blank\" label=\"DisharmonyDetector\"];\nCircularReferenceChecker [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/dsm/CircularReferenceChecker.java\" target=\"_blank\" label=\"CircularReferenceChecker\"];\nFeedbackArcSetSolver [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/arc/approximate/FeedbackArcSetSolver.java\" target=\"_blank\" label=\"FeedbackArcSetSolver\"];\nCycleRemovalResult [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalResult.java\" target=\"_blank\" label=\"CycleRemovalResult\"];\norg_hjug_refactorfirst_report_ReportWriter_ReportWriteException [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter$ReportWriteException\"];\nAbstractDependencyVisitor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/AbstractDependencyVisitor.java\" target=\"_blank\" label=\"AbstractDependencyVisitor\"];\nJava25ParserFactory [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/graphbuilder/Java25ParserFactory.java\" target=\"_blank\" label=\"Java25ParserFactory\"];\nProjectMetadataDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/ProjectMetadataDTO.java\" target=\"_blank\" label=\"ProjectMetadataDTO\"];\norg_hjug_feedback_vertex_kernelized_ParameterComputer_Parameters [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ParameterComputer.java\" target=\"_blank\" label=\"ParameterComputer$Parameters\"];\nLargestCycleDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/LargestCycleDTO.java\" target=\"_blank\" label=\"LargestCycleDTO\"];\nRankedCycle [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/cost-benefit-calculator/src/main/java/org/hjug/cbc/RankedCycle.java\" target=\"_blank\" label=\"RankedCycle\"];\nClassRelationshipDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/ClassRelationshipDTO.java\" target=\"_blank\" label=\"ClassRelationshipDTO\"];\nDisharmonyRanker [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/effort-ranker/src/main/java/org/hjug/metrics/DisharmonyRanker.java\" target=\"_blank\" label=\"DisharmonyRanker\"];\norg_hjug_git_GitLogReader_CommitWalkStats [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/change-proneness-ranker/src/main/java/org/hjug/git/GitLogReader.java\" target=\"_blank\" label=\"GitLogReader$CommitWalkStats\"];\nGraphVisualDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/GraphVisualDTO.java\" target=\"_blank\" label=\"GraphVisualDTO\"];\nDisharmonyTableRowDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/DisharmonyTableRowDTO.java\" target=\"_blank\" label=\"DisharmonyTableRowDTO\"];\nChangePronenessRanker [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/change-proneness-ranker/src/main/java/org/hjug/git/ChangePronenessRanker.java\" target=\"_blank\" label=\"ChangePronenessRanker\"];\nScmLogInfo [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/change-proneness-ranker/src/main/java/org/hjug/git/ScmLogInfo.java\" target=\"_blank\" label=\"ScmLogInfo\"];\nKotlinMetricsCollectingVisitor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/KotlinMetricsCollectingVisitor.java\" target=\"_blank\" label=\"KotlinMetricsCollectingVisitor\"];\nEdgeToRemoveInfo [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/dsm/EdgeToRemoveInfo.java\" target=\"_blank\" label=\"EdgeToRemoveInfo\"];\nDirectedFeedbackVertexSetSolver [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java\" target=\"_blank\" label=\"DirectedFeedbackVertexSetSolver\"];\nGraphBuilderConfig [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/GraphBuilderConfig.java\" target=\"_blank\" label=\"GraphBuilderConfig\"];\nMinimumFeedbackArcSetSolver [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java\" target=\"_blank\" label=\"MinimumFeedbackArcSetSolver\"];\norg_hjug_graphbuilder_visitor_DependencyVisitorLogic_ClassSnapshot [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/DependencyVisitorLogic.java\" target=\"_blank\" label=\"DependencyVisitorLogic$ClassSnapshot\"];\nRefactorFirstMavenReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/refactor-first-maven-plugin/src/main/java/org/hjug/mavenreport/RefactorFirstMavenReport.java\" target=\"_blank\" label=\"RefactorFirstMavenReport\"];\nEdgeInfoCalculator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/arc/EdgeInfoCalculator.java\" target=\"_blank\" label=\"EdgeInfoCalculator\"];\nRefactorFirstMavenJsonGenerator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/refactor-first-maven-plugin/src/main/java/org/hjug/mavenreport/RefactorFirstMavenJsonGenerator.java\" target=\"_blank\" label=\"RefactorFirstMavenJsonGenerator\"];\nCycleRanker [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/cost-benefit-calculator/src/main/java/org/hjug/cbc/CycleRanker.java\" target=\"_blank\" label=\"CycleRanker\"];\nReportCommand [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/cli/src/main/java/org/hjug/refactorfirst/ReportCommand.java\" target=\"_blank\" label=\"ReportCommand\"];\nDisharmonyChartDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/DisharmonyChartDTO.java\" target=\"_blank\" label=\"DisharmonyChartDTO\"];\nRefactorFirstPlugin [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/RefactorFirstPlugin.java\" target=\"_blank\" label=\"RefactorFirstPlugin\"];\nDependencyCollector [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/DependencyCollector.java\" target=\"_blank\" label=\"DependencyCollector\"];\nCostBenefitCalculator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/cost-benefit-calculator/src/main/java/org/hjug/cbc/CostBenefitCalculator.java\" target=\"_blank\" label=\"CostBenefitCalculator\"];\nEdgeInfo [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/arc/EdgeInfo.java\" target=\"_blank\" label=\"EdgeInfo\"];\nGitLogReader [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/change-proneness-ranker/src/main/java/org/hjug/git/GitLogReader.java\" target=\"_blank\" label=\"GitLogReader\"];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_OverridePredicate [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java\" target=\"_blank\" label=\"MetricsVisitorLogic$OverridePredicate\"];\nGraphDependencyCollector [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/GraphDependencyCollector.java\" target=\"_blank\" label=\"GraphDependencyCollector\"];\nDependencyVisitorLogic [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/DependencyVisitorLogic.java\" target=\"_blank\" label=\"DependencyVisitorLogic\"];\nDisharmony [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/effort-ranker/src/main/java/org/hjug/metrics/Disharmony.java\" target=\"_blank\" label=\"Disharmony\"];\nio_confluent_ksql_cli_console_Console_NoOpRowCaptor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/test-resources/src/main/resources/Console.java\" target=\"_blank\" label=\"Console$NoOpRowCaptor\"];\nClassMetrics [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/ClassMetrics.java\" target=\"_blank\" label=\"ClassMetrics\"];\nSparseIntDWGEdgeRemovalCalculator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/dsm/SparseIntDWGEdgeRemovalCalculator.java\" target=\"_blank\" label=\"SparseIntDWGEdgeRemovalCalculator\"];\nRefactorFirstSimpleHtmlReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/refactor-first-maven-plugin/src/main/java/org/hjug/mavenreport/RefactorFirstSimpleHtmlReport.java\" target=\"_blank\" label=\"RefactorFirstSimpleHtmlReport\"];\nClassRelationshipsToRemoveDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/ClassRelationshipsToRemoveDTO.java\" target=\"_blank\" label=\"ClassRelationshipsToRemoveDTO\"];\nCsvReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/CsvReport.java\" target=\"_blank\" label=\"CsvReport\"];\nDisharmonyTableDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/DisharmonyTableDTO.java\" target=\"_blank\" label=\"DisharmonyTableDTO\"];\nJsonGenerator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java\" target=\"_blank\" label=\"JsonGenerator\"];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_FlaggedClassData [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java\" target=\"_blank\" label=\"DisharmonyDetector$FlaggedClassData\"];\norg_hjug_metrics_DisharmonyRanker_RankSetter [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/effort-ranker/src/main/java/org/hjug/metrics/DisharmonyRanker.java\" target=\"_blank\" label=\"DisharmonyRanker$RankSetter\"];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter$SecureDirectoryOps\"];\nChartJsBubbleDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/ChartJsBubbleDTO.java\" target=\"_blank\" label=\"ChartJsBubbleDTO\"];\nHtmlReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/HtmlReport.java\" target=\"_blank\" label=\"HtmlReport\"];\nDisharmonyMetric [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyMetric.java\" target=\"_blank\" label=\"DisharmonyMetric\"];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_MethodStateSnapshot [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java\" target=\"_blank\" label=\"MetricsVisitorLogic$MethodStateSnapshot\"];\norg_hjug_feedback_vertex_kernelized_DirectedFeedbackVertexSetSolver_PathComputationStats [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java\" target=\"_blank\" label=\"DirectedFeedbackVertexSetSolver$PathComputationStats\"];\nLineVertex [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/PageRankFAS.java\" target=\"_blank\" label=\"LineVertex\"];\norg_hjug_feedback_vertex_kernelized_ModulatorComputer_ModulatorResult [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java\" target=\"_blank\" label=\"ModulatorComputer$ModulatorResult\"];\nGodClass [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/effort-ranker/src/main/java/org/hjug/metrics/GodClass.java\" target=\"_blank\" label=\"GodClass\"];\nDirectedFeedbackVertexSetResult [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetResult.java\" target=\"_blank\" label=\"DirectedFeedbackVertexSetResult\"];\nRefactorFirstReportDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/RefactorFirstReportDTO.java\" target=\"_blank\" label=\"RefactorFirstReportDTO\"];\nio_confluent_ksql_cli_console_Console_CliCmdExecutor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/test-resources/src/main/resources/Console.java\" target=\"_blank\" label=\"Console$CliCmdExecutor\"];\nKotlinDependencyVisitor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/KotlinDependencyVisitor.java\" target=\"_blank\" label=\"KotlinDependencyVisitor\"];\norg_hjug_feedback_vertex_approximate_FeedbackVertexSetSolver_CutCandidate [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java\" target=\"_blank\" label=\"FeedbackVertexSetSolver$CutCandidate\"];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_Clone [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java\" target=\"_blank\" label=\"DisharmonyDetector$Clone\"];\nCBOClass [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/effort-ranker/src/main/java/org/hjug/metrics/CBOClass.java\" target=\"_blank\" label=\"CBOClass\"];\nMain [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/cli/src/main/java/org/hjug/refactorfirst/Main.java\" target=\"_blank\" label=\"Main\"];\nJavaSourceFileGraphBuilder [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/graphbuilder/JavaSourceFileGraphBuilder.java\" target=\"_blank\" label=\"JavaSourceFileGraphBuilder\"];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter$SecureDirectoryOpsImpl\"];\nGodClassRanker [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/effort-ranker/src/main/java/org/hjug/metrics/GodClassRanker.java\" target=\"_blank\" label=\"GodClassRanker\"];\norg_hjug_graphbuilder_visitor_KotlinDependencyVisitor_1 [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/KotlinDependencyVisitor.java\" target=\"_blank\" label=\"KotlinDependencyVisitor$1\"];\norg_hjug_feedback_vertex_kernelized_EnhancedParameterComputer_EnhancedParameters [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/EnhancedParameterComputer.java\" target=\"_blank\" label=\"EnhancedParameterComputer$EnhancedParameters\"];\nConsole [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/test-resources/src/main/resources/Console.java\" target=\"_blank\" label=\"Console\"];\nCycleNode [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/cost-benefit-calculator/src/main/java/org/hjug/cbc/CycleNode.java\" target=\"_blank\" label=\"CycleNode\"];\nFeedbackVertexSetComputer [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/FeedbackVertexSetComputer.java\" target=\"_blank\" label=\"FeedbackVertexSetComputer\"];\nCBORule [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/effort-ranker/src/main/java/org/hjug/metrics/rules/CBORule.java\" target=\"_blank\" label=\"CBORule\"];\nReportType [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/cli/src/main/java/org/hjug/refactorfirst/ReportType.java\" target=\"_blank\" label=\"ReportType\"];\nParameterComputer [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ParameterComputer.java\" target=\"_blank\" label=\"ParameterComputer\"];\nComplexityCalculator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/ComplexityCalculator.java\" target=\"_blank\" label=\"ComplexityCalculator\"];\nRefactorFirstMavenCsvReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/refactor-first-maven-plugin/src/main/java/org/hjug/mavenreport/RefactorFirstMavenCsvReport.java\" target=\"_blank\" label=\"RefactorFirstMavenCsvReport\"];\nReportWriter [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter\" color=red style=filled];\nMetricsVisitorLogic [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java\" target=\"_blank\" label=\"MetricsVisitorLogic\"];\norg_hjug_metrics_DisharmonyRanker_ValueExtractor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/effort-ranker/src/main/java/org/hjug/metrics/DisharmonyRanker.java\" target=\"_blank\" label=\"DisharmonyRanker$ValueExtractor\"];\nMetricsVisitorState [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorState.java\" target=\"_blank\" label=\"MetricsVisitorState\"];\nTypeDependencyExtractor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/TypeDependencyExtractor.java\" target=\"_blank\" label=\"TypeDependencyExtractor\"];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java\" target=\"_blank\" label=\"DisharmonyDetector$ClassDisharmony\"];\nHtmlReportTask [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/HtmlReportTask.java\" target=\"_blank\" label=\"HtmlReportTask\"];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodEntry [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java\" target=\"_blank\" label=\"DisharmonyDetector$MethodEntry\"];\norg_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter$FallbackDirectoryOps\"];\norg_hjug_feedback_arc_approximate_FeedbackArcSetResult [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/arc/approximate/FeedbackArcSetResult.java\" target=\"_blank\" label=\"FeedbackArcSetResult\"];\nJavaVisitor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/JavaVisitor.java\" target=\"_blank\" label=\"JavaVisitor\"];\nJsonReportExecutor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/json/JsonReportExecutor.java\" target=\"_blank\" label=\"JsonReportExecutor\"];\nBaseTypeProcessor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/BaseTypeProcessor.java\" target=\"_blank\" label=\"BaseTypeProcessor\"];\nEnhancedParameterComputer [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/EnhancedParameterComputer.java\" target=\"_blank\" label=\"EnhancedParameterComputer\"];\nFeedbackVertexSetSolver [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java\" target=\"_blank\" label=\"FeedbackVertexSetSolver\"];\nGraphDataGenerator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-data-generator/src/main/java/org/hjug/gdg/GraphDataGenerator.java\" target=\"_blank\" label=\"GraphDataGenerator\"];\nDependencyVisitorState [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/DependencyVisitorState.java\" target=\"_blank\" label=\"DependencyVisitorState\"];\norg_hjug_feedback_arc_exact_FeedbackArcSetResult [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/FeedbackArcSetResult.java\" target=\"_blank\" label=\"FeedbackArcSetResult\"];\nUnattributedTypeFqnResolver [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/UnattributedTypeFqnResolver.java\" target=\"_blank\" label=\"UnattributedTypeFqnResolver\"];\nSourceFileGraphBuilder [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/graphbuilder/SourceFileGraphBuilder.java\" target=\"_blank\" label=\"SourceFileGraphBuilder\"];\nSuperTypeToken [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/SuperTypeToken.java\" target=\"_blank\" label=\"SuperTypeToken\"];\nPageRankFAS [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/PageRankFAS.java\" target=\"_blank\" label=\"PageRankFAS\"];\nSourcePathResolver [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/SourcePathResolver.java\" target=\"_blank\" label=\"SourcePathResolver\"];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java\" target=\"_blank\" label=\"DisharmonyDetector$MethodDisharmony\"];\nSimpleHtmlReportTask [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/SimpleHtmlReportTask.java\" target=\"_blank\" label=\"SimpleHtmlReportTask\"];\nRefactorFirstHtmlReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/refactor-first-maven-plugin/src/main/java/org/hjug/mavenreport/RefactorFirstHtmlReport.java\" target=\"_blank\" label=\"RefactorFirstHtmlReport\"];\nClassCyclesDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/model/ClassCyclesDTO.java\" target=\"_blank\" label=\"ClassCyclesDTO\"];\nTreewidthComputer [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java\" target=\"_blank\" label=\"TreewidthComputer\"];\nModulatorComputer [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java\" target=\"_blank\" label=\"ModulatorComputer\"];\n}",
+ "dot" : "strict digraph G {\nChangePronenessRanker -> ScmLogInfo [ label = \"5\" weight = \"5\" ];\nChangePronenessRanker -> GitLogReader [ label = \"2\" weight = \"2\" ];\nGitLogReader -> org_hjug_git_GitLogReader_CommitWalkStats [ label = \"4\" weight = \"4\" ];\nGitLogReader -> ScmLogInfo [ label = \"3\" weight = \"3\" ];\nMain -> ReportCommand [ label = \"1\" weight = \"1\" ];\nReportCommand -> ReportType [ label = \"1\" weight = \"1\" ];\nReportCommand -> ReportWriter [ label = \"1\" weight = \"1\" ];\nReportCommand -> SimpleHtmlReport [ label = \"4\" weight = \"4\" ];\nReportCommand -> HtmlReport [ label = \"2\" weight = \"2\" ];\nReportCommand -> JsonReportExecutor [ label = \"3\" weight = \"3\" ];\nReportCommand -> CsvReport [ label = \"3\" weight = \"3\" ];\nCodebaseGraphDTO -> org_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony [ label = \"4\" weight = \"4\" ];\nCodebaseGraphDTO -> org_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony [ label = \"4\" weight = \"4\" ];\nCompositeGraphBuilder -> GraphBuilderConfig [ label = \"4\" weight = \"4\" ];\nCompositeGraphBuilder -> CodebaseGraphDTO [ label = \"10\" weight = \"10\" ];\nCompositeGraphBuilder -> JavaSourceFileGraphBuilder [ label = \"3\" weight = \"3\" ];\nCompositeGraphBuilder -> KotlinSourceFileGraphBuilder [ label = \"3\" weight = \"3\" ];\nCompositeGraphBuilder -> org_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony [ label = \"2\" weight = \"2\" ];\nCompositeGraphBuilder -> org_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony [ label = \"2\" weight = \"2\" ];\nJavaSourceFileGraphBuilder -> SourceFileGraphBuilder [ label = \"2\" weight = \"2\" ];\nJavaSourceFileGraphBuilder -> GraphBuilderConfig [ label = \"1\" weight = \"1\" ];\nJavaSourceFileGraphBuilder -> GraphDependencyCollector [ label = \"2\" weight = \"2\" ];\nJavaSourceFileGraphBuilder -> JavaVisitor [ label = \"1\" weight = \"1\" ];\nJavaSourceFileGraphBuilder -> GraphMetricsCollector [ label = \"5\" weight = \"5\" ];\nJavaSourceFileGraphBuilder -> MetricsCollectingVisitor [ label = \"2\" weight = \"2\" ];\nJavaSourceFileGraphBuilder -> AbstractDependencyVisitor [ label = \"1\" weight = \"1\" ];\nJavaSourceFileGraphBuilder -> CodebaseGraphDTO [ label = \"2\" weight = \"2\" ];\nJavaSourceFileGraphBuilder -> Java25ParserFactory [ label = \"1\" weight = \"1\" ];\nJavaSourceFileGraphBuilder -> DisharmonyDetector [ label = \"18\" weight = \"18\" ];\nJavaSourceFileGraphBuilder -> ClassMetrics [ label = \"3\" weight = \"3\" ];\nJavaSourceFileGraphBuilder -> org_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony [ label = \"3\" weight = \"3\" ];\nJavaSourceFileGraphBuilder -> org_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony [ label = \"3\" weight = \"3\" ];\nKotlinSourceFileGraphBuilder -> SourceFileGraphBuilder [ label = \"2\" weight = \"2\" ];\nKotlinSourceFileGraphBuilder -> GraphBuilderConfig [ label = \"1\" weight = \"1\" ];\nKotlinSourceFileGraphBuilder -> GraphDependencyCollector [ label = \"1\" weight = \"1\" ];\nKotlinSourceFileGraphBuilder -> KotlinDependencyVisitor [ label = \"2\" weight = \"2\" ];\nKotlinSourceFileGraphBuilder -> GraphMetricsCollector [ label = \"1\" weight = \"1\" ];\nKotlinSourceFileGraphBuilder -> KotlinMetricsCollectingVisitor [ label = \"2\" weight = \"2\" ];\nKotlinSourceFileGraphBuilder -> JavaSourceFileGraphBuilder [ label = \"1\" weight = \"1\" ];\nKotlinSourceFileGraphBuilder -> CodebaseGraphDTO [ label = \"1\" weight = \"1\" ];\nSourceFileGraphBuilder -> GraphBuilderConfig [ label = \"1\" weight = \"1\" ];\nSourceFileGraphBuilder -> CodebaseGraphDTO [ label = \"1\" weight = \"1\" ];\nGraphDependencyCollector -> DependencyCollector [ label = \"1\" weight = \"1\" ];\nClassMetrics -> MethodMetrics [ label = \"13\" weight = \"13\" ];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony -> ClassMetrics [ label = \"1\" weight = \"1\" ];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony -> DisharmonyMetric [ label = \"1\" weight = \"1\" ];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony -> MethodMetrics [ label = \"1\" weight = \"1\" ];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony -> DisharmonyMetric [ label = \"1\" weight = \"1\" ];\nDisharmonyDetector -> ClassMetrics [ label = \"99\" weight = \"99\" ];\nDisharmonyDetector -> org_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony [ label = \"30\" weight = \"30\" ];\nDisharmonyDetector -> DisharmonyMetric [ label = \"44\" weight = \"44\" ];\nDisharmonyDetector -> org_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony [ label = \"15\" weight = \"15\" ];\nDisharmonyDetector -> MethodMetrics [ label = \"40\" weight = \"40\" ];\nDisharmonyDetector -> org_hjug_graphbuilder_metrics_DisharmonyDetector_MethodEntry [ label = \"5\" weight = \"5\" ];\nDisharmonyDetector -> org_hjug_graphbuilder_metrics_DisharmonyDetector_FlaggedClassData [ label = \"10\" weight = \"10\" ];\nDisharmonyDetector -> org_hjug_graphbuilder_metrics_DisharmonyDetector_Clone [ label = \"20\" weight = \"20\" ];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodEntry -> ClassMetrics [ label = \"2\" weight = \"2\" ];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodEntry -> MethodMetrics [ label = \"2\" weight = \"2\" ];\nDisharmonyMetric -> org_hjug_graphbuilder_metrics_DisharmonyMetric_Direction [ label = \"1\" weight = \"1\" ];\nGraphMetricsCollector -> DependencyCollector [ label = \"1\" weight = \"1\" ];\nGraphMetricsCollector -> ClassMetrics [ label = \"33\" weight = \"33\" ];\nGraphMetricsCollector -> MethodMetrics [ label = \"10\" weight = \"10\" ];\nKotlinMetricsCollectingVisitor -> GraphMetricsCollector [ label = \"2\" weight = \"2\" ];\nKotlinMetricsCollectingVisitor -> MetricsVisitorState [ label = \"2\" weight = \"2\" ];\nKotlinMetricsCollectingVisitor -> MetricsVisitorLogic [ label = \"17\" weight = \"17\" ];\nKotlinMetricsCollectingVisitor -> org_hjug_graphbuilder_metrics_MetricsVisitorLogic_ClassStateSnapshot [ label = \"1\" weight = \"1\" ];\nKotlinMetricsCollectingVisitor -> org_hjug_graphbuilder_metrics_MetricsVisitorLogic_MethodStateSnapshot [ label = \"1\" weight = \"1\" ];\nKotlinMetricsCollectingVisitor -> ClassMetrics [ label = \"2\" weight = \"2\" ];\nMetricsCollectingVisitor -> GraphMetricsCollector [ label = \"2\" weight = \"2\" ];\nMetricsCollectingVisitor -> MetricsVisitorState [ label = \"2\" weight = \"2\" ];\nMetricsCollectingVisitor -> MetricsVisitorLogic [ label = \"10\" weight = \"10\" ];\nMetricsCollectingVisitor -> org_hjug_graphbuilder_metrics_MetricsVisitorLogic_ClassStateSnapshot [ label = \"1\" weight = \"1\" ];\nMetricsCollectingVisitor -> org_hjug_graphbuilder_metrics_MetricsVisitorLogic_MethodStateSnapshot [ label = \"1\" weight = \"1\" ];\nMetricsVisitorLogic -> MetricsVisitorState [ label = \"12\" weight = \"12\" ];\nMetricsVisitorLogic -> GraphMetricsCollector [ label = \"13\" weight = \"13\" ];\nMetricsVisitorLogic -> org_hjug_graphbuilder_metrics_MetricsVisitorLogic_ClassStateSnapshot [ label = \"4\" weight = \"4\" ];\nMetricsVisitorLogic -> ClassMetrics [ label = \"28\" weight = \"28\" ];\nMetricsVisitorLogic -> org_hjug_graphbuilder_metrics_MetricsVisitorLogic_OverridePredicate [ label = \"2\" weight = \"2\" ];\nMetricsVisitorLogic -> MethodMetrics [ label = \"31\" weight = \"31\" ];\nMetricsVisitorLogic -> ComplexityCalculator [ label = \"4\" weight = \"4\" ];\nMetricsVisitorLogic -> org_hjug_graphbuilder_metrics_MetricsVisitorLogic_MethodStateSnapshot [ label = \"3\" weight = \"3\" ];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_ClassStateSnapshot -> ClassMetrics [ label = \"2\" weight = \"2\" ];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_MethodStateSnapshot -> MethodMetrics [ label = \"2\" weight = \"2\" ];\nMetricsVisitorState -> ClassMetrics [ label = \"1\" weight = \"1\" ];\nMetricsVisitorState -> MethodMetrics [ label = \"1\" weight = \"1\" ];\nAbstractDependencyVisitor -> DependencyVisitorState [ label = \"2\" weight = \"2\" ];\nAbstractDependencyVisitor -> DependencyCollector [ label = \"1\" weight = \"1\" ];\norg_hjug_graphbuilder_visitor_AbstractDependencyVisitor_1 -> DependencyCollector [ label = \"1\" weight = \"1\" ];\nAbstractDependencyVisitor -> org_hjug_graphbuilder_visitor_AbstractDependencyVisitor_1 [ label = \"1\" weight = \"1\" ];\nAbstractDependencyVisitor -> BaseTypeProcessor [ label = \"1\" weight = \"1\" ];\nAbstractDependencyVisitor -> DependencyVisitorLogic [ label = \"14\" weight = \"14\" ];\nBaseTypeProcessor -> TypeDependencyExtractor [ label = \"3\" weight = \"3\" ];\nBaseTypeProcessor -> DependencyCollector [ label = \"3\" weight = \"3\" ];\nDependencyVisitorLogic -> DependencyVisitorState [ label = \"14\" weight = \"14\" ];\nDependencyVisitorLogic -> SourcePathResolver [ label = \"2\" weight = \"2\" ];\nDependencyVisitorLogic -> org_hjug_graphbuilder_visitor_DependencyVisitorLogic_ClassSnapshot [ label = \"3\" weight = \"3\" ];\nDependencyVisitorLogic -> UnattributedTypeFqnResolver [ label = \"1\" weight = \"1\" ];\nDependencyVisitorState -> BaseTypeProcessor [ label = \"2\" weight = \"2\" ];\nJavaVisitor -> AbstractDependencyVisitor [ label = \"2\" weight = \"2\" ];\nJavaVisitor -> DependencyCollector [ label = \"1\" weight = \"1\" ];\nKotlinDependencyVisitor -> DependencyCollector [ label = \"7\" weight = \"7\" ];\nKotlinDependencyVisitor -> BaseTypeProcessor [ label = \"8\" weight = \"8\" ];\nKotlinDependencyVisitor -> DependencyVisitorState [ label = \"2\" weight = \"2\" ];\norg_hjug_graphbuilder_visitor_KotlinDependencyVisitor_1 -> DependencyCollector [ label = \"1\" weight = \"1\" ];\nKotlinDependencyVisitor -> org_hjug_graphbuilder_visitor_KotlinDependencyVisitor_1 [ label = \"1\" weight = \"1\" ];\nKotlinDependencyVisitor -> DependencyVisitorLogic [ label = \"17\" weight = \"17\" ];\nCostBenefitCalculator -> GitLogReader [ label = \"4\" weight = \"4\" ];\nCostBenefitCalculator -> ChangePronenessRanker [ label = \"3\" weight = \"3\" ];\nCostBenefitCalculator -> CBORule [ label = \"1\" weight = \"1\" ];\nCostBenefitCalculator -> GodClass [ label = \"10\" weight = \"10\" ];\nCostBenefitCalculator -> ScmLogInfo [ label = \"16\" weight = \"16\" ];\nCostBenefitCalculator -> RankedDisharmony [ label = \"20\" weight = \"20\" ];\nCostBenefitCalculator -> CodebaseGraphDTO [ label = \"10\" weight = \"10\" ];\nCostBenefitCalculator -> org_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony [ label = \"4\" weight = \"4\" ];\nCostBenefitCalculator -> GodClassRanker [ label = \"6\" weight = \"6\" ];\nCostBenefitCalculator -> DisharmonyInstance [ label = \"11\" weight = \"11\" ];\nCostBenefitCalculator -> DisharmonyRanker [ label = \"4\" weight = \"4\" ];\nCostBenefitCalculator -> org_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony [ label = \"2\" weight = \"2\" ];\nCostBenefitCalculator -> Disharmony [ label = \"5\" weight = \"5\" ];\nCostBenefitCalculator -> CBOClass [ label = \"6\" weight = \"6\" ];\nCycleNode -> Disharmony [ label = \"1\" weight = \"1\" ];\nCycleNode -> ScmLogInfo [ label = \"1\" weight = \"1\" ];\nCycleRanker -> CodebaseGraphDTO [ label = \"2\" weight = \"2\" ];\nCycleRanker -> CompositeGraphBuilder [ label = \"3\" weight = \"3\" ];\nCycleRanker -> GraphBuilderConfig [ label = \"1\" weight = \"1\" ];\nCycleRanker -> RankedCycle [ label = \"7\" weight = \"7\" ];\nCycleRanker -> CircularReferenceChecker [ label = \"2\" weight = \"2\" ];\nCycleRanker -> CycleNode [ label = \"3\" weight = \"3\" ];\nRankedCycle -> CycleNode [ label = \"2\" weight = \"2\" ];\nRankedDisharmony -> DisharmonyMetric [ label = \"1\" weight = \"1\" ];\nRankedDisharmony -> GodClass [ label = \"1\" weight = \"1\" ];\nRankedDisharmony -> ScmLogInfo [ label = \"3\" weight = \"3\" ];\nRankedDisharmony -> CBOClass [ label = \"1\" weight = \"1\" ];\nRankedDisharmony -> DisharmonyInstance [ label = \"1\" weight = \"1\" ];\nCBOClass -> Disharmony [ label = \"1\" weight = \"1\" ];\nDisharmonyInstance -> Disharmony [ label = \"1\" weight = \"1\" ];\nDisharmonyInstance -> DisharmonyMetric [ label = \"1\" weight = \"1\" ];\nDisharmonyRanker -> DisharmonyInstance [ label = \"7\" weight = \"7\" ];\nDisharmonyRanker -> DisharmonyMetric [ label = \"1\" weight = \"1\" ];\nDisharmonyRanker -> org_hjug_metrics_DisharmonyRanker_ValueExtractor [ label = \"3\" weight = \"3\" ];\nDisharmonyRanker -> org_hjug_metrics_DisharmonyRanker_RankSetter [ label = \"3\" weight = \"3\" ];\nGodClass -> Disharmony [ label = \"1\" weight = \"1\" ];\nGodClassRanker -> GodClass [ label = \"18\" weight = \"18\" ];\nEdgeRemovalCalculator -> DSM [ label = \"4\" weight = \"4\" ];\nEdgeRemovalCalculator -> CircularReferenceChecker [ label = \"6\" weight = \"6\" ];\nEdgeRemovalCalculator -> EdgeToRemoveInfo [ label = \"7\" weight = \"7\" ];\nSparseIntDWGEdgeRemovalCalculator -> EdgeToRemoveInfo [ label = \"3\" weight = \"3\" ];\nFeedbackArcSetSolver -> org_hjug_feedback_arc_approximate_FeedbackArcSetResult [ label = \"2\" weight = \"2\" ];\nEdgeInfoCalculator -> EdgeInfo [ label = \"4\" weight = \"4\" ];\nMinimumFeedbackArcSetSolver -> SuperTypeToken [ label = \"2\" weight = \"2\" ];\nMinimumFeedbackArcSetSolver -> org_hjug_feedback_arc_exact_FeedbackArcSetResult [ label = \"2\" weight = \"2\" ];\nLineDigraph -> LineVertex [ label = \"68\" weight = \"68\" ];\nPageRankFAS -> SuperTypeToken [ label = \"3\" weight = \"3\" ];\nPageRankFAS -> LineDigraph [ label = \"13\" weight = \"13\" ];\nPageRankFAS -> LineVertex [ label = \"25\" weight = \"25\" ];\nCycleRemovalComputer -> CircularReferenceChecker [ label = \"2\" weight = \"2\" ];\nCycleRemovalComputer -> EnhancedParameterComputer [ label = \"2\" weight = \"2\" ];\nCycleRemovalComputer -> org_hjug_feedback_vertex_kernelized_EnhancedParameterComputer_EnhancedParameters [ label = \"4\" weight = \"4\" ];\nCycleRemovalComputer -> DirectedFeedbackVertexSetSolver [ label = \"2\" weight = \"2\" ];\nCycleRemovalComputer -> DirectedFeedbackVertexSetResult [ label = \"2\" weight = \"2\" ];\nCycleRemovalComputer -> PageRankFAS [ label = \"2\" weight = \"2\" ];\nCycleRemovalComputer -> CycleRemovalResult [ label = \"1\" weight = \"1\" ];\nFeedbackVertexSetSolver -> FeedbackVertexSetResult [ label = \"16\" weight = \"16\" ];\nFeedbackVertexSetSolver -> org_hjug_feedback_vertex_approximate_FeedbackVertexSetSolver_CutCandidate [ label = \"5\" weight = \"5\" ];\nDirectedFeedbackVertexSetSolver -> SuperTypeToken [ label = \"2\" weight = \"2\" ];\nDirectedFeedbackVertexSetSolver -> DirectedFeedbackVertexSetResult [ label = \"4\" weight = \"4\" ];\nDirectedFeedbackVertexSetSolver -> org_hjug_feedback_vertex_kernelized_DirectedFeedbackVertexSetSolver_PathComputationStats [ label = \"4\" weight = \"4\" ];\nDirectedFeedbackVertexSetSolver -> org_hjug_feedback_vertex_kernelized_DirectedFeedbackVertexSetSolver_PathContext [ label = \"1\" weight = \"1\" ];\nEnhancedParameterComputer -> TreewidthComputer [ label = \"6\" weight = \"6\" ];\nEnhancedParameterComputer -> FeedbackVertexSetComputer [ label = \"6\" weight = \"6\" ];\nEnhancedParameterComputer -> ModulatorComputer [ label = \"5\" weight = \"5\" ];\nEnhancedParameterComputer -> SuperTypeToken [ label = \"2\" weight = \"2\" ];\nEnhancedParameterComputer -> org_hjug_feedback_vertex_kernelized_EnhancedParameterComputer_EnhancedParameters [ label = \"14\" weight = \"14\" ];\nEnhancedParameterComputer -> org_hjug_feedback_vertex_kernelized_ModulatorComputer_ModulatorResult [ label = \"6\" weight = \"6\" ];\nFeedbackVertexSetComputer -> SuperTypeToken [ label = \"4\" weight = \"4\" ];\nModulatorComputer -> TreewidthComputer [ label = \"14\" weight = \"14\" ];\nModulatorComputer -> FeedbackVertexSetComputer [ label = \"5\" weight = \"5\" ];\nModulatorComputer -> SuperTypeToken [ label = \"2\" weight = \"2\" ];\nModulatorComputer -> org_hjug_feedback_vertex_kernelized_ModulatorComputer_ModulatorResult [ label = \"2\" weight = \"2\" ];\nParameterComputer -> TreewidthComputer [ label = \"7\" weight = \"7\" ];\nParameterComputer -> FeedbackVertexSetComputer [ label = \"6\" weight = \"6\" ];\nParameterComputer -> SuperTypeToken [ label = \"2\" weight = \"2\" ];\nParameterComputer -> org_hjug_feedback_vertex_kernelized_ParameterComputer_Parameters [ label = \"4\" weight = \"4\" ];\nGraphDataGenerator -> RankedDisharmony [ label = \"2\" weight = \"2\" ];\nCsvReportTask -> RefactorFirstExtension [ label = \"8\" weight = \"8\" ];\nCsvReportTask -> CsvReport [ label = \"3\" weight = \"3\" ];\nCsvReportTask -> RefactorFirstPlugin [ label = \"1\" weight = \"1\" ];\nHtmlReportTask -> RefactorFirstExtension [ label = \"13\" weight = \"13\" ];\nHtmlReportTask -> HtmlReport [ label = \"2\" weight = \"2\" ];\nHtmlReportTask -> RefactorFirstPlugin [ label = \"1\" weight = \"1\" ];\nHtmlReportTask -> SimpleHtmlReport [ label = \"1\" weight = \"1\" ];\nJsonReportTask -> RefactorFirstExtension [ label = \"3\" weight = \"3\" ];\nJsonReportTask -> JsonReportExecutor [ label = \"3\" weight = \"3\" ];\nJsonReportTask -> RefactorFirstPlugin [ label = \"1\" weight = \"1\" ];\nSimpleHtmlReportTask -> RefactorFirstExtension [ label = \"13\" weight = \"13\" ];\nSimpleHtmlReportTask -> SimpleHtmlReport [ label = \"3\" weight = \"3\" ];\nSimpleHtmlReportTask -> RefactorFirstPlugin [ label = \"1\" weight = \"1\" ];\nMavenReportOutputDirectory -> ReportWriter [ label = \"1\" weight = \"1\" ];\nRefactorFirstHtmlReport -> HtmlReport [ label = \"2\" weight = \"2\" ];\nRefactorFirstHtmlReport -> MavenReportOutputDirectory [ label = \"1\" weight = \"1\" ];\nRefactorFirstHtmlReport -> SimpleHtmlReport [ label = \"1\" weight = \"1\" ];\nRefactorFirstMavenCsvReport -> CsvReport [ label = \"3\" weight = \"3\" ];\nRefactorFirstMavenCsvReport -> MavenReportOutputDirectory [ label = \"1\" weight = \"1\" ];\nRefactorFirstMavenJsonGenerator -> JsonGenerator [ label = \"3\" weight = \"3\" ];\nRefactorFirstMavenJsonReport -> JsonReportExecutor [ label = \"3\" weight = \"3\" ];\nRefactorFirstMavenJsonReport -> MavenReportOutputDirectory [ label = \"1\" weight = \"1\" ];\nRefactorFirstMavenReport -> HtmlReport [ label = \"2\" weight = \"2\" ];\nRefactorFirstMavenReport -> SimpleHtmlReport [ label = \"1\" weight = \"1\" ];\nRefactorFirstSimpleHtmlReport -> SimpleHtmlReport [ label = \"3\" weight = \"3\" ];\nRefactorFirstSimpleHtmlReport -> MavenReportOutputDirectory [ label = \"1\" weight = \"1\" ];\nCsvReport -> GitLogReader [ label = \"4\" weight = \"4\" ];\nCsvReport -> ReportWriter [ label = \"3\" weight = \"3\" ];\nCsvReport -> RankedDisharmony [ label = \"3\" weight = \"3\" ];\nCsvReport -> CostBenefitCalculator [ label = \"5\" weight = \"5\" ];\nHtmlReport -> SimpleHtmlReport [ label = \"9\" weight = \"9\" ];\nHtmlReport -> RankedDisharmony [ label = \"1\" weight = \"1\" ];\nHtmlReport -> GraphDataGenerator [ label = \"5\" weight = \"5\" ];\nHtmlReport -> CodebaseGraphDTO [ label = \"17\" weight = \"17\" ];\nHtmlReport -> RankedCycle [ label = \"3\" weight = \"3\" ];\nJsonReport -> JsonReportDisharmonyEntry [ label = \"1\" weight = \"1\" ];\nJsonReportDisharmonyEntry -> RankedDisharmony [ label = \"1\" weight = \"1\" ];\nJsonReportExecutor -> CostBenefitCalculator [ label = \"5\" weight = \"5\" ];\nJsonReportExecutor -> RankedDisharmony [ label = \"2\" weight = \"2\" ];\nJsonReportExecutor -> JsonReportDisharmonyEntry [ label = \"2\" weight = \"2\" ];\nJsonReportExecutor -> JsonReport [ label = \"3\" weight = \"3\" ];\nJsonReportExecutor -> ReportWriter [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> HtmlReport [ label = \"4\" weight = \"4\" ];\nJsonGenerator -> RefactorFirstReportDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> GitLogReader [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> CycleRanker [ label = \"5\" weight = \"5\" ];\nJsonGenerator -> RankedCycle [ label = \"3\" weight = \"3\" ];\nJsonGenerator -> CodebaseGraphDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> CycleRemovalComputer [ label = \"4\" weight = \"4\" ];\nJsonGenerator -> CycleRemovalResult [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> RankedDisharmony [ label = \"10\" weight = \"10\" ];\nJsonGenerator -> CostBenefitCalculator [ label = \"6\" weight = \"6\" ];\nJsonGenerator -> org_hjug_refactorfirst_report_SimpleHtmlReport_DisharmonySpec [ label = \"17\" weight = \"17\" ];\nJsonGenerator -> DisharmonyInstance [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> SimpleHtmlReport [ label = \"31\" weight = \"31\" ];\nJsonGenerator -> ProjectMetadataDTO [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> GraphVisualDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> ClassRelationshipDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> ClassRelationshipsToRemoveDTO [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> PackageRelationshipDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> PackageRelationshipsToRemoveDTO [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> DisharmonySectionDTO [ label = \"3\" weight = \"3\" ];\nJsonGenerator -> CycleSummaryDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> LargestCycleDTO [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> CycleBreakdownRowDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> ClassCyclesDTO [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> ChartJsBubbleDTO [ label = \"3\" weight = \"3\" ];\nJsonGenerator -> DisharmonyChartDTO [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> DisharmonyMetric [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> DisharmonyTableRowDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> DisharmonyTableCellDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> DisharmonyTableDTO [ label = \"1\" weight = \"1\" ];\nClassCyclesDTO -> CycleSummaryDTO [ label = \"2\" weight = \"2\" ];\nClassCyclesDTO -> LargestCycleDTO [ label = \"1\" weight = \"1\" ];\nClassRelationshipsToRemoveDTO -> ClassRelationshipDTO [ label = \"2\" weight = \"2\" ];\nDisharmonyChartDTO -> ChartJsBubbleDTO [ label = \"2\" weight = \"2\" ];\nDisharmonySectionDTO -> DisharmonyChartDTO [ label = \"1\" weight = \"1\" ];\nDisharmonySectionDTO -> DisharmonyTableDTO [ label = \"1\" weight = \"1\" ];\nDisharmonyTableDTO -> DisharmonyTableRowDTO [ label = \"2\" weight = \"2\" ];\nDisharmonyTableRowDTO -> DisharmonyTableCellDTO [ label = \"2\" weight = \"2\" ];\nLargestCycleDTO -> CycleBreakdownRowDTO [ label = \"2\" weight = \"2\" ];\nPackageRelationshipsToRemoveDTO -> PackageRelationshipDTO [ label = \"2\" weight = \"2\" ];\nRefactorFirstReportDTO -> ProjectMetadataDTO [ label = \"1\" weight = \"1\" ];\nRefactorFirstReportDTO -> GraphVisualDTO [ label = \"2\" weight = \"2\" ];\nRefactorFirstReportDTO -> ClassRelationshipsToRemoveDTO [ label = \"1\" weight = \"1\" ];\nRefactorFirstReportDTO -> PackageRelationshipsToRemoveDTO [ label = \"1\" weight = \"1\" ];\nRefactorFirstReportDTO -> DisharmonySectionDTO [ label = \"2\" weight = \"2\" ];\nRefactorFirstReportDTO -> ClassCyclesDTO [ label = \"1\" weight = \"1\" ];\nReportWriter -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [ label = \"3\" weight = \"3\" ];\nReportWriter -> org_hjug_refactorfirst_report_ReportWriter_ReportWriteException [ label = \"3\" weight = \"3\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps -> org_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [ label = \"1\" weight = \"1\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl -> ReportWriter [ label = \"1\" weight = \"1\" ];\norg_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [ label = \"1\" weight = \"1\" ];\norg_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps -> ReportWriter [ label = \"1\" weight = \"1\" ];\nSimpleHtmlReport -> org_hjug_refactorfirst_report_SimpleHtmlReport_DisharmonySpec [ label = \"34\" weight = \"34\" ];\nSimpleHtmlReport -> ReportWriter [ label = \"1\" weight = \"1\" ];\nSimpleHtmlReport -> GitLogReader [ label = \"5\" weight = \"5\" ];\nSimpleHtmlReport -> CycleRanker [ label = \"5\" weight = \"5\" ];\nSimpleHtmlReport -> RankedCycle [ label = \"10\" weight = \"10\" ];\nSimpleHtmlReport -> CodebaseGraphDTO [ label = \"13\" weight = \"13\" ];\nSimpleHtmlReport -> CycleRemovalComputer [ label = \"4\" weight = \"4\" ];\nSimpleHtmlReport -> CycleRemovalResult [ label = \"2\" weight = \"2\" ];\nSimpleHtmlReport -> RankedDisharmony [ label = \"16\" weight = \"16\" ];\nSimpleHtmlReport -> CostBenefitCalculator [ label = \"6\" weight = \"6\" ];\nSimpleHtmlReport -> DisharmonyInstance [ label = \"1\" weight = \"1\" ];\nSimpleHtmlReport -> DisharmonyMetric [ label = \"3\" weight = \"3\" ];\nConsole -> io_confluent_ksql_cli_console_Console_RowCaptor [ label = \"4\" weight = \"4\" ];\nConsole -> io_confluent_ksql_cli_console_Console_NoOpRowCaptor [ label = \"1\" weight = \"1\" ];\nConsole -> io_confluent_ksql_cli_console_Console_CliCmdExecutor [ label = \"4\" weight = \"4\" ];\nio_confluent_ksql_cli_console_Console_NoOpRowCaptor -> io_confluent_ksql_cli_console_Console_RowCaptor [ label = \"1\" weight = \"1\" ];\norg_hjug_graphbuilder_visitor_AbstractDependencyVisitor_1 [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/AbstractDependencyVisitor.java\" target=\"_blank\" label=\"AbstractDependencyVisitor$1\"];\nCycleSummaryDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/CycleSummaryDTO.java\" target=\"_blank\" label=\"CycleSummaryDTO\"];\nJsonReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/json/JsonReport.java\" target=\"_blank\" label=\"JsonReport\"];\nDisharmonyTableCellDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/DisharmonyTableCellDTO.java\" target=\"_blank\" label=\"DisharmonyTableCellDTO\"];\nEdgeRemovalCalculator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/dsm/EdgeRemovalCalculator.java\" target=\"_blank\" label=\"EdgeRemovalCalculator\"];\nSimpleHtmlReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java\" target=\"_blank\" label=\"SimpleHtmlReport\"];\nLineDigraph [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/LineDigraph.java\" target=\"_blank\" label=\"LineDigraph\"];\nCsvReportTask [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/CsvReportTask.java\" target=\"_blank\" label=\"CsvReportTask\"];\nRefactorFirstExtension [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/RefactorFirstExtension.java\" target=\"_blank\" label=\"RefactorFirstExtension\"];\norg_hjug_refactorfirst_report_SimpleHtmlReport_DisharmonySpec [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java\" target=\"_blank\" label=\"SimpleHtmlReport$DisharmonySpec\"];\nGraphMetricsCollector [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/GraphMetricsCollector.java\" target=\"_blank\" label=\"GraphMetricsCollector\"];\nDisharmonyInstance [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/effort-ranker/src/main/java/org/hjug/metrics/DisharmonyInstance.java\" target=\"_blank\" label=\"DisharmonyInstance\"];\norg_hjug_feedback_vertex_kernelized_DirectedFeedbackVertexSetSolver_PathContext [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java\" target=\"_blank\" label=\"DirectedFeedbackVertexSetSolver$PathContext\"];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_ClassStateSnapshot [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java\" target=\"_blank\" label=\"MetricsVisitorLogic$ClassStateSnapshot\"];\nDisharmonySectionDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/DisharmonySectionDTO.java\" target=\"_blank\" label=\"DisharmonySectionDTO\"];\nMavenReportOutputDirectory [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-maven-plugin/src/main/java/org/hjug/mavenreport/MavenReportOutputDirectory.java\" target=\"_blank\" label=\"MavenReportOutputDirectory\"];\nPackageRelationshipsToRemoveDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/PackageRelationshipsToRemoveDTO.java\" target=\"_blank\" label=\"PackageRelationshipsToRemoveDTO\"];\nCompositeGraphBuilder [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java\" target=\"_blank\" label=\"CompositeGraphBuilder\"];\nPackageRelationshipDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/PackageRelationshipDTO.java\" target=\"_blank\" label=\"PackageRelationshipDTO\"];\nMetricsCollectingVisitor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsCollectingVisitor.java\" target=\"_blank\" label=\"MetricsCollectingVisitor\"];\nKotlinSourceFileGraphBuilder [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/graphbuilder/KotlinSourceFileGraphBuilder.java\" target=\"_blank\" label=\"KotlinSourceFileGraphBuilder\"];\nMethodMetrics [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MethodMetrics.java\" target=\"_blank\" label=\"MethodMetrics\"];\nCodebaseGraphDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CodebaseGraphDTO.java\" target=\"_blank\" label=\"CodebaseGraphDTO\"];\nRankedDisharmony [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/cost-benefit-calculator/src/main/java/org/hjug/cbc/RankedDisharmony.java\" target=\"_blank\" label=\"RankedDisharmony\"];\nFeedbackVertexSetResult [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetResult.java\" target=\"_blank\" label=\"FeedbackVertexSetResult\"];\nRefactorFirstMavenJsonReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-maven-plugin/src/main/java/org/hjug/mavenreport/RefactorFirstMavenJsonReport.java\" target=\"_blank\" label=\"RefactorFirstMavenJsonReport\"];\nCycleRemovalComputer [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalComputer.java\" target=\"_blank\" label=\"CycleRemovalComputer\"];\nJsonReportTask [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/JsonReportTask.java\" target=\"_blank\" label=\"JsonReportTask\"];\nDSM [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/dsm/DSM.java\" target=\"_blank\" label=\"DSM\"];\nJsonReportDisharmonyEntry [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/json/JsonReportDisharmonyEntry.java\" target=\"_blank\" label=\"JsonReportDisharmonyEntry\"];\norg_hjug_graphbuilder_metrics_DisharmonyMetric_Direction [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyMetric.java\" target=\"_blank\" label=\"DisharmonyMetric$Direction\"];\nio_confluent_ksql_cli_console_Console_RowCaptor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/Console.java\" target=\"_blank\" label=\"Console$RowCaptor\"];\nCycleBreakdownRowDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/CycleBreakdownRowDTO.java\" target=\"_blank\" label=\"CycleBreakdownRowDTO\"];\nDisharmonyDetector [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java\" target=\"_blank\" label=\"DisharmonyDetector\"];\nCircularReferenceChecker [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/dsm/CircularReferenceChecker.java\" target=\"_blank\" label=\"CircularReferenceChecker\"];\nFeedbackArcSetSolver [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/arc/approximate/FeedbackArcSetSolver.java\" target=\"_blank\" label=\"FeedbackArcSetSolver\"];\nCycleRemovalResult [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalResult.java\" target=\"_blank\" label=\"CycleRemovalResult\"];\norg_hjug_refactorfirst_report_ReportWriter_ReportWriteException [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter$ReportWriteException\"];\nAbstractDependencyVisitor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/AbstractDependencyVisitor.java\" target=\"_blank\" label=\"AbstractDependencyVisitor\"];\nJava25ParserFactory [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/graphbuilder/Java25ParserFactory.java\" target=\"_blank\" label=\"Java25ParserFactory\"];\nProjectMetadataDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/ProjectMetadataDTO.java\" target=\"_blank\" label=\"ProjectMetadataDTO\"];\norg_hjug_feedback_vertex_kernelized_ParameterComputer_Parameters [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ParameterComputer.java\" target=\"_blank\" label=\"ParameterComputer$Parameters\"];\nLargestCycleDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/LargestCycleDTO.java\" target=\"_blank\" label=\"LargestCycleDTO\"];\nRankedCycle [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/cost-benefit-calculator/src/main/java/org/hjug/cbc/RankedCycle.java\" target=\"_blank\" label=\"RankedCycle\"];\nClassRelationshipDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/ClassRelationshipDTO.java\" target=\"_blank\" label=\"ClassRelationshipDTO\"];\nDisharmonyRanker [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/effort-ranker/src/main/java/org/hjug/metrics/DisharmonyRanker.java\" target=\"_blank\" label=\"DisharmonyRanker\"];\norg_hjug_git_GitLogReader_CommitWalkStats [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/change-proneness-ranker/src/main/java/org/hjug/git/GitLogReader.java\" target=\"_blank\" label=\"GitLogReader$CommitWalkStats\"];\nGraphVisualDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/GraphVisualDTO.java\" target=\"_blank\" label=\"GraphVisualDTO\"];\nDisharmonyTableRowDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/DisharmonyTableRowDTO.java\" target=\"_blank\" label=\"DisharmonyTableRowDTO\"];\nChangePronenessRanker [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/change-proneness-ranker/src/main/java/org/hjug/git/ChangePronenessRanker.java\" target=\"_blank\" label=\"ChangePronenessRanker\"];\nScmLogInfo [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/change-proneness-ranker/src/main/java/org/hjug/git/ScmLogInfo.java\" target=\"_blank\" label=\"ScmLogInfo\"];\nKotlinMetricsCollectingVisitor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/KotlinMetricsCollectingVisitor.java\" target=\"_blank\" label=\"KotlinMetricsCollectingVisitor\"];\nEdgeToRemoveInfo [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/dsm/EdgeToRemoveInfo.java\" target=\"_blank\" label=\"EdgeToRemoveInfo\"];\nDirectedFeedbackVertexSetSolver [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java\" target=\"_blank\" label=\"DirectedFeedbackVertexSetSolver\"];\nGraphBuilderConfig [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/GraphBuilderConfig.java\" target=\"_blank\" label=\"GraphBuilderConfig\"];\nMinimumFeedbackArcSetSolver [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java\" target=\"_blank\" label=\"MinimumFeedbackArcSetSolver\"];\norg_hjug_graphbuilder_visitor_DependencyVisitorLogic_ClassSnapshot [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/DependencyVisitorLogic.java\" target=\"_blank\" label=\"DependencyVisitorLogic$ClassSnapshot\"];\nRefactorFirstMavenReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-maven-plugin/src/main/java/org/hjug/mavenreport/RefactorFirstMavenReport.java\" target=\"_blank\" label=\"RefactorFirstMavenReport\"];\nEdgeInfoCalculator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/arc/EdgeInfoCalculator.java\" target=\"_blank\" label=\"EdgeInfoCalculator\"];\nRefactorFirstMavenJsonGenerator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-maven-plugin/src/main/java/org/hjug/mavenreport/RefactorFirstMavenJsonGenerator.java\" target=\"_blank\" label=\"RefactorFirstMavenJsonGenerator\"];\nCycleRanker [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/cost-benefit-calculator/src/main/java/org/hjug/cbc/CycleRanker.java\" target=\"_blank\" label=\"CycleRanker\"];\nReportCommand [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/cli/src/main/java/org/hjug/refactorfirst/ReportCommand.java\" target=\"_blank\" label=\"ReportCommand\"];\nDisharmonyChartDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/DisharmonyChartDTO.java\" target=\"_blank\" label=\"DisharmonyChartDTO\"];\nRefactorFirstPlugin [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/RefactorFirstPlugin.java\" target=\"_blank\" label=\"RefactorFirstPlugin\"];\nDependencyCollector [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/DependencyCollector.java\" target=\"_blank\" label=\"DependencyCollector\"];\nCostBenefitCalculator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/cost-benefit-calculator/src/main/java/org/hjug/cbc/CostBenefitCalculator.java\" target=\"_blank\" label=\"CostBenefitCalculator\"];\nEdgeInfo [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/arc/EdgeInfo.java\" target=\"_blank\" label=\"EdgeInfo\"];\nGitLogReader [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/change-proneness-ranker/src/main/java/org/hjug/git/GitLogReader.java\" target=\"_blank\" label=\"GitLogReader\"];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_OverridePredicate [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java\" target=\"_blank\" label=\"MetricsVisitorLogic$OverridePredicate\"];\nGraphDependencyCollector [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/GraphDependencyCollector.java\" target=\"_blank\" label=\"GraphDependencyCollector\"];\nDependencyVisitorLogic [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/DependencyVisitorLogic.java\" target=\"_blank\" label=\"DependencyVisitorLogic\"];\nDisharmony [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/effort-ranker/src/main/java/org/hjug/metrics/Disharmony.java\" target=\"_blank\" label=\"Disharmony\"];\nio_confluent_ksql_cli_console_Console_NoOpRowCaptor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/Console.java\" target=\"_blank\" label=\"Console$NoOpRowCaptor\"];\nClassMetrics [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/ClassMetrics.java\" target=\"_blank\" label=\"ClassMetrics\"];\nSparseIntDWGEdgeRemovalCalculator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/dsm/SparseIntDWGEdgeRemovalCalculator.java\" target=\"_blank\" label=\"SparseIntDWGEdgeRemovalCalculator\"];\nRefactorFirstSimpleHtmlReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-maven-plugin/src/main/java/org/hjug/mavenreport/RefactorFirstSimpleHtmlReport.java\" target=\"_blank\" label=\"RefactorFirstSimpleHtmlReport\"];\nClassRelationshipsToRemoveDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/ClassRelationshipsToRemoveDTO.java\" target=\"_blank\" label=\"ClassRelationshipsToRemoveDTO\"];\nCsvReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/CsvReport.java\" target=\"_blank\" label=\"CsvReport\"];\nDisharmonyTableDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/DisharmonyTableDTO.java\" target=\"_blank\" label=\"DisharmonyTableDTO\"];\nJsonGenerator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java\" target=\"_blank\" label=\"JsonGenerator\"];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_FlaggedClassData [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java\" target=\"_blank\" label=\"DisharmonyDetector$FlaggedClassData\"];\norg_hjug_metrics_DisharmonyRanker_RankSetter [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/effort-ranker/src/main/java/org/hjug/metrics/DisharmonyRanker.java\" target=\"_blank\" label=\"DisharmonyRanker$RankSetter\"];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter$SecureDirectoryOps\"];\nChartJsBubbleDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/ChartJsBubbleDTO.java\" target=\"_blank\" label=\"ChartJsBubbleDTO\"];\nHtmlReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/HtmlReport.java\" target=\"_blank\" label=\"HtmlReport\"];\nDisharmonyMetric [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyMetric.java\" target=\"_blank\" label=\"DisharmonyMetric\"];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_MethodStateSnapshot [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java\" target=\"_blank\" label=\"MetricsVisitorLogic$MethodStateSnapshot\"];\norg_hjug_feedback_vertex_kernelized_DirectedFeedbackVertexSetSolver_PathComputationStats [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java\" target=\"_blank\" label=\"DirectedFeedbackVertexSetSolver$PathComputationStats\"];\nLineVertex [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/PageRankFAS.java\" target=\"_blank\" label=\"LineVertex\"];\norg_hjug_feedback_vertex_kernelized_ModulatorComputer_ModulatorResult [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java\" target=\"_blank\" label=\"ModulatorComputer$ModulatorResult\"];\nGodClass [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/effort-ranker/src/main/java/org/hjug/metrics/GodClass.java\" target=\"_blank\" label=\"GodClass\"];\nDirectedFeedbackVertexSetResult [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetResult.java\" target=\"_blank\" label=\"DirectedFeedbackVertexSetResult\"];\nRefactorFirstReportDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/RefactorFirstReportDTO.java\" target=\"_blank\" label=\"RefactorFirstReportDTO\"];\nio_confluent_ksql_cli_console_Console_CliCmdExecutor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/Console.java\" target=\"_blank\" label=\"Console$CliCmdExecutor\"];\nKotlinDependencyVisitor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/KotlinDependencyVisitor.java\" target=\"_blank\" label=\"KotlinDependencyVisitor\"];\norg_hjug_feedback_vertex_approximate_FeedbackVertexSetSolver_CutCandidate [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java\" target=\"_blank\" label=\"FeedbackVertexSetSolver$CutCandidate\"];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_Clone [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java\" target=\"_blank\" label=\"DisharmonyDetector$Clone\"];\nCBOClass [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/effort-ranker/src/main/java/org/hjug/metrics/CBOClass.java\" target=\"_blank\" label=\"CBOClass\"];\nMain [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/cli/src/main/java/org/hjug/refactorfirst/Main.java\" target=\"_blank\" label=\"Main\"];\nJavaSourceFileGraphBuilder [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/graphbuilder/JavaSourceFileGraphBuilder.java\" target=\"_blank\" label=\"JavaSourceFileGraphBuilder\"];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter$SecureDirectoryOpsImpl\"];\nGodClassRanker [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/effort-ranker/src/main/java/org/hjug/metrics/GodClassRanker.java\" target=\"_blank\" label=\"GodClassRanker\"];\norg_hjug_graphbuilder_visitor_KotlinDependencyVisitor_1 [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/KotlinDependencyVisitor.java\" target=\"_blank\" label=\"KotlinDependencyVisitor$1\"];\norg_hjug_feedback_vertex_kernelized_EnhancedParameterComputer_EnhancedParameters [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/EnhancedParameterComputer.java\" target=\"_blank\" label=\"EnhancedParameterComputer$EnhancedParameters\"];\nConsole [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/Console.java\" target=\"_blank\" label=\"Console\"];\nCycleNode [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/cost-benefit-calculator/src/main/java/org/hjug/cbc/CycleNode.java\" target=\"_blank\" label=\"CycleNode\"];\nFeedbackVertexSetComputer [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/FeedbackVertexSetComputer.java\" target=\"_blank\" label=\"FeedbackVertexSetComputer\"];\nCBORule [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/effort-ranker/src/main/java/org/hjug/metrics/rules/CBORule.java\" target=\"_blank\" label=\"CBORule\"];\nReportType [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/cli/src/main/java/org/hjug/refactorfirst/ReportType.java\" target=\"_blank\" label=\"ReportType\"];\nParameterComputer [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ParameterComputer.java\" target=\"_blank\" label=\"ParameterComputer\"];\nComplexityCalculator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/ComplexityCalculator.java\" target=\"_blank\" label=\"ComplexityCalculator\"];\nRefactorFirstMavenCsvReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-maven-plugin/src/main/java/org/hjug/mavenreport/RefactorFirstMavenCsvReport.java\" target=\"_blank\" label=\"RefactorFirstMavenCsvReport\"];\nReportWriter [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter\" color=red style=filled];\nMetricsVisitorLogic [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java\" target=\"_blank\" label=\"MetricsVisitorLogic\"];\norg_hjug_metrics_DisharmonyRanker_ValueExtractor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/effort-ranker/src/main/java/org/hjug/metrics/DisharmonyRanker.java\" target=\"_blank\" label=\"DisharmonyRanker$ValueExtractor\"];\nMetricsVisitorState [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorState.java\" target=\"_blank\" label=\"MetricsVisitorState\"];\nTypeDependencyExtractor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/TypeDependencyExtractor.java\" target=\"_blank\" label=\"TypeDependencyExtractor\"];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java\" target=\"_blank\" label=\"DisharmonyDetector$ClassDisharmony\"];\nHtmlReportTask [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/HtmlReportTask.java\" target=\"_blank\" label=\"HtmlReportTask\"];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodEntry [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java\" target=\"_blank\" label=\"DisharmonyDetector$MethodEntry\"];\norg_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter$FallbackDirectoryOps\"];\norg_hjug_feedback_arc_approximate_FeedbackArcSetResult [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/arc/approximate/FeedbackArcSetResult.java\" target=\"_blank\" label=\"FeedbackArcSetResult\"];\nJavaVisitor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/JavaVisitor.java\" target=\"_blank\" label=\"JavaVisitor\"];\nJsonReportExecutor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/json/JsonReportExecutor.java\" target=\"_blank\" label=\"JsonReportExecutor\"];\nBaseTypeProcessor [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/BaseTypeProcessor.java\" target=\"_blank\" label=\"BaseTypeProcessor\"];\nEnhancedParameterComputer [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/EnhancedParameterComputer.java\" target=\"_blank\" label=\"EnhancedParameterComputer\"];\nFeedbackVertexSetSolver [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java\" target=\"_blank\" label=\"FeedbackVertexSetSolver\"];\nGraphDataGenerator [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-data-generator/src/main/java/org/hjug/gdg/GraphDataGenerator.java\" target=\"_blank\" label=\"GraphDataGenerator\"];\nDependencyVisitorState [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/DependencyVisitorState.java\" target=\"_blank\" label=\"DependencyVisitorState\"];\norg_hjug_feedback_arc_exact_FeedbackArcSetResult [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/FeedbackArcSetResult.java\" target=\"_blank\" label=\"FeedbackArcSetResult\"];\nUnattributedTypeFqnResolver [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/UnattributedTypeFqnResolver.java\" target=\"_blank\" label=\"UnattributedTypeFqnResolver\"];\nSourceFileGraphBuilder [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/graphbuilder/SourceFileGraphBuilder.java\" target=\"_blank\" label=\"SourceFileGraphBuilder\"];\nSuperTypeToken [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/SuperTypeToken.java\" target=\"_blank\" label=\"SuperTypeToken\"];\nPageRankFAS [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/PageRankFAS.java\" target=\"_blank\" label=\"PageRankFAS\"];\nSourcePathResolver [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/SourcePathResolver.java\" target=\"_blank\" label=\"SourcePathResolver\"];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java\" target=\"_blank\" label=\"DisharmonyDetector$MethodDisharmony\"];\nSimpleHtmlReportTask [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/SimpleHtmlReportTask.java\" target=\"_blank\" label=\"SimpleHtmlReportTask\"];\nRefactorFirstHtmlReport [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-maven-plugin/src/main/java/org/hjug/mavenreport/RefactorFirstHtmlReport.java\" target=\"_blank\" label=\"RefactorFirstHtmlReport\"];\nClassCyclesDTO [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/model/ClassCyclesDTO.java\" target=\"_blank\" label=\"ClassCyclesDTO\"];\nTreewidthComputer [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java\" target=\"_blank\" label=\"TreewidthComputer\"];\nModulatorComputer [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java\" target=\"_blank\" label=\"ModulatorComputer\"];\n}",
"hasEdges" : false
},
"classRelationshipsToRemove" : {
@@ -24,12 +24,10 @@
"relationships" : [ {
"sourceClass" : "org.hjug.refactorfirst.report.ReportWriter$SecureDirectoryOps",
"targetClass" : "org.hjug.refactorfirst.report.ReportWriter$SecureDirectoryOpsImpl",
- "sourceUrl" : null,
- "targetUrl" : null,
"sourceMarked" : false,
"targetMarked" : false,
"weight" : 1,
- "renderedLabel" : "ReportWriter$SecureDirectoryOps → ReportWriter$SecureDirectoryOpsImpl : 1",
+ "renderedLabel" : "ReportWriter$SecureDirectoryOps → ReportWriter$SecureDirectoryOpsImpl : 1",
"priority" : 1,
"cycleCount" : 1,
"effortRank" : 1,
@@ -38,12 +36,10 @@
}, {
"sourceClass" : "org.hjug.refactorfirst.report.ReportWriter$SecureDirectoryOps",
"targetClass" : "org.hjug.refactorfirst.report.ReportWriter$FallbackDirectoryOps",
- "sourceUrl" : null,
- "targetUrl" : null,
"sourceMarked" : false,
"targetMarked" : false,
"weight" : 1,
- "renderedLabel" : "ReportWriter$SecureDirectoryOps → ReportWriter$FallbackDirectoryOps : 1",
+ "renderedLabel" : "ReportWriter$SecureDirectoryOps → ReportWriter$FallbackDirectoryOps : 1",
"priority" : 2,
"cycleCount" : 1,
"effortRank" : 1,
@@ -57,7 +53,7 @@
"relationshipCount" : 37,
"dotThreshold" : 4000,
"dotThresholdExceeded" : false,
- "dot" : "strict digraph G {\npackage_622c04a26e1ba36b6ebca283 -> package_864d6940ac14438961598d5a [ label = \"10\" weight = \"10\" ];\npackage_622c04a26e1ba36b6ebca283 -> package_bb20afe0ec6010144ae2060c [ label = \"3\" weight = \"3\" ];\npackage_275b39592e996f9bc7d2bab4 -> package_179967d6e66ef95e5ec582dc [ label = \"12\" weight = \"12\" ];\npackage_275b39592e996f9bc7d2bab4 -> package_98c578ab6c4dd833f53d3aee [ label = \"6\" weight = \"6\" color = \"red\" ];\npackage_98c578ab6c4dd833f53d3aee -> package_275b39592e996f9bc7d2bab4 [ label = \"10\" weight = \"10\" ];\npackage_98c578ab6c4dd833f53d3aee -> package_d36e09db80f0e2bbc4ffd5c7 [ label = \"4\" weight = \"4\" ];\npackage_98c578ab6c4dd833f53d3aee -> package_179967d6e66ef95e5ec582dc [ label = \"37\" weight = \"37\" ];\npackage_179967d6e66ef95e5ec582dc -> package_275b39592e996f9bc7d2bab4 [ label = \"1\" weight = \"1\" color = \"red\" ];\npackage_d36e09db80f0e2bbc4ffd5c7 -> package_275b39592e996f9bc7d2bab4 [ label = \"14\" weight = \"14\" ];\npackage_bfb0d6f0cb59390b479b08a1 -> package_cc2439ece2ff219a79eb369d [ label = \"27\" weight = \"27\" ];\npackage_bfb0d6f0cb59390b479b08a1 -> package_d6011c21970de8ae7eafff05 [ label = \"1\" weight = \"1\" ];\npackage_bfb0d6f0cb59390b479b08a1 -> package_869fe932642cb7510df73c8d [ label = \"46\" weight = \"46\" ];\npackage_bfb0d6f0cb59390b479b08a1 -> package_275b39592e996f9bc7d2bab4 [ label = \"16\" weight = \"16\" ];\npackage_bfb0d6f0cb59390b479b08a1 -> package_179967d6e66ef95e5ec582dc [ label = \"7\" weight = \"7\" ];\npackage_bfb0d6f0cb59390b479b08a1 -> package_6da3c08ea2d561edab77673f [ label = \"2\" weight = \"2\" ];\npackage_869fe932642cb7510df73c8d -> package_179967d6e66ef95e5ec582dc [ label = \"2\" weight = \"2\" ];\npackage_5770287cc40afd5bd6812d59 -> package_0b6cea3e7e0dde98e8d142c3 [ label = \"2\" weight = \"2\" ];\npackage_d30a7a8d892c5e6113a07e84 -> package_0b6cea3e7e0dde98e8d142c3 [ label = \"3\" weight = \"3\" ];\npackage_0b6cea3e7e0dde98e8d142c3 -> package_6da3c08ea2d561edab77673f [ label = \"2\" weight = \"2\" ];\npackage_0b6cea3e7e0dde98e8d142c3 -> package_d2f1dd27b2e43b88238a4c05 [ label = \"10\" weight = \"10\" color = \"red\" ];\npackage_0b6cea3e7e0dde98e8d142c3 -> package_d30a7a8d892c5e6113a07e84 [ label = \"2\" weight = \"2\" color = \"red\" ];\npackage_d2f1dd27b2e43b88238a4c05 -> package_0b6cea3e7e0dde98e8d142c3 [ label = \"12\" weight = \"12\" ];\npackage_e16f87ed4cbaa8972b66b80b -> package_bfb0d6f0cb59390b479b08a1 [ label = \"2\" weight = \"2\" ];\npackage_c28460328a6700365ccc109d -> package_864d6940ac14438961598d5a [ label = \"9\" weight = \"9\" ];\npackage_c28460328a6700365ccc109d -> package_bb20afe0ec6010144ae2060c [ label = \"3\" weight = \"3\" ];\npackage_5a5b226dc916c25cd94e86c9 -> package_864d6940ac14438961598d5a [ label = \"16\" weight = \"16\" ];\npackage_5a5b226dc916c25cd94e86c9 -> package_bb20afe0ec6010144ae2060c [ label = \"3\" weight = \"3\" ];\npackage_864d6940ac14438961598d5a -> package_cc2439ece2ff219a79eb369d [ label = \"11\" weight = \"11\" ];\npackage_864d6940ac14438961598d5a -> package_bfb0d6f0cb59390b479b08a1 [ label = \"73\" weight = \"73\" ];\npackage_864d6940ac14438961598d5a -> package_e16f87ed4cbaa8972b66b80b [ label = \"5\" weight = \"5\" ];\npackage_864d6940ac14438961598d5a -> package_275b39592e996f9bc7d2bab4 [ label = \"31\" weight = \"31\" ];\npackage_bb20afe0ec6010144ae2060c -> package_bfb0d6f0cb59390b479b08a1 [ label = \"8\" weight = \"8\" ];\npackage_bb20afe0ec6010144ae2060c -> package_864d6940ac14438961598d5a [ label = \"2\" weight = \"2\" ];\npackage_864d6940ac14438961598d5a -> package_8b5bd27cd192f3c043f79d74 [ label = \"29\" weight = \"29\" ];\npackage_864d6940ac14438961598d5a -> package_0b6cea3e7e0dde98e8d142c3 [ label = \"12\" weight = \"12\" ];\npackage_864d6940ac14438961598d5a -> package_869fe932642cb7510df73c8d [ label = \"2\" weight = \"2\" ];\npackage_864d6940ac14438961598d5a -> package_179967d6e66ef95e5ec582dc [ label = \"5\" weight = \"5\" ];\npackage_6da3c08ea2d561edab77673f [label=\"org.hjug.dsm\"];\npackage_5a5b226dc916c25cd94e86c9 [label=\"org.hjug.mavenreport\"];\npackage_d30a7a8d892c5e6113a07e84 [label=\"org.hjug.feedback.arc.pageRank\"];\npackage_d6011c21970de8ae7eafff05 [label=\"org.hjug.metrics.rules\"];\npackage_179967d6e66ef95e5ec582dc [label=\"org.hjug.graphbuilder.metrics\"];\npackage_98c578ab6c4dd833f53d3aee [label=\"org.hjug.graphbuilder.graphbuilder\"];\npackage_8b5bd27cd192f3c043f79d74 [label=\"org.hjug.refactorfirst.report.model\"];\npackage_cc2439ece2ff219a79eb369d [label=\"org.hjug.git\"];\npackage_bb20afe0ec6010144ae2060c [label=\"org.hjug.refactorfirst.report.json\"];\npackage_d36e09db80f0e2bbc4ffd5c7 [label=\"org.hjug.graphbuilder.visitor\"];\npackage_0b6cea3e7e0dde98e8d142c3 [label=\"org.hjug.feedback\"];\npackage_275b39592e996f9bc7d2bab4 [label=\"org.hjug.graphbuilder\" color=red style=filled];\npackage_869fe932642cb7510df73c8d [label=\"org.hjug.metrics\"];\npackage_864d6940ac14438961598d5a [label=\"org.hjug.refactorfirst.report\"];\npackage_e16f87ed4cbaa8972b66b80b [label=\"org.hjug.gdg\"];\npackage_c28460328a6700365ccc109d [label=\"org.hjug.gradlereport\"];\npackage_5770287cc40afd5bd6812d59 [label=\"org.hjug.feedback.arc.exact\"];\npackage_622c04a26e1ba36b6ebca283 [label=\"org.hjug.refactorfirst\"];\npackage_bfb0d6f0cb59390b479b08a1 [label=\"org.hjug.cbc\" color=red style=filled];\npackage_d2f1dd27b2e43b88238a4c05 [label=\"org.hjug.feedback.vertex.kernelized\"];\n}",
+ "dot" : "strict digraph G {\npackage_622c04a26e1ba36b6ebca283 -> package_864d6940ac14438961598d5a [ label = \"10\" weight = \"10\" ];\npackage_622c04a26e1ba36b6ebca283 -> package_bb20afe0ec6010144ae2060c [ label = \"3\" weight = \"3\" ];\npackage_275b39592e996f9bc7d2bab4 -> package_179967d6e66ef95e5ec582dc [ label = \"12\" weight = \"12\" ];\npackage_275b39592e996f9bc7d2bab4 -> package_98c578ab6c4dd833f53d3aee [ label = \"6\" weight = \"6\" color = \"red\" ];\npackage_98c578ab6c4dd833f53d3aee -> package_275b39592e996f9bc7d2bab4 [ label = \"10\" weight = \"10\" ];\npackage_98c578ab6c4dd833f53d3aee -> package_d36e09db80f0e2bbc4ffd5c7 [ label = \"4\" weight = \"4\" ];\npackage_98c578ab6c4dd833f53d3aee -> package_179967d6e66ef95e5ec582dc [ label = \"37\" weight = \"37\" ];\npackage_179967d6e66ef95e5ec582dc -> package_275b39592e996f9bc7d2bab4 [ label = \"1\" weight = \"1\" color = \"red\" ];\npackage_d36e09db80f0e2bbc4ffd5c7 -> package_275b39592e996f9bc7d2bab4 [ label = \"14\" weight = \"14\" ];\npackage_bfb0d6f0cb59390b479b08a1 -> package_cc2439ece2ff219a79eb369d [ label = \"27\" weight = \"27\" ];\npackage_bfb0d6f0cb59390b479b08a1 -> package_d6011c21970de8ae7eafff05 [ label = \"1\" weight = \"1\" ];\npackage_bfb0d6f0cb59390b479b08a1 -> package_869fe932642cb7510df73c8d [ label = \"46\" weight = \"46\" ];\npackage_bfb0d6f0cb59390b479b08a1 -> package_275b39592e996f9bc7d2bab4 [ label = \"16\" weight = \"16\" ];\npackage_bfb0d6f0cb59390b479b08a1 -> package_179967d6e66ef95e5ec582dc [ label = \"7\" weight = \"7\" ];\npackage_bfb0d6f0cb59390b479b08a1 -> package_6da3c08ea2d561edab77673f [ label = \"2\" weight = \"2\" ];\npackage_869fe932642cb7510df73c8d -> package_179967d6e66ef95e5ec582dc [ label = \"2\" weight = \"2\" ];\npackage_5770287cc40afd5bd6812d59 -> package_0b6cea3e7e0dde98e8d142c3 [ label = \"2\" weight = \"2\" ];\npackage_d30a7a8d892c5e6113a07e84 -> package_0b6cea3e7e0dde98e8d142c3 [ label = \"3\" weight = \"3\" color = \"red\" ];\npackage_0b6cea3e7e0dde98e8d142c3 -> package_6da3c08ea2d561edab77673f [ label = \"2\" weight = \"2\" ];\npackage_0b6cea3e7e0dde98e8d142c3 -> package_d2f1dd27b2e43b88238a4c05 [ label = \"10\" weight = \"10\" ];\npackage_0b6cea3e7e0dde98e8d142c3 -> package_d30a7a8d892c5e6113a07e84 [ label = \"2\" weight = \"2\" ];\npackage_d2f1dd27b2e43b88238a4c05 -> package_0b6cea3e7e0dde98e8d142c3 [ label = \"12\" weight = \"12\" color = \"red\" ];\npackage_e16f87ed4cbaa8972b66b80b -> package_bfb0d6f0cb59390b479b08a1 [ label = \"2\" weight = \"2\" ];\npackage_c28460328a6700365ccc109d -> package_864d6940ac14438961598d5a [ label = \"9\" weight = \"9\" ];\npackage_c28460328a6700365ccc109d -> package_bb20afe0ec6010144ae2060c [ label = \"3\" weight = \"3\" ];\npackage_5a5b226dc916c25cd94e86c9 -> package_864d6940ac14438961598d5a [ label = \"16\" weight = \"16\" ];\npackage_5a5b226dc916c25cd94e86c9 -> package_bb20afe0ec6010144ae2060c [ label = \"3\" weight = \"3\" ];\npackage_864d6940ac14438961598d5a -> package_cc2439ece2ff219a79eb369d [ label = \"11\" weight = \"11\" ];\npackage_864d6940ac14438961598d5a -> package_bfb0d6f0cb59390b479b08a1 [ label = \"73\" weight = \"73\" ];\npackage_864d6940ac14438961598d5a -> package_e16f87ed4cbaa8972b66b80b [ label = \"5\" weight = \"5\" ];\npackage_864d6940ac14438961598d5a -> package_275b39592e996f9bc7d2bab4 [ label = \"32\" weight = \"32\" ];\npackage_bb20afe0ec6010144ae2060c -> package_bfb0d6f0cb59390b479b08a1 [ label = \"8\" weight = \"8\" ];\npackage_bb20afe0ec6010144ae2060c -> package_864d6940ac14438961598d5a [ label = \"2\" weight = \"2\" ];\npackage_864d6940ac14438961598d5a -> package_8b5bd27cd192f3c043f79d74 [ label = \"29\" weight = \"29\" ];\npackage_864d6940ac14438961598d5a -> package_0b6cea3e7e0dde98e8d142c3 [ label = \"12\" weight = \"12\" ];\npackage_864d6940ac14438961598d5a -> package_869fe932642cb7510df73c8d [ label = \"2\" weight = \"2\" ];\npackage_864d6940ac14438961598d5a -> package_179967d6e66ef95e5ec582dc [ label = \"5\" weight = \"5\" ];\npackage_6da3c08ea2d561edab77673f [label=\"org.hjug.dsm\"];\npackage_5a5b226dc916c25cd94e86c9 [label=\"org.hjug.mavenreport\"];\npackage_d30a7a8d892c5e6113a07e84 [label=\"org.hjug.feedback.arc.pageRank\"];\npackage_d6011c21970de8ae7eafff05 [label=\"org.hjug.metrics.rules\"];\npackage_179967d6e66ef95e5ec582dc [label=\"org.hjug.graphbuilder.metrics\"];\npackage_98c578ab6c4dd833f53d3aee [label=\"org.hjug.graphbuilder.graphbuilder\"];\npackage_8b5bd27cd192f3c043f79d74 [label=\"org.hjug.refactorfirst.report.model\"];\npackage_cc2439ece2ff219a79eb369d [label=\"org.hjug.git\"];\npackage_bb20afe0ec6010144ae2060c [label=\"org.hjug.refactorfirst.report.json\"];\npackage_d36e09db80f0e2bbc4ffd5c7 [label=\"org.hjug.graphbuilder.visitor\"];\npackage_0b6cea3e7e0dde98e8d142c3 [label=\"org.hjug.feedback\"];\npackage_275b39592e996f9bc7d2bab4 [label=\"org.hjug.graphbuilder\" color=red style=filled];\npackage_869fe932642cb7510df73c8d [label=\"org.hjug.metrics\"];\npackage_864d6940ac14438961598d5a [label=\"org.hjug.refactorfirst.report\"];\npackage_e16f87ed4cbaa8972b66b80b [label=\"org.hjug.gdg\"];\npackage_c28460328a6700365ccc109d [label=\"org.hjug.gradlereport\"];\npackage_5770287cc40afd5bd6812d59 [label=\"org.hjug.feedback.arc.exact\"];\npackage_622c04a26e1ba36b6ebca283 [label=\"org.hjug.refactorfirst\"];\npackage_bfb0d6f0cb59390b479b08a1 [label=\"org.hjug.cbc\" color=red style=filled];\npackage_d2f1dd27b2e43b88238a4c05 [label=\"org.hjug.feedback.vertex.kernelized\"];\n}",
"hasEdges" : true
},
"packageRelationshipsToRemove" : {
@@ -70,48 +66,98 @@
"sourceMarked" : false,
"targetMarked" : true,
"weight" : 1,
- "renderedLabel" : "org.hjug.graphbuilder.metrics → org.hjug.graphbuilder* : 1",
+ "renderedLabel" : "org.hjug.graphbuilder.metrics → org.hjug.graphbuilder* : 1",
"priority" : 1,
"cycleCount" : 1,
"effortRank" : 1,
- "classRelationshipsToBreakPackage" : [ "GraphMetricsCollector → DependencyCollector : 1" ]
+ "classRelationshipsToBreakPackage" : [ "GraphMetricsCollector → DependencyCollector : 1" ]
}, {
- "sourcePackage" : "org.hjug.feedback",
- "targetPackage" : "org.hjug.feedback.arc.pageRank",
+ "sourcePackage" : "org.hjug.feedback.arc.pageRank",
+ "targetPackage" : "org.hjug.feedback",
"sourceMarked" : false,
"targetMarked" : false,
- "weight" : 2,
- "renderedLabel" : "org.hjug.feedback → org.hjug.feedback.arc.pageRank : 2",
+ "weight" : 3,
+ "renderedLabel" : "org.hjug.feedback.arc.pageRank → org.hjug.feedback : 3",
"priority" : 2,
"cycleCount" : 1,
- "effortRank" : 2,
- "classRelationshipsToBreakPackage" : [ "CycleRemovalComputer → PageRankFAS : 2" ]
+ "effortRank" : 3,
+ "classRelationshipsToBreakPackage" : [ "PageRankFAS → SuperTypeToken : 3" ]
}, {
"sourcePackage" : "org.hjug.graphbuilder",
"targetPackage" : "org.hjug.graphbuilder.graphbuilder",
"sourceMarked" : true,
"targetMarked" : false,
"weight" : 6,
- "renderedLabel" : "org.hjug.graphbuilder* → org.hjug.graphbuilder.graphbuilder : 6",
+ "renderedLabel" : "org.hjug.graphbuilder* → org.hjug.graphbuilder.graphbuilder : 6",
"priority" : 3,
"cycleCount" : 1,
"effortRank" : 6,
- "classRelationshipsToBreakPackage" : [ "CompositeGraphBuilder → KotlinSourceFileGraphBuilder : 3", "CompositeGraphBuilder → JavaSourceFileGraphBuilder : 3" ]
+ "classRelationshipsToBreakPackage" : [ "CompositeGraphBuilder → JavaSourceFileGraphBuilder : 3", "CompositeGraphBuilder → KotlinSourceFileGraphBuilder : 3" ]
}, {
- "sourcePackage" : "org.hjug.feedback",
- "targetPackage" : "org.hjug.feedback.vertex.kernelized",
+ "sourcePackage" : "org.hjug.feedback.vertex.kernelized",
+ "targetPackage" : "org.hjug.feedback",
"sourceMarked" : false,
"targetMarked" : false,
- "weight" : 10,
- "renderedLabel" : "org.hjug.feedback → org.hjug.feedback.vertex.kernelized : 10",
+ "weight" : 12,
+ "renderedLabel" : "org.hjug.feedback.vertex.kernelized → org.hjug.feedback : 12",
"priority" : 4,
"cycleCount" : 1,
- "effortRank" : 10,
- "classRelationshipsToBreakPackage" : [ "CycleRemovalComputer → DirectedFeedbackVertexSetResult : 2", "CycleRemovalComputer → DirectedFeedbackVertexSetSolver : 2", "CycleRemovalComputer → EnhancedParameterComputer : 2", "CycleRemovalComputer → EnhancedParameterComputer$EnhancedParameters : 4" ]
+ "effortRank" : 12,
+ "classRelationshipsToBreakPackage" : [ "FeedbackVertexSetComputer → SuperTypeToken : 4", "ParameterComputer → SuperTypeToken : 2", "EnhancedParameterComputer → SuperTypeToken : 2", "DirectedFeedbackVertexSetSolver → SuperTypeToken : 2", "ModulatorComputer → SuperTypeToken : 2" ]
} ]
},
"hasDisharmonies" : true,
"disharmonies" : [ {
+ "type" : "God Class",
+ "anchorId" : "GOD",
+ "title" : "God Classes",
+ "methodLevel" : false,
+ "problem" : "God Classes take on too much responsibility,",
+ "solution" : "Extract related islands of functionality into separate classes. Leave God classes that don't change often alone.",
+ "maxPriority" : 1,
+ "chart" : {
+ "canvasId" : "chart_GOD",
+ "bubbles" : [ {
+ "id" : "JsonGenerator.java",
+ "label" : "JsonGenerator.java",
+ "x" : 1,
+ "y" : 1,
+ "r" : 24,
+ "priority" : 1,
+ "effortRank" : 1,
+ "changePronenessRank" : 1,
+ "color" : "rgba(235, 64, 52, 0.75)",
+ "borderColor" : "rgb(235, 64, 52)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java"
+ } ],
+ "xaxisLabel" : "Effort to refactor",
+ "yaxisLabel" : "Relative churn (impact)"
+ },
+ "table" : {
+ "headers" : [ "Class", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ],
+ "rows" : [ {
+ "cells" : [ {
+ "content" : "JsonGenerator.java",
+ "align" : "left"
+ }, {
+ "content" : "1",
+ "align" : "right"
+ }, {
+ "content" : "1",
+ "align" : "right"
+ }, {
+ "content" : "1",
+ "align" : "right"
+ }, {
+ "content" : "10/2/26, 6:02 AM",
+ "align" : "right"
+ }, {
+ "content" : "7",
+ "align" : "right"
+ } ]
+ } ]
+ }
+ }, {
"type" : "Data Class",
"anchorId" : "DATA_CLASS",
"title" : "Data Classes",
@@ -131,7 +177,8 @@
"effortRank" : 1,
"changePronenessRank" : 2,
"color" : "rgba(235, 64, 52, 0.75)",
- "borderColor" : "rgb(235, 64, 52)"
+ "borderColor" : "rgb(235, 64, 52)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/RefactorFirstExtension.java"
}, {
"id" : "MetricsVisitorState.java",
"label" : "MetricsVisitorState.java",
@@ -142,7 +189,8 @@
"effortRank" : 2,
"changePronenessRank" : 3,
"color" : "rgba(137, 119, 74, 0.75)",
- "borderColor" : "rgb(137, 119, 74)"
+ "borderColor" : "rgb(137, 119, 74)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorState.java"
}, {
"id" : "Attributes.java",
"label" : "Attributes.java",
@@ -153,16 +201,17 @@
"effortRank" : 3,
"changePronenessRank" : 1,
"color" : "rgba(39, 174, 96, 0.75)",
- "borderColor" : "rgb(39, 174, 96)"
+ "borderColor" : "rgb(39, 174, 96)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/Attributes.java"
} ],
- "yaxisLabel" : "Relative churn (impact)",
- "xaxisLabel" : "Effort to refactor"
+ "xaxisLabel" : "Effort to refactor",
+ "yaxisLabel" : "Relative churn (impact)"
},
"table" : {
"headers" : [ "Class", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ],
"rows" : [ {
"cells" : [ {
- "content" : "RefactorFirstExtension.java",
+ "content" : "RefactorFirstExtension.java",
"align" : "left"
}, {
"content" : "1",
@@ -182,7 +231,7 @@
} ]
}, {
"cells" : [ {
- "content" : "MetricsVisitorState.java",
+ "content" : "MetricsVisitorState.java",
"align" : "left"
}, {
"content" : "2",
@@ -202,7 +251,7 @@
} ]
}, {
"cells" : [ {
- "content" : "Attributes.java",
+ "content" : "Attributes.java",
"align" : "left"
}, {
"content" : "3",
@@ -242,16 +291,17 @@
"effortRank" : 1,
"changePronenessRank" : 1,
"color" : "rgba(235, 64, 52, 0.75)",
- "borderColor" : "rgb(235, 64, 52)"
+ "borderColor" : "rgb(235, 64, 52)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java"
} ],
- "yaxisLabel" : "Relative churn (impact)",
- "xaxisLabel" : "Effort to refactor"
+ "xaxisLabel" : "Effort to refactor",
+ "yaxisLabel" : "Relative churn (impact)"
},
"table" : {
"headers" : [ "Class", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ],
"rows" : [ {
"cells" : [ {
- "content" : "MetricsVisitorLogic.java",
+ "content" : "MetricsVisitorLogic.java",
"align" : "left"
}, {
"content" : "1",
@@ -278,122 +328,138 @@
"methodLevel" : false,
"problem" : "Child class is large and often complex, but doesn't override or use many of the parent class's methods",
"solution" : "Do one or more of the following:
- Extract the child class into a separate class. Move the methods that are used from the parent class into the child class.
- Make unused protected members private in the parent class.
- If a parent class has multiple children, move methods not used by all descendants to another class.",
- "maxPriority" : 4,
+ "maxPriority" : 5,
"chart" : {
"canvasId" : "chart_RPB",
"bubbles" : [ {
- "id" : "HtmlReport.java",
- "label" : "HtmlReport.java",
- "x" : 2,
- "y" : 4,
- "r" : 24,
- "priority" : 1,
- "effortRank" : 2,
- "changePronenessRank" : 4,
- "color" : "rgba(235, 64, 52, 0.75)",
- "borderColor" : "rgb(235, 64, 52)"
- }, {
"id" : "AttributeHandlerAndSorter.java",
"label" : "AttributeHandlerAndSorter.java",
"x" : 1,
- "y" : 2,
- "r" : 18,
- "priority" : 2,
+ "y" : 5,
+ "r" : 24,
+ "priority" : 1,
"effortRank" : 1,
- "changePronenessRank" : 2,
- "color" : "rgba(170, 101, 67, 0.75)",
- "borderColor" : "rgb(170, 101, 67)"
+ "changePronenessRank" : 5,
+ "color" : "rgba(235, 64, 52, 0.75)",
+ "borderColor" : "rgb(235, 64, 52)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/AttributeHandlerAndSorter.java"
}, {
- "id" : "AttributeHandler2.java",
- "label" : "AttributeHandler2.java",
+ "id" : "HtmlReport.java",
+ "label" : "HtmlReport.java",
"x" : 2,
"y" : 3,
- "r" : 12,
- "priority" : 3,
+ "r" : 20,
+ "priority" : 2,
"effortRank" : 2,
"changePronenessRank" : 3,
- "color" : "rgba(104, 137, 81, 0.75)",
- "borderColor" : "rgb(104, 137, 81)"
+ "color" : "rgba(186, 92, 63, 0.75)",
+ "borderColor" : "rgb(186, 92, 63)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/HtmlReport.java"
+ }, {
+ "id" : "JsonGenerator.java",
+ "label" : "JsonGenerator.java",
+ "x" : 3,
+ "y" : 4,
+ "r" : 15,
+ "priority" : 3,
+ "effortRank" : 3,
+ "changePronenessRank" : 4,
+ "color" : "rgba(137, 119, 74, 0.75)",
+ "borderColor" : "rgb(137, 119, 74)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java"
}, {
"id" : "AttributeHandler.java",
"label" : "AttributeHandler.java",
"x" : 1,
"y" : 1,
- "r" : 6,
+ "r" : 11,
"priority" : 4,
"effortRank" : 1,
"changePronenessRank" : 1,
+ "color" : "rgba(88, 147, 85, 0.75)",
+ "borderColor" : "rgb(88, 147, 85)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/AttributeHandler.java"
+ }, {
+ "id" : "AttributeHandler2.java",
+ "label" : "AttributeHandler2.java",
+ "x" : 2,
+ "y" : 2,
+ "r" : 6,
+ "priority" : 5,
+ "effortRank" : 2,
+ "changePronenessRank" : 2,
"color" : "rgba(39, 174, 96, 0.75)",
- "borderColor" : "rgb(39, 174, 96)"
+ "borderColor" : "rgb(39, 174, 96)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/AttributeHandler2.java"
} ],
- "yaxisLabel" : "Relative churn (impact)",
- "xaxisLabel" : "Effort to refactor"
+ "xaxisLabel" : "Effort to refactor",
+ "yaxisLabel" : "Relative churn (impact)"
},
"table" : {
"headers" : [ "Class", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ],
"rows" : [ {
"cells" : [ {
- "content" : "HtmlReport.java",
+ "content" : "AttributeHandlerAndSorter.java",
"align" : "left"
}, {
"content" : "1",
"align" : "right"
}, {
- "content" : "4",
+ "content" : "5",
"align" : "right"
}, {
- "content" : "2",
+ "content" : "1",
"align" : "right"
}, {
- "content" : "9/30/26, 9:07 PM",
+ "content" : "1/18/38, 9:14 PM",
"align" : "right"
}, {
- "content" : "62",
+ "content" : "0",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "AttributeHandlerAndSorter.java",
+ "content" : "HtmlReport.java",
"align" : "left"
}, {
"content" : "2",
"align" : "right"
}, {
- "content" : "2",
+ "content" : "3",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "2",
"align" : "right"
}, {
- "content" : "10/1/20, 8:46 AM",
+ "content" : "9/30/26, 9:07 PM",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "62",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "AttributeHandler2.java",
+ "content" : "JsonGenerator.java",
"align" : "left"
}, {
"content" : "3",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "4",
"align" : "right"
}, {
- "content" : "2",
+ "content" : "3",
"align" : "right"
}, {
- "content" : "10/1/20, 8:46 AM",
+ "content" : "10/2/26, 6:02 AM",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "7",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "AttributeHandler.java",
+ "content" : "AttributeHandler.java",
"align" : "left"
}, {
"content" : "4",
@@ -411,6 +477,26 @@
"content" : "1",
"align" : "right"
} ]
+ }, {
+ "cells" : [ {
+ "content" : "AttributeHandler2.java",
+ "align" : "left"
+ }, {
+ "content" : "5",
+ "align" : "right"
+ }, {
+ "content" : "2",
+ "align" : "right"
+ }, {
+ "content" : "2",
+ "align" : "right"
+ }, {
+ "content" : "10/1/20, 8:46 AM",
+ "align" : "right"
+ }, {
+ "content" : "1",
+ "align" : "right"
+ } ]
} ]
}
}, {
@@ -433,7 +519,8 @@
"effortRank" : 1,
"changePronenessRank" : 1,
"color" : "rgba(235, 64, 52, 0.75)",
- "borderColor" : "rgb(235, 64, 52)"
+ "borderColor" : "rgb(235, 64, 52)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/AttributeHandler2.java"
}, {
"id" : "HtmlReport.java",
"label" : "HtmlReport.java",
@@ -444,16 +531,17 @@
"effortRank" : 2,
"changePronenessRank" : 2,
"color" : "rgba(39, 174, 96, 0.75)",
- "borderColor" : "rgb(39, 174, 96)"
+ "borderColor" : "rgb(39, 174, 96)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/HtmlReport.java"
} ],
- "yaxisLabel" : "Relative churn (impact)",
- "xaxisLabel" : "Effort to refactor"
+ "xaxisLabel" : "Effort to refactor",
+ "yaxisLabel" : "Relative churn (impact)"
},
"table" : {
"headers" : [ "Class", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ],
"rows" : [ {
"cells" : [ {
- "content" : "AttributeHandler2.java",
+ "content" : "AttributeHandler2.java",
"align" : "left"
}, {
"content" : "1",
@@ -473,7 +561,7 @@
} ]
}, {
"cells" : [ {
- "content" : "HtmlReport.java",
+ "content" : "HtmlReport.java",
"align" : "left"
}, {
"content" : "2",
@@ -485,10 +573,10 @@
"content" : "2",
"align" : "right"
}, {
- "content" : "9/30/26, 9:07 PM",
+ "content" : "1/18/38, 9:14 PM",
"align" : "right"
}, {
- "content" : "62",
+ "content" : "0",
"align" : "right"
} ]
} ]
@@ -504,8 +592,8 @@
"chart" : {
"canvasId" : "chart_SIG_DUP",
"bubbles" : [ {
- "id" : "HtmlReportTask.java",
- "label" : "HtmlReportTask.java",
+ "id" : "AttributeHandlerAndSorter.java",
+ "label" : "AttributeHandlerAndSorter.java",
"x" : 1,
"y" : 5,
"r" : 24,
@@ -513,10 +601,11 @@
"effortRank" : 1,
"changePronenessRank" : 5,
"color" : "rgba(235, 64, 52, 0.75)",
- "borderColor" : "rgb(235, 64, 52)"
+ "borderColor" : "rgb(235, 64, 52)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/AttributeHandlerAndSorter.java"
}, {
- "id" : "SimpleHtmlReportTask.java",
- "label" : "SimpleHtmlReportTask.java",
+ "id" : "HtmlReportTask.java",
+ "label" : "HtmlReportTask.java",
"x" : 1,
"y" : 4,
"r" : 20,
@@ -524,10 +613,11 @@
"effortRank" : 1,
"changePronenessRank" : 4,
"color" : "rgba(186, 92, 63, 0.75)",
- "borderColor" : "rgb(186, 92, 63)"
+ "borderColor" : "rgb(186, 92, 63)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/HtmlReportTask.java"
}, {
- "id" : "AttributeHandler.java",
- "label" : "AttributeHandler.java",
+ "id" : "SimpleHtmlReportTask.java",
+ "label" : "SimpleHtmlReportTask.java",
"x" : 1,
"y" : 3,
"r" : 15,
@@ -535,10 +625,11 @@
"effortRank" : 1,
"changePronenessRank" : 3,
"color" : "rgba(137, 119, 74, 0.75)",
- "borderColor" : "rgb(137, 119, 74)"
+ "borderColor" : "rgb(137, 119, 74)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/SimpleHtmlReportTask.java"
}, {
- "id" : "AttributeHandlerAndSorter.java",
- "label" : "AttributeHandlerAndSorter.java",
+ "id" : "AttributeHandler.java",
+ "label" : "AttributeHandler.java",
"x" : 1,
"y" : 2,
"r" : 11,
@@ -546,7 +637,8 @@
"effortRank" : 1,
"changePronenessRank" : 2,
"color" : "rgba(88, 147, 85, 0.75)",
- "borderColor" : "rgb(88, 147, 85)"
+ "borderColor" : "rgb(88, 147, 85)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/AttributeHandler.java"
}, {
"id" : "AttributeHandler2.java",
"label" : "AttributeHandler2.java",
@@ -557,16 +649,17 @@
"effortRank" : 1,
"changePronenessRank" : 1,
"color" : "rgba(39, 174, 96, 0.75)",
- "borderColor" : "rgb(39, 174, 96)"
+ "borderColor" : "rgb(39, 174, 96)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/AttributeHandler2.java"
} ],
- "yaxisLabel" : "Relative churn (impact)",
- "xaxisLabel" : "Effort to refactor"
+ "xaxisLabel" : "Effort to refactor",
+ "yaxisLabel" : "Relative churn (impact)"
},
"table" : {
"headers" : [ "Class", "Priority", "Change Proneness Rank", "Effort Rank", "Duplicate Partners", "Most Recent Commit Date", "Commit Count" ],
"rows" : [ {
"cells" : [ {
- "content" : "HtmlReportTask.java",
+ "content" : "AttributeHandlerAndSorter.java",
"align" : "left"
}, {
"content" : "1",
@@ -578,18 +671,18 @@
"content" : "1",
"align" : "right"
}, {
- "content" : "generate() ↔ SimpleHtmlReportTask.generate()",
+ "content" : "apply(Unknown,Unknown) ↔ AttributeHandler.apply(Unknown,Unknown)
apply(Unknown,Unknown) ↔ <
unknown>
.apply(Unknown,Unknown)",
"align" : "left"
}, {
- "content" : "9/15/25, 12:47 PM",
+ "content" : "1/18/38, 9:14 PM",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "0",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "SimpleHtmlReportTask.java",
+ "content" : "HtmlReportTask.java",
"align" : "left"
}, {
"content" : "2",
@@ -601,7 +694,7 @@
"content" : "1",
"align" : "right"
}, {
- "content" : "generate() ↔ HtmlReportTask.generate()",
+ "content" : "generate() ↔ SimpleHtmlReportTask.generate()",
"align" : "left"
}, {
"content" : "9/15/25, 12:47 PM",
@@ -612,7 +705,7 @@
} ]
}, {
"cells" : [ {
- "content" : "AttributeHandler.java",
+ "content" : "SimpleHtmlReportTask.java",
"align" : "left"
}, {
"content" : "3",
@@ -624,10 +717,10 @@
"content" : "1",
"align" : "right"
}, {
- "content" : "apply(Unknown,Unknown) ↔ AttributeHandler.apply(Unknown,Unknown)
apply(Unknown,Unknown) ↔ <
unknown>
.apply(Unknown,Unknown)",
+ "content" : "generate() ↔ HtmlReportTask.generate()",
"align" : "left"
}, {
- "content" : "10/1/20, 8:46 AM",
+ "content" : "9/15/25, 12:47 PM",
"align" : "right"
}, {
"content" : "1",
@@ -635,7 +728,7 @@
} ]
}, {
"cells" : [ {
- "content" : "AttributeHandlerAndSorter.java",
+ "content" : "AttributeHandler.java",
"align" : "left"
}, {
"content" : "4",
@@ -658,7 +751,7 @@
} ]
}, {
"cells" : [ {
- "content" : "AttributeHandler2.java",
+ "content" : "AttributeHandler2.java",
"align" : "left"
}, {
"content" : "5",
@@ -695,82 +788,89 @@
"id" : "CompositeGraphBuilder.java",
"label" : "CompositeGraphBuilder.java",
"x" : 1,
- "y" : 9,
+ "y" : 7,
"r" : 24,
"priority" : 1,
"effortRank" : 1,
- "changePronenessRank" : 9,
+ "changePronenessRank" : 7,
"color" : "rgba(235, 64, 52, 0.75)",
- "borderColor" : "rgb(235, 64, 52)"
+ "borderColor" : "rgb(235, 64, 52)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java"
}, {
- "id" : "MetricsVisitorLogic.java",
- "label" : "MetricsVisitorLogic.java",
- "x" : 2,
- "y" : 6,
+ "id" : "AttributeHandlerAndSorter.java",
+ "label" : "AttributeHandlerAndSorter.java",
+ "x" : 5,
+ "y" : 11,
"r" : 22,
"priority" : 2,
- "effortRank" : 2,
- "changePronenessRank" : 6,
+ "effortRank" : 5,
+ "changePronenessRank" : 11,
"color" : "rgba(215, 75, 56, 0.75)",
- "borderColor" : "rgb(215, 75, 56)"
+ "borderColor" : "rgb(215, 75, 56)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/AttributeHandlerAndSorter.java"
}, {
- "id" : "DirectedFeedbackVertexSetSolver.java",
- "label" : "DirectedFeedbackVertexSetSolver.java",
- "x" : 3,
- "y" : 7,
+ "id" : "DependencyVisitorLogic.java",
+ "label" : "DependencyVisitorLogic.java",
+ "x" : 4,
+ "y" : 9,
"r" : 20,
"priority" : 3,
- "effortRank" : 3,
- "changePronenessRank" : 7,
+ "effortRank" : 4,
+ "changePronenessRank" : 9,
"color" : "rgba(196, 86, 61, 0.75)",
- "borderColor" : "rgb(196, 86, 61)"
+ "borderColor" : "rgb(196, 86, 61)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/DependencyVisitorLogic.java"
}, {
- "id" : "DependencyVisitorLogic.java",
- "label" : "DependencyVisitorLogic.java",
- "x" : 4,
- "y" : 8,
+ "id" : "AttributeHandlerAndSorter.java",
+ "label" : "AttributeHandlerAndSorter.java",
+ "x" : 8,
+ "y" : 11,
"r" : 19,
"priority" : 4,
- "effortRank" : 4,
- "changePronenessRank" : 8,
+ "effortRank" : 8,
+ "changePronenessRank" : 11,
"color" : "rgba(176, 97, 65, 0.75)",
- "borderColor" : "rgb(176, 97, 65)"
+ "borderColor" : "rgb(176, 97, 65)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/AttributeHandlerAndSorter.java"
}, {
- "id" : "DisharmonyDetector.java",
- "label" : "DisharmonyDetector.java",
- "x" : 6,
- "y" : 10,
+ "id" : "MetricsVisitorLogic.java",
+ "label" : "MetricsVisitorLogic.java",
+ "x" : 2,
+ "y" : 4,
"r" : 17,
"priority" : 5,
- "effortRank" : 6,
- "changePronenessRank" : 10,
+ "effortRank" : 2,
+ "changePronenessRank" : 4,
"color" : "rgba(157, 108, 70, 0.75)",
- "borderColor" : "rgb(157, 108, 70)"
+ "borderColor" : "rgb(157, 108, 70)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java"
}, {
- "id" : "JsonGenerator.java",
- "label" : "JsonGenerator.java",
- "x" : 8,
- "y" : 11,
+ "id" : "DirectedFeedbackVertexSetSolver.java",
+ "label" : "DirectedFeedbackVertexSetSolver.java",
+ "x" : 3,
+ "y" : 5,
"r" : 15,
"priority" : 6,
- "effortRank" : 8,
- "changePronenessRank" : 11,
+ "effortRank" : 3,
+ "changePronenessRank" : 5,
"color" : "rgba(137, 119, 74, 0.75)",
- "borderColor" : "rgb(137, 119, 74)"
+ "borderColor" : "rgb(137, 119, 74)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java"
}, {
- "id" : "MetricsVisitorLogic.java",
- "label" : "MetricsVisitorLogic.java",
- "x" : 5,
+ "id" : "DisharmonyDetector.java",
+ "label" : "DisharmonyDetector.java",
+ "x" : 6,
"y" : 6,
"r" : 13,
"priority" : 7,
- "effortRank" : 5,
+ "effortRank" : 6,
"changePronenessRank" : 6,
"color" : "rgba(117, 130, 78, 0.75)",
- "borderColor" : "rgb(117, 130, 78)"
+ "borderColor" : "rgb(117, 130, 78)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java"
}, {
- "id" : "AttributeHandlerAndSorter.java",
- "label" : "AttributeHandlerAndSorter.java",
+ "id" : "MetricsVisitorLogic.java",
+ "label" : "MetricsVisitorLogic.java",
"x" : 5,
"y" : 4,
"r" : 11,
@@ -778,49 +878,53 @@
"effortRank" : 5,
"changePronenessRank" : 4,
"color" : "rgba(98, 141, 83, 0.75)",
- "borderColor" : "rgb(98, 141, 83)"
+ "borderColor" : "rgb(98, 141, 83)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java"
}, {
- "id" : "AttributeHandler2.java",
- "label" : "AttributeHandler2.java",
- "x" : 7,
- "y" : 2,
+ "id" : "JsonGenerator.java",
+ "label" : "JsonGenerator.java",
+ "x" : 9,
+ "y" : 8,
"r" : 10,
"priority" : 9,
- "effortRank" : 7,
- "changePronenessRank" : 2,
+ "effortRank" : 9,
+ "changePronenessRank" : 8,
"color" : "rgba(78, 152, 87, 0.75)",
- "borderColor" : "rgb(78, 152, 87)"
+ "borderColor" : "rgb(78, 152, 87)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java"
}, {
- "id" : "AttributeHandlerAndSorter.java",
- "label" : "AttributeHandlerAndSorter.java",
- "x" : 9,
- "y" : 4,
+ "id" : "AttributeHandler2.java",
+ "label" : "AttributeHandler2.java",
+ "x" : 7,
+ "y" : 1,
"r" : 8,
"priority" : 10,
- "effortRank" : 9,
- "changePronenessRank" : 4,
- "color" : "rgba(59, 163, 92, 0.75)",
- "borderColor" : "rgb(59, 163, 92)"
+ "effortRank" : 7,
+ "changePronenessRank" : 1,
+ "color" : "rgba(59, 163, 92, 0.75)",
+ "borderColor" : "rgb(59, 163, 92)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/AttributeHandler2.java"
}, {
"id" : "AttributeHandler.java",
"label" : "AttributeHandler.java",
- "x" : 9,
- "y" : 3,
+ "x" : 8,
+ "y" : 2,
"r" : 6,
"priority" : 11,
- "effortRank" : 9,
- "changePronenessRank" : 3,
+ "effortRank" : 8,
+ "changePronenessRank" : 2,
"color" : "rgba(39, 174, 96, 0.75)",
- "borderColor" : "rgb(39, 174, 96)"
+ "borderColor" : "rgb(39, 174, 96)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/AttributeHandler.java"
} ],
- "yaxisLabel" : "Relative churn (impact)",
- "xaxisLabel" : "Effort to refactor"
+ "xaxisLabel" : "Effort to refactor",
+ "yaxisLabel" : "Relative churn (impact)"
},
"table" : {
"headers" : [ "Class", "Method", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ],
"rows" : [ {
"cells" : [ {
- "content" : "CompositeGraphBuilder.java",
+ "content" : "CompositeGraphBuilder.java",
"align" : "left"
}, {
"content" : "reconcileUnattributedVertices(Unknown,Unknown,Map<String,String>)",
@@ -829,7 +933,7 @@
"content" : "1",
"align" : "right"
}, {
- "content" : "9",
+ "content" : "7",
"align" : "right"
}, {
"content" : "1",
@@ -843,22 +947,22 @@
} ]
}, {
"cells" : [ {
- "content" : "MetricsVisitorLogic.java",
+ "content" : "AttributeHandlerAndSorter.java",
"align" : "left"
}, {
- "content" : "handleMemberReference(MetricsVisitorState,GraphMetricsCollector,Unknown)",
+ "content" : "perform(Unknown)",
"align" : "left"
}, {
"content" : "2",
"align" : "right"
}, {
- "content" : "6",
+ "content" : "11",
"align" : "right"
}, {
- "content" : "2",
+ "content" : "5",
"align" : "right"
}, {
- "content" : "8/19/26, 7:20 PM",
+ "content" : "10/1/20, 8:46 AM",
"align" : "right"
}, {
"content" : "1",
@@ -866,91 +970,91 @@
} ]
}, {
"cells" : [ {
- "content" : "DirectedFeedbackVertexSetSolver.java",
+ "content" : "DependencyVisitorLogic.java",
"align" : "left"
}, {
- "content" : "addBypassEdges(V,Set<V>)",
+ "content" : "enterClassDeclaration(DependencyVisitorState,Unknown,boolean,SourcePathResolver)",
"align" : "left"
}, {
"content" : "3",
"align" : "right"
}, {
- "content" : "7",
+ "content" : "9",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "4",
"align" : "right"
}, {
- "content" : "8/26/26, 7:48 PM",
+ "content" : "1/18/38, 9:14 PM",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "0",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "DependencyVisitorLogic.java",
+ "content" : "AttributeHandlerAndSorter.java",
"align" : "left"
}, {
- "content" : "enterClassDeclaration(DependencyVisitorState,Unknown,boolean,SourcePathResolver)",
+ "content" : "apply(Unknown,Unknown)",
"align" : "left"
}, {
"content" : "4",
"align" : "right"
}, {
- "content" : "8",
+ "content" : "11",
"align" : "right"
}, {
- "content" : "4",
+ "content" : "8",
"align" : "right"
}, {
- "content" : "9/5/26, 1:41 PM",
+ "content" : "10/1/20, 8:46 AM",
"align" : "right"
}, {
- "content" : "6",
+ "content" : "1",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "DisharmonyDetector.java",
+ "content" : "MetricsVisitorLogic.java",
"align" : "left"
}, {
- "content" : "detectSignificantDuplication(List<ClassMetrics>)",
+ "content" : "handleMemberReference(MetricsVisitorState,GraphMetricsCollector,Unknown)",
"align" : "left"
}, {
"content" : "5",
"align" : "right"
}, {
- "content" : "10",
+ "content" : "4",
"align" : "right"
}, {
- "content" : "6",
+ "content" : "2",
"align" : "right"
}, {
- "content" : "9/5/26, 1:41 PM",
+ "content" : "1/18/38, 9:14 PM",
"align" : "right"
}, {
- "content" : "15",
+ "content" : "0",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "JsonGenerator.java",
+ "content" : "DirectedFeedbackVertexSetSolver.java",
"align" : "left"
}, {
- "content" : "generateReportData(boolean,int,boolean,boolean,String,String,String,File)",
+ "content" : "addBypassEdges(V,Set<V>)",
"align" : "left"
}, {
"content" : "6",
"align" : "right"
}, {
- "content" : "11",
+ "content" : "5",
"align" : "right"
}, {
- "content" : "8",
+ "content" : "3",
"align" : "right"
}, {
- "content" : "9/10/26, 8:06 AM",
+ "content" : "8/26/26, 7:48 PM",
"align" : "right"
}, {
"content" : "3",
@@ -958,10 +1062,10 @@
} ]
}, {
"cells" : [ {
- "content" : "MetricsVisitorLogic.java",
+ "content" : "DisharmonyDetector.java",
"align" : "left"
}, {
- "content" : "enterClass(MetricsVisitorState,GraphMetricsCollector,Unknown)",
+ "content" : "detectSignificantDuplication(List<ClassMetrics>)",
"align" : "left"
}, {
"content" : "7",
@@ -970,21 +1074,21 @@
"content" : "6",
"align" : "right"
}, {
- "content" : "5",
+ "content" : "6",
"align" : "right"
}, {
- "content" : "8/19/26, 7:20 PM",
+ "content" : "9/5/26, 1:41 PM",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "2",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "AttributeHandlerAndSorter.java",
+ "content" : "MetricsVisitorLogic.java",
"align" : "left"
}, {
- "content" : "perform(Unknown)",
+ "content" : "enterClass(MetricsVisitorState,GraphMetricsCollector,Unknown)",
"align" : "left"
}, {
"content" : "8",
@@ -996,38 +1100,38 @@
"content" : "5",
"align" : "right"
}, {
- "content" : "10/1/20, 8:46 AM",
+ "content" : "1/18/38, 9:14 PM",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "0",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "AttributeHandler2.java",
+ "content" : "JsonGenerator.java",
"align" : "left"
}, {
- "content" : "apply(Unknown,Unknown)",
+ "content" : "generateReportData(boolean,int,boolean,boolean,String,String,String,File)",
"align" : "left"
}, {
"content" : "9",
"align" : "right"
}, {
- "content" : "2",
+ "content" : "8",
"align" : "right"
}, {
- "content" : "7",
+ "content" : "9",
"align" : "right"
}, {
- "content" : "10/1/20, 8:46 AM",
+ "content" : "10/2/26, 6:02 AM",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "7",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "AttributeHandlerAndSorter.java",
+ "content" : "AttributeHandler2.java",
"align" : "left"
}, {
"content" : "apply(Unknown,Unknown)",
@@ -1036,10 +1140,10 @@
"content" : "10",
"align" : "right"
}, {
- "content" : "4",
+ "content" : "1",
"align" : "right"
}, {
- "content" : "9",
+ "content" : "7",
"align" : "right"
}, {
"content" : "10/1/20, 8:46 AM",
@@ -1050,7 +1154,7 @@
} ]
}, {
"cells" : [ {
- "content" : "AttributeHandler.java",
+ "content" : "AttributeHandler.java",
"align" : "left"
}, {
"content" : "apply(Unknown,Unknown)",
@@ -1059,10 +1163,10 @@
"content" : "11",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "2",
"align" : "right"
}, {
- "content" : "9",
+ "content" : "8",
"align" : "right"
}, {
"content" : "10/1/20, 8:46 AM",
@@ -1084,106 +1188,112 @@
"chart" : {
"canvasId" : "chart_FEATURE_ENVY",
"bubbles" : [ {
- "id" : "ReportWriter.java",
- "label" : "ReportWriter.java",
- "x" : 1,
- "y" : 5,
+ "id" : "AttributeHandlerAndSorter.java",
+ "label" : "AttributeHandlerAndSorter.java",
+ "x" : 2,
+ "y" : 6,
"r" : 24,
"priority" : 1,
- "effortRank" : 1,
- "changePronenessRank" : 5,
+ "effortRank" : 2,
+ "changePronenessRank" : 6,
"color" : "rgba(235, 64, 52, 0.75)",
- "borderColor" : "rgb(235, 64, 52)"
+ "borderColor" : "rgb(235, 64, 52)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/AttributeHandlerAndSorter.java"
}, {
- "id" : "MetricsVisitorLogic.java",
- "label" : "MetricsVisitorLogic.java",
- "x" : 3,
+ "id" : "ReportWriter.java",
+ "label" : "ReportWriter.java",
+ "x" : 1,
"y" : 4,
"r" : 20,
"priority" : 2,
- "effortRank" : 3,
+ "effortRank" : 1,
"changePronenessRank" : 4,
"color" : "rgba(196, 86, 61, 0.75)",
- "borderColor" : "rgb(196, 86, 61)"
+ "borderColor" : "rgb(196, 86, 61)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java"
}, {
- "id" : "JsonGenerator.java",
- "label" : "JsonGenerator.java",
- "x" : 5,
- "y" : 6,
+ "id" : "MetricsVisitorLogic.java",
+ "label" : "MetricsVisitorLogic.java",
+ "x" : 3,
+ "y" : 3,
"r" : 17,
"priority" : 3,
- "effortRank" : 5,
- "changePronenessRank" : 6,
+ "effortRank" : 3,
+ "changePronenessRank" : 3,
"color" : "rgba(157, 108, 70, 0.75)",
- "borderColor" : "rgb(157, 108, 70)"
+ "borderColor" : "rgb(157, 108, 70)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java"
}, {
- "id" : "AttributeHandlerAndSorter.java",
- "label" : "AttributeHandlerAndSorter.java",
- "x" : 2,
- "y" : 2,
+ "id" : "JsonGenerator.java",
+ "label" : "JsonGenerator.java",
+ "x" : 5,
+ "y" : 5,
"r" : 13,
"priority" : 4,
- "effortRank" : 2,
- "changePronenessRank" : 2,
+ "effortRank" : 5,
+ "changePronenessRank" : 5,
"color" : "rgba(117, 130, 78, 0.75)",
- "borderColor" : "rgb(117, 130, 78)"
- }, {
- "id" : "MetricsVisitorLogic.java",
- "label" : "MetricsVisitorLogic.java",
- "x" : 4,
- "y" : 4,
- "r" : 10,
- "priority" : 5,
- "effortRank" : 4,
- "changePronenessRank" : 4,
- "color" : "rgba(78, 152, 87, 0.75)",
- "borderColor" : "rgb(78, 152, 87)"
+ "borderColor" : "rgb(117, 130, 78)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java"
}, {
"id" : "AttributeHandler.java",
"label" : "AttributeHandler.java",
"x" : 2,
"y" : 1,
- "r" : 6,
- "priority" : 6,
+ "r" : 10,
+ "priority" : 5,
"effortRank" : 2,
"changePronenessRank" : 1,
+ "color" : "rgba(78, 152, 87, 0.75)",
+ "borderColor" : "rgb(78, 152, 87)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/AttributeHandler.java"
+ }, {
+ "id" : "MetricsVisitorLogic.java",
+ "label" : "MetricsVisitorLogic.java",
+ "x" : 4,
+ "y" : 3,
+ "r" : 6,
+ "priority" : 6,
+ "effortRank" : 4,
+ "changePronenessRank" : 3,
"color" : "rgba(39, 174, 96, 0.75)",
- "borderColor" : "rgb(39, 174, 96)"
+ "borderColor" : "rgb(39, 174, 96)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java"
} ],
- "yaxisLabel" : "Relative churn (impact)",
- "xaxisLabel" : "Effort to refactor"
+ "xaxisLabel" : "Effort to refactor",
+ "yaxisLabel" : "Relative churn (impact)"
},
"table" : {
"headers" : [ "Class", "Method", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ],
"rows" : [ {
"cells" : [ {
- "content" : "ReportWriter.java",
+ "content" : "AttributeHandlerAndSorter.java",
"align" : "left"
}, {
- "content" : "writeAtomically(Path,String)",
+ "content" : "apply(Unknown,Unknown)",
"align" : "left"
}, {
"content" : "1",
"align" : "right"
}, {
- "content" : "5",
+ "content" : "6",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "2",
"align" : "right"
}, {
- "content" : "9/5/26, 8:03 AM",
+ "content" : "10/1/20, 8:46 AM",
"align" : "right"
}, {
- "content" : "10",
+ "content" : "1",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "MetricsVisitorLogic.java",
+ "content" : "ReportWriter.java",
"align" : "left"
}, {
- "content" : "leaveClass(MetricsVisitorState,GraphMetricsCollector,Unknown,MetricsVisitorLogic$ClassStateSnapshot)",
+ "content" : "writeAtomically(Path,String)",
"align" : "left"
}, {
"content" : "2",
@@ -1192,79 +1302,79 @@
"content" : "4",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "1",
"align" : "right"
}, {
- "content" : "8/19/26, 7:20 PM",
+ "content" : "9/5/26, 8:03 AM",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "10",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "JsonGenerator.java",
+ "content" : "MetricsVisitorLogic.java",
"align" : "left"
}, {
- "content" : "generateReportData(boolean,int,boolean,boolean,String,String,String,File)",
+ "content" : "leaveClass(MetricsVisitorState,GraphMetricsCollector,Unknown,MetricsVisitorLogic$ClassStateSnapshot)",
"align" : "left"
}, {
"content" : "3",
"align" : "right"
}, {
- "content" : "6",
+ "content" : "3",
"align" : "right"
}, {
- "content" : "5",
+ "content" : "3",
"align" : "right"
}, {
- "content" : "9/10/26, 8:06 AM",
+ "content" : "8/19/26, 7:20 PM",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "1",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "AttributeHandlerAndSorter.java",
+ "content" : "JsonGenerator.java",
"align" : "left"
}, {
- "content" : "apply(Unknown,Unknown)",
+ "content" : "generateReportData(boolean,int,boolean,boolean,String,String,String,File)",
"align" : "left"
}, {
"content" : "4",
"align" : "right"
}, {
- "content" : "2",
+ "content" : "5",
"align" : "right"
}, {
- "content" : "2",
+ "content" : "5",
"align" : "right"
}, {
- "content" : "10/1/20, 8:46 AM",
+ "content" : "10/2/26, 6:02 AM",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "7",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "MetricsVisitorLogic.java",
+ "content" : "AttributeHandler.java",
"align" : "left"
}, {
- "content" : "leaveMethod(MetricsVisitorState,GraphMetricsCollector,MetricsVisitorLogic$MethodStateSnapshot)",
+ "content" : "apply(Unknown,Unknown)",
"align" : "left"
}, {
"content" : "5",
"align" : "right"
}, {
- "content" : "4",
+ "content" : "1",
"align" : "right"
}, {
- "content" : "4",
+ "content" : "2",
"align" : "right"
}, {
- "content" : "8/19/26, 7:20 PM",
+ "content" : "10/1/20, 8:46 AM",
"align" : "right"
}, {
"content" : "1",
@@ -1272,22 +1382,22 @@
} ]
}, {
"cells" : [ {
- "content" : "AttributeHandler.java",
+ "content" : "MetricsVisitorLogic.java",
"align" : "left"
}, {
- "content" : "apply(Unknown,Unknown)",
+ "content" : "leaveMethod(MetricsVisitorState,GraphMetricsCollector,MetricsVisitorLogic$MethodStateSnapshot)",
"align" : "left"
}, {
"content" : "6",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "3",
"align" : "right"
}, {
- "content" : "2",
+ "content" : "4",
"align" : "right"
}, {
- "content" : "10/1/20, 8:46 AM",
+ "content" : "8/19/26, 7:20 PM",
"align" : "right"
}, {
"content" : "1",
@@ -1309,187 +1419,203 @@
"id" : "SimpleHtmlReport.java",
"label" : "SimpleHtmlReport.java",
"x" : 4,
- "y" : 16,
+ "y" : 14,
"r" : 24,
"priority" : 1,
"effortRank" : 4,
- "changePronenessRank" : 16,
+ "changePronenessRank" : 14,
"color" : "rgba(235, 64, 52, 0.75)",
- "borderColor" : "rgb(235, 64, 52)"
+ "borderColor" : "rgb(235, 64, 52)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java"
}, {
- "id" : "SimpleHtmlReport.java",
- "label" : "SimpleHtmlReport.java",
- "x" : 7,
- "y" : 16,
+ "id" : "CompositeGraphBuilder.java",
+ "label" : "CompositeGraphBuilder.java",
+ "x" : 2,
+ "y" : 11,
"r" : 23,
"priority" : 2,
- "effortRank" : 7,
- "changePronenessRank" : 16,
+ "effortRank" : 2,
+ "changePronenessRank" : 11,
"color" : "rgba(222, 71, 55, 0.75)",
- "borderColor" : "rgb(222, 71, 55)"
+ "borderColor" : "rgb(222, 71, 55)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java"
}, {
- "id" : "CompositeGraphBuilder.java",
- "label" : "CompositeGraphBuilder.java",
- "x" : 2,
- "y" : 10,
+ "id" : "SimpleHtmlReport.java",
+ "label" : "SimpleHtmlReport.java",
+ "x" : 7,
+ "y" : 14,
"r" : 22,
"priority" : 3,
- "effortRank" : 2,
- "changePronenessRank" : 10,
+ "effortRank" : 7,
+ "changePronenessRank" : 14,
"color" : "rgba(209, 79, 58, 0.75)",
- "borderColor" : "rgb(209, 79, 58)"
+ "borderColor" : "rgb(209, 79, 58)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java"
}, {
"id" : "SimpleHtmlReport.java",
"label" : "SimpleHtmlReport.java",
"x" : 8,
- "y" : 16,
+ "y" : 14,
"r" : 20,
"priority" : 4,
"effortRank" : 8,
- "changePronenessRank" : 16,
+ "changePronenessRank" : 14,
"color" : "rgba(196, 86, 61, 0.75)",
- "borderColor" : "rgb(196, 86, 61)"
+ "borderColor" : "rgb(196, 86, 61)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java"
}, {
- "id" : "FeedbackVertexSetSolver.java",
- "label" : "FeedbackVertexSetSolver.java",
- "x" : 4,
- "y" : 8,
+ "id" : "JsonGenerator.java",
+ "label" : "JsonGenerator.java",
+ "x" : 11,
+ "y" : 16,
"r" : 19,
"priority" : 5,
- "effortRank" : 4,
- "changePronenessRank" : 8,
+ "effortRank" : 11,
+ "changePronenessRank" : 16,
"color" : "rgba(183, 93, 64, 0.75)",
- "borderColor" : "rgb(183, 93, 64)"
+ "borderColor" : "rgb(183, 93, 64)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java"
}, {
- "id" : "CompositeGraphBuilder.java",
- "label" : "CompositeGraphBuilder.java",
- "x" : 7,
- "y" : 10,
+ "id" : "OptimalBackEdgeRemover.java",
+ "label" : "OptimalBackEdgeRemover.java",
+ "x" : 1,
+ "y" : 5,
"r" : 18,
"priority" : 6,
- "effortRank" : 7,
- "changePronenessRank" : 10,
+ "effortRank" : 1,
+ "changePronenessRank" : 5,
"color" : "rgba(170, 101, 67, 0.75)",
- "borderColor" : "rgb(170, 101, 67)"
+ "borderColor" : "rgb(170, 101, 67)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/dsm/OptimalBackEdgeRemover.java"
}, {
- "id" : "DirectedFeedbackVertexSetSolver.java",
- "label" : "DirectedFeedbackVertexSetSolver.java",
- "x" : 5,
- "y" : 7,
+ "id" : "FeedbackVertexSetSolver.java",
+ "label" : "FeedbackVertexSetSolver.java",
+ "x" : 4,
+ "y" : 8,
"r" : 17,
"priority" : 7,
- "effortRank" : 5,
- "changePronenessRank" : 7,
+ "effortRank" : 4,
+ "changePronenessRank" : 8,
"color" : "rgba(157, 108, 70, 0.75)",
- "borderColor" : "rgb(157, 108, 70)"
+ "borderColor" : "rgb(157, 108, 70)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java"
}, {
- "id" : "JsonGenerator.java",
- "label" : "JsonGenerator.java",
- "x" : 11,
- "y" : 13,
+ "id" : "CompositeGraphBuilder.java",
+ "label" : "CompositeGraphBuilder.java",
+ "x" : 7,
+ "y" : 11,
"r" : 16,
"priority" : 8,
- "effortRank" : 11,
- "changePronenessRank" : 13,
+ "effortRank" : 7,
+ "changePronenessRank" : 11,
"color" : "rgba(144, 115, 73, 0.75)",
- "borderColor" : "rgb(144, 115, 73)"
- }, {
- "id" : "OptimalBackEdgeRemover.java",
- "label" : "OptimalBackEdgeRemover.java",
- "x" : 1,
- "y" : 2,
- "r" : 14,
- "priority" : 9,
- "effortRank" : 1,
- "changePronenessRank" : 2,
- "color" : "rgba(130, 123, 75, 0.75)",
- "borderColor" : "rgb(130, 123, 75)"
+ "borderColor" : "rgb(144, 115, 73)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java"
}, {
"id" : "JsonGenerator.java",
"label" : "JsonGenerator.java",
"x" : 12,
- "y" : 13,
- "r" : 13,
- "priority" : 10,
+ "y" : 16,
+ "r" : 14,
+ "priority" : 9,
"effortRank" : 12,
- "changePronenessRank" : 13,
- "color" : "rgba(117, 130, 78, 0.75)",
- "borderColor" : "rgb(117, 130, 78)"
+ "changePronenessRank" : 16,
+ "color" : "rgba(130, 123, 75, 0.75)",
+ "borderColor" : "rgb(130, 123, 75)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java"
}, {
"id" : "TreewidthComputer.java",
"label" : "TreewidthComputer.java",
"x" : 3,
- "y" : 3,
+ "y" : 6,
+ "r" : 13,
+ "priority" : 10,
+ "effortRank" : 3,
+ "changePronenessRank" : 6,
+ "color" : "rgba(117, 130, 78, 0.75)",
+ "borderColor" : "rgb(117, 130, 78)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java"
+ }, {
+ "id" : "DirectedFeedbackVertexSetSolver.java",
+ "label" : "DirectedFeedbackVertexSetSolver.java",
+ "x" : 5,
+ "y" : 7,
"r" : 12,
"priority" : 11,
- "effortRank" : 3,
- "changePronenessRank" : 3,
+ "effortRank" : 5,
+ "changePronenessRank" : 7,
"color" : "rgba(104, 137, 81, 0.75)",
- "borderColor" : "rgb(104, 137, 81)"
+ "borderColor" : "rgb(104, 137, 81)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java"
}, {
- "id" : "MetricsVisitorLogic.java",
- "label" : "MetricsVisitorLogic.java",
- "x" : 6,
- "y" : 6,
+ "id" : "MinimumFeedbackArcSetSolver.java",
+ "label" : "MinimumFeedbackArcSetSolver.java",
+ "x" : 3,
+ "y" : 1,
"r" : 11,
"priority" : 12,
- "effortRank" : 6,
- "changePronenessRank" : 6,
+ "effortRank" : 3,
+ "changePronenessRank" : 1,
"color" : "rgba(91, 145, 84, 0.75)",
- "borderColor" : "rgb(91, 145, 84)"
+ "borderColor" : "rgb(91, 145, 84)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java"
}, {
- "id" : "DisharmonyDetector.java",
- "label" : "DisharmonyDetector.java",
- "x" : 11,
- "y" : 11,
+ "id" : "MetricsVisitorLogic.java",
+ "label" : "MetricsVisitorLogic.java",
+ "x" : 6,
+ "y" : 4,
"r" : 10,
"priority" : 13,
- "effortRank" : 11,
- "changePronenessRank" : 11,
+ "effortRank" : 6,
+ "changePronenessRank" : 4,
"color" : "rgba(78, 152, 87, 0.75)",
- "borderColor" : "rgb(78, 152, 87)"
+ "borderColor" : "rgb(78, 152, 87)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java"
}, {
- "id" : "MinimumFeedbackArcSetSolver.java",
- "label" : "MinimumFeedbackArcSetSolver.java",
- "x" : 3,
- "y" : 1,
+ "id" : "DisharmonyDetector.java",
+ "label" : "DisharmonyDetector.java",
+ "x" : 11,
+ "y" : 9,
"r" : 8,
"priority" : 14,
- "effortRank" : 3,
- "changePronenessRank" : 1,
+ "effortRank" : 11,
+ "changePronenessRank" : 9,
"color" : "rgba(65, 159, 90, 0.75)",
- "borderColor" : "rgb(65, 159, 90)"
+ "borderColor" : "rgb(65, 159, 90)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java"
}, {
"id" : "MetricsVisitorLogic.java",
"label" : "MetricsVisitorLogic.java",
"x" : 9,
- "y" : 6,
+ "y" : 4,
"r" : 7,
"priority" : 15,
"effortRank" : 9,
- "changePronenessRank" : 6,
+ "changePronenessRank" : 4,
"color" : "rgba(52, 167, 93, 0.75)",
- "borderColor" : "rgb(52, 167, 93)"
+ "borderColor" : "rgb(52, 167, 93)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java"
}, {
"id" : "MetricsVisitorLogic.java",
"label" : "MetricsVisitorLogic.java",
"x" : 10,
- "y" : 6,
+ "y" : 4,
"r" : 6,
"priority" : 16,
"effortRank" : 10,
- "changePronenessRank" : 6,
+ "changePronenessRank" : 4,
"color" : "rgba(39, 174, 96, 0.75)",
- "borderColor" : "rgb(39, 174, 96)"
+ "borderColor" : "rgb(39, 174, 96)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java"
} ],
- "yaxisLabel" : "Relative churn (impact)",
- "xaxisLabel" : "Effort to refactor"
+ "xaxisLabel" : "Effort to refactor",
+ "yaxisLabel" : "Relative churn (impact)"
},
"table" : {
"headers" : [ "Class", "Method", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ],
"rows" : [ {
"cells" : [ {
- "content" : "SimpleHtmlReport.java",
+ "content" : "SimpleHtmlReport.java",
"align" : "left"
}, {
"content" : "simplifyDuplicatePartners(String)",
@@ -1498,7 +1624,7 @@
"content" : "1",
"align" : "right"
}, {
- "content" : "16",
+ "content" : "14",
"align" : "right"
}, {
"content" : "4",
@@ -1512,53 +1638,53 @@
} ]
}, {
"cells" : [ {
- "content" : "SimpleHtmlReport.java",
+ "content" : "CompositeGraphBuilder.java",
"align" : "left"
}, {
- "content" : "renderDisharmonyInfo(String,SimpleHtmlReport$DisharmonySpec,boolean,List<RankedDisharmony>)",
+ "content" : "reconcileUnattributedVertices(Unknown,Unknown,Map<String,String>)",
"align" : "left"
}, {
"content" : "2",
"align" : "right"
}, {
- "content" : "16",
+ "content" : "11",
"align" : "right"
}, {
- "content" : "7",
+ "content" : "2",
"align" : "right"
}, {
- "content" : "9/23/26, 6:59 AM",
+ "content" : "9/5/26, 1:41 PM",
"align" : "right"
}, {
- "content" : "98",
+ "content" : "8",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "CompositeGraphBuilder.java",
+ "content" : "SimpleHtmlReport.java",
"align" : "left"
}, {
- "content" : "reconcileUnattributedVertices(Unknown,Unknown,Map<String,String>)",
+ "content" : "renderDisharmonyInfo(String,SimpleHtmlReport$DisharmonySpec,boolean,List<RankedDisharmony>)",
"align" : "left"
}, {
"content" : "3",
"align" : "right"
}, {
- "content" : "10",
+ "content" : "14",
"align" : "right"
}, {
- "content" : "2",
+ "content" : "7",
"align" : "right"
}, {
- "content" : "9/5/26, 1:41 PM",
+ "content" : "9/23/26, 6:59 AM",
"align" : "right"
}, {
- "content" : "8",
+ "content" : "98",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "SimpleHtmlReport.java",
+ "content" : "SimpleHtmlReport.java",
"align" : "left"
}, {
"content" : "generateReport(boolean,int,boolean,boolean,String,String,String,File)",
@@ -1567,7 +1693,7 @@
"content" : "4",
"align" : "right"
}, {
- "content" : "16",
+ "content" : "14",
"align" : "right"
}, {
"content" : "8",
@@ -1581,183 +1707,183 @@
} ]
}, {
"cells" : [ {
- "content" : "FeedbackVertexSetSolver.java",
+ "content" : "JsonGenerator.java",
"align" : "left"
}, {
- "content" : "solveRecursive(Unknown,Set<V>)",
+ "content" : "buildDisharmonySection(SimpleHtmlReport$DisharmonySpec,boolean,List<RankedDisharmony>,String)",
"align" : "left"
}, {
"content" : "5",
"align" : "right"
}, {
- "content" : "8",
+ "content" : "16",
"align" : "right"
}, {
- "content" : "4",
+ "content" : "11",
"align" : "right"
}, {
- "content" : "8/26/26, 7:48 PM",
+ "content" : "10/2/26, 6:02 AM",
"align" : "right"
}, {
- "content" : "4",
+ "content" : "7",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "CompositeGraphBuilder.java",
+ "content" : "OptimalBackEdgeRemover.java",
"align" : "left"
}, {
- "content" : "getEnclosingClassFqn(String)",
+ "content" : "findOptimalBackEdgesToRemove()",
"align" : "left"
}, {
"content" : "6",
"align" : "right"
}, {
- "content" : "10",
+ "content" : "5",
"align" : "right"
}, {
- "content" : "7",
+ "content" : "1",
"align" : "right"
}, {
- "content" : "9/5/26, 1:41 PM",
+ "content" : "8/19/26, 7:20 PM",
"align" : "right"
}, {
- "content" : "8",
+ "content" : "2",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "DirectedFeedbackVertexSetSolver.java",
+ "content" : "FeedbackVertexSetSolver.java",
"align" : "left"
}, {
- "content" : "computeMinimumVertexCut(V,Set<V>,int)",
+ "content" : "solveRecursive(Unknown,Set<V>)",
"align" : "left"
}, {
"content" : "7",
"align" : "right"
}, {
- "content" : "7",
+ "content" : "8",
"align" : "right"
}, {
- "content" : "5",
+ "content" : "4",
"align" : "right"
}, {
"content" : "8/26/26, 7:48 PM",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "4",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "JsonGenerator.java",
+ "content" : "CompositeGraphBuilder.java",
"align" : "left"
}, {
- "content" : "buildDisharmonySection(SimpleHtmlReport$DisharmonySpec,boolean,List<RankedDisharmony>,String)",
+ "content" : "getEnclosingClassFqn(String)",
"align" : "left"
}, {
"content" : "8",
"align" : "right"
}, {
- "content" : "13",
+ "content" : "11",
"align" : "right"
}, {
- "content" : "11",
+ "content" : "7",
"align" : "right"
}, {
- "content" : "9/10/26, 8:06 AM",
+ "content" : "9/5/26, 1:41 PM",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "8",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "OptimalBackEdgeRemover.java",
+ "content" : "JsonGenerator.java",
"align" : "left"
}, {
- "content" : "findOptimalBackEdgesToRemove()",
+ "content" : "generateReportData(boolean,int,boolean,boolean,String,String,String,File)",
"align" : "left"
}, {
"content" : "9",
"align" : "right"
}, {
- "content" : "2",
+ "content" : "16",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "12",
"align" : "right"
}, {
- "content" : "8/19/26, 7:20 PM",
+ "content" : "10/2/26, 6:02 AM",
"align" : "right"
}, {
- "content" : "2",
+ "content" : "7",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "JsonGenerator.java",
+ "content" : "TreewidthComputer.java",
"align" : "left"
}, {
- "content" : "generateReportData(boolean,int,boolean,boolean,String,String,String,File)",
+ "content" : "minDegreeEliminationTreewidth(Unknown)",
"align" : "left"
}, {
"content" : "10",
"align" : "right"
}, {
- "content" : "13",
+ "content" : "6",
"align" : "right"
}, {
- "content" : "12",
+ "content" : "3",
"align" : "right"
}, {
- "content" : "9/10/26, 8:06 AM",
+ "content" : "7/12/26, 3:24 PM",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "2",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "TreewidthComputer.java",
+ "content" : "DirectedFeedbackVertexSetSolver.java",
"align" : "left"
}, {
- "content" : "minDegreeEliminationTreewidth(Unknown)",
+ "content" : "computeMinimumVertexCut(V,Set<V>,int)",
"align" : "left"
}, {
"content" : "11",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "7",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "5",
"align" : "right"
}, {
- "content" : "7/12/26, 3:24 PM",
+ "content" : "8/26/26, 7:48 PM",
"align" : "right"
}, {
- "content" : "2",
+ "content" : "3",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "MetricsVisitorLogic.java",
+ "content" : "MinimumFeedbackArcSetSolver.java",
"align" : "left"
}, {
- "content" : "handleMemberReference(MetricsVisitorState,GraphMetricsCollector,Unknown)",
+ "content" : "solveRelaxedProblem()",
"align" : "left"
}, {
"content" : "12",
"align" : "right"
}, {
- "content" : "6",
+ "content" : "1",
"align" : "right"
}, {
- "content" : "6",
+ "content" : "3",
"align" : "right"
}, {
- "content" : "8/19/26, 7:20 PM",
+ "content" : "12/18/25, 11:00 AM",
"align" : "right"
}, {
"content" : "1",
@@ -1765,53 +1891,53 @@
} ]
}, {
"cells" : [ {
- "content" : "DisharmonyDetector.java",
+ "content" : "MetricsVisitorLogic.java",
"align" : "left"
}, {
- "content" : "detectSignificantDuplication(List<ClassMetrics>)",
+ "content" : "handleMemberReference(MetricsVisitorState,GraphMetricsCollector,Unknown)",
"align" : "left"
}, {
"content" : "13",
"align" : "right"
}, {
- "content" : "11",
+ "content" : "4",
"align" : "right"
}, {
- "content" : "11",
+ "content" : "6",
"align" : "right"
}, {
- "content" : "9/5/26, 1:41 PM",
+ "content" : "8/19/26, 7:20 PM",
"align" : "right"
}, {
- "content" : "15",
+ "content" : "1",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "MinimumFeedbackArcSetSolver.java",
+ "content" : "DisharmonyDetector.java",
"align" : "left"
}, {
- "content" : "solveRelaxedProblem()",
+ "content" : "detectSignificantDuplication(List<ClassMetrics>)",
"align" : "left"
}, {
"content" : "14",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "9",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "11",
"align" : "right"
}, {
- "content" : "12/18/25, 11:00 AM",
+ "content" : "9/5/26, 1:41 PM",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "15",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "MetricsVisitorLogic.java",
+ "content" : "MetricsVisitorLogic.java",
"align" : "left"
}, {
"content" : "enterMethod(MetricsVisitorState,Unknown,MetricsVisitorLogic$OverridePredicate)",
@@ -1820,7 +1946,7 @@
"content" : "15",
"align" : "right"
}, {
- "content" : "6",
+ "content" : "4",
"align" : "right"
}, {
"content" : "9",
@@ -1834,7 +1960,7 @@
} ]
}, {
"cells" : [ {
- "content" : "MetricsVisitorLogic.java",
+ "content" : "MetricsVisitorLogic.java",
"align" : "left"
}, {
"content" : "enterClass(MetricsVisitorState,GraphMetricsCollector,Unknown)",
@@ -1843,7 +1969,7 @@
"content" : "16",
"align" : "right"
}, {
- "content" : "6",
+ "content" : "4",
"align" : "right"
}, {
"content" : "10",
@@ -1877,161 +2003,176 @@
"effortRank" : 1,
"changePronenessRank" : 31,
"color" : "rgba(235, 64, 52, 0.75)",
- "borderColor" : "rgb(235, 64, 52)"
+ "borderColor" : "rgb(235, 64, 52)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/GraphMetricsCollector.java"
}, {
"id" : "GitLogReader.java",
"label" : "GitLogReader.java",
"x" : 2,
- "y" : 30,
+ "y" : 29,
"r" : 23,
"priority" : 2,
"effortRank" : 2,
- "changePronenessRank" : 30,
+ "changePronenessRank" : 29,
"color" : "rgba(229, 67, 53, 0.75)",
- "borderColor" : "rgb(229, 67, 53)"
+ "borderColor" : "rgb(229, 67, 53)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/change-proneness-ranker/src/main/java/org/hjug/git/GitLogReader.java"
}, {
- "id" : "ReportWriter.java",
- "label" : "ReportWriter.java",
- "x" : 4,
- "y" : 29,
+ "id" : "AttributeHandlerAndSorter.java",
+ "label" : "AttributeHandlerAndSorter.java",
+ "x" : 7,
+ "y" : 33,
"r" : 23,
"priority" : 3,
- "effortRank" : 4,
- "changePronenessRank" : 29,
+ "effortRank" : 7,
+ "changePronenessRank" : 33,
"color" : "rgba(223, 71, 55, 0.75)",
- "borderColor" : "rgb(223, 71, 55)"
+ "borderColor" : "rgb(223, 71, 55)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/test-resources/src/main/resources/AttributeHandlerAndSorter.java"
}, {
- "id" : "DisharmonyDetector.java",
- "label" : "DisharmonyDetector.java",
- "x" : 8,
- "y" : 33,
+ "id" : "ReportWriter.java",
+ "label" : "ReportWriter.java",
+ "x" : 4,
+ "y" : 28,
"r" : 22,
"priority" : 4,
- "effortRank" : 8,
- "changePronenessRank" : 33,
+ "effortRank" : 4,
+ "changePronenessRank" : 28,
"color" : "rgba(217, 74, 56, 0.75)",
- "borderColor" : "rgb(217, 74, 56)"
+ "borderColor" : "rgb(217, 74, 56)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java"
}, {
"id" : "FeedbackVertexSetSolver.java",
"label" : "FeedbackVertexSetSolver.java",
"x" : 2,
- "y" : 26,
+ "y" : 25,
"r" : 22,
"priority" : 5,
"effortRank" : 2,
- "changePronenessRank" : 26,
+ "changePronenessRank" : 25,
"color" : "rgba(211, 78, 58, 0.75)",
- "borderColor" : "rgb(211, 78, 58)"
+ "borderColor" : "rgb(211, 78, 58)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java"
}, {
"id" : "ReportWriter.java",
"label" : "ReportWriter.java",
"x" : 5,
- "y" : 29,
+ "y" : 28,
"r" : 21,
"priority" : 6,
"effortRank" : 5,
- "changePronenessRank" : 29,
+ "changePronenessRank" : 28,
"color" : "rgba(204, 81, 59, 0.75)",
- "borderColor" : "rgb(204, 81, 59)"
+ "borderColor" : "rgb(204, 81, 59)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java"
}, {
- "id" : "KotlinSourceFileGraphBuilder.java",
- "label" : "KotlinSourceFileGraphBuilder.java",
- "x" : 12,
- "y" : 32,
+ "id" : "DisharmonyDetector.java",
+ "label" : "DisharmonyDetector.java",
+ "x" : 8,
+ "y" : 30,
"r" : 21,
"priority" : 7,
- "effortRank" : 12,
- "changePronenessRank" : 32,
+ "effortRank" : 8,
+ "changePronenessRank" : 30,
"color" : "rgba(198, 85, 60, 0.75)",
- "borderColor" : "rgb(198, 85, 60)"
+ "borderColor" : "rgb(198, 85, 60)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java"
}, {
- "id" : "MetricsVisitorLogic.java",
- "label" : "MetricsVisitorLogic.java",
- "x" : 3,
- "y" : 22,
+ "id" : "KotlinSourceFileGraphBuilder.java",
+ "label" : "KotlinSourceFileGraphBuilder.java",
+ "x" : 12,
+ "y" : 32,
"r" : 20,
"priority" : 8,
- "effortRank" : 3,
- "changePronenessRank" : 22,
+ "effortRank" : 12,
+ "changePronenessRank" : 32,
"color" : "rgba(192, 88, 62, 0.75)",
- "borderColor" : "rgb(192, 88, 62)"
+ "borderColor" : "rgb(192, 88, 62)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/graphbuilder/KotlinSourceFileGraphBuilder.java"
}, {
"id" : "ReportWriter.java",
"label" : "ReportWriter.java",
"x" : 10,
- "y" : 29,
+ "y" : 28,
"r" : 20,
"priority" : 9,
"effortRank" : 10,
- "changePronenessRank" : 29,
+ "changePronenessRank" : 28,
"color" : "rgba(186, 92, 63, 0.75)",
- "borderColor" : "rgb(186, 92, 63)"
+ "borderColor" : "rgb(186, 92, 63)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java"
}, {
"id" : "DirectedFeedbackVertexSetSolver.java",
"label" : "DirectedFeedbackVertexSetSolver.java",
"x" : 8,
- "y" : 25,
+ "y" : 24,
"r" : 19,
"priority" : 10,
"effortRank" : 8,
- "changePronenessRank" : 25,
+ "changePronenessRank" : 24,
"color" : "rgba(180, 95, 64, 0.75)",
- "borderColor" : "rgb(180, 95, 64)"
+ "borderColor" : "rgb(180, 95, 64)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java"
+ }, {
+ "id" : "MetricsVisitorLogic.java",
+ "label" : "MetricsVisitorLogic.java",
+ "x" : 3,
+ "y" : 18,
+ "r" : 18,
+ "priority" : 11,
+ "effortRank" : 3,
+ "changePronenessRank" : 18,
+ "color" : "rgba(174, 98, 66, 0.75)",
+ "borderColor" : "rgb(174, 98, 66)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java"
}, {
"id" : "DirectedFeedbackVertexSetSolver.java",
"label" : "DirectedFeedbackVertexSetSolver.java",
"x" : 9,
- "y" : 25,
+ "y" : 24,
"r" : 18,
- "priority" : 11,
+ "priority" : 12,
"effortRank" : 9,
- "changePronenessRank" : 25,
- "color" : "rgba(174, 98, 66, 0.75)",
- "borderColor" : "rgb(174, 98, 66)"
+ "changePronenessRank" : 24,
+ "color" : "rgba(168, 102, 67, 0.75)",
+ "borderColor" : "rgb(168, 102, 67)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java"
}, {
"id" : "TreewidthComputer.java",
"label" : "TreewidthComputer.java",
"x" : 7,
"y" : 21,
- "r" : 18,
- "priority" : 12,
- "effortRank" : 7,
- "changePronenessRank" : 21,
- "color" : "rgba(168, 102, 67, 0.75)",
- "borderColor" : "rgb(168, 102, 67)"
- }, {
- "id" : "ModulatorComputer.java",
- "label" : "ModulatorComputer.java",
- "x" : 4,
- "y" : 17,
"r" : 17,
"priority" : 13,
- "effortRank" : 4,
- "changePronenessRank" : 17,
+ "effortRank" : 7,
+ "changePronenessRank" : 21,
"color" : "rgba(162, 105, 69, 0.75)",
- "borderColor" : "rgb(162, 105, 69)"
+ "borderColor" : "rgb(162, 105, 69)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java"
}, {
"id" : "ModulatorComputer.java",
"label" : "ModulatorComputer.java",
"x" : 4,
- "y" : 17,
+ "y" : 16,
"r" : 17,
"priority" : 14,
"effortRank" : 4,
- "changePronenessRank" : 17,
+ "changePronenessRank" : 16,
"color" : "rgba(155, 109, 70, 0.75)",
- "borderColor" : "rgb(155, 109, 70)"
+ "borderColor" : "rgb(155, 109, 70)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java"
}, {
"id" : "ModulatorComputer.java",
"label" : "ModulatorComputer.java",
- "x" : 5,
- "y" : 17,
+ "x" : 4,
+ "y" : 16,
"r" : 16,
"priority" : 15,
- "effortRank" : 5,
- "changePronenessRank" : 17,
+ "effortRank" : 4,
+ "changePronenessRank" : 16,
"color" : "rgba(149, 112, 71, 0.75)",
- "borderColor" : "rgb(149, 112, 71)"
+ "borderColor" : "rgb(149, 112, 71)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java"
}, {
"id" : "TreewidthComputer.java",
"label" : "TreewidthComputer.java",
@@ -2042,203 +2183,221 @@
"effortRank" : 9,
"changePronenessRank" : 21,
"color" : "rgba(143, 116, 73, 0.75)",
- "borderColor" : "rgb(143, 116, 73)"
+ "borderColor" : "rgb(143, 116, 73)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java"
}, {
- "id" : "DirectedFeedbackVertexSetSolver.java",
- "label" : "DirectedFeedbackVertexSetSolver.java",
- "x" : 13,
- "y" : 25,
+ "id" : "ModulatorComputer.java",
+ "label" : "ModulatorComputer.java",
+ "x" : 5,
+ "y" : 16,
"r" : 15,
"priority" : 17,
- "effortRank" : 13,
- "changePronenessRank" : 25,
+ "effortRank" : 5,
+ "changePronenessRank" : 16,
"color" : "rgba(137, 119, 74, 0.75)",
- "borderColor" : "rgb(137, 119, 74)"
+ "borderColor" : "rgb(137, 119, 74)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java"
}, {
- "id" : "FeedbackVertexSetComputer.java",
- "label" : "FeedbackVertexSetComputer.java",
- "x" : 4,
- "y" : 15,
+ "id" : "TreewidthComputer.java",
+ "label" : "TreewidthComputer.java",
+ "x" : 10,
+ "y" : 21,
"r" : 14,
"priority" : 18,
- "effortRank" : 4,
- "changePronenessRank" : 15,
+ "effortRank" : 10,
+ "changePronenessRank" : 21,
"color" : "rgba(131, 122, 75, 0.75)",
- "borderColor" : "rgb(131, 122, 75)"
+ "borderColor" : "rgb(131, 122, 75)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java"
}, {
- "id" : "ModulatorComputer.java",
- "label" : "ModulatorComputer.java",
- "x" : 6,
- "y" : 17,
+ "id" : "DirectedFeedbackVertexSetSolver.java",
+ "label" : "DirectedFeedbackVertexSetSolver.java",
+ "x" : 13,
+ "y" : 24,
"r" : 14,
"priority" : 19,
- "effortRank" : 6,
- "changePronenessRank" : 17,
+ "effortRank" : 13,
+ "changePronenessRank" : 24,
"color" : "rgba(125, 126, 77, 0.75)",
- "borderColor" : "rgb(125, 126, 77)"
+ "borderColor" : "rgb(125, 126, 77)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java"
}, {
- "id" : "TreewidthComputer.java",
- "label" : "TreewidthComputer.java",
- "x" : 10,
- "y" : 21,
+ "id" : "FeedbackVertexSetComputer.java",
+ "label" : "FeedbackVertexSetComputer.java",
+ "x" : 4,
+ "y" : 14,
"r" : 13,
"priority" : 20,
- "effortRank" : 10,
- "changePronenessRank" : 21,
+ "effortRank" : 4,
+ "changePronenessRank" : 14,
"color" : "rgba(119, 129, 78, 0.75)",
- "borderColor" : "rgb(119, 129, 78)"
+ "borderColor" : "rgb(119, 129, 78)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/FeedbackVertexSetComputer.java"
}, {
"id" : "ModulatorComputer.java",
"label" : "ModulatorComputer.java",
- "x" : 7,
- "y" : 17,
+ "x" : 6,
+ "y" : 16,
"r" : 13,
"priority" : 21,
- "effortRank" : 7,
- "changePronenessRank" : 17,
+ "effortRank" : 6,
+ "changePronenessRank" : 16,
"color" : "rgba(113, 133, 80, 0.75)",
- "borderColor" : "rgb(113, 133, 80)"
+ "borderColor" : "rgb(113, 133, 80)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java"
}, {
"id" : "ModulatorComputer.java",
"label" : "ModulatorComputer.java",
- "x" : 8,
- "y" : 17,
+ "x" : 7,
+ "y" : 16,
"r" : 12,
"priority" : 22,
- "effortRank" : 8,
- "changePronenessRank" : 17,
+ "effortRank" : 7,
+ "changePronenessRank" : 16,
"color" : "rgba(106, 136, 81, 0.75)",
- "borderColor" : "rgb(106, 136, 81)"
+ "borderColor" : "rgb(106, 136, 81)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java"
}, {
"id" : "ModulatorComputer.java",
"label" : "ModulatorComputer.java",
"x" : 8,
- "y" : 17,
+ "y" : 16,
"r" : 12,
"priority" : 23,
"effortRank" : 8,
- "changePronenessRank" : 17,
+ "changePronenessRank" : 16,
"color" : "rgba(100, 140, 82, 0.75)",
- "borderColor" : "rgb(100, 140, 82)"
+ "borderColor" : "rgb(100, 140, 82)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java"
}, {
- "id" : "CycleRemovalComputer.java",
- "label" : "CycleRemovalComputer.java",
- "x" : 9,
- "y" : 18,
+ "id" : "ModulatorComputer.java",
+ "label" : "ModulatorComputer.java",
+ "x" : 8,
+ "y" : 16,
"r" : 11,
"priority" : 24,
- "effortRank" : 9,
- "changePronenessRank" : 18,
+ "effortRank" : 8,
+ "changePronenessRank" : 16,
"color" : "rgba(94, 143, 84, 0.75)",
- "borderColor" : "rgb(94, 143, 84)"
+ "borderColor" : "rgb(94, 143, 84)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java"
}, {
- "id" : "MinimumFeedbackArcSetSolver.java",
- "label" : "MinimumFeedbackArcSetSolver.java",
- "x" : 4,
- "y" : 10,
+ "id" : "CycleRemovalComputer.java",
+ "label" : "CycleRemovalComputer.java",
+ "x" : 9,
+ "y" : 17,
"r" : 11,
"priority" : 25,
- "effortRank" : 4,
- "changePronenessRank" : 10,
+ "effortRank" : 9,
+ "changePronenessRank" : 17,
"color" : "rgba(88, 147, 85, 0.75)",
- "borderColor" : "rgb(88, 147, 85)"
+ "borderColor" : "rgb(88, 147, 85)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalComputer.java"
}, {
"id" : "MinimumFeedbackArcSetSolver.java",
"label" : "MinimumFeedbackArcSetSolver.java",
"x" : 4,
- "y" : 10,
+ "y" : 9,
"r" : 10,
"priority" : 26,
"effortRank" : 4,
- "changePronenessRank" : 10,
+ "changePronenessRank" : 9,
"color" : "rgba(82, 150, 86, 0.75)",
- "borderColor" : "rgb(82, 150, 86)"
+ "borderColor" : "rgb(82, 150, 86)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java"
+ }, {
+ "id" : "MinimumFeedbackArcSetSolver.java",
+ "label" : "MinimumFeedbackArcSetSolver.java",
+ "x" : 4,
+ "y" : 9,
+ "r" : 9,
+ "priority" : 27,
+ "effortRank" : 4,
+ "changePronenessRank" : 9,
+ "color" : "rgba(76, 153, 88, 0.75)",
+ "borderColor" : "rgb(76, 153, 88)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java"
}, {
"id" : "LineDigraph.java",
"label" : "LineDigraph.java",
"x" : 8,
- "y" : 14,
+ "y" : 13,
"r" : 9,
- "priority" : 27,
+ "priority" : 28,
"effortRank" : 8,
- "changePronenessRank" : 14,
- "color" : "rgba(76, 153, 88, 0.75)",
- "borderColor" : "rgb(76, 153, 88)"
+ "changePronenessRank" : 13,
+ "color" : "rgba(70, 157, 89, 0.75)",
+ "borderColor" : "rgb(70, 157, 89)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/LineDigraph.java"
}, {
"id" : "ModulatorComputer.java",
"label" : "ModulatorComputer.java",
- "x" : 11,
- "y" : 17,
- "r" : 9,
- "priority" : 28,
+ "x" : 11,
+ "y" : 16,
+ "r" : 8,
+ "priority" : 29,
"effortRank" : 11,
- "changePronenessRank" : 17,
- "color" : "rgba(70, 157, 89, 0.75)",
- "borderColor" : "rgb(70, 157, 89)"
+ "changePronenessRank" : 16,
+ "color" : "rgba(64, 160, 91, 0.75)",
+ "borderColor" : "rgb(64, 160, 91)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java"
}, {
"id" : "FeedbackVertexSetComputer.java",
"label" : "FeedbackVertexSetComputer.java",
"x" : 10,
- "y" : 15,
+ "y" : 14,
"r" : 8,
- "priority" : 29,
+ "priority" : 30,
"effortRank" : 10,
- "changePronenessRank" : 15,
- "color" : "rgba(64, 160, 91, 0.75)",
- "borderColor" : "rgb(64, 160, 91)"
+ "changePronenessRank" : 14,
+ "color" : "rgba(57, 164, 92, 0.75)",
+ "borderColor" : "rgb(57, 164, 92)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/FeedbackVertexSetComputer.java"
}, {
"id" : "ModulatorComputer.java",
"label" : "ModulatorComputer.java",
"x" : 12,
- "y" : 17,
- "r" : 8,
- "priority" : 30,
+ "y" : 16,
+ "r" : 7,
+ "priority" : 31,
"effortRank" : 12,
- "changePronenessRank" : 17,
- "color" : "rgba(57, 164, 92, 0.75)",
- "borderColor" : "rgb(57, 164, 92)"
+ "changePronenessRank" : 16,
+ "color" : "rgba(51, 167, 93, 0.75)",
+ "borderColor" : "rgb(51, 167, 93)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java"
}, {
"id" : "MinimumFeedbackArcSetSolver.java",
"label" : "MinimumFeedbackArcSetSolver.java",
"x" : 7,
- "y" : 10,
+ "y" : 9,
"r" : 7,
- "priority" : 31,
+ "priority" : 32,
"effortRank" : 7,
- "changePronenessRank" : 10,
- "color" : "rgba(51, 167, 93, 0.75)",
- "borderColor" : "rgb(51, 167, 93)"
+ "changePronenessRank" : 9,
+ "color" : "rgba(45, 171, 95, 0.75)",
+ "borderColor" : "rgb(45, 171, 95)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java"
}, {
"id" : "FeedbackArcSetSolver.java",
"label" : "FeedbackArcSetSolver.java",
"x" : 4,
- "y" : 3,
- "r" : 7,
- "priority" : 32,
- "effortRank" : 4,
- "changePronenessRank" : 3,
- "color" : "rgba(45, 171, 95, 0.75)",
- "borderColor" : "rgb(45, 171, 95)"
- }, {
- "id" : "AttributeHandlerAndSorter.java",
- "label" : "AttributeHandlerAndSorter.java",
- "x" : 7,
- "y" : 1,
+ "y" : 2,
"r" : 6,
"priority" : 33,
- "effortRank" : 7,
- "changePronenessRank" : 1,
+ "effortRank" : 4,
+ "changePronenessRank" : 2,
"color" : "rgba(39, 174, 96, 0.75)",
- "borderColor" : "rgb(39, 174, 96)"
+ "borderColor" : "rgb(39, 174, 96)",
+ "url" : "https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/graph-algorithms/src/main/java/org/hjug/feedback/arc/approximate/FeedbackArcSetSolver.java"
} ],
- "yaxisLabel" : "Relative churn (impact)",
- "xaxisLabel" : "Effort to refactor"
+ "xaxisLabel" : "Effort to refactor",
+ "yaxisLabel" : "Relative churn (impact)"
},
"table" : {
"headers" : [ "Class", "Method", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ],
"rows" : [ {
"cells" : [ {
- "content" : "GraphMetricsCollector.java",
+ "content" : "GraphMetricsCollector.java",
"align" : "left"
}, {
"content" : "finalizeMetrics()",
@@ -2261,7 +2420,7 @@
} ]
}, {
"cells" : [ {
- "content" : "GitLogReader.java",
+ "content" : "GitLogReader.java",
"align" : "left"
}, {
"content" : "captureChangeCountByCommitTimestamp()",
@@ -2270,7 +2429,7 @@
"content" : "2",
"align" : "right"
}, {
- "content" : "30",
+ "content" : "29",
"align" : "right"
}, {
"content" : "2",
@@ -2284,53 +2443,53 @@
} ]
}, {
"cells" : [ {
- "content" : "ReportWriter.java",
+ "content" : "AttributeHandlerAndSorter.java",
"align" : "left"
}, {
- "content" : "openSecurePath()",
+ "content" : "perform(Unknown)",
"align" : "left"
}, {
"content" : "3",
"align" : "right"
}, {
- "content" : "29",
+ "content" : "33",
"align" : "right"
}, {
- "content" : "4",
+ "content" : "7",
"align" : "right"
}, {
- "content" : "9/5/26, 8:03 AM",
+ "content" : "10/1/20, 8:46 AM",
"align" : "right"
}, {
- "content" : "10",
+ "content" : "1",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "DisharmonyDetector.java",
+ "content" : "ReportWriter.java",
"align" : "left"
}, {
- "content" : "detectFeatureEnvy(List<ClassMetrics>)",
+ "content" : "openSecurePath()",
"align" : "left"
}, {
"content" : "4",
"align" : "right"
}, {
- "content" : "33",
+ "content" : "28",
"align" : "right"
}, {
- "content" : "8",
+ "content" : "4",
"align" : "right"
}, {
- "content" : "9/5/26, 1:41 PM",
+ "content" : "9/5/26, 8:03 AM",
"align" : "right"
}, {
- "content" : "15",
+ "content" : "10",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "FeedbackVertexSetSolver.java",
+ "content" : "FeedbackVertexSetSolver.java",
"align" : "left"
}, {
"content" : "computeFractionalSolution()",
@@ -2339,7 +2498,7 @@
"content" : "5",
"align" : "right"
}, {
- "content" : "26",
+ "content" : "25",
"align" : "right"
}, {
"content" : "2",
@@ -2353,7 +2512,7 @@
} ]
}, {
"cells" : [ {
- "content" : "ReportWriter.java",
+ "content" : "ReportWriter.java",
"align" : "left"
}, {
"content" : "writeAtomically(Path,String)",
@@ -2362,7 +2521,7 @@
"content" : "6",
"align" : "right"
}, {
- "content" : "29",
+ "content" : "28",
"align" : "right"
}, {
"content" : "5",
@@ -2376,53 +2535,53 @@
} ]
}, {
"cells" : [ {
- "content" : "KotlinSourceFileGraphBuilder.java",
+ "content" : "DisharmonyDetector.java",
"align" : "left"
}, {
- "content" : "buildGraph(String,String,GraphBuilderConfig)",
+ "content" : "detectFeatureEnvy(List<ClassMetrics>)",
"align" : "left"
}, {
"content" : "7",
"align" : "right"
}, {
- "content" : "32",
+ "content" : "30",
"align" : "right"
}, {
- "content" : "12",
+ "content" : "8",
"align" : "right"
}, {
- "content" : "9/5/26, 1:25 PM",
+ "content" : "9/5/26, 1:41 PM",
"align" : "right"
}, {
- "content" : "8",
+ "content" : "15",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "MetricsVisitorLogic.java",
+ "content" : "KotlinSourceFileGraphBuilder.java",
"align" : "left"
}, {
- "content" : "handleMethodInvocation(MetricsVisitorState,GraphMetricsCollector,Unknown)",
+ "content" : "buildGraph(String,String,GraphBuilderConfig)",
"align" : "left"
}, {
"content" : "8",
"align" : "right"
}, {
- "content" : "22",
+ "content" : "32",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "12",
"align" : "right"
}, {
- "content" : "8/19/26, 7:20 PM",
+ "content" : "9/5/26, 1:25 PM",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "8",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "ReportWriter.java",
+ "content" : "ReportWriter.java",
"align" : "left"
}, {
"content" : "writeAtomicallySecure(SecureDirectoryStream<Path>,Path,String)",
@@ -2431,7 +2590,7 @@
"content" : "9",
"align" : "right"
}, {
- "content" : "29",
+ "content" : "28",
"align" : "right"
}, {
"content" : "10",
@@ -2445,7 +2604,7 @@
} ]
}, {
"cells" : [ {
- "content" : "DirectedFeedbackVertexSetSolver.java",
+ "content" : "DirectedFeedbackVertexSetSolver.java",
"align" : "left"
}, {
"content" : "createMinimalBypass(V,Set<V>,Set<E>)",
@@ -2454,7 +2613,7 @@
"content" : "10",
"align" : "right"
}, {
- "content" : "25",
+ "content" : "24",
"align" : "right"
}, {
"content" : "8",
@@ -2468,85 +2627,85 @@
} ]
}, {
"cells" : [ {
- "content" : "DirectedFeedbackVertexSetSolver.java",
+ "content" : "MetricsVisitorLogic.java",
"align" : "left"
}, {
- "content" : "findBypassChain(V,Set<V>)",
+ "content" : "handleMethodInvocation(MetricsVisitorState,GraphMetricsCollector,Unknown)",
"align" : "left"
}, {
"content" : "11",
"align" : "right"
}, {
- "content" : "25",
+ "content" : "18",
"align" : "right"
}, {
- "content" : "9",
+ "content" : "3",
"align" : "right"
}, {
- "content" : "8/26/26, 7:48 PM",
+ "content" : "8/19/26, 7:20 PM",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "1",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "TreewidthComputer.java",
+ "content" : "DirectedFeedbackVertexSetSolver.java",
"align" : "left"
}, {
- "content" : "computeEta(Unknown,Set<V>)",
+ "content" : "findBypassChain(V,Set<V>)",
"align" : "left"
}, {
"content" : "12",
"align" : "right"
}, {
- "content" : "21",
+ "content" : "24",
"align" : "right"
}, {
- "content" : "7",
+ "content" : "9",
"align" : "right"
}, {
- "content" : "7/12/26, 3:24 PM",
+ "content" : "8/26/26, 7:48 PM",
"align" : "right"
}, {
- "content" : "2",
+ "content" : "3",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "ModulatorComputer.java",
+ "content" : "TreewidthComputer.java",
"align" : "left"
}, {
- "content" : "computeBetweennessCentrality(Unknown)",
+ "content" : "computeEta(Unknown,Set<V>)",
"align" : "left"
}, {
"content" : "13",
"align" : "right"
}, {
- "content" : "17",
+ "content" : "21",
"align" : "right"
}, {
- "content" : "4",
+ "content" : "7",
"align" : "right"
}, {
- "content" : "12/18/25, 11:00 AM",
+ "content" : "7/12/26, 3:24 PM",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "2",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "ModulatorComputer.java",
+ "content" : "ModulatorComputer.java",
"align" : "left"
}, {
- "content" : "computeGreedyDegreeModulator(Unknown,int,int)",
+ "content" : "computeBetweennessCentrality(Unknown)",
"align" : "left"
}, {
"content" : "14",
"align" : "right"
}, {
- "content" : "17",
+ "content" : "16",
"align" : "right"
}, {
"content" : "4",
@@ -2560,19 +2719,19 @@
} ]
}, {
"cells" : [ {
- "content" : "ModulatorComputer.java",
+ "content" : "ModulatorComputer.java",
"align" : "left"
}, {
- "content" : "computeFeedbackVertexSetModulator(Unknown,int,int)",
+ "content" : "computeGreedyDegreeModulator(Unknown,int,int)",
"align" : "left"
}, {
"content" : "15",
"align" : "right"
}, {
- "content" : "17",
+ "content" : "16",
"align" : "right"
}, {
- "content" : "5",
+ "content" : "4",
"align" : "right"
}, {
"content" : "12/18/25, 11:00 AM",
@@ -2583,7 +2742,7 @@
} ]
}, {
"cells" : [ {
- "content" : "TreewidthComputer.java",
+ "content" : "TreewidthComputer.java",
"align" : "left"
}, {
"content" : "greedyTriangulationTreewidth(Unknown)",
@@ -2606,111 +2765,111 @@
} ]
}, {
"cells" : [ {
- "content" : "DirectedFeedbackVertexSetSolver.java",
+ "content" : "ModulatorComputer.java",
"align" : "left"
}, {
- "content" : "addBypassEdges(V,Set<V>)",
+ "content" : "computeFeedbackVertexSetModulator(Unknown,int,int)",
"align" : "left"
}, {
"content" : "17",
"align" : "right"
}, {
- "content" : "25",
+ "content" : "16",
"align" : "right"
}, {
- "content" : "13",
+ "content" : "5",
"align" : "right"
}, {
- "content" : "8/26/26, 7:48 PM",
+ "content" : "12/18/25, 11:00 AM",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "1",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "FeedbackVertexSetComputer.java",
+ "content" : "TreewidthComputer.java",
"align" : "left"
}, {
- "content" : "stronglyConnectedComponentsBasedFVS(Unknown)",
+ "content" : "fillInHeuristicTreewidth(Unknown)",
"align" : "left"
}, {
"content" : "18",
"align" : "right"
}, {
- "content" : "15",
+ "content" : "21",
"align" : "right"
}, {
- "content" : "4",
+ "content" : "10",
"align" : "right"
}, {
- "content" : "12/18/25, 11:00 AM",
+ "content" : "7/12/26, 3:24 PM",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "2",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "ModulatorComputer.java",
+ "content" : "DirectedFeedbackVertexSetSolver.java",
"align" : "left"
}, {
- "content" : "computeSingleSourceBetweennessContributionsParallel(Unknown,V)",
+ "content" : "addBypassEdges(V,Set<V>)",
"align" : "left"
}, {
"content" : "19",
"align" : "right"
}, {
- "content" : "17",
+ "content" : "24",
"align" : "right"
}, {
- "content" : "6",
+ "content" : "13",
"align" : "right"
}, {
- "content" : "12/18/25, 11:00 AM",
+ "content" : "8/26/26, 7:48 PM",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "3",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "TreewidthComputer.java",
+ "content" : "FeedbackVertexSetComputer.java",
"align" : "left"
}, {
- "content" : "fillInHeuristicTreewidth(Unknown)",
+ "content" : "stronglyConnectedComponentsBasedFVS(Unknown)",
"align" : "left"
}, {
"content" : "20",
"align" : "right"
}, {
- "content" : "21",
+ "content" : "14",
"align" : "right"
}, {
- "content" : "10",
+ "content" : "4",
"align" : "right"
}, {
- "content" : "7/12/26, 3:24 PM",
+ "content" : "12/18/25, 11:00 AM",
"align" : "right"
}, {
- "content" : "2",
+ "content" : "1",
"align" : "right"
} ]
}, {
"cells" : [ {
- "content" : "ModulatorComputer.java",
+ "content" : "ModulatorComputer.java",
"align" : "left"
}, {
- "content" : "originalComputeBetweennessCentrality(Unknown)",
+ "content" : "computeSingleSourceBetweennessContributionsParallel(Unknown,V)",
"align" : "left"
}, {
"content" : "21",
"align" : "right"
}, {
- "content" : "17",
+ "content" : "16",
"align" : "right"
}, {
- "content" : "7",
+ "content" : "6",
"align" : "right"
}, {
"content" : "12/18/25, 11:00 AM",
@@ -2721,19 +2880,19 @@
} ]
}, {
"cells" : [ {
- "content" : "ModulatorComputer.java",
+ "content" : "ModulatorComputer.java",
"align" : "left"
}, {
- "content" : "computeSingleSourceBetweennessContributions(Unknown,V)",
+ "content" : "originalComputeBetweennessCentrality(Unknown)",
"align" : "left"
}, {
"content" : "22",
"align" : "right"
}, {
- "content" : "17",
+ "content" : "16",
"align" : "right"
}, {
- "content" : "8",
+ "content" : "7",
"align" : "right"
}, {
"content" : "12/18/25, 11:00 AM",
@@ -2744,16 +2903,16 @@
} ]
}, {
"cells" : [ {
- "content" : "ModulatorComputer.java",
+ "content" : "ModulatorComputer.java",
"align" : "left"
}, {
- "content" : "computeBetweennessCentralityAdaptive(Unknown)",
+ "content" : "computeSingleSourceBetweennessContributions(Unknown,V)",
"align" : "left"
}, {
"content" : "23",
"align" : "right"
}, {
- "content" : "17",
+ "content" : "16",
"align" : "right"
}, {
"content" : "8",
@@ -2767,22 +2926,22 @@
} ]
}, {
"cells" : [ {
- "content" : "CycleRemovalComputer.java",
+ "content" : "ModulatorComputer.java",
"align" : "left"
}, {
- "content" : "computeCycleRemovalInformation(Unknown)",
+ "content" : "computeBetweennessCentralityAdaptive(Unknown)",
"align" : "left"
}, {
"content" : "24",
"align" : "right"
}, {
- "content" : "18",
+ "content" : "16",
"align" : "right"
}, {
- "content" : "9",
+ "content" : "8",
"align" : "right"
}, {
- "content" : "6/16/26, 7:10 PM",
+ "content" : "12/18/25, 11:00 AM",
"align" : "right"
}, {
"content" : "1",
@@ -2790,22 +2949,22 @@
} ]
}, {
"cells" : [ {
- "content" : "MinimumFeedbackArcSetSolver.java",
+ "content" : "CycleRemovalComputer.java",
"align" : "left"
}, {
- "content" : "findShortestPath(Unknown,V)",
+ "content" : "computeCycleRemovalInformation(Unknown)",
"align" : "left"
}, {
"content" : "25",
"align" : "right"
}, {
- "content" : "10",
+ "content" : "17",
"align" : "right"
}, {
- "content" : "4",
+ "content" : "9",
"align" : "right"
}, {
- "content" : "12/18/25, 11:00 AM",
+ "content" : "6/16/26, 7:10 PM",
"align" : "right"
}, {
"content" : "1",
@@ -2813,16 +2972,16 @@
} ]
}, {
"cells" : [ {
- "content" : "MinimumFeedbackArcSetSolver.java",
+ "content" : "MinimumFeedbackArcSetSolver.java",
"align" : "left"
}, {
- "content" : "solve()",
+ "content" : "findShortestPath(Unknown,V)",
"align" : "left"
}, {
"content" : "26",
"align" : "right"
}, {
- "content" : "10",
+ "content" : "9",
"align" : "right"
}, {
"content" : "4",
@@ -2836,19 +2995,19 @@
} ]
}, {
"cells" : [ {
- "content" : "LineDigraph.java",
+ "content" : "MinimumFeedbackArcSetSolver.java",
"align" : "left"
}, {
- "content" : "topologicalSort()",
+ "content" : "solve()",
"align" : "left"
}, {
"content" : "27",
"align" : "right"
}, {
- "content" : "14",
+ "content" : "9",
"align" : "right"
}, {
- "content" : "8",
+ "content" : "4",
"align" : "right"
}, {
"content" : "12/18/25, 11:00 AM",
@@ -2859,19 +3018,19 @@
} ]
}, {
"cells" : [ {
- "content" : "ModulatorComputer.java",
+ "content" : "LineDigraph.java",
"align" : "left"
}, {
- "content" : "computeTreewidthDecompositionModulator(Unknown,int,int)",
+ "content" : "topologicalSort()",
"align" : "left"
}, {
"content" : "28",
"align" : "right"
}, {
- "content" : "17",
+ "content" : "13",
"align" : "right"
}, {
- "content" : "11",
+ "content" : "8",
"align" : "right"
}, {
"content" : "12/18/25, 11:00 AM",
@@ -2882,19 +3041,19 @@
} ]
}, {
"cells" : [ {
- "content" : "FeedbackVertexSetComputer.java",
+ "content" : "ModulatorComputer.java",
"align" : "left"
}, {
- "content" : "degreeBasedFeedbackVertexSet(Unknown)",
+ "content" : "computeTreewidthDecompositionModulator(Unknown,int,int)",
"align" : "left"
}, {
"content" : "29",
"align" : "right"
}, {
- "content" : "15",
+ "content" : "16",
"align" : "right"
}, {
- "content" : "10",
+ "content" : "11",
"align" : "right"
}, {
"content" : "12/18/25, 11:00 AM",
@@ -2905,19 +3064,19 @@
} ]
}, {
"cells" : [ {
- "content" : "ModulatorComputer.java",
+ "content" : "FeedbackVertexSetComputer.java",
"align" : "left"
}, {
- "content" : "computeBottleneckVertexModulator(Unknown,int,int)",
+ "content" : "degreeBasedFeedbackVertexSet(Unknown)",
"align" : "left"
}, {
"content" : "30",
"align" : "right"
}, {
- "content" : "17",
+ "content" : "14",
"align" : "right"
}, {
- "content" : "12",
+ "content" : "10",
"align" : "right"
}, {
"content" : "12/18/25, 11:00 AM",
@@ -2928,19 +3087,19 @@
} ]
}, {
"cells" : [ {
- "content" : "MinimumFeedbackArcSetSolver.java",
+ "content" : "ModulatorComputer.java",
"align" : "left"
}, {
- "content" : "computeInitialHeuristicSolution()",
+ "content" : "computeBottleneckVertexModulator(Unknown,int,int)",
"align" : "left"
}, {
"content" : "31",
"align" : "right"
}, {
- "content" : "10",
+ "content" : "16",
"align" : "right"
}, {
- "content" : "7",
+ "content" : "12",
"align" : "right"
}, {
"content" : "12/18/25, 11:00 AM",
@@ -2951,19 +3110,19 @@
} ]
}, {
"cells" : [ {
- "content" : "FeedbackArcSetSolver.java",
+ "content" : "MinimumFeedbackArcSetSolver.java",
"align" : "left"
}, {
- "content" : "solve()",
+ "content" : "computeInitialHeuristicSolution()",
"align" : "left"
}, {
"content" : "32",
"align" : "right"
}, {
- "content" : "3",
+ "content" : "9",
"align" : "right"
}, {
- "content" : "4",
+ "content" : "7",
"align" : "right"
}, {
"content" : "12/18/25, 11:00 AM",
@@ -2974,22 +3133,22 @@
} ]
}, {
"cells" : [ {
- "content" : "AttributeHandlerAndSorter.java",
+ "content" : "FeedbackArcSetSolver.java",
"align" : "left"
}, {
- "content" : "perform(Unknown)",
+ "content" : "solve()",
"align" : "left"
}, {
"content" : "33",
"align" : "right"
}, {
- "content" : "1",
+ "content" : "2",
"align" : "right"
}, {
- "content" : "7",
+ "content" : "4",
"align" : "right"
}, {
- "content" : "10/1/20, 8:46 AM",
+ "content" : "12/18/25, 11:00 AM",
"align" : "right"
}, {
"content" : "1",
@@ -3012,19 +3171,19 @@
"cycleIdentifier" : "graph_ReportWriter_SecureDirectoryOps_g0qpeh",
"classCount" : 4,
"relationshipCount" : 7,
- "dot" : "strict digraph G {\nReportWriter -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [ label = \"3\" weight = \"3\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [ label = \"1\" weight = \"1\" ];\norg_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [ label = \"1\" weight = \"1\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps -> org_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps -> ReportWriter [ label = \"1\" weight = \"1\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl -> ReportWriter [ label = \"1\" weight = \"1\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter$SecureDirectoryOps\"];\norg_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter$FallbackDirectoryOps\"];\nReportWriter [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter\" color=red style=filled];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/d76a4fe1cc453b7e6f230d31d354d955e275657a/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter$SecureDirectoryOpsImpl\"];\n}",
+ "dot" : "strict digraph G {\nReportWriter -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [ label = \"3\" weight = \"3\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [ label = \"1\" weight = \"1\" ];\norg_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [ label = \"1\" weight = \"1\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps -> org_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps -> org_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps [ label = \"1\" weight = \"1\" color = \"red\" ];\norg_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps -> ReportWriter [ label = \"1\" weight = \"1\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl -> ReportWriter [ label = \"1\" weight = \"1\" ];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter$SecureDirectoryOps\"];\norg_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter$FallbackDirectoryOps\"];\nReportWriter [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter\" color=red style=filled];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl [URL=\"https://github.com/refactorfirst/RefactorFirst/blob/48990a70cc2437030b6905415d9be354c101db75/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java\" target=\"_blank\" label=\"ReportWriter$SecureDirectoryOpsImpl\"];\n}",
"dotThresholdExceeded" : false,
"breakdown" : [ {
- "className" : "ReportWriter$SecureDirectoryOps",
- "edgesHtml" : "ReportWriter$SecureDirectoryOps → ReportWriter$SecureDirectoryOpsImpl : 1*
\nReportWriter$SecureDirectoryOps → ReportWriter$FallbackDirectoryOps : 1*
\n"
+ "className" : "ReportWriter$SecureDirectoryOps",
+ "edgesHtml" : "ReportWriter$SecureDirectoryOps → ReportWriter$SecureDirectoryOpsImpl : 1*
\nReportWriter$SecureDirectoryOps → ReportWriter$FallbackDirectoryOps : 1*
\n"
}, {
- "className" : "ReportWriter$FallbackDirectoryOps",
+ "className" : "ReportWriter$FallbackDirectoryOps",
"edgesHtml" : "ReportWriter$FallbackDirectoryOps → ReportWriter$SecureDirectoryOps : 1
\nReportWriter$FallbackDirectoryOps → ReportWriter : 1
\n"
}, {
- "className" : "ReportWriter*",
+ "className" : "ReportWriter*",
"edgesHtml" : "ReportWriter → ReportWriter$SecureDirectoryOps : 3
\n"
}, {
- "className" : "ReportWriter$SecureDirectoryOpsImpl",
+ "className" : "ReportWriter$SecureDirectoryOpsImpl",
"edgesHtml" : "ReportWriter$SecureDirectoryOpsImpl → ReportWriter$SecureDirectoryOps : 1
\nReportWriter$SecureDirectoryOpsImpl → ReportWriter : 1
\n"
} ]
}
diff --git a/AGENTS.md b/AGENTS.md
index 98089b15..ce9e6249 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -115,6 +115,7 @@ back to returning the Java-only DTO with a `log.warn`
is for build failures, not for "Kotlin is absent".
## Testing Notes
+- **TDD is required when implementing code.** Write tests before production code using the red-green-refactor cycle. Use the Given-When-Then format for test structure.
- JUnit 5 with parameterized tests
- Test fixtures in `test-resources/src/test/resources`
- For graph algorithm changes, check `JavaGraphBuilderTest` and `CircularReferenceCheckerTests`
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 f271116c..366bf482 100644
--- a/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java
+++ b/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java
@@ -77,7 +77,7 @@ public void execute(
log.info("RefactorFirst JSON successfully generated at {}", targetFile.toAbsolutePath());
// Copy Mustache template and viewer to .refactorfirst directory
- copyViewerResources(dotRefactorFirstDir);
+ // copyViewerResources(dotRefactorFirstDir);
}
/** Copies the Mustache template and browser viewer into the report directory. */
@@ -254,13 +254,25 @@ public RefactorFirstReportDTO generateReportData(
String startVertex = vertexes[0].trim();
String endVertex = vertexes[1].trim();
+ String sourcePath =
+ codebaseGraphDTO.getClassToSourceFilePathMapping().get(startVertex);
+ String targetPath =
+ codebaseGraphDTO.getClassToSourceFilePathMapping().get(endVertex);
+ String sourceUrl = (sourcePath != null && !sourcePath.isBlank()) ? repoUrl + sourcePath : "";
+ String targetUrl = (targetPath != null && !targetPath.isBlank()) ? repoUrl + targetPath : "";
+
+ // Build rendered label with links to class files
+ String renderedLabel =
+ buildClassLinkLabel(startVertex, endVertex, sourceUrl, targetUrl, classesToRemove, (int)
+ classGraph.getEdgeWeight(edgeInfo.getEdge()));
+
classRelList.add(ClassRelationshipDTO.builder()
.sourceClass(startVertex)
.targetClass(endVertex)
.sourceMarked(classesToRemove.contains(startVertex))
.targetMarked(classesToRemove.contains(endVertex))
.weight((int) classGraph.getEdgeWeight(edgeInfo.getEdge()))
- .renderedLabel(renderPlainClassEdge(edgeInfo.getEdge()))
+ .renderedLabel(renderedLabel)
.priority(edgeInfo.getPriority())
.cycleCount(edgeInfo.getCycleCount())
.effortRank(edgeInfo.getEffortRank())
@@ -300,16 +312,81 @@ public RefactorFirstReportDTO generateReportData(
String startVertex = vertexes[0].trim();
String endVertex = vertexes[1].trim();
+ // Extract package URLs from class relationships in the package edge
+ String sourceUrl = "";
+ String targetUrl = "";
+ Set classRelationshipsInPackageRelationship = codebaseGraphDTO
+ .getClassRelationshipsInPackageRelationship()
+ .get(edgeInfo.getEdge());
+ if (classRelationshipsInPackageRelationship != null) {
+ for (DefaultWeightedEdge classEdge : classRelationshipsInPackageRelationship) {
+ String[] classVertexes = extractVertexes(classEdge);
+ String classStart = classVertexes[0].trim();
+ String classEnd = classVertexes[1].trim();
+
+ // Get source file path for each class vertex
+ String classStartPath = codebaseGraphDTO
+ .getClassToSourceFilePathMapping()
+ .get(classStart);
+ String classEndPath = codebaseGraphDTO
+ .getClassToSourceFilePathMapping()
+ .get(classEnd);
+
+ // Derive package directory from source file path
+ if (classStartPath != null && !classStartPath.isBlank()) {
+ int lastSlash = classStartPath.lastIndexOf('/');
+ if (lastSlash != -1) {
+ String packageDir = classStartPath.substring(0, lastSlash + 1);
+ // Check if this class belongs to the source package
+ if (isClassInPackage(classStart, startVertex, codebaseGraphDTO)) {
+ sourceUrl = repoUrl + packageDir;
+ }
+ // Check if this class belongs to the target package
+ if (isClassInPackage(classStart, endVertex, codebaseGraphDTO)) {
+ targetUrl = repoUrl + packageDir;
+ }
+ }
+ }
+
+ if (classEndPath != null && !classEndPath.isBlank()) {
+ int lastSlash = classEndPath.lastIndexOf('/');
+ if (lastSlash != -1) {
+ String packageDir = classEndPath.substring(0, lastSlash + 1);
+ // Check if this class belongs to the source package
+ if (isClassInPackage(classEnd, startVertex, codebaseGraphDTO)) {
+ sourceUrl = repoUrl + packageDir;
+ }
+ // Check if this class belongs to the target package
+ if (isClassInPackage(classEnd, endVertex, codebaseGraphDTO)) {
+ targetUrl = repoUrl + packageDir;
+ }
+ }
+ }
+ }
+ }
+
+ // Fallback to package name conversion if no class edges found
+ if (sourceUrl.isBlank()) {
+ sourceUrl = repoUrl + startVertex.replace('.', '/');
+ }
+ if (targetUrl.isBlank()) {
+ targetUrl = repoUrl + endVertex.replace('.', '/');
+ }
+
List breakClassRels =
cells.length > 4 && !cells[4].isBlank() ? List.of(cells[4].split("
")) : List.of();
+ // Build rendered label with links to package directories
+ String renderedLabel =
+ buildPackageLinkLabel(cells[0], startVertex, endVertex, sourceUrl, targetUrl, packagesToRemove);
+
packageRelList.add(PackageRelationshipDTO.builder()
.sourcePackage(startVertex)
.targetPackage(endVertex)
.sourceMarked(packagesToRemove.contains(startVertex))
.targetMarked(packagesToRemove.contains(endVertex))
.weight((int) packageGraph.getEdgeWeight(edgeInfo.getEdge()))
- .renderedLabel(cells[0])
+ .renderedLabel(renderedLabel)
.priority(edgeInfo.getPriority())
.cycleCount(edgeInfo.getCycleCount())
.effortRank(edgeInfo.getEffortRank())
@@ -358,7 +435,7 @@ public RefactorFirstReportDTO generateReportData(
for (String vertex : largestCycle.getVertexSet()) {
String className;
if (classesToRemove.contains(vertex)) {
- className = hyperlinkClass(vertex, repoUrl, codebaseGraphDTO) + "*";
+ className = hyperlinkClass(vertex, repoUrl, codebaseGraphDTO) + "*";
} else {
className = hyperlinkClass(vertex, repoUrl, codebaseGraphDTO);
}
@@ -368,7 +445,7 @@ public RefactorFirstReportDTO generateReportData(
if (edge.toString().startsWith("(" + vertex + " :")) {
if (classRelationshipsToRemove.contains(edge)) {
edges.append("");
- edges.append(renderClassEdge(edge) + "*");
+ edges.append(renderClassEdge(edge) + "*");
edges.append("");
} else {
edges.append(renderClassEdge(edge));
@@ -426,17 +503,6 @@ public RefactorFirstReportDTO generateReportData(
}
}
- /** Renders a relationship label as plain text for Mustache's escaped interpolation. */
- private String renderPlainClassEdge(DefaultWeightedEdge edge) {
- String[] vertexes = extractVertexes(edge);
- String startVertex = vertexes[0].trim();
- String endVertex = vertexes[1].trim();
- String startMarker = classesToRemove.contains(startVertex) ? "*" : "";
- String endMarker = classesToRemove.contains(endVertex) ? "*" : "";
- return getClassName(startVertex) + startMarker + " → " + getClassName(endVertex) + endMarker + " : "
- + (int) classGraph.getEdgeWeight(edge);
- }
-
/** Converts ranked instances of one disharmony type into chart and table data. */
private DisharmonySectionDTO buildDisharmonySection(
DisharmonySpec spec, boolean showDetails, List ranked, String repoUrl) {
@@ -449,13 +515,15 @@ private DisharmonySectionDTO buildDisharmonySection(
String label = rd.getFileName() != null
? rd.getFileName()
: rd.getRawPriority().toString();
+ String url = repoUrl + rd.getPath();
bubbles.add(createBubble(
rd.getFileName(),
label,
rd.getEffortRank(),
rd.getChangePronenessRank(),
rd.getPriority(),
- maxPriority));
+ maxPriority,
+ url));
}
DisharmonyChartDTO chartDTO = DisharmonyChartDTO.builder()
@@ -615,7 +683,13 @@ private DisharmonySectionDTO buildDisharmonySection(
/** Creates a chart bubble whose size and color reflect the finding priority. */
public ChartJsBubbleDTO createBubble(
- String id, String label, int effortRank, int changePronenessRank, int priority, int maxPriority) {
+ String id,
+ String label,
+ int effortRank,
+ int changePronenessRank,
+ int priority,
+ int maxPriority,
+ String url) {
int minRadius = 6;
int maxRadius = 24;
@@ -655,6 +729,7 @@ public ChartJsBubbleDTO createBubble(
.changePronenessRank(changePronenessRank)
.color(color)
.borderColor(borderColor)
+ .url(url)
.build();
}
@@ -667,4 +742,143 @@ private static String graphIdentifier(String value) {
}
return "graph_" + sanitized + "_" + Integer.toUnsignedString(original.hashCode(), 36);
}
+
+ /** Checks if a class belongs to a given package by checking the fully qualified class name. */
+ private boolean isClassInPackage(String className, String packageName, CodebaseGraphDTO codebaseGraphDTO) {
+ if (className == null || packageName == null) {
+ return false;
+ }
+ // Check if the class name starts with the package name followed by a dot
+ int lastDot = className.lastIndexOf('.');
+ return lastDot > 0 && className.substring(0, lastDot).equals(packageName);
+ }
+
+ /**
+ * Builds a rendered label with HTML links to package directories.
+ * Transforms "org.hjug.graphbuilder.metrics → org.hjug.graphbuilder* : 1"
+ * into "org.hjug.graphbuilder.metrics → org.hjug.graphbuilder* : 1"
+ */
+ private String buildPackageLinkLabel(
+ String originalLabel,
+ String startVertex,
+ String endVertex,
+ String sourceUrl,
+ String targetUrl,
+ Set packagesToRemove) {
+ if (originalLabel == null || originalLabel.isBlank()) {
+ return originalLabel;
+ }
+
+ // The original label format is: "startPackage → endPackage : weight"
+ // We need to wrap the package names with links
+ String arrow = " → ";
+ String weightSeparator = " : ";
+
+ // Split the label into parts
+ String[] parts = originalLabel.split(weightSeparator);
+ if (parts.length < 2) {
+ return originalLabel;
+ }
+
+ String edgePart = parts[0];
+ String weight = parts[1];
+
+ // Split the edge part by arrow
+ String[] packages = edgePart.split(arrow, 2);
+ if (packages.length < 2) {
+ return originalLabel;
+ }
+
+ String startPackage = packages[0].trim();
+ String endPackage = packages[1].trim();
+
+ // Check if start package has the removal marker (escaped or unescaped)
+ boolean startMarked =
+ startPackage.contains("*") || startPackage.contains("<strong>*</strong>");
+ if (startMarked) {
+ startPackage = startPackage.replace("*", "").replace("<strong>*</strong>", "");
+ }
+
+ // Check if end package has the removal marker (escaped or unescaped)
+ boolean endMarked =
+ endPackage.contains("*") || endPackage.contains("<strong>*</strong>");
+ if (endMarked) {
+ endPackage = endPackage.replace("*", "").replace("<strong>*</strong>", "");
+ }
+
+ // Build the new label with links
+ StringBuilder newLabel = new StringBuilder();
+ newLabel.append("")
+ .append(escapeHtmlLabel(startPackage))
+ .append("");
+ if (startMarked) {
+ newLabel.append("*");
+ }
+ newLabel.append(arrow);
+ newLabel.append("")
+ .append(escapeHtmlLabel(endPackage))
+ .append("");
+ if (endMarked) {
+ newLabel.append("*");
+ }
+ newLabel.append(weightSeparator).append(weight);
+
+ return newLabel.toString();
+ }
+
+ /**
+ * Builds a rendered label with HTML links to class files.
+ * Transforms "GraphMetricsCollector → DependencyCollector : 1"
+ * into "GraphMetricsCollector → DependencyCollector* : 1"
+ */
+ private String buildClassLinkLabel(
+ String startVertex,
+ String endVertex,
+ String sourceUrl,
+ String targetUrl,
+ Set classesToRemove,
+ int weight) {
+ // Extract simple class names for display
+ String startClass = getClassName(startVertex);
+ String endClass = getClassName(endVertex);
+
+ // Check if classes are marked for removal
+ boolean startMarked = classesToRemove.contains(startVertex);
+ boolean endMarked = classesToRemove.contains(endVertex);
+
+ // Build the new label with links
+ StringBuilder newLabel = new StringBuilder();
+ if (sourceUrl != null && !sourceUrl.isBlank()) {
+ newLabel.append("")
+ .append(escapeHtmlLabel(startClass))
+ .append("");
+ } else {
+ newLabel.append(escapeHtmlLabel(startClass));
+ }
+ if (startMarked) {
+ newLabel.append("*");
+ }
+ newLabel.append(" → ");
+ if (targetUrl != null && !targetUrl.isBlank()) {
+ newLabel.append("")
+ .append(escapeHtmlLabel(endClass))
+ .append("");
+ } else {
+ newLabel.append(escapeHtmlLabel(endClass));
+ }
+ if (endMarked) {
+ newLabel.append("*");
+ }
+ newLabel.append(" : ").append(weight);
+
+ return newLabel.toString();
+ }
}
diff --git a/report/src/main/java/org/hjug/refactorfirst/report/model/ChartJsBubbleDTO.java b/report/src/main/java/org/hjug/refactorfirst/report/model/ChartJsBubbleDTO.java
index 31b7f643..d5c5c63c 100644
--- a/report/src/main/java/org/hjug/refactorfirst/report/model/ChartJsBubbleDTO.java
+++ b/report/src/main/java/org/hjug/refactorfirst/report/model/ChartJsBubbleDTO.java
@@ -20,4 +20,5 @@ public class ChartJsBubbleDTO {
private int changePronenessRank;
private String color;
private String borderColor;
+ private String url;
}
diff --git a/report/src/main/java/org/hjug/refactorfirst/report/model/ClassRelationshipDTO.java b/report/src/main/java/org/hjug/refactorfirst/report/model/ClassRelationshipDTO.java
index 76f8ca3a..46b52c0d 100644
--- a/report/src/main/java/org/hjug/refactorfirst/report/model/ClassRelationshipDTO.java
+++ b/report/src/main/java/org/hjug/refactorfirst/report/model/ClassRelationshipDTO.java
@@ -12,8 +12,6 @@
public class ClassRelationshipDTO {
private String sourceClass;
private String targetClass;
- private String sourceUrl;
- private String targetUrl;
private boolean sourceMarked;
private boolean targetMarked;
private int weight;
diff --git a/report/src/test/java/org/hjug/refactorfirst/report/JsonGeneratorTest.java b/report/src/test/java/org/hjug/refactorfirst/report/JsonGeneratorTest.java
index 1cd5595a..51b43999 100644
--- a/report/src/test/java/org/hjug/refactorfirst/report/JsonGeneratorTest.java
+++ b/report/src/test/java/org/hjug/refactorfirst/report/JsonGeneratorTest.java
@@ -1,6 +1,7 @@
package org.hjug.refactorfirst.report;
import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assumptions.assumeTrue;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
@@ -75,10 +76,6 @@ void testConfiguredOutputDirectoryIsHonored() throws Exception {
assertTrue(Files.exists(outputDir.resolve(".refactorfirst/refactor-first.json")));
assertFalse(Files.exists(tempDir.resolve(".refactorfirst/refactor-first.json")));
-
- String viewer = Files.readString(outputDir.resolve(".refactorfirst/index.html"));
- assertTrue(viewer.contains("accept=\".json,.mustache\" multiple"));
- assertFalse(viewer.contains("getFallbackTemplate"));
}
/** Verifies HTML encoding used for repository-derived text and attribute values. */
@@ -118,7 +115,7 @@ void testCalculateBubbleRadiusAndColor() {
JsonGenerator generator = new JsonGenerator();
// Priority 1 out of 10 should have max radius and red color
- ChartJsBubbleDTO bubblePriority1 = generator.createBubble("TestClass", "TestClass.java", 5, 10, 1, 10);
+ ChartJsBubbleDTO bubblePriority1 = generator.createBubble("TestClass", "TestClass.java", 5, 10, 1, 10, null);
assertEquals(1, bubblePriority1.getPriority());
assertEquals(24, bubblePriority1.getR(), "Priority 1 should have max radius 24");
@@ -128,7 +125,7 @@ void testCalculateBubbleRadiusAndColor() {
"Priority 1 should be red");
// Priority 10 out of 10 should have min radius and green color
- ChartJsBubbleDTO bubblePriority10 = generator.createBubble("CleanClass", "CleanClass.java", 1, 1, 10, 10);
+ ChartJsBubbleDTO bubblePriority10 = generator.createBubble("CleanClass", "CleanClass.java", 1, 1, 10, 10, null);
assertEquals(10, bubblePriority10.getPriority());
assertEquals(6, bubblePriority10.getR(), "Max priority (lowest urgency) should have min radius 6");
@@ -138,6 +135,97 @@ void testCalculateBubbleRadiusAndColor() {
"Lowest priority should be green");
}
+ /** Verifies that bubble URL is set to the class file path. */
+ @Test
+ void given_createBubble_when_urlProvided_then_urlIsSet() {
+ // Given
+ JsonGenerator generator = new JsonGenerator();
+ String classPath = "src/main/java/com/example/TestClass.java";
+ String repoUrl = "https://github.com/example/repo/blob/main/";
+
+ // When
+ ChartJsBubbleDTO bubble =
+ generator.createBubble("TestClass", "TestClass.java", 5, 10, 1, 10, repoUrl + classPath);
+
+ // Then
+ assertNotNull(bubble.getUrl());
+ assertEquals(
+ "https://github.com/example/repo/blob/main/src/main/java/com/example/TestClass.java", bubble.getUrl());
+ }
+
+ /** Verifies that generated and serialized chart bubbles carry repoUrl + source path. */
+ @Test
+ void given_repoWithOrigin_when_reportGenerated_then_bubbleUrlsPointToSourceFiles() throws Exception {
+ // Given
+ File repoDir = tempDir.toFile();
+ File srcDir = new File(repoDir, "src/main/java/com/example");
+ srcDir.mkdirs();
+
+ StringBuilder complexMethod = new StringBuilder();
+ for (int i = 0; i < 40; i++) {
+ complexMethod
+ .append(" if (a > ")
+ .append(i)
+ .append(") { for (int j = 0; j < a; j++) { if (j % 2 == 0 && b) { c += j; } else { c -= j; } } }\n");
+ }
+ Files.writeString(
+ new File(srcDir, "ComplexService.java").toPath(),
+ "package com.example;\n\n"
+ + "public class ComplexService {\n"
+ + " private int c;\n"
+ + " public int compute(int a, boolean b) {\n"
+ + complexMethod
+ + " return c;\n"
+ + " }\n"
+ + "}\n");
+
+ new ProcessBuilder("git", "init").directory(repoDir).start().waitFor();
+ new ProcessBuilder("git", "config", "user.email", "test@test.com")
+ .directory(repoDir)
+ .start()
+ .waitFor();
+ new ProcessBuilder("git", "config", "user.name", "Test")
+ .directory(repoDir)
+ .start()
+ .waitFor();
+ new ProcessBuilder("git", "remote", "add", "origin", "https://github.com/example/repo.git")
+ .directory(repoDir)
+ .start()
+ .waitFor();
+ new ProcessBuilder("git", "add", ".").directory(repoDir).start().waitFor();
+ new ProcessBuilder("git", "commit", "-m", "initial")
+ .directory(repoDir)
+ .start()
+ .waitFor();
+
+ // When
+ new JsonGenerator().execute(0, true, false, true, "src/test", "BubbleProject", "1.0.0", repoDir, null);
+
+ // Then
+ Path jsonFile = tempDir.resolve(".refactorfirst").resolve("refactor-first.json");
+ RefactorFirstReportDTO report = objectMapper.readValue(jsonFile.toFile(), RefactorFirstReportDTO.class);
+ String repoUrl = report.getProject().getRepoUrl();
+ assertTrue(
+ repoUrl.startsWith("https://github.com/example/repo/blob/"),
+ "repoUrl should be derived from origin: " + repoUrl);
+
+ var bubbles = report.getDisharmonies() == null
+ ? java.util.List.of()
+ : report.getDisharmonies().stream()
+ .filter(section -> section.getChart() != null)
+ .flatMap(section -> section.getChart().getBubbles().stream())
+ .toList();
+ assumeTrue(!bubbles.isEmpty(), "Fixture produced no disharmony bubbles");
+
+ for (ChartJsBubbleDTO bubble : bubbles) {
+ assertNotNull(bubble.getUrl(), "Bubble " + bubble.getLabel() + " should have a url");
+ assertTrue(bubble.getUrl().startsWith(repoUrl), "Bubble url should start with repoUrl: " + bubble.getUrl());
+ assertTrue(
+ bubble.getUrl().endsWith("src/main/java/com/example/" + bubble.getLabel()),
+ "Bubble url should point to the source file: " + bubble.getUrl());
+ }
+ }
+
/** Verifies report generation against a minimal Git repository fixture. */
@Test
void testGenerateReportDataWithGitRepoFixture() throws Exception {
@@ -244,4 +332,97 @@ public String execute() {
assertFalse(report.getProject().isAnalysisFailed());
assertTrue(report.getClassMap().getClassCount() >= 1);
}
+
+ /**
+ * Verifies that sourceUrl and targetUrl are set in ClassRelationshipDTO and PackageRelationshipDTO.
+ */
+ @Test
+ void given_circularDependency_when_reportGenerated_then_relationshipUrlsAreSet() throws Exception {
+ // Given
+ File repoDir = tempDir.toFile();
+ new File(repoDir, ".git").mkdirs();
+
+ File srcDir = new File(repoDir, "src/main/java/com/example");
+ srcDir.mkdirs();
+
+ // Create two classes with circular dependency
+ Files.writeString(
+ new File(srcDir, "ClassA.java").toPath(),
+ """
+ package com.example;
+
+ public class ClassA {
+ private ClassB classB;
+
+ public ClassA(ClassB classB) {
+ this.classB = classB;
+ }
+ }
+ """);
+
+ Files.writeString(
+ new File(srcDir, "ClassB.java").toPath(),
+ """
+ package com.example;
+
+ public class ClassB {
+ private ClassA classA;
+
+ public ClassB(ClassA classA) {
+ this.classA = classA;
+ }
+ }
+ """);
+
+ new ProcessBuilder("git", "init").directory(repoDir).start().waitFor();
+ new ProcessBuilder("git", "config", "user.email", "test@test.com")
+ .directory(repoDir)
+ .start()
+ .waitFor();
+ new ProcessBuilder("git", "config", "user.name", "Test")
+ .directory(repoDir)
+ .start()
+ .waitFor();
+ new ProcessBuilder("git", "add", ".").directory(repoDir).start().waitFor();
+ new ProcessBuilder("git", "commit", "-m", "initial")
+ .directory(repoDir)
+ .start()
+ .waitFor();
+
+ // When
+ new JsonGenerator().execute(0, true, false, true, "src/test", "CircularProject", "1.0.0", repoDir, null);
+
+ // Then
+ Path jsonFile = tempDir.resolve(".refactorfirst").resolve("refactor-first.json");
+ assertTrue(Files.exists(jsonFile));
+
+ RefactorFirstReportDTO report = objectMapper.readValue(jsonFile.toFile(), RefactorFirstReportDTO.class);
+ assertNotNull(report);
+
+ // Verify ClassRelationshipDTO renderedLabel contains HTML links
+ assertNotNull(report.getClassRelationshipsToRemove());
+ assertNotNull(report.getClassRelationshipsToRemove().getRelationships());
+ assertFalse(report.getClassRelationshipsToRemove().getRelationships().isEmpty());
+ var classRel = report.getClassRelationshipsToRemove().getRelationships().get(0);
+ assertNotNull(classRel.getRenderedLabel(), "ClassRelationshipDTO should have renderedLabel");
+ assertTrue(classRel.getRenderedLabel().contains("