From 8a0e341aa2193b1ae8137adf63210e74ab5f1192 Mon Sep 17 00:00:00 2001
From: Tim te Beek <tim@moderne.io>
Date: Mon, 20 Jan 2025 21:24:36 +0100
Subject: [PATCH 1/5] Rewrite recipe bom 3.x

---
 pom.xml                                                |  8 ++++----
 recipes/pom.xml                                        |  6 ++++++
 .../resources/quarkus-updates/core/3.7.alpha1.yaml     | 10 +++++-----
 3 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/pom.xml b/pom.xml
index 40cafc3b3b..beac519082 100644
--- a/pom.xml
+++ b/pom.xml
@@ -61,11 +61,11 @@
         <!-- Make sure all these versions are aligned and use a compatible OpenRewrite version -->
         <!-- The rewrite-recipe-bom release notes should contain the Maven and Gradle plugin versions to target -->
         <!-- https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-recipe-bom/versions -->
-        <rewrite-recipe-bom.version>2.23.1</rewrite-recipe-bom.version>
+        <rewrite-recipe-bom.version>3.0.2</rewrite-recipe-bom.version>
         <!--   https://central.sonatype.com/artifact/org.openrewrite.maven/rewrite-maven-plugin/versions -->
-        <rewrite-maven-plugin.version>5.47.0</rewrite-maven-plugin.version>
+        <rewrite-maven-plugin.version>6.0.4</rewrite-maven-plugin.version>
         <!--   https://plugins.gradle.org/plugin/org.openrewrite.rewrite -->
-        <rewrite-gradle-plugin.version>6.29.0</rewrite-gradle-plugin.version>
+        <rewrite-gradle-plugin.version>7.0.3</rewrite-gradle-plugin.version>
         <!-- https://github.com/apache/camel-upgrade-recipes -->
         <camel-upgrade-recipes.version>4.8.0</camel-upgrade-recipes.version>
         <!-- align with https://central.sonatype.com/artifact/org.openrewrite/rewrite-core -->
@@ -75,7 +75,7 @@
         <!-- Http version used by the tests -->
         <http.version>4.5.14</http.version>
 
-        <lombok.version>1.18.34</lombok.version>
+        <lombok.version>1.18.36</lombok.version>
         <slf4j.version>1.7.36</slf4j.version>
 
         <maven-failsafe-plugin.version>3.2.5</maven-failsafe-plugin.version>
diff --git a/recipes/pom.xml b/recipes/pom.xml
index 689d5cf947..018e4b10eb 100644
--- a/recipes/pom.xml
+++ b/recipes/pom.xml
@@ -59,12 +59,18 @@
             <artifactId>rewrite-java-17</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.openrewrite</groupId>
+            <artifactId>rewrite-java-21</artifactId>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>io.micrometer</groupId>
             <artifactId>micrometer-core</artifactId>
             <scope>provided</scope>
         </dependency>
         <dependency>
+            <!-- TODO Remove dependency -->
             <groupId>org.openrewrite.recipe</groupId>
             <artifactId>rewrite-migrate-java</artifactId>
         </dependency>
diff --git a/recipes/src/main/resources/quarkus-updates/core/3.7.alpha1.yaml b/recipes/src/main/resources/quarkus-updates/core/3.7.alpha1.yaml
index 0f63e663cd..031c08378d 100644
--- a/recipes/src/main/resources/quarkus-updates/core/3.7.alpha1.yaml
+++ b/recipes/src/main/resources/quarkus-updates/core/3.7.alpha1.yaml
@@ -137,7 +137,7 @@ description: >
 tags:
   - java17
 recipeList:
-  - org.openrewrite.github.SetupJavaUpgradeJavaVersion:
+  - org.openrewrite.github.SetupJavaUpgradeJavaVersion: # TODO Fork recipe or remove
       minimumJavaMajorVersion: 17
   - org.openrewrite.java.RemoveMethodInvocations:
       methodPattern: java.lang.Runtime traceInstructions(boolean)
@@ -156,9 +156,9 @@ tags:
   - java17
   - compiler
 recipeList:
-  - org.openrewrite.java.migrate.UpgradeJavaVersion:
+  - org.openrewrite.java.migrate.UpgradeJavaVersion: # TODO Fork recipe or remove
       version: 17
-  - org.openrewrite.java.migrate.maven.UseMavenCompilerPluginReleaseConfiguration:
+  - org.openrewrite.maven.UseMavenCompilerPluginReleaseConfiguration:
       releaseVersion: 17
 ---
 type: specs.openrewrite.org/v1beta/recipe
