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("