diff --git a/build.gradle.kts b/build.gradle.kts index 491d130ea4..0da963c0cd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -79,6 +79,7 @@ dependencies { testRuntimeOnly("com.google.code.findbugs:jsr305:3.0.2") testRuntimeOnly("javax.mail:mail:1.4.7") testRuntimeOnly("javax.mail:javax.mail-api:1.6.2") + testRuntimeOnly("javax.servlet:javax.servlet-api:4.0.1") testRuntimeOnly("javax.ws.rs:javax.ws.rs-api:2.1.1") testRuntimeOnly(gradleApi()) } diff --git a/src/main/resources/META-INF/rewrite/jakarta-ee-9.yml b/src/main/resources/META-INF/rewrite/jakarta-ee-9.yml index c35dc25498..51e34d0e43 100644 --- a/src/main/resources/META-INF/rewrite/jakarta-ee-9.yml +++ b/src/main/resources/META-INF/rewrite/jakarta-ee-9.yml @@ -638,6 +638,11 @@ recipeList: groupId: jakarta.servlet artifactId: jakarta.servlet-api newVersion: 5.0.x + - org.openrewrite.java.dependencies.AddDependency: + groupId: jakarta.servlet + artifactId: jakarta.servlet-api + version: 5.0.x + onlyIfUsing: javax.servlet.* - org.openrewrite.java.ChangePackage: oldPackageName: javax.servlet newPackageName: jakarta.servlet diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxMailToJakartaMailTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxMailToJakartaMailTest.java index d0f9c15599..ac0c536aa0 100644 --- a/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxMailToJakartaMailTest.java +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxMailToJakartaMailTest.java @@ -42,9 +42,7 @@ void switchesJavaxMailApiDependencyToJakartaMailApiDependency() { //language=xml pomXml( """ - - + 4.0.0 com.example demo @@ -59,7 +57,11 @@ void switchesJavaxMailApiDependencyToJakartaMailApiDependency() { """, spec -> spec.after(pom -> assertThat(pom) - .contains("jakarta.mail-api") + .contains("jakarta.mail") + .contains("jakarta.mail-api") + .containsPattern("2.0.\\d+") + .doesNotContain("javax.mail") + .doesNotContain("javax.mail-api") .actual()) ) ), @@ -89,9 +91,7 @@ void switchesJavaxMailDependencyToJakartaMailApiDependency() { //language=xml pomXml( """ - - + 4.0.0 com.example demo @@ -106,7 +106,11 @@ void switchesJavaxMailDependencyToJakartaMailApiDependency() { """, spec -> spec.after(pom -> assertThat(pom) - .contains("jakarta.mail-api") + .contains("jakarta.mail") + .contains("jakarta.mail-api") + .containsPattern("2.0.\\d+") + .doesNotContain("javax.mail") + .doesNotContain("mail") .actual()) ) ), @@ -129,7 +133,7 @@ public class TestApplication { } @Test - void addsJakartaMailDependencyIfExistingInTransitive() { + void addsJakartaMailApiDependencyIfJavaxMailApiOnlyExistingInTransitive() { rewriteRun( mavenProject( "Sample", @@ -151,17 +155,24 @@ public class TestApplication { //language=xml pomXml( """ - - + 4.0.0 com.example demo 0.0.1-SNAPSHOT + + + org.springframework.boot + spring-boot-autoconfigure + 2.1.0.RELEASE + + """, spec -> spec.after(pom -> assertThat(pom) - .contains("jakarta.mail-api") + .contains("jakarta.mail") + .contains("jakarta.mail-api") + .containsPattern("2.0.\\d+") .actual()) ) ) @@ -169,16 +180,59 @@ public class TestApplication { } @Test - void ignoresJakartaMailDependencyIfAlreadyExisting() { + void upgradesJakartaMailApiDependencyIfAlreadyExistingAtALowerVersion() { rewriteRun( mavenProject( "Sample", //language=xml pomXml( """ - - + + 4.0.0 + com.example + demo + 0.0.1-SNAPSHOT + + + jakarta.mail + jakarta.mail-api + 1.6.8 + + + + """, + spec -> spec.after(pom -> assertThat(pom) + .containsPattern("2.0.\\d+") + .actual()) + ) + ) + ); + } + + @Test + void ignoresJakartaMailApiDependencyIfAlreadyExisting() { + rewriteRun( + mavenProject( + "Sample", + srcMainJava( + //language=java + java( + """ + import javax.mail.Session; + public class TestApplication { + } + """, + """ + import jakarta.mail.Session; + public class TestApplication { + } + """ + ) + ), + //language=xml + pomXml( + """ + 4.0.0 com.example demo diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxServletToJakartaServletTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxServletToJakartaServletTest.java new file mode 100644 index 0000000000..6e2ccc090e --- /dev/null +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxServletToJakartaServletTest.java @@ -0,0 +1,204 @@ +/* + * Copyright 2025 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import org.junit.jupiter.api.Test; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.openrewrite.java.Assertions.*; +import static org.openrewrite.maven.Assertions.pomXml; + +class JavaxServletToJakartaServletTest implements RewriteTest { + @Override + public void defaults(RecipeSpec spec) { + spec.parser(JavaParser.fromJavaVersion() + .classpath("javax.servlet-api-4.0.1")) + .recipeFromResource( + "/META-INF/rewrite/jakarta-ee-9.yml", + "org.openrewrite.java.migrate.jakarta.JavaxServletToJakartaServlet"); + } + + @Test + void switchesJavaxServletApiDependencyToJakartaServletApiDependency() { + rewriteRun( + mavenProject( + "Sample", + //language=xml + pomXml( + """ + + 4.0.0 + com.example + demo + 0.0.1-SNAPSHOT + + + javax.servlet + javax.servlet-api + 4.0.1 + + + + """, + spec -> spec.after(pom -> assertThat(pom) + .contains("jakarta.servlet") + .contains("jakarta.servlet-api") + .containsPattern("5.0.\\d+") + .doesNotContain("javax.servlet") + .doesNotContain("javax.servlet-api") + .actual()) + ) + ), + srcMainJava( + //language=java + java( + """ + import javax.servlet.Filter; + public class TestApplication { + } + """, + """ + import jakarta.servlet.Filter; + public class TestApplication { + } + """ + ) + ) + ); + } + + @Test + void addsJakartaServletApiDependencyIfJavaxServletApiOnlyExistsInTransitive() { + rewriteRun( + mavenProject( + "Sample", + srcMainJava( + //language=java + java( + """ + import javax.servlet.Filter; + public class TestApplication { + } + """, + """ + import jakarta.servlet.Filter; + public class TestApplication { + } + """ + ) + ), + //language=xml + pomXml( + """ + + 4.0.0 + com.example + demo + 0.0.1-SNAPSHOT + + + org.springframework.boot + spring-boot + 2.1.9.RELEASE + + + + """, + spec -> spec.after(pom -> assertThat(pom) + .contains("jakarta.servlet") + .contains("jakarta.servlet-api") + .containsPattern("5.0.\\d+") + .actual()) + ) + ) + ); + } + + @Test + void upgradesJakartaServletApiDependencyIfAlreadyExistingAtLowerVersion() { + rewriteRun( + mavenProject( + "Sample", + //language=xml + pomXml( + """ + + 4.0.0 + com.example + demo + 0.0.1-SNAPSHOT + + + jakarta.servlet + jakarta.servlet-api + 4.0.4 + + + + """, + spec -> spec.after(pom -> assertThat(pom) + .containsPattern("5.0.\\d+") + .actual()) + ) + ) + ); + } + + @Test + void ignoresJakartaServletApiDependencyIfAlreadyExisting() { + rewriteRun( + mavenProject( + "Sample", + srcMainJava( + //language=java + java( + """ + import javax.servlet.Filter; + public class TestApplication { + } + """, + """ + import jakarta.servlet.Filter; + public class TestApplication { + } + """ + ) + ), + //language=xml + pomXml( + """ + + 4.0.0 + com.example + demo + 0.0.1-SNAPSHOT + + + jakarta.servlet + jakarta.servlet-api + 5.0.0 + + + + """ + ) + ) + ); + } +}