@@ -179,7 +179,7 @@ description: The `com.sun.net.ssl.internal.ssl.Provider` provider name was remov
 tags:
   - java17
 recipeList:
-  - org.openrewrite.java.migrate.ReplaceStringLiteralValue:
+  - org.openrewrite.java.ReplaceStringLiteralValue:
       oldLiteralValue: com.sun.net.ssl.internal.ssl.Provider
       newLiteralValue: SunJSSE
 ---
@@ -193,7 +193,7 @@ recipeList:
   - org.openrewrite.java.ChangeMethodName:
       methodPattern: java.util.logging.LogRecord getThreadID()
       newMethodName: getLongThreadID
-  - org.openrewrite.java.migrate.ChangeMethodInvocationReturnType:
+  - org.openrewrite.java.ChangeMethodInvocationReturnType:
       methodPattern: java.util.logging.LogRecord getLongThreadID()
       newReturnType: long
   - org.openrewrite.java.ChangeMethodName:

From 1fa26dba6743f9a1e587fca7bb4d47d04dfd26eb Mon Sep 17 00:00:00 2001
From: Tim te Beek <tim@moderne.io>
Date: Mon, 20 Jan 2025 21:39:41 +0100
Subject: [PATCH 2/5] Add forked and stripped versions of rewrite-migrate-java
 recipes

---
 recipes/pom.xml                               | 10 ++-
 .../SetupJavaUpgradeJavaVersion.java          | 74 ++++++++++++++++++
 .../core/quarkus37/UpgradeJavaVersion.java    | 76 +++++++++++++++++++
 .../quarkus-updates/core/3.7.alpha1.yaml      |  6 +-
 4 files changed, 159 insertions(+), 7 deletions(-)
 create mode 100644 recipes/src/main/java/io/quarkus/updates/core/quarkus37/SetupJavaUpgradeJavaVersion.java
 create mode 100644 recipes/src/main/java/io/quarkus/updates/core/quarkus37/UpgradeJavaVersion.java

diff --git a/recipes/pom.xml b/recipes/pom.xml
index 018e4b10eb..043a98d071 100644
--- a/recipes/pom.xml
+++ b/recipes/pom.xml
@@ -70,13 +70,15 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <!-- TODO Remove dependency -->
             <groupId>org.openrewrite.recipe</groupId>
-            <artifactId>rewrite-migrate-java</artifactId>
+            <artifactId>rewrite-quarkus</artifactId>
         </dependency>
+
+        <!-- rewrite-gradle dependency only necessary for Gradle Recipe development -->
         <dependency>
-            <groupId>org.openrewrite.recipe</groupId>
-            <artifactId>rewrite-quarkus</artifactId>
+            <groupId>org.openrewrite</groupId>
+            <artifactId>rewrite-gradle</artifactId>
+            <scope>provided</scope>
         </dependency>
 
         <!-- rewrite-maven dependency only necessary for Maven Recipe development -->
