diff --git a/.refactorfirst/refactor-first.json b/.refactorfirst/refactor-first.json index b431de34..176974da 100644 --- a/.refactorfirst/refactor-first.json +++ b/.refactorfirst/refactor-first.json @@ -2,9 +2,9 @@ "project" : { "name" : "RefactorFirst", "version" : "0.11.0-SNAPSHOT", - "repoUrl" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/", + "repoUrl" : "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/refactorfirst/RefactorFirst/blob/d7305febbb3d27e9f4eb7c078a31fbc16180e9a0/", "baseDir" : "C:\\Code\\RefactorFirst", - "scanTimestamp" : "10/4/26, 4:37 PM", + "scanTimestamp" : "10/5/26, 12:57 PM", "hasAnyDisharmony" : true, "analysisFailed" : false }, @@ -14,7 +14,7 @@ "relationshipCount" : 300, "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 = \"12\" weight = \"12\" ];\nPageRankFAS -> LineVertex [ label = \"39\" weight = \"39\" ];\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 -> CodebaseGraphDTO [ label = \"4\" weight = \"4\" ];\nJsonGenerator -> GitLogReader [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> CycleRanker [ label = \"5\" weight = \"5\" ];\nJsonGenerator -> RankedCycle [ label = \"3\" weight = \"3\" ];\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 = \"33\" weight = \"33\" ];\nJsonGenerator -> ProjectMetadataDTO [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> GraphVisualDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> ClassRelationshipDTO [ label = \"6\" weight = \"6\" ];\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\" ];\nPackageRelationshipDTO -> ClassRelationshipDTO [ 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 [ label=\"AbstractDependencyVisitor$1\"];\nCycleSummaryDTO [];\nJsonReport [];\nDisharmonyTableCellDTO [];\nEdgeRemovalCalculator [];\nSimpleHtmlReport [];\nLineDigraph [];\nCsvReportTask [];\nRefactorFirstExtension [];\norg_hjug_refactorfirst_report_SimpleHtmlReport_DisharmonySpec [ label=\"SimpleHtmlReport$DisharmonySpec\"];\nGraphMetricsCollector [];\nDisharmonyInstance [];\norg_hjug_feedback_vertex_kernelized_DirectedFeedbackVertexSetSolver_PathContext [ label=\"DirectedFeedbackVertexSetSolver$PathContext\"];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_ClassStateSnapshot [ label=\"MetricsVisitorLogic$ClassStateSnapshot\"];\nDisharmonySectionDTO [];\nMavenReportOutputDirectory [];\nPackageRelationshipsToRemoveDTO [];\nCompositeGraphBuilder [];\nPackageRelationshipDTO [];\nMetricsCollectingVisitor [];\nKotlinSourceFileGraphBuilder [];\nMethodMetrics [];\nCodebaseGraphDTO [];\nRankedDisharmony [];\nFeedbackVertexSetResult [];\nRefactorFirstMavenJsonReport [];\nCycleRemovalComputer [];\nJsonReportTask [];\nDSM [];\nJsonReportDisharmonyEntry [];\norg_hjug_graphbuilder_metrics_DisharmonyMetric_Direction [ label=\"DisharmonyMetric$Direction\"];\nio_confluent_ksql_cli_console_Console_RowCaptor [ label=\"Console$RowCaptor\"];\nCycleBreakdownRowDTO [];\nDisharmonyDetector [];\nCircularReferenceChecker [];\nFeedbackArcSetSolver [];\nCycleRemovalResult [];\norg_hjug_refactorfirst_report_ReportWriter_ReportWriteException [ label=\"ReportWriter$ReportWriteException\"];\nAbstractDependencyVisitor [];\nJava25ParserFactory [];\nProjectMetadataDTO [];\norg_hjug_feedback_vertex_kernelized_ParameterComputer_Parameters [ label=\"ParameterComputer$Parameters\"];\nLargestCycleDTO [];\nRankedCycle [];\nClassRelationshipDTO [];\nDisharmonyRanker [];\norg_hjug_git_GitLogReader_CommitWalkStats [ label=\"GitLogReader$CommitWalkStats\"];\nGraphVisualDTO [];\nDisharmonyTableRowDTO [];\nChangePronenessRanker [];\nScmLogInfo [];\nKotlinMetricsCollectingVisitor [];\nEdgeToRemoveInfo [];\nDirectedFeedbackVertexSetSolver [];\nGraphBuilderConfig [];\nMinimumFeedbackArcSetSolver [];\norg_hjug_graphbuilder_visitor_DependencyVisitorLogic_ClassSnapshot [ label=\"DependencyVisitorLogic$ClassSnapshot\"];\nRefactorFirstMavenReport [];\nEdgeInfoCalculator [];\nRefactorFirstMavenJsonGenerator [];\nCycleRanker [];\nReportCommand [];\nDisharmonyChartDTO [];\nRefactorFirstPlugin [];\nDependencyCollector [];\nCostBenefitCalculator [];\nEdgeInfo [];\nGitLogReader [];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_OverridePredicate [ label=\"MetricsVisitorLogic$OverridePredicate\"];\nGraphDependencyCollector [];\nDependencyVisitorLogic [];\nDisharmony [];\nio_confluent_ksql_cli_console_Console_NoOpRowCaptor [ label=\"Console$NoOpRowCaptor\"];\nClassMetrics [];\nSparseIntDWGEdgeRemovalCalculator [];\nRefactorFirstSimpleHtmlReport [];\nClassRelationshipsToRemoveDTO [];\nCsvReport [];\nDisharmonyTableDTO [];\nJsonGenerator [];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_FlaggedClassData [ label=\"DisharmonyDetector$FlaggedClassData\"];\norg_hjug_metrics_DisharmonyRanker_RankSetter [ label=\"DisharmonyRanker$RankSetter\"];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [ label=\"ReportWriter$SecureDirectoryOps\"];\nChartJsBubbleDTO [];\nHtmlReport [];\nDisharmonyMetric [];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_MethodStateSnapshot [ label=\"MetricsVisitorLogic$MethodStateSnapshot\"];\norg_hjug_feedback_vertex_kernelized_DirectedFeedbackVertexSetSolver_PathComputationStats [ label=\"DirectedFeedbackVertexSetSolver$PathComputationStats\"];\nLineVertex [];\norg_hjug_feedback_vertex_kernelized_ModulatorComputer_ModulatorResult [ label=\"ModulatorComputer$ModulatorResult\"];\nGodClass [];\nDirectedFeedbackVertexSetResult [];\nRefactorFirstReportDTO [];\nio_confluent_ksql_cli_console_Console_CliCmdExecutor [ label=\"Console$CliCmdExecutor\"];\nKotlinDependencyVisitor [];\norg_hjug_feedback_vertex_approximate_FeedbackVertexSetSolver_CutCandidate [ label=\"FeedbackVertexSetSolver$CutCandidate\"];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_Clone [ label=\"DisharmonyDetector$Clone\"];\nCBOClass [];\nMain [];\nJavaSourceFileGraphBuilder [];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl [ label=\"ReportWriter$SecureDirectoryOpsImpl\"];\nGodClassRanker [];\norg_hjug_graphbuilder_visitor_KotlinDependencyVisitor_1 [ label=\"KotlinDependencyVisitor$1\"];\norg_hjug_feedback_vertex_kernelized_EnhancedParameterComputer_EnhancedParameters [ label=\"EnhancedParameterComputer$EnhancedParameters\"];\nConsole [];\nCycleNode [];\nFeedbackVertexSetComputer [];\nCBORule [];\nReportType [];\nParameterComputer [];\nComplexityCalculator [];\nRefactorFirstMavenCsvReport [];\nReportWriter [ color=red style=filled];\nMetricsVisitorLogic [];\norg_hjug_metrics_DisharmonyRanker_ValueExtractor [ label=\"DisharmonyRanker$ValueExtractor\"];\nMetricsVisitorState [];\nTypeDependencyExtractor [];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony [ label=\"DisharmonyDetector$ClassDisharmony\"];\nHtmlReportTask [];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodEntry [ label=\"DisharmonyDetector$MethodEntry\"];\norg_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps [ label=\"ReportWriter$FallbackDirectoryOps\"];\norg_hjug_feedback_arc_approximate_FeedbackArcSetResult [ label=\"FeedbackArcSetResult\"];\nJavaVisitor [];\nJsonReportExecutor [];\nBaseTypeProcessor [];\nEnhancedParameterComputer [];\nFeedbackVertexSetSolver [];\nGraphDataGenerator [];\nDependencyVisitorState [];\norg_hjug_feedback_arc_exact_FeedbackArcSetResult [ label=\"FeedbackArcSetResult\"];\nUnattributedTypeFqnResolver [];\nSourceFileGraphBuilder [];\nSuperTypeToken [];\nPageRankFAS [];\nSourcePathResolver [];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony [ label=\"DisharmonyDetector$MethodDisharmony\"];\nSimpleHtmlReportTask [];\nRefactorFirstHtmlReport [];\nClassCyclesDTO [];\nTreewidthComputer [];\nModulatorComputer [];\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 = \"12\" weight = \"12\" ];\nPageRankFAS -> LineVertex [ label = \"39\" weight = \"39\" ];\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 -> CodebaseGraphDTO [ label = \"5\" weight = \"5\" ];\nJsonGenerator -> GitLogReader [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> CycleRanker [ label = \"5\" weight = \"5\" ];\nJsonGenerator -> RankedCycle [ label = \"3\" weight = \"3\" ];\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 = \"22\" weight = \"22\" ];\nJsonGenerator -> ProjectMetadataDTO [ label = \"1\" weight = \"1\" ];\nJsonGenerator -> GraphVisualDTO [ label = \"2\" weight = \"2\" ];\nJsonGenerator -> ClassRelationshipDTO [ label = \"6\" weight = \"6\" ];\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\" ];\nPackageRelationshipDTO -> ClassRelationshipDTO [ 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 [ label=\"AbstractDependencyVisitor$1\"];\nCycleSummaryDTO [];\nJsonReport [];\nDisharmonyTableCellDTO [];\nEdgeRemovalCalculator [];\nSimpleHtmlReport [];\nLineDigraph [];\nCsvReportTask [];\nRefactorFirstExtension [];\norg_hjug_refactorfirst_report_SimpleHtmlReport_DisharmonySpec [ label=\"SimpleHtmlReport$DisharmonySpec\"];\nGraphMetricsCollector [];\nDisharmonyInstance [];\norg_hjug_feedback_vertex_kernelized_DirectedFeedbackVertexSetSolver_PathContext [ label=\"DirectedFeedbackVertexSetSolver$PathContext\"];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_ClassStateSnapshot [ label=\"MetricsVisitorLogic$ClassStateSnapshot\"];\nDisharmonySectionDTO [];\nMavenReportOutputDirectory [];\nPackageRelationshipsToRemoveDTO [];\nCompositeGraphBuilder [];\nPackageRelationshipDTO [];\nMetricsCollectingVisitor [];\nKotlinSourceFileGraphBuilder [];\nMethodMetrics [];\nCodebaseGraphDTO [];\nRankedDisharmony [];\nFeedbackVertexSetResult [];\nRefactorFirstMavenJsonReport [];\nCycleRemovalComputer [];\nJsonReportTask [];\nDSM [];\nJsonReportDisharmonyEntry [];\norg_hjug_graphbuilder_metrics_DisharmonyMetric_Direction [ label=\"DisharmonyMetric$Direction\"];\nio_confluent_ksql_cli_console_Console_RowCaptor [ label=\"Console$RowCaptor\"];\nCycleBreakdownRowDTO [];\nDisharmonyDetector [];\nCircularReferenceChecker [];\nFeedbackArcSetSolver [];\nCycleRemovalResult [];\norg_hjug_refactorfirst_report_ReportWriter_ReportWriteException [ label=\"ReportWriter$ReportWriteException\"];\nAbstractDependencyVisitor [];\nJava25ParserFactory [];\nProjectMetadataDTO [];\norg_hjug_feedback_vertex_kernelized_ParameterComputer_Parameters [ label=\"ParameterComputer$Parameters\"];\nLargestCycleDTO [];\nRankedCycle [];\nClassRelationshipDTO [];\nDisharmonyRanker [];\norg_hjug_git_GitLogReader_CommitWalkStats [ label=\"GitLogReader$CommitWalkStats\"];\nGraphVisualDTO [];\nDisharmonyTableRowDTO [];\nChangePronenessRanker [];\nScmLogInfo [];\nKotlinMetricsCollectingVisitor [];\nEdgeToRemoveInfo [];\nDirectedFeedbackVertexSetSolver [];\nGraphBuilderConfig [];\nMinimumFeedbackArcSetSolver [];\norg_hjug_graphbuilder_visitor_DependencyVisitorLogic_ClassSnapshot [ label=\"DependencyVisitorLogic$ClassSnapshot\"];\nRefactorFirstMavenReport [];\nEdgeInfoCalculator [];\nRefactorFirstMavenJsonGenerator [];\nCycleRanker [];\nReportCommand [];\nDisharmonyChartDTO [];\nRefactorFirstPlugin [];\nDependencyCollector [];\nCostBenefitCalculator [];\nEdgeInfo [];\nGitLogReader [];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_OverridePredicate [ label=\"MetricsVisitorLogic$OverridePredicate\"];\nGraphDependencyCollector [];\nDependencyVisitorLogic [];\nDisharmony [];\nio_confluent_ksql_cli_console_Console_NoOpRowCaptor [ label=\"Console$NoOpRowCaptor\"];\nClassMetrics [];\nSparseIntDWGEdgeRemovalCalculator [];\nRefactorFirstSimpleHtmlReport [];\nClassRelationshipsToRemoveDTO [];\nCsvReport [];\nDisharmonyTableDTO [];\nJsonGenerator [];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_FlaggedClassData [ label=\"DisharmonyDetector$FlaggedClassData\"];\norg_hjug_metrics_DisharmonyRanker_RankSetter [ label=\"DisharmonyRanker$RankSetter\"];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOps [ label=\"ReportWriter$SecureDirectoryOps\"];\nChartJsBubbleDTO [];\nHtmlReport [];\nDisharmonyMetric [];\norg_hjug_graphbuilder_metrics_MetricsVisitorLogic_MethodStateSnapshot [ label=\"MetricsVisitorLogic$MethodStateSnapshot\"];\norg_hjug_feedback_vertex_kernelized_DirectedFeedbackVertexSetSolver_PathComputationStats [ label=\"DirectedFeedbackVertexSetSolver$PathComputationStats\"];\nLineVertex [];\norg_hjug_feedback_vertex_kernelized_ModulatorComputer_ModulatorResult [ label=\"ModulatorComputer$ModulatorResult\"];\nGodClass [];\nDirectedFeedbackVertexSetResult [];\nRefactorFirstReportDTO [];\nio_confluent_ksql_cli_console_Console_CliCmdExecutor [ label=\"Console$CliCmdExecutor\"];\nKotlinDependencyVisitor [];\norg_hjug_feedback_vertex_approximate_FeedbackVertexSetSolver_CutCandidate [ label=\"FeedbackVertexSetSolver$CutCandidate\"];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_Clone [ label=\"DisharmonyDetector$Clone\"];\nCBOClass [];\nMain [];\nJavaSourceFileGraphBuilder [];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl [ label=\"ReportWriter$SecureDirectoryOpsImpl\"];\nGodClassRanker [];\norg_hjug_graphbuilder_visitor_KotlinDependencyVisitor_1 [ label=\"KotlinDependencyVisitor$1\"];\norg_hjug_feedback_vertex_kernelized_EnhancedParameterComputer_EnhancedParameters [ label=\"EnhancedParameterComputer$EnhancedParameters\"];\nConsole [];\nCycleNode [];\nFeedbackVertexSetComputer [];\nCBORule [];\nReportType [];\nParameterComputer [];\nComplexityCalculator [];\nRefactorFirstMavenCsvReport [];\nReportWriter [ color=red style=filled];\nMetricsVisitorLogic [];\norg_hjug_metrics_DisharmonyRanker_ValueExtractor [ label=\"DisharmonyRanker$ValueExtractor\"];\nMetricsVisitorState [];\nTypeDependencyExtractor [];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_ClassDisharmony [ label=\"DisharmonyDetector$ClassDisharmony\"];\nHtmlReportTask [];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodEntry [ label=\"DisharmonyDetector$MethodEntry\"];\norg_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps [ label=\"ReportWriter$FallbackDirectoryOps\"];\norg_hjug_feedback_arc_approximate_FeedbackArcSetResult [ label=\"FeedbackArcSetResult\"];\nJavaVisitor [];\nJsonReportExecutor [];\nBaseTypeProcessor [];\nEnhancedParameterComputer [];\nFeedbackVertexSetSolver [];\nGraphDataGenerator [];\nDependencyVisitorState [];\norg_hjug_feedback_arc_exact_FeedbackArcSetResult [ label=\"FeedbackArcSetResult\"];\nUnattributedTypeFqnResolver [];\nSourceFileGraphBuilder [];\nSuperTypeToken [];\nPageRankFAS [];\nSourcePathResolver [];\norg_hjug_graphbuilder_metrics_DisharmonyDetector_MethodDisharmony [ label=\"DisharmonyDetector$MethodDisharmony\"];\nSimpleHtmlReportTask [];\nRefactorFirstHtmlReport [];\nClassCyclesDTO [];\nTreewidthComputer [];\nModulatorComputer [];\n}", "hasEdges" : false }, "classRelationshipsToRemove" : { @@ -24,10 +24,13 @@ "relationships" : [ { "sourceClass" : "org.hjug.refactorfirst.report.ReportWriter$SecureDirectoryOps", "targetClass" : "org.hjug.refactorfirst.report.ReportWriter$SecureDirectoryOpsImpl", + "sourceClassPath" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java", + "targetClassPath" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java", + "simpleSourceClassName" : "ReportWriter$SecureDirectoryOps", + "simpleTargetClassName" : "ReportWriter$SecureDirectoryOpsImpl", "sourceMarked" : false, "targetMarked" : false, "weight" : 1, - "renderedLabel" : "ReportWriter$SecureDirectoryOps → ReportWriter$SecureDirectoryOpsImpl : 1", "priority" : 1, "cycleCount" : 1, "effortRank" : 1, @@ -36,10 +39,13 @@ }, { "sourceClass" : "org.hjug.refactorfirst.report.ReportWriter$SecureDirectoryOps", "targetClass" : "org.hjug.refactorfirst.report.ReportWriter$FallbackDirectoryOps", + "sourceClassPath" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java", + "targetClassPath" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java", + "simpleSourceClassName" : "ReportWriter$SecureDirectoryOps", + "simpleTargetClassName" : "ReportWriter$FallbackDirectoryOps", "sourceMarked" : false, "targetMarked" : false, "weight" : 1, - "renderedLabel" : "ReportWriter$SecureDirectoryOps → ReportWriter$FallbackDirectoryOps : 1", "priority" : 2, "cycleCount" : 1, "effortRank" : 1, @@ -53,7 +59,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 = \"34\" weight = \"34\" ];\npackage_bb20afe0ec6010144ae2060c -> package_bfb0d6f0cb59390b479b08a1 [ label = \"8\" weight = \"8\" ];\npackage_bb20afe0ec6010144ae2060c -> package_864d6940ac14438961598d5a [ label = \"2\" weight = \"2\" ];\npackage_864d6940ac14438961598d5a -> package_8b5bd27cd192f3c043f79d74 [ label = \"33\" weight = \"33\" ];\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\" ];\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 = \"35\" weight = \"35\" ];\npackage_bb20afe0ec6010144ae2060c -> package_bfb0d6f0cb59390b479b08a1 [ label = \"8\" weight = \"8\" ];\npackage_bb20afe0ec6010144ae2060c -> package_864d6940ac14438961598d5a [ label = \"2\" weight = \"2\" ];\npackage_864d6940ac14438961598d5a -> package_8b5bd27cd192f3c043f79d74 [ label = \"33\" weight = \"33\" ];\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" : { @@ -63,20 +69,24 @@ "relationships" : [ { "sourcePackage" : "org.hjug.graphbuilder.metrics", "targetPackage" : "org.hjug.graphbuilder", + "sourcePackagePath" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/", + "targetPackagePath" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/", "sourceMarked" : false, "targetMarked" : true, "weight" : 1, - "renderedLabel" : "org.hjug.graphbuilder.metrics → org.hjug.graphbuilder* : 1", "priority" : 1, "cycleCount" : 1, "effortRank" : 1, "classRelationshipsToBreakPackage" : [ { "sourceClass" : "org.hjug.graphbuilder.metrics.GraphMetricsCollector", "targetClass" : "org.hjug.graphbuilder.DependencyCollector", + "sourceClassPath" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/GraphMetricsCollector.java", + "targetClassPath" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/DependencyCollector.java", + "simpleSourceClassName" : "GraphMetricsCollector", + "simpleTargetClassName" : "DependencyCollector", "sourceMarked" : false, "targetMarked" : false, "weight" : 1, - "renderedLabel" : "GraphMetricsCollector → DependencyCollector : 1", "priority" : 0, "cycleCount" : 0, "effortRank" : 0, @@ -86,20 +96,24 @@ }, { "sourcePackage" : "org.hjug.feedback", "targetPackage" : "org.hjug.feedback.arc.pageRank", + "sourcePackagePath" : "graph-algorithms/src/main/java/org/hjug/feedback/", + "targetPackagePath" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/", "sourceMarked" : false, "targetMarked" : false, "weight" : 2, - "renderedLabel" : "org.hjug.feedback → org.hjug.feedback.arc.pageRank : 2", "priority" : 2, "cycleCount" : 1, "effortRank" : 2, "classRelationshipsToBreakPackage" : [ { "sourceClass" : "org.hjug.feedback.CycleRemovalComputer", "targetClass" : "org.hjug.feedback.arc.pageRank.PageRankFAS", + "sourceClassPath" : "graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalComputer.java", + "targetClassPath" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/PageRankFAS.java", + "simpleSourceClassName" : "CycleRemovalComputer", + "simpleTargetClassName" : "PageRankFAS", "sourceMarked" : false, "targetMarked" : false, "weight" : 2, - "renderedLabel" : "CycleRemovalComputer → PageRankFAS : 2", "priority" : 0, "cycleCount" : 0, "effortRank" : 0, @@ -109,20 +123,24 @@ }, { "sourcePackage" : "org.hjug.graphbuilder", "targetPackage" : "org.hjug.graphbuilder.graphbuilder", + "sourcePackagePath" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/", + "targetPackagePath" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/graphbuilder/", "sourceMarked" : true, "targetMarked" : false, "weight" : 6, - "renderedLabel" : "org.hjug.graphbuilder* → org.hjug.graphbuilder.graphbuilder : 6", "priority" : 3, "cycleCount" : 1, "effortRank" : 6, "classRelationshipsToBreakPackage" : [ { "sourceClass" : "org.hjug.graphbuilder.CompositeGraphBuilder", "targetClass" : "org.hjug.graphbuilder.graphbuilder.JavaSourceFileGraphBuilder", + "sourceClassPath" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java", + "targetClassPath" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/graphbuilder/JavaSourceFileGraphBuilder.java", + "simpleSourceClassName" : "CompositeGraphBuilder", + "simpleTargetClassName" : "JavaSourceFileGraphBuilder", "sourceMarked" : false, "targetMarked" : false, "weight" : 3, - "renderedLabel" : "CompositeGraphBuilder → JavaSourceFileGraphBuilder : 3", "priority" : 0, "cycleCount" : 0, "effortRank" : 0, @@ -131,10 +149,13 @@ }, { "sourceClass" : "org.hjug.graphbuilder.CompositeGraphBuilder", "targetClass" : "org.hjug.graphbuilder.graphbuilder.KotlinSourceFileGraphBuilder", + "sourceClassPath" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java", + "targetClassPath" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/graphbuilder/KotlinSourceFileGraphBuilder.java", + "simpleSourceClassName" : "CompositeGraphBuilder", + "simpleTargetClassName" : "KotlinSourceFileGraphBuilder", "sourceMarked" : false, "targetMarked" : false, "weight" : 3, - "renderedLabel" : "CompositeGraphBuilder → KotlinSourceFileGraphBuilder : 3", "priority" : 0, "cycleCount" : 0, "effortRank" : 0, @@ -144,20 +165,24 @@ }, { "sourcePackage" : "org.hjug.feedback", "targetPackage" : "org.hjug.feedback.vertex.kernelized", + "sourcePackagePath" : "graph-algorithms/src/main/java/org/hjug/feedback/", + "targetPackagePath" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/", "sourceMarked" : false, "targetMarked" : false, "weight" : 10, - "renderedLabel" : "org.hjug.feedback → org.hjug.feedback.vertex.kernelized : 10", "priority" : 4, "cycleCount" : 1, "effortRank" : 10, "classRelationshipsToBreakPackage" : [ { "sourceClass" : "org.hjug.feedback.CycleRemovalComputer", "targetClass" : "org.hjug.feedback.vertex.kernelized.DirectedFeedbackVertexSetResult", + "sourceClassPath" : "graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalComputer.java", + "targetClassPath" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetResult.java", + "simpleSourceClassName" : "CycleRemovalComputer", + "simpleTargetClassName" : "DirectedFeedbackVertexSetResult", "sourceMarked" : false, "targetMarked" : false, "weight" : 2, - "renderedLabel" : "CycleRemovalComputer → DirectedFeedbackVertexSetResult : 2", "priority" : 0, "cycleCount" : 0, "effortRank" : 0, @@ -166,10 +191,13 @@ }, { "sourceClass" : "org.hjug.feedback.CycleRemovalComputer", "targetClass" : "org.hjug.feedback.vertex.kernelized.DirectedFeedbackVertexSetSolver", + "sourceClassPath" : "graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalComputer.java", + "targetClassPath" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java", + "simpleSourceClassName" : "CycleRemovalComputer", + "simpleTargetClassName" : "DirectedFeedbackVertexSetSolver", "sourceMarked" : false, "targetMarked" : false, "weight" : 2, - "renderedLabel" : "CycleRemovalComputer → DirectedFeedbackVertexSetSolver : 2", "priority" : 0, "cycleCount" : 0, "effortRank" : 0, @@ -178,10 +206,13 @@ }, { "sourceClass" : "org.hjug.feedback.CycleRemovalComputer", "targetClass" : "org.hjug.feedback.vertex.kernelized.EnhancedParameterComputer", + "sourceClassPath" : "graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalComputer.java", + "targetClassPath" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/EnhancedParameterComputer.java", + "simpleSourceClassName" : "CycleRemovalComputer", + "simpleTargetClassName" : "EnhancedParameterComputer", "sourceMarked" : false, "targetMarked" : false, "weight" : 2, - "renderedLabel" : "CycleRemovalComputer → EnhancedParameterComputer : 2", "priority" : 0, "cycleCount" : 0, "effortRank" : 0, @@ -190,10 +221,13 @@ }, { "sourceClass" : "org.hjug.feedback.CycleRemovalComputer", "targetClass" : "org.hjug.feedback.vertex.kernelized.EnhancedParameterComputer$EnhancedParameters", + "sourceClassPath" : "graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalComputer.java", + "targetClassPath" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/EnhancedParameterComputer.java", + "simpleSourceClassName" : "CycleRemovalComputer", + "simpleTargetClassName" : "EnhancedParameterComputer$EnhancedParameters", "sourceMarked" : false, "targetMarked" : false, "weight" : 4, - "renderedLabel" : "CycleRemovalComputer → EnhancedParameterComputer$EnhancedParameters : 4", "priority" : 0, "cycleCount" : 0, "effortRank" : 0, @@ -204,56 +238,6 @@ }, "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" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/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/4/26, 3:17 PM", - "align" : "right" - }, { - "content" : "14", - "align" : "right" - } ] - } ] - } - }, { "type" : "Data Class", "anchorId" : "DATA_CLASS", "title" : "Data Classes", @@ -274,7 +258,7 @@ "changePronenessRank" : 2, "color" : "rgba(235, 64, 52, 0.75)", "borderColor" : "rgb(235, 64, 52)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/RefactorFirstExtension.java" + "path" : "refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/RefactorFirstExtension.java" }, { "id" : "MetricsVisitorState.java", "label" : "MetricsVisitorState.java", @@ -286,7 +270,7 @@ "changePronenessRank" : 3, "color" : "rgba(137, 119, 74, 0.75)", "borderColor" : "rgb(137, 119, 74)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorState.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorState.java" }, { "id" : "Attributes.java", "label" : "Attributes.java", @@ -298,72 +282,90 @@ "changePronenessRank" : 1, "color" : "rgba(39, 174, 96, 0.75)", "borderColor" : "rgb(39, 174, 96)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/test-resources/src/main/resources/Attributes.java" + "path" : "test-resources/src/main/resources/Attributes.java" } ], - "xaxisLabel" : "Effort to refactor", - "yaxisLabel" : "Relative churn (impact)" + "yaxisLabel" : "Relative churn (impact)", + "xaxisLabel" : "Effort to refactor" }, "table" : { "headers" : [ "Class", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ], "rows" : [ { "cells" : [ { - "content" : "RefactorFirstExtension.java", - "align" : "left" + "content" : "RefactorFirstExtension.java", + "align" : "left", + "path" : "refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/RefactorFirstExtension.java" }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9/15/25, 12:47 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "MetricsVisitorState.java", - "align" : "left" + "content" : "MetricsVisitorState.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorState.java" }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8/19/26, 7:20 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "Attributes.java", - "align" : "left" + "content" : "Attributes.java", + "align" : "left", + "path" : "test-resources/src/main/resources/Attributes.java" }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10/1/20, 8:46 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] } ] } @@ -374,46 +376,90 @@ "methodLevel" : false, "problem" : "Brain Classes are complex, lack cohesion, and have at least one Brain Method.", "solution" : "Decompose Brain Methods into smaller methods.", - "maxPriority" : 1, + "maxPriority" : 2, "chart" : { "canvasId" : "chart_BRAIN_CLASS", "bubbles" : [ { - "id" : "MetricsVisitorLogic.java", - "label" : "MetricsVisitorLogic.java", + "id" : "JsonGenerator.java", + "label" : "JsonGenerator.java", "x" : 1, - "y" : 1, + "y" : 2, "r" : 24, "priority" : 1, "effortRank" : 1, - "changePronenessRank" : 1, + "changePronenessRank" : 2, "color" : "rgba(235, 64, 52, 0.75)", "borderColor" : "rgb(235, 64, 52)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" + "path" : "report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" + }, { + "id" : "MetricsVisitorLogic.java", + "label" : "MetricsVisitorLogic.java", + "x" : 1, + "y" : 1, + "r" : 6, + "priority" : 2, + "effortRank" : 1, + "changePronenessRank" : 1, + "color" : "rgba(39, 174, 96, 0.75)", + "borderColor" : "rgb(39, 174, 96)", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" } ], - "xaxisLabel" : "Effort to refactor", - "yaxisLabel" : "Relative churn (impact)" + "yaxisLabel" : "Relative churn (impact)", + "xaxisLabel" : "Effort to refactor" }, "table" : { "headers" : [ "Class", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ], "rows" : [ { "cells" : [ { - "content" : "MetricsVisitorLogic.java", - "align" : "left" + "content" : "JsonGenerator.java", + "align" : "left", + "path" : "report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" + }, { + "content" : "1", + "align" : "right", + "path" : null + }, { + "content" : "2", + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null + }, { + "content" : "10/5/26, 12:56 PM", + "align" : "right", + "path" : null + }, { + "content" : "19", + "align" : "right", + "path" : null + } ] + }, { + "cells" : [ { + "content" : "MetricsVisitorLogic.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" + }, { + "content" : "2", + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8/19/26, 7:20 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] } ] } @@ -428,53 +474,53 @@ "chart" : { "canvasId" : "chart_RPB", "bubbles" : [ { - "id" : "HtmlReport.java", - "label" : "HtmlReport.java", - "x" : 2, - "y" : 4, + "id" : "AttributeHandlerAndSorter.java", + "label" : "AttributeHandlerAndSorter.java", + "x" : 1, + "y" : 2, "r" : 24, "priority" : 1, - "effortRank" : 2, - "changePronenessRank" : 4, + "effortRank" : 1, + "changePronenessRank" : 2, "color" : "rgba(235, 64, 52, 0.75)", "borderColor" : "rgb(235, 64, 52)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/report/src/main/java/org/hjug/refactorfirst/report/HtmlReport.java" + "path" : "test-resources/src/main/resources/AttributeHandlerAndSorter.java" }, { - "id" : "JsonGenerator.java", - "label" : "JsonGenerator.java", - "x" : 3, - "y" : 5, + "id" : "AttributeHandler2.java", + "label" : "AttributeHandler2.java", + "x" : 2, + "y" : 3, "r" : 20, "priority" : 2, - "effortRank" : 3, - "changePronenessRank" : 5, + "effortRank" : 2, + "changePronenessRank" : 3, "color" : "rgba(186, 92, 63, 0.75)", "borderColor" : "rgb(186, 92, 63)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" + "path" : "test-resources/src/main/resources/AttributeHandler2.java" }, { - "id" : "AttributeHandlerAndSorter.java", - "label" : "AttributeHandlerAndSorter.java", - "x" : 1, - "y" : 2, + "id" : "HtmlReport.java", + "label" : "HtmlReport.java", + "x" : 3, + "y" : 4, "r" : 15, "priority" : 3, - "effortRank" : 1, - "changePronenessRank" : 2, + "effortRank" : 3, + "changePronenessRank" : 4, "color" : "rgba(137, 119, 74, 0.75)", "borderColor" : "rgb(137, 119, 74)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/test-resources/src/main/resources/AttributeHandlerAndSorter.java" + "path" : "report/src/main/java/org/hjug/refactorfirst/report/HtmlReport.java" }, { - "id" : "AttributeHandler2.java", - "label" : "AttributeHandler2.java", - "x" : 2, - "y" : 3, + "id" : "JsonGenerator.java", + "label" : "JsonGenerator.java", + "x" : 4, + "y" : 5, "r" : 11, "priority" : 4, - "effortRank" : 2, - "changePronenessRank" : 3, + "effortRank" : 4, + "changePronenessRank" : 5, "color" : "rgba(88, 147, 85, 0.75)", "borderColor" : "rgb(88, 147, 85)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/test-resources/src/main/resources/AttributeHandler2.java" + "path" : "report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" }, { "id" : "AttributeHandler.java", "label" : "AttributeHandler.java", @@ -486,112 +532,142 @@ "changePronenessRank" : 1, "color" : "rgba(39, 174, 96, 0.75)", "borderColor" : "rgb(39, 174, 96)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/test-resources/src/main/resources/AttributeHandler.java" + "path" : "test-resources/src/main/resources/AttributeHandler.java" } ], - "xaxisLabel" : "Effort to refactor", - "yaxisLabel" : "Relative churn (impact)" + "yaxisLabel" : "Relative churn (impact)", + "xaxisLabel" : "Effort to refactor" }, "table" : { "headers" : [ "Class", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ], "rows" : [ { "cells" : [ { - "content" : "HtmlReport.java", - "align" : "left" + "content" : "AttributeHandlerAndSorter.java", + "align" : "left", + "path" : "test-resources/src/main/resources/AttributeHandlerAndSorter.java" }, { "content" : "1", - "align" : "right" - }, { - "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "10/3/26, 4:43 PM", - "align" : "right" + "content" : "1", + "align" : "right", + "path" : null }, { - "content" : "64", - "align" : "right" + "content" : "10/1/20, 8:46 AM", + "align" : "right", + "path" : null + }, { + "content" : "1", + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "JsonGenerator.java", - "align" : "left" + "content" : "AttributeHandler2.java", + "align" : "left", + "path" : "test-resources/src/main/resources/AttributeHandler2.java" }, { "content" : "2", - "align" : "right" - }, { - "content" : "5", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "10/4/26, 3:17 PM", - "align" : "right" + "content" : "2", + "align" : "right", + "path" : null }, { - "content" : "5", - "align" : "right" + "content" : "10/1/20, 8:46 AM", + "align" : "right", + "path" : null + }, { + "content" : "1", + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "AttributeHandlerAndSorter.java", - "align" : "left" + "content" : "HtmlReport.java", + "align" : "left", + "path" : "report/src/main/java/org/hjug/refactorfirst/report/HtmlReport.java" }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "2", - "align" : "right" + "content" : "4", + "align" : "right", + "path" : null }, { - "content" : "1", - "align" : "right" + "content" : "3", + "align" : "right", + "path" : null }, { - "content" : "10/1/20, 8:46 AM", - "align" : "right" + "content" : "10/3/26, 4:43 PM", + "align" : "right", + "path" : null }, { - "content" : "1", - "align" : "right" + "content" : "64", + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "AttributeHandler2.java", - "align" : "left" + "content" : "JsonGenerator.java", + "align" : "left", + "path" : "report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "3", - "align" : "right" + "content" : "5", + "align" : "right", + "path" : null }, { - "content" : "2", - "align" : "right" + "content" : "4", + "align" : "right", + "path" : null }, { - "content" : "10/1/20, 8:46 AM", - "align" : "right" + "content" : "10/5/26, 12:56 PM", + "align" : "right", + "path" : null }, { - "content" : "1", - "align" : "right" + "content" : "19", + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "AttributeHandler.java", - "align" : "left" + "content" : "AttributeHandler.java", + "align" : "left", + "path" : "test-resources/src/main/resources/AttributeHandler.java" }, { "content" : "5", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10/1/20, 8:46 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] } ] } @@ -602,110 +678,90 @@ "methodLevel" : false, "problem" : "Child class adds many new public methods, but doesn't override or use many of the parent class's methods", "solution" : "Do one or more of the following:
- Make public child methods unused outside of the class non-public.
- Pull duplicated methods in child classes into the parent class.
- Move methods in the child class that are unrelated to the parent class to another class.
- Remove the child class from the hierarchy.", - "maxPriority" : 3, + "maxPriority" : 2, "chart" : { "canvasId" : "chart_TB", "bubbles" : [ { - "id" : "JsonGenerator.java", - "label" : "JsonGenerator.java", - "x" : 2, - "y" : 3, - "r" : 24, - "priority" : 1, - "effortRank" : 2, - "changePronenessRank" : 3, - "color" : "rgba(235, 64, 52, 0.75)", - "borderColor" : "rgb(235, 64, 52)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" - }, { "id" : "AttributeHandler2.java", "label" : "AttributeHandler2.java", "x" : 1, "y" : 1, - "r" : 15, - "priority" : 2, + "r" : 24, + "priority" : 1, "effortRank" : 1, "changePronenessRank" : 1, - "color" : "rgba(137, 119, 74, 0.75)", - "borderColor" : "rgb(137, 119, 74)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/test-resources/src/main/resources/AttributeHandler2.java" + "color" : "rgba(235, 64, 52, 0.75)", + "borderColor" : "rgb(235, 64, 52)", + "path" : "test-resources/src/main/resources/AttributeHandler2.java" }, { "id" : "HtmlReport.java", "label" : "HtmlReport.java", - "x" : 3, + "x" : 2, "y" : 2, "r" : 6, - "priority" : 3, - "effortRank" : 3, + "priority" : 2, + "effortRank" : 2, "changePronenessRank" : 2, "color" : "rgba(39, 174, 96, 0.75)", "borderColor" : "rgb(39, 174, 96)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/report/src/main/java/org/hjug/refactorfirst/report/HtmlReport.java" + "path" : "report/src/main/java/org/hjug/refactorfirst/report/HtmlReport.java" } ], - "xaxisLabel" : "Effort to refactor", - "yaxisLabel" : "Relative churn (impact)" + "yaxisLabel" : "Relative churn (impact)", + "xaxisLabel" : "Effort to refactor" }, "table" : { "headers" : [ "Class", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ], "rows" : [ { "cells" : [ { - "content" : "JsonGenerator.java", - "align" : "left" + "content" : "AttributeHandler2.java", + "align" : "left", + "path" : "test-resources/src/main/resources/AttributeHandler2.java" }, { "content" : "1", - "align" : "right" - }, { - "content" : "3", - "align" : "right" - }, { - "content" : "2", - "align" : "right" - }, { - "content" : "10/4/26, 3:17 PM", - "align" : "right" - }, { - "content" : "14", - "align" : "right" - } ] - }, { - "cells" : [ { - "content" : "AttributeHandler2.java", - "align" : "left" - }, { - "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10/1/20, 8:46 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "HtmlReport.java", - "align" : "left" + "content" : "HtmlReport.java", + "align" : "left", + "path" : "report/src/main/java/org/hjug/refactorfirst/report/HtmlReport.java" }, { - "content" : "3", - "align" : "right" + "content" : "2", + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "3", - "align" : "right" + "content" : "2", + "align" : "right", + "path" : null }, { "content" : "10/3/26, 4:43 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "64", - "align" : "right" + "align" : "right", + "path" : null } ] } ] } @@ -730,7 +786,7 @@ "changePronenessRank" : 5, "color" : "rgba(235, 64, 52, 0.75)", "borderColor" : "rgb(235, 64, 52)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/HtmlReportTask.java" + "path" : "refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/HtmlReportTask.java" }, { "id" : "SimpleHtmlReportTask.java", "label" : "SimpleHtmlReportTask.java", @@ -742,7 +798,7 @@ "changePronenessRank" : 4, "color" : "rgba(186, 92, 63, 0.75)", "borderColor" : "rgb(186, 92, 63)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/SimpleHtmlReportTask.java" + "path" : "refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/SimpleHtmlReportTask.java" }, { "id" : "AttributeHandler.java", "label" : "AttributeHandler.java", @@ -754,7 +810,7 @@ "changePronenessRank" : 3, "color" : "rgba(137, 119, 74, 0.75)", "borderColor" : "rgb(137, 119, 74)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/test-resources/src/main/resources/AttributeHandler.java" + "path" : "test-resources/src/main/resources/AttributeHandler.java" }, { "id" : "AttributeHandlerAndSorter.java", "label" : "AttributeHandlerAndSorter.java", @@ -766,7 +822,7 @@ "changePronenessRank" : 2, "color" : "rgba(88, 147, 85, 0.75)", "borderColor" : "rgb(88, 147, 85)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/test-resources/src/main/resources/AttributeHandlerAndSorter.java" + "path" : "test-resources/src/main/resources/AttributeHandlerAndSorter.java" }, { "id" : "AttributeHandler2.java", "label" : "AttributeHandler2.java", @@ -778,127 +834,162 @@ "changePronenessRank" : 1, "color" : "rgba(39, 174, 96, 0.75)", "borderColor" : "rgb(39, 174, 96)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/test-resources/src/main/resources/AttributeHandler2.java" + "path" : "test-resources/src/main/resources/AttributeHandler2.java" } ], - "xaxisLabel" : "Effort to refactor", - "yaxisLabel" : "Relative churn (impact)" + "yaxisLabel" : "Relative churn (impact)", + "xaxisLabel" : "Effort to refactor" }, "table" : { "headers" : [ "Class", "Priority", "Change Proneness Rank", "Effort Rank", "Duplicate Partners", "Most Recent Commit Date", "Commit Count" ], "rows" : [ { "cells" : [ { - "content" : "HtmlReportTask.java", - "align" : "left" + "content" : "HtmlReportTask.java", + "align" : "left", + "path" : "refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/HtmlReportTask.java" }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "5", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "generate() ↔ SimpleHtmlReportTask.generate()", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "9/15/25, 12:47 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "SimpleHtmlReportTask.java", - "align" : "left" + "content" : "SimpleHtmlReportTask.java", + "align" : "left", + "path" : "refactor-first-gradle-plugin/src/main/java/org/hjug/gradlereport/SimpleHtmlReportTask.java" }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "generate() ↔ HtmlReportTask.generate()", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "9/15/25, 12:47 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "AttributeHandler.java", - "align" : "left" + "content" : "AttributeHandler.java", + "align" : "left", + "path" : "test-resources/src/main/resources/AttributeHandler.java" }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "apply(Unknown,Unknown) ↔ AttributeHandler.apply(Unknown,Unknown)
apply(Unknown,Unknown) ↔ <
unknown>
.apply(Unknown,Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "10/1/20, 8:46 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "AttributeHandlerAndSorter.java", - "align" : "left" + "content" : "AttributeHandlerAndSorter.java", + "align" : "left", + "path" : "test-resources/src/main/resources/AttributeHandlerAndSorter.java" }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "apply(Unknown,Unknown) ↔ AttributeHandler.apply(Unknown,Unknown)
apply(Unknown,Unknown) ↔ <
unknown>
.apply(Unknown,Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "10/1/20, 8:46 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "AttributeHandler2.java", - "align" : "left" + "content" : "AttributeHandler2.java", + "align" : "left", + "path" : "test-resources/src/main/resources/AttributeHandler2.java" }, { "content" : "5", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "apply(Unknown,Unknown) ↔ AttributeHandler.apply(Unknown,Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "10/1/20, 8:46 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] } ] } @@ -923,7 +1014,7 @@ "changePronenessRank" : 9, "color" : "rgba(235, 64, 52, 0.75)", "borderColor" : "rgb(235, 64, 52)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java" }, { "id" : "MetricsVisitorLogic.java", "label" : "MetricsVisitorLogic.java", @@ -935,7 +1026,7 @@ "changePronenessRank" : 6, "color" : "rgba(215, 75, 56, 0.75)", "borderColor" : "rgb(215, 75, 56)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" }, { "id" : "DirectedFeedbackVertexSetSolver.java", "label" : "DirectedFeedbackVertexSetSolver.java", @@ -947,7 +1038,7 @@ "changePronenessRank" : 7, "color" : "rgba(196, 86, 61, 0.75)", "borderColor" : "rgb(196, 86, 61)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java" }, { "id" : "DependencyVisitorLogic.java", "label" : "DependencyVisitorLogic.java", @@ -959,7 +1050,7 @@ "changePronenessRank" : 8, "color" : "rgba(176, 97, 65, 0.75)", "borderColor" : "rgb(176, 97, 65)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/DependencyVisitorLogic.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/DependencyVisitorLogic.java" }, { "id" : "DisharmonyDetector.java", "label" : "DisharmonyDetector.java", @@ -971,7 +1062,7 @@ "changePronenessRank" : 10, "color" : "rgba(157, 108, 70, 0.75)", "borderColor" : "rgb(157, 108, 70)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java" }, { "id" : "JsonGenerator.java", "label" : "JsonGenerator.java", @@ -983,7 +1074,7 @@ "changePronenessRank" : 11, "color" : "rgba(137, 119, 74, 0.75)", "borderColor" : "rgb(137, 119, 74)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" + "path" : "report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" }, { "id" : "MetricsVisitorLogic.java", "label" : "MetricsVisitorLogic.java", @@ -995,7 +1086,7 @@ "changePronenessRank" : 6, "color" : "rgba(117, 130, 78, 0.75)", "borderColor" : "rgb(117, 130, 78)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" }, { "id" : "AttributeHandlerAndSorter.java", "label" : "AttributeHandlerAndSorter.java", @@ -1007,7 +1098,7 @@ "changePronenessRank" : 4, "color" : "rgba(98, 141, 83, 0.75)", "borderColor" : "rgb(98, 141, 83)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/test-resources/src/main/resources/AttributeHandlerAndSorter.java" + "path" : "test-resources/src/main/resources/AttributeHandlerAndSorter.java" }, { "id" : "AttributeHandlerAndSorter.java", "label" : "AttributeHandlerAndSorter.java", @@ -1019,7 +1110,7 @@ "changePronenessRank" : 4, "color" : "rgba(78, 152, 87, 0.75)", "borderColor" : "rgb(78, 152, 87)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/test-resources/src/main/resources/AttributeHandlerAndSorter.java" + "path" : "test-resources/src/main/resources/AttributeHandlerAndSorter.java" }, { "id" : "AttributeHandler2.java", "label" : "AttributeHandler2.java", @@ -1031,7 +1122,7 @@ "changePronenessRank" : 2, "color" : "rgba(59, 163, 92, 0.75)", "borderColor" : "rgb(59, 163, 92)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/test-resources/src/main/resources/AttributeHandler2.java" + "path" : "test-resources/src/main/resources/AttributeHandler2.java" }, { "id" : "AttributeHandler.java", "label" : "AttributeHandler.java", @@ -1043,265 +1134,342 @@ "changePronenessRank" : 3, "color" : "rgba(39, 174, 96, 0.75)", "borderColor" : "rgb(39, 174, 96)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/test-resources/src/main/resources/AttributeHandler.java" + "path" : "test-resources/src/main/resources/AttributeHandler.java" } ], - "xaxisLabel" : "Effort to refactor", - "yaxisLabel" : "Relative churn (impact)" + "yaxisLabel" : "Relative churn (impact)", + "xaxisLabel" : "Effort to refactor" }, "table" : { "headers" : [ "Class", "Method", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ], "rows" : [ { "cells" : [ { - "content" : "CompositeGraphBuilder.java", - "align" : "left" + "content" : "CompositeGraphBuilder.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java" }, { "content" : "reconcileUnattributedVertices(Unknown,Unknown,Map<String,String>)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9/5/26, 1:41 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "MetricsVisitorLogic.java", - "align" : "left" + "content" : "MetricsVisitorLogic.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" }, { "content" : "handleMemberReference(MetricsVisitorState,GraphMetricsCollector,Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "6", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8/19/26, 7:20 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "DirectedFeedbackVertexSetSolver.java", - "align" : "left" + "content" : "DirectedFeedbackVertexSetSolver.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java" }, { "content" : "addBypassEdges(V,Set<V>)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "7", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8/26/26, 7:48 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "DependencyVisitorLogic.java", - "align" : "left" + "content" : "DependencyVisitorLogic.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/DependencyVisitorLogic.java" }, { "content" : "enterClassDeclaration(DependencyVisitorState,Unknown,boolean,SourcePathResolver)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9/5/26, 1:41 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "6", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "DisharmonyDetector.java", - "align" : "left" + "content" : "DisharmonyDetector.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java" }, { "content" : "detectSignificantDuplication(List<ClassMetrics>)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "5", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "6", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9/5/26, 1:41 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "15", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "JsonGenerator.java", - "align" : "left" + "content" : "JsonGenerator.java", + "align" : "left", + "path" : "report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" }, { "content" : "generateReportData(boolean,int,boolean,boolean,String,String,String,File)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "6", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "11", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "10/4/26, 3:17 PM", - "align" : "right" + "content" : "10/5/26, 12:56 PM", + "align" : "right", + "path" : null }, { - "content" : "14", - "align" : "right" + "content" : "19", + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "MetricsVisitorLogic.java", - "align" : "left" + "content" : "MetricsVisitorLogic.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" }, { "content" : "enterClass(MetricsVisitorState,GraphMetricsCollector,Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "7", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "6", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "5", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8/19/26, 7:20 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "AttributeHandlerAndSorter.java", - "align" : "left" + "content" : "AttributeHandlerAndSorter.java", + "align" : "left", + "path" : "test-resources/src/main/resources/AttributeHandlerAndSorter.java" }, { "content" : "perform(Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "5", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10/1/20, 8:46 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "AttributeHandlerAndSorter.java", - "align" : "left" + "content" : "AttributeHandlerAndSorter.java", + "align" : "left", + "path" : "test-resources/src/main/resources/AttributeHandlerAndSorter.java" }, { "content" : "apply(Unknown,Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "9", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10/1/20, 8:46 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "AttributeHandler2.java", - "align" : "left" + "content" : "AttributeHandler2.java", + "align" : "left", + "path" : "test-resources/src/main/resources/AttributeHandler2.java" }, { "content" : "apply(Unknown,Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "10", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "7", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10/1/20, 8:46 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "AttributeHandler.java", - "align" : "left" + "content" : "AttributeHandler.java", + "align" : "left", + "path" : "test-resources/src/main/resources/AttributeHandler.java" }, { "content" : "apply(Unknown,Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "11", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10/1/20, 8:46 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] } ] } @@ -1326,7 +1494,7 @@ "changePronenessRank" : 5, "color" : "rgba(235, 64, 52, 0.75)", "borderColor" : "rgb(235, 64, 52)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java" + "path" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java" }, { "id" : "JsonGenerator.java", "label" : "JsonGenerator.java", @@ -1338,7 +1506,7 @@ "changePronenessRank" : 6, "color" : "rgba(196, 86, 61, 0.75)", "borderColor" : "rgb(196, 86, 61)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" + "path" : "report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" }, { "id" : "MetricsVisitorLogic.java", "label" : "MetricsVisitorLogic.java", @@ -1350,7 +1518,7 @@ "changePronenessRank" : 4, "color" : "rgba(157, 108, 70, 0.75)", "borderColor" : "rgb(157, 108, 70)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" }, { "id" : "AttributeHandlerAndSorter.java", "label" : "AttributeHandlerAndSorter.java", @@ -1362,7 +1530,7 @@ "changePronenessRank" : 2, "color" : "rgba(117, 130, 78, 0.75)", "borderColor" : "rgb(117, 130, 78)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/test-resources/src/main/resources/AttributeHandlerAndSorter.java" + "path" : "test-resources/src/main/resources/AttributeHandlerAndSorter.java" }, { "id" : "MetricsVisitorLogic.java", "label" : "MetricsVisitorLogic.java", @@ -1374,7 +1542,7 @@ "changePronenessRank" : 4, "color" : "rgba(78, 152, 87, 0.75)", "borderColor" : "rgb(78, 152, 87)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" }, { "id" : "AttributeHandler.java", "label" : "AttributeHandler.java", @@ -1386,150 +1554,192 @@ "changePronenessRank" : 1, "color" : "rgba(39, 174, 96, 0.75)", "borderColor" : "rgb(39, 174, 96)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/test-resources/src/main/resources/AttributeHandler.java" + "path" : "test-resources/src/main/resources/AttributeHandler.java" } ], - "xaxisLabel" : "Effort to refactor", - "yaxisLabel" : "Relative churn (impact)" + "yaxisLabel" : "Relative churn (impact)", + "xaxisLabel" : "Effort to refactor" }, "table" : { "headers" : [ "Class", "Method", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ], "rows" : [ { "cells" : [ { - "content" : "ReportWriter.java", - "align" : "left" + "content" : "ReportWriter.java", + "align" : "left", + "path" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java" }, { "content" : "writeAtomically(Path,String)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "5", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9/5/26, 8:03 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "JsonGenerator.java", - "align" : "left" + "content" : "JsonGenerator.java", + "align" : "left", + "path" : "report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" }, { "content" : "generateReportData(boolean,int,boolean,boolean,String,String,String,File)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "6", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "10/4/26, 3:17 PM", - "align" : "right" + "content" : "10/5/26, 12:56 PM", + "align" : "right", + "path" : null }, { - "content" : "14", - "align" : "right" + "content" : "19", + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "MetricsVisitorLogic.java", - "align" : "left" + "content" : "MetricsVisitorLogic.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" }, { "content" : "leaveClass(MetricsVisitorState,GraphMetricsCollector,Unknown,MetricsVisitorLogic$ClassStateSnapshot)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8/19/26, 7:20 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "AttributeHandlerAndSorter.java", - "align" : "left" + "content" : "AttributeHandlerAndSorter.java", + "align" : "left", + "path" : "test-resources/src/main/resources/AttributeHandlerAndSorter.java" }, { "content" : "apply(Unknown,Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10/1/20, 8:46 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "MetricsVisitorLogic.java", - "align" : "left" + "content" : "MetricsVisitorLogic.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" }, { "content" : "leaveMethod(MetricsVisitorState,GraphMetricsCollector,MetricsVisitorLogic$MethodStateSnapshot)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "5", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8/19/26, 7:20 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "AttributeHandler.java", - "align" : "left" + "content" : "AttributeHandler.java", + "align" : "left", + "path" : "test-resources/src/main/resources/AttributeHandler.java" }, { "content" : "apply(Unknown,Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "6", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10/1/20, 8:46 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] } ] } @@ -1554,7 +1764,7 @@ "changePronenessRank" : 15, "color" : "rgba(235, 64, 52, 0.75)", "borderColor" : "rgb(235, 64, 52)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java" + "path" : "report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java" }, { "id" : "CompositeGraphBuilder.java", "label" : "CompositeGraphBuilder.java", @@ -1566,7 +1776,7 @@ "changePronenessRank" : 11, "color" : "rgba(223, 71, 55, 0.75)", "borderColor" : "rgb(223, 71, 55)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java" }, { "id" : "SimpleHtmlReport.java", "label" : "SimpleHtmlReport.java", @@ -1578,103 +1788,103 @@ "changePronenessRank" : 15, "color" : "rgba(211, 78, 58, 0.75)", "borderColor" : "rgb(211, 78, 58)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java" + "path" : "report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java" }, { "id" : "SimpleHtmlReport.java", "label" : "SimpleHtmlReport.java", - "x" : 8, + "x" : 9, "y" : 15, "r" : 21, "priority" : 4, - "effortRank" : 8, + "effortRank" : 9, "changePronenessRank" : 15, "color" : "rgba(198, 85, 60, 0.75)", "borderColor" : "rgb(198, 85, 60)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java" + "path" : "report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java" }, { "id" : "JsonGenerator.java", "label" : "JsonGenerator.java", - "x" : 11, + "x" : 12, "y" : 17, "r" : 20, "priority" : 5, - "effortRank" : 11, + "effortRank" : 12, "changePronenessRank" : 17, "color" : "rgba(186, 92, 63, 0.75)", "borderColor" : "rgb(186, 92, 63)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" + "path" : "report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" }, { - "id" : "JsonGenerator.java", - "label" : "JsonGenerator.java", - "x" : 12, - "y" : 17, + "id" : "OptimalBackEdgeRemover.java", + "label" : "OptimalBackEdgeRemover.java", + "x" : 1, + "y" : 5, "r" : 18, "priority" : 6, - "effortRank" : 12, - "changePronenessRank" : 17, + "effortRank" : 1, + "changePronenessRank" : 5, "color" : "rgba(174, 98, 66, 0.75)", "borderColor" : "rgb(174, 98, 66)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" + "path" : "graph-algorithms/src/main/java/org/hjug/dsm/OptimalBackEdgeRemover.java" }, { - "id" : "OptimalBackEdgeRemover.java", - "label" : "OptimalBackEdgeRemover.java", - "x" : 1, - "y" : 5, + "id" : "PageRankFAS.java", + "label" : "PageRankFAS.java", + "x" : 5, + "y" : 9, "r" : 17, "priority" : 7, - "effortRank" : 1, - "changePronenessRank" : 5, + "effortRank" : 5, + "changePronenessRank" : 9, "color" : "rgba(162, 105, 69, 0.75)", "borderColor" : "rgb(162, 105, 69)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/dsm/OptimalBackEdgeRemover.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/PageRankFAS.java" }, { "id" : "FeedbackVertexSetSolver.java", "label" : "FeedbackVertexSetSolver.java", - "x" : 4, + "x" : 5, "y" : 8, "r" : 16, "priority" : 8, - "effortRank" : 4, + "effortRank" : 5, "changePronenessRank" : 8, "color" : "rgba(149, 112, 71, 0.75)", "borderColor" : "rgb(149, 112, 71)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java" }, { - "id" : "PageRankFAS.java", - "label" : "PageRankFAS.java", - "x" : 5, - "y" : 9, + "id" : "CompositeGraphBuilder.java", + "label" : "CompositeGraphBuilder.java", + "x" : 8, + "y" : 11, "r" : 15, "priority" : 9, - "effortRank" : 5, - "changePronenessRank" : 9, + "effortRank" : 8, + "changePronenessRank" : 11, "color" : "rgba(137, 119, 74, 0.75)", "borderColor" : "rgb(137, 119, 74)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/PageRankFAS.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java" }, { - "id" : "TreewidthComputer.java", - "label" : "TreewidthComputer.java", - "x" : 3, - "y" : 6, + "id" : "JsonGenerator.java", + "label" : "JsonGenerator.java", + "x" : 14, + "y" : 17, "r" : 14, "priority" : 10, - "effortRank" : 3, - "changePronenessRank" : 6, + "effortRank" : 14, + "changePronenessRank" : 17, "color" : "rgba(125, 126, 77, 0.75)", "borderColor" : "rgb(125, 126, 77)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java" + "path" : "report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" }, { - "id" : "CompositeGraphBuilder.java", - "label" : "CompositeGraphBuilder.java", - "x" : 8, - "y" : 11, + "id" : "TreewidthComputer.java", + "label" : "TreewidthComputer.java", + "x" : 4, + "y" : 6, "r" : 13, "priority" : 11, - "effortRank" : 8, - "changePronenessRank" : 11, + "effortRank" : 4, + "changePronenessRank" : 6, "color" : "rgba(113, 133, 80, 0.75)", "borderColor" : "rgb(113, 133, 80)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java" }, { "id" : "DirectedFeedbackVertexSetSolver.java", "label" : "DirectedFeedbackVertexSetSolver.java", @@ -1686,19 +1896,19 @@ "changePronenessRank" : 7, "color" : "rgba(100, 140, 82, 0.75)", "borderColor" : "rgb(100, 140, 82)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java" }, { "id" : "DisharmonyDetector.java", "label" : "DisharmonyDetector.java", - "x" : 11, + "x" : 13, "y" : 12, "r" : 11, "priority" : 13, - "effortRank" : 11, + "effortRank" : 13, "changePronenessRank" : 12, "color" : "rgba(88, 147, 85, 0.75)", "borderColor" : "rgb(88, 147, 85)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java" }, { "id" : "MinimumFeedbackArcSetSolver.java", "label" : "MinimumFeedbackArcSetSolver.java", @@ -1710,7 +1920,7 @@ "changePronenessRank" : 1, "color" : "rgba(76, 153, 88, 0.75)", "borderColor" : "rgb(76, 153, 88)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java" }, { "id" : "MetricsVisitorLogic.java", "label" : "MetricsVisitorLogic.java", @@ -1722,427 +1932,546 @@ "changePronenessRank" : 4, "color" : "rgba(64, 160, 91, 0.75)", "borderColor" : "rgb(64, 160, 91)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" }, { "id" : "MetricsVisitorLogic.java", "label" : "MetricsVisitorLogic.java", - "x" : 9, + "x" : 10, "y" : 4, "r" : 7, "priority" : 16, - "effortRank" : 9, + "effortRank" : 10, "changePronenessRank" : 4, "color" : "rgba(51, 167, 93, 0.75)", "borderColor" : "rgb(51, 167, 93)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" }, { "id" : "MetricsVisitorLogic.java", "label" : "MetricsVisitorLogic.java", - "x" : 10, + "x" : 11, "y" : 4, "r" : 6, "priority" : 17, - "effortRank" : 10, + "effortRank" : 11, "changePronenessRank" : 4, "color" : "rgba(39, 174, 96, 0.75)", "borderColor" : "rgb(39, 174, 96)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" } ], - "xaxisLabel" : "Effort to refactor", - "yaxisLabel" : "Relative churn (impact)" + "yaxisLabel" : "Relative churn (impact)", + "xaxisLabel" : "Effort to refactor" }, "table" : { "headers" : [ "Class", "Method", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ], "rows" : [ { "cells" : [ { - "content" : "SimpleHtmlReport.java", - "align" : "left" + "content" : "SimpleHtmlReport.java", + "align" : "left", + "path" : "report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java" }, { "content" : "simplifyDuplicatePartners(String)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "15", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "5", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10/4/26, 2:29 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "99", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "CompositeGraphBuilder.java", - "align" : "left" + "content" : "CompositeGraphBuilder.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java" }, { "content" : "reconcileUnattributedVertices(Unknown,Unknown,Map<String,String>)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "11", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9/5/26, 1:41 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "SimpleHtmlReport.java", - "align" : "left" + "content" : "SimpleHtmlReport.java", + "align" : "left", + "path" : "report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java" }, { - "content" : "generateReport(boolean,int,boolean,boolean,String,String,String,File)", - "align" : "left" + "content" : "renderDisharmonyInfo(String,SimpleHtmlReport$DisharmonySpec,boolean,List<RankedDisharmony>)", + "align" : "left", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "15", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10/4/26, 2:29 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "99", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "SimpleHtmlReport.java", - "align" : "left" + "content" : "SimpleHtmlReport.java", + "align" : "left", + "path" : "report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java" }, { - "content" : "renderDisharmonyInfo(String,SimpleHtmlReport$DisharmonySpec,boolean,List<RankedDisharmony>)", - "align" : "left" + "content" : "generateReport(boolean,int,boolean,boolean,String,String,String,File)", + "align" : "left", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "15", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "8", - "align" : "right" + "content" : "9", + "align" : "right", + "path" : null }, { "content" : "10/4/26, 2:29 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "99", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "JsonGenerator.java", - "align" : "left" + "content" : "JsonGenerator.java", + "align" : "left", + "path" : "report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" }, { - "content" : "buildDisharmonySection(SimpleHtmlReport$DisharmonySpec,boolean,List<RankedDisharmony>,String)", - "align" : "left" + "content" : "buildDisharmonySection(SimpleHtmlReport$DisharmonySpec,boolean,List<RankedDisharmony>)", + "align" : "left", + "path" : null }, { "content" : "5", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "17", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "11", - "align" : "right" + "content" : "12", + "align" : "right", + "path" : null }, { - "content" : "10/4/26, 3:17 PM", - "align" : "right" + "content" : "10/5/26, 12:56 PM", + "align" : "right", + "path" : null }, { - "content" : "14", - "align" : "right" + "content" : "19", + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "JsonGenerator.java", - "align" : "left" + "content" : "OptimalBackEdgeRemover.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/dsm/OptimalBackEdgeRemover.java" }, { - "content" : "generateReportData(boolean,int,boolean,boolean,String,String,String,File)", - "align" : "left" + "content" : "findOptimalBackEdgesToRemove()", + "align" : "left", + "path" : null }, { "content" : "6", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "17", - "align" : "right" + "content" : "5", + "align" : "right", + "path" : null }, { - "content" : "12", - "align" : "right" + "content" : "1", + "align" : "right", + "path" : null }, { - "content" : "10/4/26, 3:17 PM", - "align" : "right" + "content" : "8/19/26, 7:20 PM", + "align" : "right", + "path" : null }, { - "content" : "14", - "align" : "right" + "content" : "2", + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "OptimalBackEdgeRemover.java", - "align" : "left" + "content" : "PageRankFAS.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/PageRankFAS.java" }, { - "content" : "findOptimalBackEdgesToRemove()", - "align" : "left" + "content" : "computePageRank(LineDigraph<V,E>)", + "align" : "left", + "path" : null }, { "content" : "7", - "align" : "right" + "align" : "right", + "path" : null + }, { + "content" : "9", + "align" : "right", + "path" : null }, { "content" : "5", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "1", - "align" : "right" + "content" : "10/4/26, 5:04 PM", + "align" : "right", + "path" : null }, { - "content" : "8/19/26, 7:20 PM", - "align" : "right" - }, { - "content" : "2", - "align" : "right" + "content" : "6", + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "FeedbackVertexSetSolver.java", - "align" : "left" + "content" : "FeedbackVertexSetSolver.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java" }, { "content" : "solveRecursive(Unknown,Set<V>)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "4", - "align" : "right" + "content" : "5", + "align" : "right", + "path" : null }, { "content" : "8/26/26, 7:48 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "PageRankFAS.java", - "align" : "left" + "content" : "CompositeGraphBuilder.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/CompositeGraphBuilder.java" }, { - "content" : "computePageRank(LineDigraph<V,E>)", - "align" : "left" + "content" : "getEnclosingClassFqn(String)", + "align" : "left", + "path" : null }, { "content" : "9", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "9", - "align" : "right" + "content" : "11", + "align" : "right", + "path" : null }, { - "content" : "5", - "align" : "right" + "content" : "8", + "align" : "right", + "path" : null }, { - "content" : "10/4/26, 4:34 PM", - "align" : "right" + "content" : "9/5/26, 1:41 PM", + "align" : "right", + "path" : null }, { - "content" : "5", - "align" : "right" + "content" : "8", + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "TreewidthComputer.java", - "align" : "left" + "content" : "JsonGenerator.java", + "align" : "left", + "path" : "report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java" }, { - "content" : "minDegreeEliminationTreewidth(Unknown)", - "align" : "left" + "content" : "generateReportData(boolean,int,boolean,boolean,String,String,String,File)", + "align" : "left", + "path" : null }, { "content" : "10", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "6", - "align" : "right" + "content" : "17", + "align" : "right", + "path" : null }, { - "content" : "3", - "align" : "right" + "content" : "14", + "align" : "right", + "path" : null }, { - "content" : "7/12/26, 3:24 PM", - "align" : "right" + "content" : "10/5/26, 12:56 PM", + "align" : "right", + "path" : null }, { - "content" : "2", - "align" : "right" + "content" : "19", + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "CompositeGraphBuilder.java", - "align" : "left" + "content" : "TreewidthComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java" }, { - "content" : "getEnclosingClassFqn(String)", - "align" : "left" + "content" : "minDegreeEliminationTreewidth(Unknown)", + "align" : "left", + "path" : null }, { "content" : "11", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "11", - "align" : "right" + "content" : "6", + "align" : "right", + "path" : null }, { - "content" : "8", - "align" : "right" + "content" : "4", + "align" : "right", + "path" : null }, { - "content" : "9/5/26, 1:41 PM", - "align" : "right" + "content" : "7/12/26, 3:24 PM", + "align" : "right", + "path" : null }, { - "content" : "8", - "align" : "right" + "content" : "2", + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "DirectedFeedbackVertexSetSolver.java", - "align" : "left" + "content" : "DirectedFeedbackVertexSetSolver.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java" }, { "content" : "computeMinimumVertexCut(V,Set<V>,int)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "12", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "7", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "6", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8/26/26, 7:48 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "DisharmonyDetector.java", - "align" : "left" + "content" : "DisharmonyDetector.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java" }, { "content" : "detectSignificantDuplication(List<ClassMetrics>)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "13", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "11", - "align" : "right" + "content" : "13", + "align" : "right", + "path" : null }, { "content" : "9/5/26, 1:41 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "15", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "MinimumFeedbackArcSetSolver.java", - "align" : "left" + "content" : "MinimumFeedbackArcSetSolver.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java" }, { "content" : "solveRelaxedProblem()", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "14", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "MetricsVisitorLogic.java", - "align" : "left" + "content" : "MetricsVisitorLogic.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" }, { "content" : "handleMemberReference(MetricsVisitorState,GraphMetricsCollector,Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "15", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "7", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8/19/26, 7:20 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "MetricsVisitorLogic.java", - "align" : "left" + "content" : "MetricsVisitorLogic.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" }, { "content" : "enterMethod(MetricsVisitorState,Unknown,MetricsVisitorLogic$OverridePredicate)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "16", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "9", - "align" : "right" + "content" : "10", + "align" : "right", + "path" : null }, { "content" : "8/19/26, 7:20 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "MetricsVisitorLogic.java", - "align" : "left" + "content" : "MetricsVisitorLogic.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" }, { "content" : "enterClass(MetricsVisitorState,GraphMetricsCollector,Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "17", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "10", - "align" : "right" + "content" : "11", + "align" : "right", + "path" : null }, { "content" : "8/19/26, 7:20 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] } ] } @@ -2160,14 +2489,14 @@ "id" : "GraphMetricsCollector.java", "label" : "GraphMetricsCollector.java", "x" : 1, - "y" : 32, + "y" : 33, "r" : 24, "priority" : 1, "effortRank" : 1, - "changePronenessRank" : 32, + "changePronenessRank" : 33, "color" : "rgba(235, 64, 52, 0.75)", "borderColor" : "rgb(235, 64, 52)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/GraphMetricsCollector.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/GraphMetricsCollector.java" }, { "id" : "GitLogReader.java", "label" : "GitLogReader.java", @@ -2179,7 +2508,7 @@ "changePronenessRank" : 31, "color" : "rgba(229, 67, 53, 0.75)", "borderColor" : "rgb(229, 67, 53)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/change-proneness-ranker/src/main/java/org/hjug/git/GitLogReader.java" + "path" : "change-proneness-ranker/src/main/java/org/hjug/git/GitLogReader.java" }, { "id" : "DisharmonyDetector.java", "label" : "DisharmonyDetector.java", @@ -2191,7 +2520,7 @@ "changePronenessRank" : 34, "color" : "rgba(223, 71, 55, 0.75)", "borderColor" : "rgb(223, 71, 55)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java" }, { "id" : "ReportWriter.java", "label" : "ReportWriter.java", @@ -2203,7 +2532,7 @@ "changePronenessRank" : 29, "color" : "rgba(217, 74, 56, 0.75)", "borderColor" : "rgb(217, 74, 56)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java" + "path" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java" }, { "id" : "FeedbackVertexSetSolver.java", "label" : "FeedbackVertexSetSolver.java", @@ -2215,7 +2544,7 @@ "changePronenessRank" : 26, "color" : "rgba(211, 77, 57, 0.75)", "borderColor" : "rgb(211, 77, 57)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java" }, { "id" : "ReportWriter.java", "label" : "ReportWriter.java", @@ -2227,7 +2556,7 @@ "changePronenessRank" : 29, "color" : "rgba(205, 81, 59, 0.75)", "borderColor" : "rgb(205, 81, 59)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java" + "path" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java" }, { "id" : "PageRankFAS.java", "label" : "PageRankFAS.java", @@ -2239,19 +2568,19 @@ "changePronenessRank" : 30, "color" : "rgba(199, 84, 60, 0.75)", "borderColor" : "rgb(199, 84, 60)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/PageRankFAS.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/PageRankFAS.java" }, { "id" : "KotlinSourceFileGraphBuilder.java", "label" : "KotlinSourceFileGraphBuilder.java", "x" : 12, - "y" : 33, + "y" : 32, "r" : 20, "priority" : 8, "effortRank" : 12, - "changePronenessRank" : 33, + "changePronenessRank" : 32, "color" : "rgba(193, 87, 61, 0.75)", "borderColor" : "rgb(193, 87, 61)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/graphbuilder/KotlinSourceFileGraphBuilder.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/graphbuilder/KotlinSourceFileGraphBuilder.java" }, { "id" : "ReportWriter.java", "label" : "ReportWriter.java", @@ -2263,7 +2592,7 @@ "changePronenessRank" : 29, "color" : "rgba(187, 91, 63, 0.75)", "borderColor" : "rgb(187, 91, 63)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java" + "path" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java" }, { "id" : "DirectedFeedbackVertexSetSolver.java", "label" : "DirectedFeedbackVertexSetSolver.java", @@ -2275,7 +2604,7 @@ "changePronenessRank" : 25, "color" : "rgba(182, 94, 64, 0.75)", "borderColor" : "rgb(182, 94, 64)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java" }, { "id" : "MetricsVisitorLogic.java", "label" : "MetricsVisitorLogic.java", @@ -2287,7 +2616,7 @@ "changePronenessRank" : 19, "color" : "rgba(176, 97, 65, 0.75)", "borderColor" : "rgb(176, 97, 65)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" }, { "id" : "DirectedFeedbackVertexSetSolver.java", "label" : "DirectedFeedbackVertexSetSolver.java", @@ -2299,7 +2628,7 @@ "changePronenessRank" : 25, "color" : "rgba(170, 101, 67, 0.75)", "borderColor" : "rgb(170, 101, 67)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java" }, { "id" : "TreewidthComputer.java", "label" : "TreewidthComputer.java", @@ -2311,7 +2640,7 @@ "changePronenessRank" : 22, "color" : "rgba(164, 104, 68, 0.75)", "borderColor" : "rgb(164, 104, 68)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java" }, { "id" : "ModulatorComputer.java", "label" : "ModulatorComputer.java", @@ -2323,7 +2652,7 @@ "changePronenessRank" : 17, "color" : "rgba(158, 107, 69, 0.75)", "borderColor" : "rgb(158, 107, 69)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "id" : "ModulatorComputer.java", "label" : "ModulatorComputer.java", @@ -2335,7 +2664,7 @@ "changePronenessRank" : 17, "color" : "rgba(152, 111, 71, 0.75)", "borderColor" : "rgb(152, 111, 71)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "id" : "TreewidthComputer.java", "label" : "TreewidthComputer.java", @@ -2347,7 +2676,7 @@ "changePronenessRank" : 22, "color" : "rgba(146, 114, 72, 0.75)", "borderColor" : "rgb(146, 114, 72)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java" }, { "id" : "ModulatorComputer.java", "label" : "ModulatorComputer.java", @@ -2359,7 +2688,7 @@ "changePronenessRank" : 17, "color" : "rgba(140, 117, 73, 0.75)", "borderColor" : "rgb(140, 117, 73)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "id" : "TreewidthComputer.java", "label" : "TreewidthComputer.java", @@ -2371,7 +2700,7 @@ "changePronenessRank" : 22, "color" : "rgba(134, 121, 75, 0.75)", "borderColor" : "rgb(134, 121, 75)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java" }, { "id" : "DirectedFeedbackVertexSetSolver.java", "label" : "DirectedFeedbackVertexSetSolver.java", @@ -2383,7 +2712,7 @@ "changePronenessRank" : 25, "color" : "rgba(128, 124, 76, 0.75)", "borderColor" : "rgb(128, 124, 76)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java" }, { "id" : "FeedbackVertexSetComputer.java", "label" : "FeedbackVertexSetComputer.java", @@ -2395,7 +2724,7 @@ "changePronenessRank" : 15, "color" : "rgba(122, 127, 77, 0.75)", "borderColor" : "rgb(122, 127, 77)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/FeedbackVertexSetComputer.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/FeedbackVertexSetComputer.java" }, { "id" : "ModulatorComputer.java", "label" : "ModulatorComputer.java", @@ -2407,7 +2736,7 @@ "changePronenessRank" : 17, "color" : "rgba(116, 131, 79, 0.75)", "borderColor" : "rgb(116, 131, 79)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "id" : "ModulatorComputer.java", "label" : "ModulatorComputer.java", @@ -2419,7 +2748,7 @@ "changePronenessRank" : 17, "color" : "rgba(110, 134, 80, 0.75)", "borderColor" : "rgb(110, 134, 80)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "id" : "ModulatorComputer.java", "label" : "ModulatorComputer.java", @@ -2431,7 +2760,7 @@ "changePronenessRank" : 17, "color" : "rgba(104, 137, 81, 0.75)", "borderColor" : "rgb(104, 137, 81)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "id" : "ModulatorComputer.java", "label" : "ModulatorComputer.java", @@ -2443,7 +2772,7 @@ "changePronenessRank" : 17, "color" : "rgba(98, 141, 83, 0.75)", "borderColor" : "rgb(98, 141, 83)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "id" : "CycleRemovalComputer.java", "label" : "CycleRemovalComputer.java", @@ -2455,7 +2784,7 @@ "changePronenessRank" : 18, "color" : "rgba(92, 144, 84, 0.75)", "borderColor" : "rgb(92, 144, 84)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalComputer.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalComputer.java" }, { "id" : "MinimumFeedbackArcSetSolver.java", "label" : "MinimumFeedbackArcSetSolver.java", @@ -2467,7 +2796,7 @@ "changePronenessRank" : 10, "color" : "rgba(87, 147, 85, 0.75)", "borderColor" : "rgb(87, 147, 85)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java" }, { "id" : "MinimumFeedbackArcSetSolver.java", "label" : "MinimumFeedbackArcSetSolver.java", @@ -2479,7 +2808,7 @@ "changePronenessRank" : 10, "color" : "rgba(81, 151, 87, 0.75)", "borderColor" : "rgb(81, 151, 87)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java" }, { "id" : "LineDigraph.java", "label" : "LineDigraph.java", @@ -2491,7 +2820,7 @@ "changePronenessRank" : 14, "color" : "rgba(75, 154, 88, 0.75)", "borderColor" : "rgb(75, 154, 88)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/LineDigraph.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/LineDigraph.java" }, { "id" : "ModulatorComputer.java", "label" : "ModulatorComputer.java", @@ -2503,7 +2832,7 @@ "changePronenessRank" : 17, "color" : "rgba(69, 157, 89, 0.75)", "borderColor" : "rgb(69, 157, 89)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "id" : "FeedbackVertexSetComputer.java", "label" : "FeedbackVertexSetComputer.java", @@ -2515,7 +2844,7 @@ "changePronenessRank" : 15, "color" : "rgba(63, 161, 91, 0.75)", "borderColor" : "rgb(63, 161, 91)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/FeedbackVertexSetComputer.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/FeedbackVertexSetComputer.java" }, { "id" : "ModulatorComputer.java", "label" : "ModulatorComputer.java", @@ -2527,7 +2856,7 @@ "changePronenessRank" : 17, "color" : "rgba(57, 164, 92, 0.75)", "borderColor" : "rgb(57, 164, 92)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "id" : "MinimumFeedbackArcSetSolver.java", "label" : "MinimumFeedbackArcSetSolver.java", @@ -2539,7 +2868,7 @@ "changePronenessRank" : 10, "color" : "rgba(51, 167, 93, 0.75)", "borderColor" : "rgb(51, 167, 93)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java" }, { "id" : "FeedbackArcSetSolver.java", "label" : "FeedbackArcSetSolver.java", @@ -2551,7 +2880,7 @@ "changePronenessRank" : 3, "color" : "rgba(45, 171, 95, 0.75)", "borderColor" : "rgb(45, 171, 95)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/graph-algorithms/src/main/java/org/hjug/feedback/arc/approximate/FeedbackArcSetSolver.java" + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/approximate/FeedbackArcSetSolver.java" }, { "id" : "AttributeHandlerAndSorter.java", "label" : "AttributeHandlerAndSorter.java", @@ -2563,794 +2892,1032 @@ "changePronenessRank" : 1, "color" : "rgba(39, 174, 96, 0.75)", "borderColor" : "rgb(39, 174, 96)", - "url" : "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/refactorfirst/RefactorFirst/blob/5258928239a496b74a704c7653240b82a325ccab/test-resources/src/main/resources/AttributeHandlerAndSorter.java" + "path" : "test-resources/src/main/resources/AttributeHandlerAndSorter.java" } ], - "xaxisLabel" : "Effort to refactor", - "yaxisLabel" : "Relative churn (impact)" + "yaxisLabel" : "Relative churn (impact)", + "xaxisLabel" : "Effort to refactor" }, "table" : { "headers" : [ "Class", "Method", "Priority", "Change Proneness Rank", "Effort Rank", "Most Recent Commit Date", "Commit Count" ], "rows" : [ { "cells" : [ { - "content" : "GraphMetricsCollector.java", - "align" : "left" + "content" : "GraphMetricsCollector.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/GraphMetricsCollector.java" }, { "content" : "finalizeMetrics()", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "32", - "align" : "right" + "content" : "33", + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9/24/26, 8:03 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "13", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "GitLogReader.java", - "align" : "left" + "content" : "GitLogReader.java", + "align" : "left", + "path" : "change-proneness-ranker/src/main/java/org/hjug/git/GitLogReader.java" }, { "content" : "captureChangeCountByCommitTimestamp()", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "31", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9/14/26, 1:00 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "21", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "DisharmonyDetector.java", - "align" : "left" + "content" : "DisharmonyDetector.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/DisharmonyDetector.java" }, { "content" : "detectFeatureEnvy(List<ClassMetrics>)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "34", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9/5/26, 1:41 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "15", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "ReportWriter.java", - "align" : "left" + "content" : "ReportWriter.java", + "align" : "left", + "path" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java" }, { "content" : "openSecurePath()", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "29", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9/5/26, 8:03 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "FeedbackVertexSetSolver.java", - "align" : "left" + "content" : "FeedbackVertexSetSolver.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java" }, { "content" : "computeFractionalSolution()", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "5", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "26", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8/26/26, 7:48 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "ReportWriter.java", - "align" : "left" + "content" : "ReportWriter.java", + "align" : "left", + "path" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java" }, { "content" : "writeAtomically(Path,String)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "6", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "29", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "5", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9/5/26, 8:03 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "PageRankFAS.java", - "align" : "left" + "content" : "PageRankFAS.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/PageRankFAS.java" }, { "content" : "createLineDigraphEdgesDFS(Unknown,LineDigraph<V,E>,Map<E,LineVertex<V,E>>,V,LineVertex<V,E>,Set<V>)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "7", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "30", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "10/4/26, 4:34 PM", - "align" : "right" + "content" : "10/4/26, 5:04 PM", + "align" : "right", + "path" : null }, { - "content" : "5", - "align" : "right" + "content" : "6", + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "KotlinSourceFileGraphBuilder.java", - "align" : "left" + "content" : "KotlinSourceFileGraphBuilder.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/graphbuilder/KotlinSourceFileGraphBuilder.java" }, { "content" : "buildGraph(String,String,GraphBuilderConfig)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null }, { - "content" : "33", - "align" : "right" + "content" : "32", + "align" : "right", + "path" : null }, { "content" : "12", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9/5/26, 1:25 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "ReportWriter.java", - "align" : "left" + "content" : "ReportWriter.java", + "align" : "left", + "path" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java" }, { "content" : "writeAtomicallySecure(SecureDirectoryStream<Path>,Path,String)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "9", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "29", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9/5/26, 8:03 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "DirectedFeedbackVertexSetSolver.java", - "align" : "left" + "content" : "DirectedFeedbackVertexSetSolver.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java" }, { "content" : "createMinimalBypass(V,Set<V>,Set<E>)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "10", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "25", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8/26/26, 7:48 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "MetricsVisitorLogic.java", - "align" : "left" + "content" : "MetricsVisitorLogic.java", + "align" : "left", + "path" : "codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsVisitorLogic.java" }, { "content" : "handleMethodInvocation(MetricsVisitorState,GraphMetricsCollector,Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "11", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "19", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8/19/26, 7:20 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "DirectedFeedbackVertexSetSolver.java", - "align" : "left" + "content" : "DirectedFeedbackVertexSetSolver.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java" }, { "content" : "findBypassChain(V,Set<V>)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "12", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "25", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8/26/26, 7:48 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "TreewidthComputer.java", - "align" : "left" + "content" : "TreewidthComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java" }, { "content" : "computeEta(Unknown,Set<V>)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "13", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "22", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "7", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "7/12/26, 3:24 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "ModulatorComputer.java", - "align" : "left" + "content" : "ModulatorComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "content" : "computeBetweennessCentrality(Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "14", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "17", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "ModulatorComputer.java", - "align" : "left" + "content" : "ModulatorComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "content" : "computeGreedyDegreeModulator(Unknown,int,int)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "15", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "17", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "TreewidthComputer.java", - "align" : "left" + "content" : "TreewidthComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java" }, { "content" : "greedyTriangulationTreewidth(Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "16", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "22", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "7/12/26, 3:24 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "ModulatorComputer.java", - "align" : "left" + "content" : "ModulatorComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "content" : "computeFeedbackVertexSetModulator(Unknown,int,int)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "17", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "17", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "5", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "TreewidthComputer.java", - "align" : "left" + "content" : "TreewidthComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java" }, { "content" : "fillInHeuristicTreewidth(Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "18", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "22", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "7/12/26, 3:24 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "2", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "DirectedFeedbackVertexSetSolver.java", - "align" : "left" + "content" : "DirectedFeedbackVertexSetSolver.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/DirectedFeedbackVertexSetSolver.java" }, { "content" : "addBypassEdges(V,Set<V>)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "19", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "25", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "13", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8/26/26, 7:48 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "FeedbackVertexSetComputer.java", - "align" : "left" + "content" : "FeedbackVertexSetComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/FeedbackVertexSetComputer.java" }, { "content" : "stronglyConnectedComponentsBasedFVS(Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "20", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "15", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "ModulatorComputer.java", - "align" : "left" + "content" : "ModulatorComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "content" : "computeSingleSourceBetweennessContributionsParallel(Unknown,V)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "21", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "17", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "6", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "ModulatorComputer.java", - "align" : "left" + "content" : "ModulatorComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "content" : "originalComputeBetweennessCentrality(Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "22", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "17", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "7", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "ModulatorComputer.java", - "align" : "left" + "content" : "ModulatorComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "content" : "computeSingleSourceBetweennessContributions(Unknown,V)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "23", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "17", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "ModulatorComputer.java", - "align" : "left" + "content" : "ModulatorComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "content" : "computeBetweennessCentralityAdaptive(Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "24", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "17", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "CycleRemovalComputer.java", - "align" : "left" + "content" : "CycleRemovalComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/CycleRemovalComputer.java" }, { "content" : "computeCycleRemovalInformation(Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "25", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "18", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "9", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "6/16/26, 7:10 PM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "MinimumFeedbackArcSetSolver.java", - "align" : "left" + "content" : "MinimumFeedbackArcSetSolver.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java" }, { "content" : "findShortestPath(Unknown,V)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "26", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "MinimumFeedbackArcSetSolver.java", - "align" : "left" + "content" : "MinimumFeedbackArcSetSolver.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java" }, { "content" : "solve()", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "27", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "LineDigraph.java", - "align" : "left" + "content" : "LineDigraph.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/pageRank/LineDigraph.java" }, { "content" : "topologicalSort()", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "28", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "14", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "8", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "ModulatorComputer.java", - "align" : "left" + "content" : "ModulatorComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "content" : "computeTreewidthDecompositionModulator(Unknown,int,int)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "29", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "17", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "11", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "FeedbackVertexSetComputer.java", - "align" : "left" + "content" : "FeedbackVertexSetComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/FeedbackVertexSetComputer.java" }, { "content" : "degreeBasedFeedbackVertexSet(Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "30", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "15", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "ModulatorComputer.java", - "align" : "left" + "content" : "ModulatorComputer.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/ModulatorComputer.java" }, { "content" : "computeBottleneckVertexModulator(Unknown,int,int)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "31", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "17", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "MinimumFeedbackArcSetSolver.java", - "align" : "left" + "content" : "MinimumFeedbackArcSetSolver.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/exact/MinimumFeedbackArcSetSolver.java" }, { "content" : "computeInitialHeuristicSolution()", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "32", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "7", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "FeedbackArcSetSolver.java", - "align" : "left" + "content" : "FeedbackArcSetSolver.java", + "align" : "left", + "path" : "graph-algorithms/src/main/java/org/hjug/feedback/arc/approximate/FeedbackArcSetSolver.java" }, { "content" : "solve()", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "33", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "3", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "4", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "12/18/25, 11:00 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] }, { "cells" : [ { - "content" : "AttributeHandlerAndSorter.java", - "align" : "left" + "content" : "AttributeHandlerAndSorter.java", + "align" : "left", + "path" : "test-resources/src/main/resources/AttributeHandlerAndSorter.java" }, { "content" : "perform(Unknown)", - "align" : "left" + "align" : "left", + "path" : null }, { "content" : "34", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "7", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "10/1/20, 8:46 AM", - "align" : "right" + "align" : "right", + "path" : null }, { "content" : "1", - "align" : "right" + "align" : "right", + "path" : null } ] } ] } @@ -3372,16 +3939,24 @@ "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 [ label=\"ReportWriter$SecureDirectoryOps\"];\norg_hjug_refactorfirst_report_ReportWriter_FallbackDirectoryOps [ label=\"ReportWriter$FallbackDirectoryOps\"];\nReportWriter [ color=red style=filled];\norg_hjug_refactorfirst_report_ReportWriter_SecureDirectoryOpsImpl [ label=\"ReportWriter$SecureDirectoryOpsImpl\"];\n}", "dotThresholdExceeded" : false, "breakdown" : [ { - "className" : "ReportWriter$SecureDirectoryOps", + "className" : "ReportWriter$SecureDirectoryOps", + "classPath" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java", + "marked" : false, "edgesHtml" : "ReportWriter$SecureDirectoryOps → ReportWriter$SecureDirectoryOpsImpl : 1*
\nReportWriter$SecureDirectoryOps → ReportWriter$FallbackDirectoryOps : 1*
\n" }, { - "className" : "ReportWriter$FallbackDirectoryOps", + "className" : "ReportWriter$FallbackDirectoryOps", + "classPath" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java", + "marked" : false, "edgesHtml" : "ReportWriter$FallbackDirectoryOps → ReportWriter$SecureDirectoryOps : 1
\nReportWriter$FallbackDirectoryOps → ReportWriter : 1
\n" }, { - "className" : "ReportWriter*", + "className" : "ReportWriter", + "classPath" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java", + "marked" : true, "edgesHtml" : "ReportWriter → ReportWriter$SecureDirectoryOps : 3
\n" }, { - "className" : "ReportWriter$SecureDirectoryOpsImpl", + "className" : "ReportWriter$SecureDirectoryOpsImpl", + "classPath" : "report/src/main/java/org/hjug/refactorfirst/report/ReportWriter.java", + "marked" : false, "edgesHtml" : "ReportWriter$SecureDirectoryOpsImpl → ReportWriter$SecureDirectoryOps : 1
\nReportWriter$SecureDirectoryOpsImpl → ReportWriter : 1
\n" } ] } 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 f7102e97..8f3b8bac 100644 --- a/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java +++ b/report/src/main/java/org/hjug/refactorfirst/report/JsonGenerator.java @@ -266,25 +266,16 @@ 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) + .sourceClassPath(classSourcePath(startVertex, codebaseGraphDTO)) + .targetClassPath(classSourcePath(endVertex, codebaseGraphDTO)) + .simpleSourceClassName(getClassName(startVertex)) + .simpleTargetClassName(getClassName(endVertex)) .sourceMarked(classesToRemove.contains(startVertex)) .targetMarked(classesToRemove.contains(endVertex)) .weight((int) classGraph.getEdgeWeight(edgeInfo.getEdge())) - .renderedLabel(renderedLabel) .priority(edgeInfo.getPriority()) .cycleCount(edgeInfo.getCycleCount()) .effortRank(edgeInfo.getEffortRank()) @@ -319,14 +310,13 @@ public RefactorFirstReportDTO generateReportData( // 4. Package Relationships To Remove List packageRelList = new ArrayList<>(); for (RankedDisharmony edgeInfo : packageRelationshipDisharmonies) { - String[] cells = getPackageRelationshipDisharmony(edgeInfo, repoUrl, codebaseGraphDTO); String[] vertexes = extractVertexes(edgeInfo.getEdge()); String startVertex = vertexes[0].trim(); String endVertex = vertexes[1].trim(); - // Extract package URLs from class relationships in the package edge - String sourceUrl = ""; - String targetUrl = ""; + // Extract package paths from class relationships in the package edge + String sourcePackagePath = ""; + String targetPackagePath = ""; Set classRelationshipsInPackageRelationship = codebaseGraphDTO .getClassRelationshipsInPackageRelationship() .get(edgeInfo.getEdge()); @@ -351,11 +341,11 @@ public RefactorFirstReportDTO generateReportData( String packageDir = classStartPath.substring(0, lastSlash + 1); // Check if this class belongs to the source package if (isClassInPackage(classStart, startVertex, codebaseGraphDTO)) { - sourceUrl = repoUrl + packageDir; + sourcePackagePath = packageDir; } // Check if this class belongs to the target package if (isClassInPackage(classStart, endVertex, codebaseGraphDTO)) { - targetUrl = repoUrl + packageDir; + targetPackagePath = packageDir; } } } @@ -366,11 +356,11 @@ public RefactorFirstReportDTO generateReportData( String packageDir = classEndPath.substring(0, lastSlash + 1); // Check if this class belongs to the source package if (isClassInPackage(classEnd, startVertex, codebaseGraphDTO)) { - sourceUrl = repoUrl + packageDir; + sourcePackagePath = packageDir; } // Check if this class belongs to the target package if (isClassInPackage(classEnd, endVertex, codebaseGraphDTO)) { - targetUrl = repoUrl + packageDir; + targetPackagePath = packageDir; } } } @@ -378,27 +368,24 @@ public RefactorFirstReportDTO generateReportData( } // Fallback to package name conversion if no class edges found - if (sourceUrl.isBlank()) { - sourceUrl = repoUrl + startVertex.replace('.', '/'); + if (sourcePackagePath.isBlank()) { + sourcePackagePath = startVertex.replace('.', '/'); } - if (targetUrl.isBlank()) { - targetUrl = repoUrl + endVertex.replace('.', '/'); + if (targetPackagePath.isBlank()) { + targetPackagePath = endVertex.replace('.', '/'); } List breakClassRels = buildClassRelationshipsToBreakPackage( - classRelationshipsInPackageRelationship, repoUrl, codebaseGraphDTO); - - // Build rendered label with links to package directories - String renderedLabel = - buildPackageLinkLabel(cells[0], startVertex, endVertex, sourceUrl, targetUrl, packagesToRemove); + classRelationshipsInPackageRelationship, codebaseGraphDTO); packageRelList.add(PackageRelationshipDTO.builder() .sourcePackage(startVertex) .targetPackage(endVertex) + .sourcePackagePath(sourcePackagePath) + .targetPackagePath(targetPackagePath) .sourceMarked(packagesToRemove.contains(startVertex)) .targetMarked(packagesToRemove.contains(endVertex)) .weight((int) packageGraph.getEdgeWeight(edgeInfo.getEdge())) - .renderedLabel(renderedLabel) .priority(edgeInfo.getPriority()) .cycleCount(edgeInfo.getCycleCount()) .effortRank(edgeInfo.getEffortRank()) @@ -418,7 +405,7 @@ public RefactorFirstReportDTO generateReportData( for (DisharmonySpec spec : DISHARMONY_SPECS) { List ranked = rankedDisharmoniesByAnchor.get(spec.anchorId()); if (ranked != null && !ranked.isEmpty()) { - disharmonySections.add(buildDisharmonySection(spec, showDetails, ranked, repoUrl)); + disharmonySections.add(buildDisharmonySection(spec, showDetails, ranked)); } } @@ -445,12 +432,7 @@ public RefactorFirstReportDTO generateReportData( List breakdown = new ArrayList<>(); for (String vertex : largestCycle.getVertexSet()) { - String className; - if (classesToRemove.contains(vertex)) { - className = hyperlinkClass(vertex, repoUrl, codebaseGraphDTO) + "*"; - } else { - className = hyperlinkClass(vertex, repoUrl, codebaseGraphDTO); - } + boolean marked = classesToRemove.contains(vertex); StringBuilder edges = new StringBuilder(); for (DefaultWeightedEdge edge : largestCycle.getEdgeSet()) { @@ -465,8 +447,13 @@ public RefactorFirstReportDTO generateReportData( edges.append("
\n"); } } + // The row carries the simple class name, the source path relative to the + // project root and the removal marker; viewers build the URL from + // project.repoUrl breakdown.add(CycleBreakdownRowDTO.builder() - .className(className) + .className(getClassName(vertex)) + .classPath(classSourcePath(vertex, codebaseGraphDTO)) + .marked(marked) .edgesHtml(edges.toString()) .build()); } @@ -515,9 +502,13 @@ public RefactorFirstReportDTO generateReportData( } } - /** Converts ranked instances of one disharmony type into chart and table data. */ - private DisharmonySectionDTO buildDisharmonySection( - DisharmonySpec spec, boolean showDetails, List ranked, String repoUrl) { + /** + * Converts ranked instances of one disharmony type into chart and table data. Table cells + * carry only plain text and paths relative to the project root; viewers combine the paths + * with the repository URL from the project metadata. + */ + DisharmonySectionDTO buildDisharmonySection( + DisharmonySpec spec, boolean showDetails, List ranked) { int maxPriority = ranked.get(ranked.size() - 1).getPriority(); @@ -527,7 +518,6 @@ private DisharmonySectionDTO buildDisharmonySection( String label = rd.getFileName() != null ? rd.getFileName() : rd.getRawPriority().toString(); - String url = repoUrl + rd.getPath(); bubbles.add(createBubble( rd.getFileName(), label, @@ -535,7 +525,7 @@ private DisharmonySectionDTO buildDisharmonySection( rd.getChangePronenessRank(), rd.getPriority(), maxPriority, - url)); + rd.getPath())); } DisharmonyChartDTO chartDTO = DisharmonyChartDTO.builder() @@ -579,10 +569,11 @@ private DisharmonySectionDTO buildDisharmonySection( for (RankedDisharmony rd : ranked) { List cells = new ArrayList<>(); - // Class link + // Class link: the cell carries the plain file name and the source path + // relative to the project root; viewers build the URL from project.repoUrl cells.add(DisharmonyTableCellDTO.builder() - .content("" - + escapeHtmlLabel(rd.getFileName()) + "") + .content(escapeHtmlLabel(rd.getFileName())) + .path(rd.getPath()) .align("left") .build()); @@ -693,7 +684,11 @@ private DisharmonySectionDTO buildDisharmonySection( .build(); } - /** Creates a chart bubble whose size and color reflect the finding priority. */ + /** + * Creates a chart bubble whose size and color reflect the finding priority. The bubble + * carries only the source file path relative to the project root; viewers combine it with + * the repository URL from the project metadata. + */ public ChartJsBubbleDTO createBubble( String id, String label, @@ -701,7 +696,7 @@ public ChartJsBubbleDTO createBubble( int changePronenessRank, int priority, int maxPriority, - String url) { + String path) { int minRadius = 6; int maxRadius = 24; @@ -741,7 +736,7 @@ public ChartJsBubbleDTO createBubble( .changePronenessRank(changePronenessRank) .color(color) .borderColor(borderColor) - .url(url) + .path(path) .build(); } @@ -765,83 +760,6 @@ private boolean isClassInPackage(String className, String packageName, CodebaseG 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(); - } - /** * Converts the class edges behind a package edge into structured DTOs. * Cycle membership is calculated for every class edge from {@code classCycles} before the @@ -850,7 +768,7 @@ private String buildPackageLinkLabel( * feedback-arc-set members — as members of zero class cycles. */ List buildClassRelationshipsToBreakPackage( - Set classEdges, String repoUrl, CodebaseGraphDTO codebaseGraphDTO) { + Set classEdges, CodebaseGraphDTO codebaseGraphDTO) { if (classEdges == null || classEdges.isEmpty()) { return List.of(); } @@ -866,29 +784,30 @@ List buildClassRelationshipsToBreakPackage( String[] vertexes = extractVertexes(classEdge); 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 : ""; int weight = (int) classGraph.getEdgeWeight(classEdge); relationships.add(ClassRelationshipDTO.builder() .sourceClass(startVertex) .targetClass(endVertex) + .sourceClassPath(classSourcePath(startVertex, codebaseGraphDTO)) + .targetClassPath(classSourcePath(endVertex, codebaseGraphDTO)) + .simpleSourceClassName(getClassName(startVertex)) + .simpleTargetClassName(getClassName(endVertex)) .sourceMarked(classesToRemove.contains(startVertex)) .targetMarked(classesToRemove.contains(endVertex)) .weight(weight) - .renderedLabel( - buildClassLinkLabel(startVertex, endVertex, sourceUrl, targetUrl, classesToRemove, weight)) .cycleCount(cycleCounts.get(classEdge)) .build()); } return relationships; } + /** Returns the class's source file path relative to the project root, or an empty string. */ + private String classSourcePath(String className, CodebaseGraphDTO codebaseGraphDTO) { + String path = codebaseGraphDTO.getClassToSourceFilePathMapping().get(className); + return path != null ? path : ""; + } + /** * Counts how many of the detected class cycles contain the given class edge — the same * counting {@code CycleRemovalComputer} applies to the edges it marks for removal. Returns @@ -906,56 +825,4 @@ private int countClassCyclesContaining(DefaultWeightedEdge classEdge) { } return cycleCount; } - - /** - * 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 d5c5c63c..6522d4ce 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,5 +20,5 @@ public class ChartJsBubbleDTO { private int changePronenessRank; private String color; private String borderColor; - private String url; + private String path; } 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 46b52c0d..6e5d7329 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,10 +12,13 @@ public class ClassRelationshipDTO { private String sourceClass; private String targetClass; + private String sourceClassPath; + private String targetClassPath; + private String simpleSourceClassName; + private String simpleTargetClassName; private boolean sourceMarked; private boolean targetMarked; private int weight; - private String renderedLabel; private int priority; private int cycleCount; private int effortRank; diff --git a/report/src/main/java/org/hjug/refactorfirst/report/model/CycleBreakdownRowDTO.java b/report/src/main/java/org/hjug/refactorfirst/report/model/CycleBreakdownRowDTO.java index 5f930aa3..d4e5ec7f 100644 --- a/report/src/main/java/org/hjug/refactorfirst/report/model/CycleBreakdownRowDTO.java +++ b/report/src/main/java/org/hjug/refactorfirst/report/model/CycleBreakdownRowDTO.java @@ -11,5 +11,7 @@ @AllArgsConstructor public class CycleBreakdownRowDTO { private String className; + private String classPath; + private boolean marked; private String edgesHtml; } diff --git a/report/src/main/java/org/hjug/refactorfirst/report/model/DisharmonyTableCellDTO.java b/report/src/main/java/org/hjug/refactorfirst/report/model/DisharmonyTableCellDTO.java index ba93f900..65931e32 100644 --- a/report/src/main/java/org/hjug/refactorfirst/report/model/DisharmonyTableCellDTO.java +++ b/report/src/main/java/org/hjug/refactorfirst/report/model/DisharmonyTableCellDTO.java @@ -12,4 +12,5 @@ public class DisharmonyTableCellDTO { private String content; private String align; + private String path; } diff --git a/report/src/main/java/org/hjug/refactorfirst/report/model/PackageRelationshipDTO.java b/report/src/main/java/org/hjug/refactorfirst/report/model/PackageRelationshipDTO.java index 5ec4692d..0fdf1168 100644 --- a/report/src/main/java/org/hjug/refactorfirst/report/model/PackageRelationshipDTO.java +++ b/report/src/main/java/org/hjug/refactorfirst/report/model/PackageRelationshipDTO.java @@ -14,10 +14,11 @@ public class PackageRelationshipDTO { private String sourcePackage; private String targetPackage; + private String sourcePackagePath; + private String targetPackagePath; private boolean sourceMarked; private boolean targetMarked; private int weight; - private String renderedLabel; private int priority; private int cycleCount; private int effortRank; diff --git a/report/src/main/resources/templates/refactor-first-report.mustache b/report/src/main/resources/templates/refactor-first-report.mustache index 7f1faf27..3bcdda1a 100644 --- a/report/src/main/resources/templates/refactor-first-report.mustache +++ b/report/src/main/resources/templates/refactor-first-report.mustache @@ -210,7 +210,7 @@ {{#classRelationshipsToRemove.relationships}} - {{renderedLabel}} + {{#sourceClassPath}}{{/sourceClassPath}}{{simpleSourceClassName}}{{#sourceClassPath}}{{/sourceClassPath}}{{#sourceMarked}}*{{/sourceMarked}} → {{#targetClassPath}}{{/targetClassPath}}{{simpleTargetClassName}}{{#targetClassPath}}{{/targetClassPath}}{{#targetMarked}}*{{/targetMarked}} {{priority}} {{cycleCount}} {{effortRank}} @@ -293,12 +293,12 @@ {{#packageRelationshipsToRemove.relationships}} - {{{renderedLabel}}} + {{#sourcePackagePath}}{{/sourcePackagePath}}{{sourcePackage}}{{#sourcePackagePath}}{{/sourcePackagePath}}{{#sourceMarked}}*{{/sourceMarked}} → {{#targetPackagePath}}{{/targetPackagePath}}{{targetPackage}}{{#targetPackagePath}}{{/targetPackagePath}}{{#targetMarked}}*{{/targetMarked}} {{priority}} {{cycleCount}} {{effortRank}} {{#classRelationshipsToBreakPackage}} - {{{renderedLabel}}}
{{/classRelationshipsToBreakPackage}} + {{#sourceClassPath}}{{/sourceClassPath}}{{simpleSourceClassName}}{{#sourceClassPath}}{{/sourceClassPath}}{{#sourceMarked}}*{{/sourceMarked}} → {{#targetClassPath}}{{/targetClassPath}}{{simpleTargetClassName}}{{#targetClassPath}}{{/targetClassPath}}{{#targetMarked}}*{{/targetMarked}} : {{weight}}
{{/classRelationshipsToBreakPackage}} {{/packageRelationshipsToRemove.relationships}} @@ -349,7 +349,7 @@ {{#table.rows}} {{#cells}} - {{{content}}} + {{#path}}{{/path}}{{{content}}}{{#path}}{{/path}} {{/cells}} {{/table.rows}} @@ -424,7 +424,7 @@ {{#classCycles.largestCycle.breakdown}} - {{{className}}} + {{#classPath}}{{/classPath}}{{className}}{{#classPath}}{{/classPath}}{{#marked}}*{{/marked}} {{{edgesHtml}}} {{/classCycles.largestCycle.breakdown}} diff --git a/report/src/test/java/org/hjug/refactorfirst/report/JsonGeneratorDisharmonySectionTest.java b/report/src/test/java/org/hjug/refactorfirst/report/JsonGeneratorDisharmonySectionTest.java new file mode 100644 index 00000000..88daa267 --- /dev/null +++ b/report/src/test/java/org/hjug/refactorfirst/report/JsonGeneratorDisharmonySectionTest.java @@ -0,0 +1,58 @@ +package org.hjug.refactorfirst.report; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import java.time.Instant; +import java.util.List; +import org.hjug.cbc.RankedDisharmony; +import org.hjug.refactorfirst.report.model.DisharmonySectionDTO; +import org.hjug.refactorfirst.report.model.DisharmonyTableCellDTO; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +/** + * Pins the JSON contract of the disharmony table cells: the Class cell carries the + * plain file name and the source path relative to the project root, and no + * server-rendered link — viewers combine the path with project.repoUrl. + */ +class JsonGeneratorDisharmonySectionTest { + + /** Creates a ranked God Class finding for the file at the given path. */ + private RankedDisharmony mockRankedDisharmony(String fileName, String path) { + RankedDisharmony rd = Mockito.mock(RankedDisharmony.class); + Mockito.when(rd.getFileName()).thenReturn(fileName); + Mockito.when(rd.getPath()).thenReturn(path); + Mockito.when(rd.getPriority()).thenReturn(1); + Mockito.when(rd.getEffortRank()).thenReturn(5); + Mockito.when(rd.getChangePronenessRank()).thenReturn(10); + Mockito.when(rd.getMostRecentCommitTime()).thenReturn(Instant.now()); + Mockito.when(rd.getCommitCount()).thenReturn(1); + Mockito.when(rd.getDuplicationPartners()).thenReturn(null); + return rd; + } + + @DisplayName("the disharmony Class cell carries the plain file name and the source path, not a rendered link") + @Test + void buildDisharmonySection_classCellCarriesPathAndFileName() { + // Given: one ranked God Class finding + JsonGenerator generator = new JsonGenerator(); + RankedDisharmony rd = mockRankedDisharmony("TestClass.java", "src/main/java/com/example/TestClass.java"); + + // When: the disharmony section is built without detail columns + DisharmonySectionDTO section = + generator.buildDisharmonySection(SimpleHtmlReport.DISHARMONY_SPECS.get(0), false, List.of(rd)); + + // Then: the Class cell lists the file name and the path relative to the + // project root; the URL is the viewer's to construct + DisharmonyTableCellDTO classCell = + section.getTable().getRows().get(0).getCells().get(0); + assertEquals("TestClass.java", classCell.getContent()); + assertEquals("src/main/java/com/example/TestClass.java", classCell.getPath()); + assertFalse(classCell.getContent().contains("= 1, "weight should be at least 1"); - assertNotNull(classRel.getRenderedLabel(), "ClassRelationshipDTO should have renderedLabel"); assertTrue( - classRel.getRenderedLabel().contains("→"), - "renderedLabel should contain the relationship arrow"); + classRel.getSourceClassPath().startsWith("src/main/java/com/example/pkg"), + "sourceClassPath should be the source file path relative to the project root: " + + classRel.getSourceClassPath()); + assertTrue( + classRel.getTargetClassPath().startsWith("src/main/java/com/example/pkg"), + "targetClassPath should be the source file path relative to the project root: " + + classRel.getTargetClassPath()); + assertTrue( + classRel.getSimpleSourceClassName().startsWith("Class"), + "simpleSourceClassName should be the simple source class name: " + + classRel.getSimpleSourceClassName()); + assertTrue( + classRel.getSimpleTargetClassName().startsWith("Class"), + "simpleTargetClassName should be the simple target class name: " + + classRel.getSimpleTargetClassName()); } } assertTrue(totalClassRelationships > 0, "Expected at least one class relationship to break the package cycle"); + + // The nested class relationships must not carry a server-rendered label either + com.fasterxml.jackson.databind.JsonNode root = objectMapper.readTree(jsonFile.toFile()); + for (com.fasterxml.jackson.databind.JsonNode packageRel : + root.get("packageRelationshipsToRemove").get("relationships")) { + assertFalse(packageRel.has("renderedLabel"), "Package relationships must not carry a renderedLabel"); + assertTrue(packageRel.has("sourcePackagePath"), "Package relationships must carry sourcePackagePath"); + assertTrue(packageRel.has("targetPackagePath"), "Package relationships must carry targetPackagePath"); + for (com.fasterxml.jackson.databind.JsonNode classRel : + packageRel.get("classRelationshipsToBreakPackage")) { + assertFalse(classRel.has("renderedLabel"), "Nested class relationships must not carry a renderedLabel"); + assertTrue(classRel.has("sourceClassPath")); + assertTrue(classRel.has("targetClassPath")); + assertTrue(classRel.has("simpleSourceClassName")); + assertTrue(classRel.has("simpleTargetClassName")); + } + } + + // The largest-cycle breakdown rows carry the simple class name, the source path + // relative to the project root and the removal marker; viewers build the URL + // from project.repoUrl themselves + assertNotNull(report.getClassCycles(), "Class cycles should be analyzed"); + assertNotNull(report.getClassCycles().getLargestCycle(), "A largest cycle should exist"); + assertNotNull( + report.getClassCycles().getLargestCycle().getBreakdown(), "The largest cycle should have a breakdown"); + var breakdown = report.getClassCycles().getLargestCycle().getBreakdown(); + assertFalse(breakdown.isEmpty(), "The largest cycle breakdown should not be empty"); + var classNames = + breakdown.stream().map(CycleBreakdownRowDTO::getClassName).toList(); + assertEquals(2, classNames.size(), "The two-class cycle should produce two breakdown rows"); + assertTrue(classNames.contains("ClassA"), "Breakdown rows should list the simple class names: " + classNames); + assertTrue(classNames.contains("ClassB"), "Breakdown rows should list the simple class names: " + classNames); + for (CycleBreakdownRowDTO row : breakdown) { + assertEquals( + "src/main/java/com/example/" + + (row.getClassName().equals("ClassA") ? "pkga/ClassA.java" : "pkgb/ClassB.java"), + row.getClassPath(), + "classPath should be the source file path relative to the project root"); + assertFalse( + row.getClassName().contains("alert(1) → B") + .sourceClassPath("src/main/java/com/example/A.java") + .targetClassPath("src/main/java/com/example/B.java") + .simpleSourceClassName("A")); + // The class names render as anchors built from the repo URL and their source + // paths, with the removal marker outside the anchor; Mustache escapes the + // names so no markup can be injected + assertTrue(rendered.contains( + "A<script>* → " + + "B")); + assertFalse(rendered.contains("