From 0ae6b478784778b52b17e6447f928e82b281908f Mon Sep 17 00:00:00 2001 From: Jim Bethancourt Date: Sun, 12 Jul 2026 15:24:15 -0500 Subject: [PATCH 1/6] Upgrade to Java 17 Upgraded to Java 17 using OpenRewrite Java 17 migration recipe --- .github/workflows/maven-pr.yml | 2 +- .github/workflows/maven.yml | 2 +- .github/workflows/release.yml | 2 +- .../hjug/graphbuilder/JavaGraphBuilder.java | 13 +- .../metrics/MetricsCollectingVisitor.java | 19 +- .../visitor/TypeDependencyExtractor.java | 24 +- .../metrics/MetricsCollectionTest.java | 57 +- .../metrics/SignificantDuplicationTest.java | 5 +- .../graphbuilder/visitor/JavaVisitorTest.java | 11 +- .../org/hjug/cbc/CostBenefitCalculator.java | 18 +- .../java/org/hjug/cbc/RankedDisharmony.java | 8 +- coverage/pom.xml | 2 +- .../org/hjug/feedback/SuperTypeToken.java | 20 +- .../approximate/FeedbackVertexSetSolver.java | 2 +- .../vertex/kernelized/TreewidthComputer.java | 2 +- pom.xml | 27 +- .../hjug/refactorfirst/report/CsvReport.java | 6 +- .../hjug/refactorfirst/report/HtmlReport.java | 734 +++++++++--------- .../report/SimpleHtmlReport.java | 35 +- .../report/json/JsonReportExecutor.java | 4 +- .../refactorfirst/report/HtmlReportTest.java | 19 +- 21 files changed, 517 insertions(+), 495 deletions(-) diff --git a/.github/workflows/maven-pr.yml b/.github/workflows/maven-pr.yml index e419bd69..223e9286 100644 --- a/.github/workflows/maven-pr.yml +++ b/.github/workflows/maven-pr.yml @@ -18,7 +18,7 @@ jobs: - name: Set up JDK 11 uses: actions/setup-java@v4 with: - java-version: 11 + java-version: 17 distribution: 'zulu' - name: Build With Maven diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 15b0023d..868833e3 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -18,7 +18,7 @@ jobs: - name: Set up JDK 11 uses: actions/setup-java@v4 with: - java-version: 11 + java-version: 17 distribution: 'zulu' - name: Build With Maven diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 01da8371..dec7def4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -28,7 +28,7 @@ jobs: - name: Set up JDK 11 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'temurin' cache: maven - name: Set release version diff --git a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/JavaGraphBuilder.java b/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/JavaGraphBuilder.java index 385858f7..6e05a32e 100644 --- a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/JavaGraphBuilder.java +++ b/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/JavaGraphBuilder.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -80,7 +79,7 @@ private CodebaseGraphDTO processWithOpenRewrite(String repositoryPath, GraphBuil new GraphMetricsCollector(classReferencesGraph, packageReferencesGraph); MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - try (Stream pathStream = Files.walk(Paths.get(srcDirectory.getAbsolutePath()))) { + try (Stream pathStream = Files.walk(Path.of(srcDirectory.getAbsolutePath()))) { List list; if (config.isExcludeTests()) { list = pathStream @@ -90,12 +89,10 @@ private CodebaseGraphDTO processWithOpenRewrite(String repositoryPath, GraphBuil list = pathStream.collect(Collectors.toList()); } - javaParser - .parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx) - .forEach(cu -> { - javaVisitor.visit(cu, ctx); - metricsVisitor.visit(cu, ctx); - }); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { + javaVisitor.visit(cu, ctx); + metricsVisitor.visit(cu, ctx); + }); } removeClassesNotInCodebase(dependencyCollector.getPackagesInCodebase(), classReferencesGraph); diff --git a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsCollectingVisitor.java b/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsCollectingVisitor.java index 1c098958..6c025bd9 100644 --- a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsCollectingVisitor.java +++ b/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/metrics/MetricsCollectingVisitor.java @@ -60,8 +60,7 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex currentPackageName = type.getPackageName(); // Get or create metrics - this ensures it's stored in the collector - if (metricsCollector instanceof GraphMetricsCollector) { - GraphMetricsCollector gmc = (GraphMetricsCollector) metricsCollector; + if (metricsCollector instanceof GraphMetricsCollector gmc) { currentClassMetrics = gmc.getAllClassMetrics().computeIfAbsent(currentClassName, ClassMetrics::new); } else { currentClassMetrics = metricsCollector.getClassMetrics(currentClassName); @@ -88,13 +87,11 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex // Count protected members int protectedMembers = 0; for (Statement statement : classDecl.getBody().getStatements()) { - if (statement instanceof J.VariableDeclarations) { - J.VariableDeclarations varDecl = (J.VariableDeclarations) statement; + if (statement instanceof J.VariableDeclarations varDecl) { if (varDecl.getModifiers().stream().anyMatch(mod -> mod.getType() == J.Modifier.Type.Protected)) { protectedMembers++; } - } else if (statement instanceof J.MethodDeclaration) { - J.MethodDeclaration methodDecl = (J.MethodDeclaration) statement; + } else if (statement instanceof J.MethodDeclaration methodDecl) { if (methodDecl.getModifiers().stream().anyMatch(mod -> mod.getType() == J.Modifier.Type.Protected)) { protectedMembers++; } @@ -238,8 +235,8 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu JavaType.Method methodType = method.getMethodType(); if (methodType != null && !methodType.isConstructor()) { JavaType declaringType = methodType.getDeclaringType(); - if (declaringType instanceof JavaType.FullyQualified) { - String declaringFqn = ((JavaType.FullyQualified) declaringType).getFullyQualifiedName(); + if (declaringType instanceof JavaType.FullyQualified qualified) { + String declaringFqn = qualified.getFullyQualifiedName(); if (!declaringFqn.equals(currentClassName)) { StringBuilder sig = new StringBuilder(); sig.append(declaringFqn) @@ -271,8 +268,7 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu public J.FieldAccess visitFieldAccess(J.FieldAccess fieldAccess, ExecutionContext ctx) { if (currentMethodMetrics != null && fieldAccess.getType() != null) { JavaType type = fieldAccess.getType(); - if (type instanceof JavaType.Variable) { - JavaType.Variable varType = (JavaType.Variable) type; + if (type instanceof JavaType.Variable varType) { if (varType.getOwner() instanceof JavaType.FullyQualified) { JavaType.FullyQualified owner = (JavaType.FullyQualified) varType.getOwner(); String ownerFqn = owner.getFullyQualifiedName(); @@ -311,8 +307,7 @@ private String buildMethodSignature(J.MethodDeclaration method) { sig.append(method.getSimpleName()).append("("); boolean first = true; for (org.openrewrite.java.tree.Statement param : method.getParameters()) { - if (param instanceof J.VariableDeclarations) { - J.VariableDeclarations varDecl = (J.VariableDeclarations) param; + if (param instanceof J.VariableDeclarations varDecl) { if (!first) { sig.append(","); } diff --git a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/TypeDependencyExtractor.java b/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/TypeDependencyExtractor.java index 2b55f45f..81a60a5e 100644 --- a/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/TypeDependencyExtractor.java +++ b/codebase-graph-builder/src/main/java/org/hjug/graphbuilder/visitor/TypeDependencyExtractor.java @@ -25,14 +25,14 @@ public Set extractDependencies(JavaType javaType) { } private void extractDependenciesRecursive(JavaType javaType, Set dependencies) { - if (javaType instanceof JavaType.Class) { - extractFromClass((JavaType.Class) javaType, dependencies); - } else if (javaType instanceof JavaType.Parameterized) { - extractFromParameterized((JavaType.Parameterized) javaType, dependencies); - } else if (javaType instanceof JavaType.GenericTypeVariable) { - extractFromGenericTypeVariable((JavaType.GenericTypeVariable) javaType, dependencies); - } else if (javaType instanceof JavaType.Array) { - extractFromArray((JavaType.Array) javaType, dependencies); + if (javaType instanceof JavaType.Class clazz) { + extractFromClass(clazz, dependencies); + } else if (javaType instanceof JavaType.Parameterized parameterized) { + extractFromParameterized(parameterized, dependencies); + } else if (javaType instanceof JavaType.GenericTypeVariable variable) { + extractFromGenericTypeVariable(variable, dependencies); + } else if (javaType instanceof JavaType.Array array) { + extractFromArray(array, dependencies); } } @@ -62,10 +62,10 @@ private void extractFromGenericTypeVariable(JavaType.GenericTypeVariable typeVar log.debug("Type parameter type name: {}", typeVariable.getName()); for (JavaType bound : typeVariable.getBounds()) { - if (bound instanceof JavaType.Class) { - dependencies.add(((JavaType.Class) bound).getFullyQualifiedName()); - } else if (bound instanceof JavaType.Parameterized) { - dependencies.add(((JavaType.Parameterized) bound).getFullyQualifiedName()); + if (bound instanceof JavaType.Class clazz) { + dependencies.add(clazz.getFullyQualifiedName()); + } else if (bound instanceof JavaType.Parameterized parameterized) { + dependencies.add(parameterized.getFullyQualifiedName()); } else { log.debug("Unknown type bound: {}", bound); } diff --git a/codebase-graph-builder/src/test/java/org/hjug/graphbuilder/metrics/MetricsCollectionTest.java b/codebase-graph-builder/src/test/java/org/hjug/graphbuilder/metrics/MetricsCollectionTest.java index 99163802..08b8bac2 100644 --- a/codebase-graph-builder/src/test/java/org/hjug/graphbuilder/metrics/MetricsCollectionTest.java +++ b/codebase-graph-builder/src/test/java/org/hjug/graphbuilder/metrics/MetricsCollectionTest.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; import org.jgrapht.graph.DefaultDirectedWeightedGraph; @@ -33,8 +32,8 @@ void collectClassMetrics() throws IOException { MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser.parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { metricsVisitor.visit(cu, ctx); }); @@ -80,8 +79,8 @@ void collectMethodMetrics() throws IOException { MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser.parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { metricsVisitor.visit(cu, ctx); }); @@ -127,8 +126,8 @@ void detectGodClass() throws IOException { MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser.parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { metricsVisitor.visit(cu, ctx); }); @@ -187,8 +186,8 @@ void detectDataClass() throws IOException { MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser.parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { metricsVisitor.visit(cu, ctx); }); @@ -240,8 +239,8 @@ void detectBrainMethod() throws IOException { MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser.parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { metricsVisitor.visit(cu, ctx); }); @@ -276,8 +275,8 @@ void detectBrainClass() throws IOException { MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser.parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { metricsVisitor.visit(cu, ctx); }); @@ -351,8 +350,8 @@ void detectFeatureEnvy() throws IOException { MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser.parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { metricsVisitor.visit(cu, ctx); }); @@ -433,8 +432,8 @@ void detectIntensiveCoupling() throws IOException { MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser.parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { metricsVisitor.visit(cu, ctx); }); @@ -509,8 +508,8 @@ void detectDispersedCoupling() throws IOException { MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser.parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { metricsVisitor.visit(cu, ctx); }); @@ -585,8 +584,8 @@ void detectShotgunSurgery() throws IOException { MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser.parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { metricsVisitor.visit(cu, ctx); }); @@ -657,8 +656,8 @@ void detectRefusedParentBequest() throws IOException { MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser.parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { metricsVisitor.visit(cu, ctx); }); @@ -747,8 +746,8 @@ void detectTraditionBreaker() throws IOException { MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser.parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { metricsVisitor.visit(cu, ctx); }); @@ -830,8 +829,8 @@ void sourceFilePathCapturedForAllClasses() throws IOException { MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser.parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { metricsVisitor.visit(cu, ctx); }); @@ -867,9 +866,9 @@ void javadocMethodReferenceIsNotCountedAsForeignMethodCall() throws IOException GraphMetricsCollector metricsCollector = new GraphMetricsCollector(classGraph, packageGraph); MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); javaParser - .parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx) + .parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx) .forEach(cu -> metricsVisitor.visit(cu, ctx)); metricsCollector.finalizeMetrics(); diff --git a/codebase-graph-builder/src/test/java/org/hjug/graphbuilder/metrics/SignificantDuplicationTest.java b/codebase-graph-builder/src/test/java/org/hjug/graphbuilder/metrics/SignificantDuplicationTest.java index 2ee1be91..50ae7363 100644 --- a/codebase-graph-builder/src/test/java/org/hjug/graphbuilder/metrics/SignificantDuplicationTest.java +++ b/codebase-graph-builder/src/test/java/org/hjug/graphbuilder/metrics/SignificantDuplicationTest.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; import org.jgrapht.graph.DefaultDirectedWeightedGraph; @@ -47,8 +46,8 @@ void setup() throws IOException { metricsCollector = new GraphMetricsCollector(classGraph, packageGraph); MetricsCollectingVisitor metricsVisitor = new MetricsCollectingVisitor(metricsCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser.parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> { metricsVisitor.visit(cu, ctx); }); diff --git a/codebase-graph-builder/src/test/java/org/hjug/graphbuilder/visitor/JavaVisitorTest.java b/codebase-graph-builder/src/test/java/org/hjug/graphbuilder/visitor/JavaVisitorTest.java index e05df532..8f48c829 100644 --- a/codebase-graph-builder/src/test/java/org/hjug/graphbuilder/visitor/JavaVisitorTest.java +++ b/codebase-graph-builder/src/test/java/org/hjug/graphbuilder/visitor/JavaVisitorTest.java @@ -10,7 +10,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; import org.hjug.graphbuilder.DependencyCollector; @@ -43,8 +42,8 @@ private static void visitAll(JavaVisitor visitor, String pathS File srcDirectory = new File(pathString); JavaParser javaParser = JavaParser.fromJavaVersion().build(); ExecutionContext ctx = new InMemoryExecutionContext(Throwable::printStackTrace); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser.parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> visitor.visit(cu, ctx)); + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> visitor.visit(cu, ctx)); } private static Graph buildAndVisit(String pathString) throws IOException { @@ -81,10 +80,8 @@ void visitClasses_registersExpectedPackageCount() throws IOException { new SimpleDirectedWeightedGraph<>(DefaultWeightedEdge.class), new SimpleDirectedWeightedGraph<>(DefaultWeightedEdge.class)); JavaVisitor javaVisitor = new JavaVisitor<>(repoFrom(TESTCLASSES), dependencyCollector); - List list = Files.walk(Paths.get(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); - javaParser - .parse(list, Paths.get(srcDirectory.getAbsolutePath()), ctx) - .forEach(cu -> javaVisitor.visit(cu, ctx)); + List list = Files.walk(Path.of(srcDirectory.getAbsolutePath())).collect(Collectors.toList()); + javaParser.parse(list, Path.of(srcDirectory.getAbsolutePath()), ctx).forEach(cu -> javaVisitor.visit(cu, ctx)); assertEquals(8, dependencyCollector.getPackagesInCodebase().size()); } diff --git a/cost-benefit-calculator/src/main/java/org/hjug/cbc/CostBenefitCalculator.java b/cost-benefit-calculator/src/main/java/org/hjug/cbc/CostBenefitCalculator.java index eefa08f6..d51f96ec 100644 --- a/cost-benefit-calculator/src/main/java/org/hjug/cbc/CostBenefitCalculator.java +++ b/cost-benefit-calculator/src/main/java/org/hjug/cbc/CostBenefitCalculator.java @@ -7,7 +7,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -66,7 +65,7 @@ public void runPmdAnalysis() throws IOException { try (PmdAnalysis pmd = PmdAnalysis.create(configuration)) { loadRules(pmd); - try (Stream files = Files.walk(Paths.get(repositoryPath))) { + try (Stream files = Files.walk(Path.of(repositoryPath))) { files.filter(Files::isRegularFile).forEach(file -> pmd.files().addFile(file)); } @@ -82,7 +81,7 @@ private void loadRules(PmdAnalysis pmd) { cboClassRule.setLanguage(LanguageRegistry.PMD.getLanguageByFullName("Java")); pmd.addRuleSet(RuleSet.forSingleRule(cboClassRule)); - log.info("files to be scanned: " + Paths.get(repositoryPath)); + log.info("files to be scanned: " + Path.of(repositoryPath)); } public List calculateGodClassCostBenefitValues(List godClasses) { @@ -252,8 +251,11 @@ public List getRankedChangeProneness(List } catch (NullPointerException e) { // Should not be reached log.error( - "Error looking up class SCM info. If this error is encountered, " - + "please log a bug on the RefactorFirst project and describe if the class is a nested class, lambda, etc. \nClass: {}, Path: {}", + """ + Error looking up class SCM info. If this error is encountered, \ + please log a bug on the RefactorFirst project and describe if the class is a nested class, lambda, etc.\s + Class: {}, Path: {}\ + """, className, path, e); @@ -267,10 +269,8 @@ public List getRankedChangeProneness(List }) .collect(Collectors.toList()); - List sortedScmInfos = scmLogInfos.stream() - .filter(Optional::isPresent) - .map(Optional::get) - .collect(Collectors.toList()); + List sortedScmInfos = + scmLogInfos.stream().flatMap(Optional::stream).collect(Collectors.toList()); changePronenessRanker.rankChangeProneness(sortedScmInfos); return sortedScmInfos; diff --git a/cost-benefit-calculator/src/main/java/org/hjug/cbc/RankedDisharmony.java b/cost-benefit-calculator/src/main/java/org/hjug/cbc/RankedDisharmony.java index 38547f41..4995c015 100644 --- a/cost-benefit-calculator/src/main/java/org/hjug/cbc/RankedDisharmony.java +++ b/cost-benefit-calculator/src/main/java/org/hjug/cbc/RankedDisharmony.java @@ -1,6 +1,6 @@ package org.hjug.cbc; -import java.nio.file.Paths; +import java.nio.file.Path; import java.time.Instant; import java.util.List; import lombok.Data; @@ -50,7 +50,7 @@ public class RankedDisharmony { public RankedDisharmony(GodClass godClass, ScmLogInfo scmLogInfo) { path = scmLogInfo.getPath(); // from https://stackoverflow.com/questions/1011287/get-file-name-from-a-file-location-in-java - fileName = Paths.get(path).getFileName().toString(); + fileName = Path.of(path).getFileName().toString(); className = godClass.getClassName(); changePronenessRank = scmLogInfo.getChangePronenessRank(); effortRank = godClass.getOverallRank(); @@ -71,7 +71,7 @@ public RankedDisharmony(GodClass godClass, ScmLogInfo scmLogInfo) { public RankedDisharmony(CBOClass cboClass, ScmLogInfo scmLogInfo) { path = scmLogInfo.getPath(); // from https://stackoverflow.com/questions/1011287/get-file-name-from-a-file-location-in-java - fileName = Paths.get(path).getFileName().toString(); + fileName = Path.of(path).getFileName().toString(); className = cboClass.getClassName(); changePronenessRank = scmLogInfo.getChangePronenessRank(); effortRank = cboClass.getCouplingCount(); @@ -84,7 +84,7 @@ public RankedDisharmony(CBOClass cboClass, ScmLogInfo scmLogInfo) { public RankedDisharmony(DisharmonyInstance instance, ScmLogInfo scmLogInfo) { path = scmLogInfo.getPath(); - fileName = Paths.get(path).getFileName().toString(); + fileName = Path.of(path).getFileName().toString(); className = instance.getClassName(); changePronenessRank = scmLogInfo.getChangePronenessRank(); effortRank = instance.getOverallRank(); diff --git a/coverage/pom.xml b/coverage/pom.xml index 34f4ef79..2a6a141e 100644 --- a/coverage/pom.xml +++ b/coverage/pom.xml @@ -60,7 +60,7 @@ org.jacoco jacoco-maven-plugin - 0.8.8 + 0.8.15 report-aggregate diff --git a/graph-algorithms/src/main/java/org/hjug/feedback/SuperTypeToken.java b/graph-algorithms/src/main/java/org/hjug/feedback/SuperTypeToken.java index 285f9589..2642caf4 100644 --- a/graph-algorithms/src/main/java/org/hjug/feedback/SuperTypeToken.java +++ b/graph-algorithms/src/main/java/org/hjug/feedback/SuperTypeToken.java @@ -7,8 +7,8 @@ public abstract class SuperTypeToken { protected SuperTypeToken() { Type superclass = getClass().getGenericSuperclass(); - if (superclass instanceof ParameterizedType) { - this.type = ((ParameterizedType) superclass).getActualTypeArguments()[0]; + if (superclass instanceof ParameterizedType parameterizedType) { + this.type = parameterizedType.getActualTypeArguments()[0]; } else { throw new RuntimeException("Missing type parameter."); } @@ -24,19 +24,19 @@ public Class getClassFromTypeToken() { // ((ParameterizedType) type).getActualTypeArguments()[0] - returns String in List static Class getClassFromTypeToken(Type type) { - if (type instanceof Class) { - return (Class) type; - } else if (type instanceof ParameterizedType) { - return (Class) ((ParameterizedType) type).getRawType(); - } else if (type instanceof GenericArrayType) { - Type componentType = ((GenericArrayType) type).getGenericComponentType(); + if (type instanceof Class clazz) { + return clazz; + } else if (type instanceof ParameterizedType parameterizedType) { + return (Class) parameterizedType.getRawType(); + } else if (type instanceof GenericArrayType arrayType) { + Type componentType = arrayType.getGenericComponentType(); return java.lang.reflect.Array.newInstance(getClassFromTypeToken(componentType), 0) .getClass(); } else if (type instanceof TypeVariable) { // Type variables don't have a direct class representation return Object.class; // Fallback - } else if (type instanceof WildcardType) { - Type[] upperBounds = ((WildcardType) type).getUpperBounds(); + } else if (type instanceof WildcardType wildcardType) { + Type[] upperBounds = wildcardType.getUpperBounds(); return getClassFromTypeToken(upperBounds[0]); // Use the first upper bound } throw new IllegalArgumentException("Unsupported Type: " + type); diff --git a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java b/graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java index 71fc9940..417b1332 100644 --- a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java +++ b/graph-algorithms/src/main/java/org/hjug/feedback/vertex/approximate/FeedbackVertexSetSolver.java @@ -66,7 +66,7 @@ private Map computeFractionalSolution() { .filter(v -> cycleCounts.getOrDefault(v, 0L) > 0) .min(Comparator.comparingDouble(v -> vertexWeights.get(v) / cycleCounts.get(v))); - if (!minVertex.isPresent()) break; + if (minVertex.isEmpty()) break; V vertex = minVertex.get(); double increment = vertexWeights.get(vertex) / cycleCounts.get(vertex); diff --git a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java b/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java index 589e23a7..7acd098e 100644 --- a/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java +++ b/graph-algorithms/src/main/java/org/hjug/feedback/vertex/kernelized/TreewidthComputer.java @@ -215,7 +215,7 @@ public int fillInHeuristicTreewidth(Graph graph) { .min(Map.Entry.comparingByValue())) .get(); - if (!bestVertexEntry.isPresent()) { + if (bestVertexEntry.isEmpty()) { // Fallback: choose any remaining vertex V fallbackVertex = remainingVertices.keys().nextElement(); eliminateVertexParallel(fallbackVertex, adjacencyMap, remainingVertices, maxCliqueSize); diff --git a/pom.xml b/pom.xml index 8fe258f8..073ff5d1 100644 --- a/pom.xml +++ b/pom.xml @@ -50,13 +50,13 @@ + 17 + 17 UTF-8 - 11 - 11 - 1.18.36 + 1.18.46 jimbethancourt_RefactorFirst ${project.artifactId} jimbethancourt-github @@ -273,13 +273,26 @@ maven-deploy-plugin 3.1.4 + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + 1.18.40 + + + + org.apache.maven.plugins maven-compiler-plugin - 3.8.1 + 3.15.0 -XDcompilePolicy=simple @@ -297,14 +310,14 @@ ${errorprone.version} --> - 11 + 17 org.jacoco jacoco-maven-plugin - 0.8.14 + 0.8.15 @@ -364,7 +377,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.9.2.0 + 4.9.8.5 com.github.spotbugs diff --git a/report/src/main/java/org/hjug/refactorfirst/report/CsvReport.java b/report/src/main/java/org/hjug/refactorfirst/report/CsvReport.java index 8c13a121..aa6d692c 100644 --- a/report/src/main/java/org/hjug/refactorfirst/report/CsvReport.java +++ b/report/src/main/java/org/hjug/refactorfirst/report/CsvReport.java @@ -3,7 +3,7 @@ import static org.hjug.refactorfirst.report.ReportWriter.writeReportToDisk; import java.io.File; -import java.nio.file.Paths; +import java.nio.file.Path; import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; @@ -33,7 +33,7 @@ public void execute( String filename = fileNameSB.toString(); if (Objects.equals(projectName, "Maven Stub Project (No POM)")) { - projectName = new File(Paths.get("").toAbsolutePath().toString()).getName(); + projectName = new File(Path.of("").toAbsolutePath().toString()).getName(); } log.info("Generating {} for {} - {} date: {}", filename, projectName, projectVersion, publishedDate); @@ -49,7 +49,7 @@ public void execute( projectBaseDir = baseDir.getPath(); optionalGitDir = Optional.ofNullable(gitLogReader.getGitDir(baseDir)); } else { - projectBaseDir = Paths.get("").toAbsolutePath().toString(); + projectBaseDir = Path.of("").toAbsolutePath().toString(); optionalGitDir = Optional.ofNullable(gitLogReader.getGitDir(new File(projectBaseDir))); } diff --git a/report/src/main/java/org/hjug/refactorfirst/report/HtmlReport.java b/report/src/main/java/org/hjug/refactorfirst/report/HtmlReport.java index 7b33619b..6cb2135f 100644 --- a/report/src/main/java/org/hjug/refactorfirst/report/HtmlReport.java +++ b/report/src/main/java/org/hjug/refactorfirst/report/HtmlReport.java @@ -16,366 +16,376 @@ public class HtmlReport extends SimpleHtmlReport { // use Files.readString(Path.of(file)) // Created by generative AI and modified slightly - public static final String SUGIYAMA_SIGMA_GRAPH = ""; + public static final String SUGIYAMA_SIGMA_GRAPH = + """ + """; public static final String FORCE_3D_GRAPH = - ""; + """ + """; // Created by generative AI and modified - public static final String POPUP_STYLE = ""; + public static final String POPUP_STYLE = + """ + """; // Created by generative AI and modified - public static final String POPUP_FUNCTIONS = ""; + public static final String POPUP_FUNCTIONS = + """ + """; @Override public String printHead() { @@ -423,13 +433,15 @@ void renderPackageMapMenu(StringBuilder stringBuilder) { @Override String renderGithubButtons() { - return "
\n" + "

Show RefactorFirst some ❤️

\n" - + "Star\n" - + "Fork\n" - + "Watch\n" - + "Issue\n" - + "Sponsor\n" - + "
"; + return """ +
+

Show RefactorFirst some ❤️

+ Star + Fork + Watch + Issue + Sponsor +
"""; } public String getName(Locale locale) { diff --git a/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java b/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java index c068162f..535c1c11 100644 --- a/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java +++ b/report/src/main/java/org/hjug/refactorfirst/report/SimpleHtmlReport.java @@ -5,7 +5,7 @@ import in.wilsonl.minifyhtml.Configuration; import in.wilsonl.minifyhtml.MinifyHtml; import java.io.File; -import java.nio.file.Paths; +import java.nio.file.Path; import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; @@ -35,7 +35,10 @@ public class SimpleHtmlReport { public static final String THE_BEGINNING = - "\n" + "\n"; + """ + + + """; public static final String THE_END = "\n" + " \n" + " \n" + "\n"; @@ -132,7 +135,7 @@ public StringBuilder generateReport( projectBaseDir = baseDir.getPath(); optionalGitDir = Optional.ofNullable(GitLogReader.getGitDir(baseDir)); } else { - projectBaseDir = Paths.get("").toAbsolutePath().toString(); + projectBaseDir = Path.of("").toAbsolutePath().toString(); optionalGitDir = Optional.ofNullable(GitLogReader.getGitDir(new File(projectBaseDir))); } @@ -873,10 +876,12 @@ public String printOpenBodyTag() { } public String printBreadcrumbs() { - return "
\n" - + "
\n" - + "
\n" - + "
\n"; + return """ + +