diff --git a/recipes/src/main/java/io/quarkus/updates/core/quarkus37/SetupJavaUpgradeJavaVersion.java b/recipes/src/main/java/io/quarkus/updates/core/quarkus37/SetupJavaUpgradeJavaVersion.java
new file mode 100644
index 0000000000..b80e7dfce0
--- /dev/null
+++ b/recipes/src/main/java/io/quarkus/updates/core/quarkus37/SetupJavaUpgradeJavaVersion.java
@@ -0,0 +1,74 @@
+package io.quarkus.updates.core.quarkus37;
+
+import org.openrewrite.*;
+import org.openrewrite.yaml.JsonPathMatcher;
+import org.openrewrite.yaml.YamlVisitor;
+import org.openrewrite.yaml.tree.Yaml;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import lombok.EqualsAndHashCode;
+import lombok.Value;
+
+@Value
+@EqualsAndHashCode(callSuper = false)
+public class SetupJavaUpgradeJavaVersion extends Recipe {
+
+    @Option(displayName = "Java version",
+            description = "The Java version to upgrade to.",
+            example = "17")
+    Integer minimumJavaMajorVersion;
+
+    @Override
+    public String getDisplayName() {
+        return "Upgrade `actions/setup-java` `java-version`";
+    }
+
+    @Override
+    public String getDescription() {
+        return "Update the Java version used by `actions/setup-java` if it is below the expected version number.";
+    }
+
+    private static final JsonPathMatcher javaVersion = new JsonPathMatcher("..steps[?(@.uses =~ 'actions/setup-java@v*.*')].with.java-version");
+    private static final Pattern javaVersionPattern = Pattern.compile("([0-9]+)(\\.[0-9]+)*([-+].*)?");
+
+    @Override
+    public TreeVisitor<?, ExecutionContext> getVisitor() {
+        return Preconditions.check(
+                new FindSourceFiles(".github/workflows/*.yml"),
+                new YamlVisitor<>() {
+                    @Override
+                    public Yaml visitMappingEntry(Yaml.Mapping.Entry entry, ExecutionContext ctx) {
+                        if (!javaVersion.matches(getCursor())) {
+                            return super.visitMappingEntry(entry, ctx);
+                        }
+
+                        Yaml.Scalar currentValue = (Yaml.Scalar) entry.getValue();
+
+                        // specific versions are allowed by `actions/setup-java`
+                        Matcher matcher = javaVersionPattern.matcher(currentValue.getValue());
+                        if (!matcher.matches()) {
+                            return super.visitMappingEntry(entry, ctx);
+                        }
+
+                        int currentMajorVersion;
+                        try {
+                            currentMajorVersion = Integer.parseInt(matcher.group(1));
+                        } catch (NumberFormatException ex) {
+                            return super.visitMappingEntry(entry, ctx);
+                        }
+
+                        if (currentMajorVersion >= minimumJavaMajorVersion) {
+                            return super.visitMappingEntry(entry, ctx);
+                        }
+
+                        return super.visitMappingEntry(
+                                entry.withValue(currentValue.withValue(String.valueOf(minimumJavaMajorVersion))),
+                                ctx
+                        );
+                    }
+                });
+    }
+
+}
\ No newline at end of file
diff --git a/recipes/src/main/java/io/quarkus/updates/core/quarkus37/UpgradeJavaVersion.java b/recipes/src/main/java/io/quarkus/updates/core/quarkus37/UpgradeJavaVersion.java
new file mode 100644
index 0000000000..233b3f2483
--- /dev/null
+++ b/recipes/src/main/java/io/quarkus/updates/core/quarkus37/UpgradeJavaVersion.java
@@ -0,0 +1,76 @@
+package io.quarkus.updates.core.quarkus37;
+
+import lombok.EqualsAndHashCode;
+import lombok.Value;
+import org.openrewrite.ExecutionContext;
+import org.openrewrite.Option;
+import org.openrewrite.Recipe;
+import org.openrewrite.TreeVisitor;
+import org.openrewrite.gradle.UpdateJavaCompatibility;
+import org.openrewrite.java.JavaIsoVisitor;
+import org.openrewrite.java.marker.JavaVersion;
+import org.openrewrite.maven.UpdateMavenProjectPropertyJavaVersion;
+import org.openrewrite.maven.UseMavenCompilerPluginReleaseConfiguration;
+import org.openrewrite.java.tree.J;
+
+import java.time.Duration;
+import java.util.*;
+
+@Value
+@EqualsAndHashCode(callSuper = false)
+public class UpgradeJavaVersion extends Recipe {
+
+    @Option(displayName = "Java version",
+            description = "The Java version to upgrade to.",
+            example = "17")
+    Integer version;
+
+    @Override
+    public String getDisplayName() {
+        return "Upgrade Java version";
+    }
+
+    @Override
+    public String getDescription() {
+        return "Upgrade build plugin configuration to use the specified Java version. " +
+               "This recipe changes `java.toolchain.languageVersion` in `build.gradle(.kts)` of gradle projects, " +
+               "or maven-compiler-plugin target version and related settings. " +
+               "Will not downgrade if the version is newer than the specified version.";
+    }
+
+    @Override
+    public List<Recipe> getRecipeList() {
+        return Arrays.asList(
+                new UseMavenCompilerPluginReleaseConfiguration(version),
+                new UpdateMavenProjectPropertyJavaVersion(version),
+                new UpdateJavaCompatibility(version, null, null, false, null)
+        );
+    }
+
+    /**
+     * This recipe only updates markers, so it does not correspond to human manual effort.
+     *
+     * @return Zero estimated time.
+     */
+    @Override
+    public Duration getEstimatedEffortPerOccurrence() {
+        return Duration.ofMinutes(0);
+    }
+
+    @Override
+    public TreeVisitor<?, ExecutionContext> getVisitor() {
+        String newVersion = version.toString();
+        Map<JavaVersion, JavaVersion> updatedMarkers = new HashMap<>();
+        return new JavaIsoVisitor<>() {
+            @Override
+            public J preVisit(J tree, ExecutionContext ctx) {
+                Optional<JavaVersion> maybeJavaVersion = tree.getMarkers().findFirst(JavaVersion.class);
+                if (maybeJavaVersion.isPresent() && maybeJavaVersion.get().getMajorVersion() < version) {
+                    return tree.withMarkers(tree.getMarkers().setByType(updatedMarkers.computeIfAbsent(maybeJavaVersion.get(),
+                            m -> m.withSourceCompatibility(newVersion).withTargetCompatibility(newVersion))));
+                }
+                return tree;
+            }
+        };
+    }
+}
\ No newline at end of file
diff --git a/recipes/src/main/resources/quarkus-updates/core/3.7.alpha1.yaml b/recipes/src/main/resources/quarkus-updates/core/3.7.alpha1.yaml
index 031c08378d..d53e2da96a 100644
--- a/recipes/src/main/resources/quarkus-updates/core/3.7.alpha1.yaml
+++ b/recipes/src/main/resources/quarkus-updates/core/3.7.alpha1.yaml
@@ -137,7 +137,7 @@ description: >
 tags:
   - java17
 recipeList:
-  - org.openrewrite.github.SetupJavaUpgradeJavaVersion: # TODO Fork recipe or remove
+  - io.quarkus.updates.core.quarkus37.SetupJavaUpgradeJavaVersion:
       minimumJavaMajorVersion: 17
   - org.openrewrite.java.RemoveMethodInvocations:
       methodPattern: java.lang.Runtime traceInstructions(boolean)
@@ -150,13 +150,13 @@ recipeList:
 ---
 type: specs.openrewrite.org/v1beta/recipe
 name: io.quarkus.updates.core.quarkus37.JavaVersion17
-displayName: Change Maven Java version property values to 17
+displayName: Change Maven and Gradle Java version property values to 17
 description: Change maven.compiler.source and maven.compiler.target values to 17.
 tags:
   - java17
   - compiler
 recipeList:
-  - org.openrewrite.java.migrate.UpgradeJavaVersion: # TODO Fork recipe or remove
+  - io.quarkus.updates.core.quarkus37.UpgradeJavaVersion:
       version: 17
   - org.openrewrite.maven.UseMavenCompilerPluginReleaseConfiguration:
       releaseVersion: 17

From e6694c432c216b9d8d0c4f5996ec955a9db91d9f Mon Sep 17 00:00:00 2001
From: Tim te Beek <tim@moderne.io>
Date: Mon, 20 Jan 2025 21:43:04 +0100
Subject: [PATCH 3/5] Add `-Dstyle.color=always` for better readable build
 output

---
 .github/workflows/build.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index bdabffae3b..008658d139 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -57,5 +57,5 @@ jobs:
           cache: 'maven'
 
       - name: Build with Maven
-        run: mvn -B clean install -Dno-format
+        run: mvn -B clean install -Dno-format -Dstyle.color=always
 

From e92e269a0b61f2521ffc394fa7828c16ae04530e Mon Sep 17 00:00:00 2001
From: Tim te Beek <tim@moderne.io>
Date: Mon, 20 Jan 2025 22:21:33 +0100
Subject: [PATCH 4/5] Hide transfer progress

---
 .github/workflows/build.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 008658d139..aca33584ec 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -57,5 +57,5 @@ jobs:
           cache: 'maven'
 
       - name: Build with Maven
-        run: mvn -B clean install -Dno-format -Dstyle.color=always
+        run: mvn --batch-mode --no-transfer-progress clean install -Dno-format -Dstyle.color=always
 

From b407c37f379973ef0f2981814e30cf14cae41c37 Mon Sep 17 00:00:00 2001
From: Tim te Beek <tim@moderne.io>
Date: Mon, 20 Jan 2025 23:11:44 +0100
Subject: [PATCH 5/5] Exclude `rewrite-migrate-java` for now

---
 recipes/pom.xml | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/recipes/pom.xml b/recipes/pom.xml
index 043a98d071..7cc1cffb72 100644
--- a/recipes/pom.xml
+++ b/recipes/pom.xml
@@ -72,6 +72,12 @@
         <dependency>
             <groupId>org.openrewrite.recipe</groupId>
             <artifactId>rewrite-quarkus</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.openrewrite.recipe</groupId>
+                    <artifactId>rewrite-migrate-java</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <!-- rewrite-gradle dependency only necessary for Gradle Recipe development -->
@@ -147,6 +153,12 @@
             <groupId>org.apache.camel.upgrade</groupId>
             <artifactId>camel-upgrade-recipes</artifactId>
             <version>${camel-upgrade-recipes.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.openrewrite.recipe</groupId>
+                    <artifactId>rewrite-migrate-java</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
     </dependencies>