Skip to content

Commit 7d30127

Browse files
Adding jakarta.servlet:jakarta.servlet-api explicitly when the javax.servlet:javax.servlet-api it is trying to migrate from was only available transitively. (#835)
1 parent cea52ed commit 7d30127

File tree

4 files changed

+281
-17
lines changed

4 files changed

+281
-17
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ dependencies {
7979
testRuntimeOnly("com.google.code.findbugs:jsr305:3.0.2")
8080
testRuntimeOnly("javax.mail:mail:1.4.7")
8181
testRuntimeOnly("javax.mail:javax.mail-api:1.6.2")
82+
testRuntimeOnly("javax.servlet:javax.servlet-api:4.0.1")
8283
testRuntimeOnly("javax.ws.rs:javax.ws.rs-api:2.1.1")
8384
testRuntimeOnly(gradleApi())
8485
}

src/main/resources/META-INF/rewrite/jakarta-ee-9.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,11 @@ recipeList:
638638
groupId: jakarta.servlet
639639
artifactId: jakarta.servlet-api
640640
newVersion: 5.0.x
641+
- org.openrewrite.java.dependencies.AddDependency:
642+
groupId: jakarta.servlet
643+
artifactId: jakarta.servlet-api
644+
version: 5.0.x
645+
onlyIfUsing: javax.servlet.*
641646
- org.openrewrite.java.ChangePackage:
642647
oldPackageName: javax.servlet
643648
newPackageName: jakarta.servlet

src/test/java/org/openrewrite/java/migrate/jakarta/JavaxMailToJakartaMailTest.java

Lines changed: 71 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,7 @@ void switchesJavaxMailApiDependencyToJakartaMailApiDependency() {
4242
//language=xml
4343
pomXml(
4444
"""
45-
<?xml version="1.0" encoding="UTF-8"?>
46-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
47-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
45+
<project>
4846
<modelVersion>4.0.0</modelVersion>
4947
<groupId>com.example</groupId>
5048
<artifactId>demo</artifactId>
@@ -59,7 +57,11 @@ void switchesJavaxMailApiDependencyToJakartaMailApiDependency() {
5957
</project>
6058
""",
6159
spec -> spec.after(pom -> assertThat(pom)
62-
.contains("jakarta.mail-api")
60+
.contains("<groupId>jakarta.mail</groupId>")
61+
.contains("<artifactId>jakarta.mail-api</artifactId>")
62+
.containsPattern("<version>2.0.\\d+</version>")
63+
.doesNotContain("<groupId>javax.mail</groupId>")
64+
.doesNotContain("<artifactId>javax.mail-api</artifactId>")
6365
.actual())
6466
)
6567
),
@@ -89,9 +91,7 @@ void switchesJavaxMailDependencyToJakartaMailApiDependency() {
8991
//language=xml
9092
pomXml(
9193
"""
92-
<?xml version="1.0" encoding="UTF-8"?>
93-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
94-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
94+
<project>
9595
<modelVersion>4.0.0</modelVersion>
9696
<groupId>com.example</groupId>
9797
<artifactId>demo</artifactId>
@@ -106,7 +106,11 @@ void switchesJavaxMailDependencyToJakartaMailApiDependency() {
106106
</project>
107107
""",
108108
spec -> spec.after(pom -> assertThat(pom)
109-
.contains("jakarta.mail-api")
109+
.contains("<groupId>jakarta.mail</groupId>")
110+
.contains("<artifactId>jakarta.mail-api</artifactId>")
111+
.containsPattern("<version>2.0.\\d+</version>")
112+
.doesNotContain("<groupId>javax.mail</groupId>")
113+
.doesNotContain("<artifactId>mail</artifactId>")
110114
.actual())
111115
)
112116
),
@@ -129,7 +133,7 @@ public class TestApplication {
129133
}
130134

131135
@Test
132-
void addsJakartaMailDependencyIfExistingInTransitive() {
136+
void addsJakartaMailApiDependencyIfJavaxMailApiOnlyExistingInTransitive() {
133137
rewriteRun(
134138
mavenProject(
135139
"Sample",
@@ -151,34 +155,84 @@ public class TestApplication {
151155
//language=xml
152156
pomXml(
153157
"""
154-
<?xml version="1.0" encoding="UTF-8"?>
155-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
156-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
158+
<project>
157159
<modelVersion>4.0.0</modelVersion>
158160
<groupId>com.example</groupId>
159161
<artifactId>demo</artifactId>
160162
<version>0.0.1-SNAPSHOT</version>
163+
<dependencies>
164+
<dependency>
165+
<groupId>org.springframework.boot</groupId>
166+
<artifactId>spring-boot-autoconfigure</artifactId>
167+
<version>2.1.0.RELEASE</version>
168+
</dependency>
169+
</dependencies>
161170
</project>
162171
""",
163172
spec -> spec.after(pom -> assertThat(pom)
164-
.contains("jakarta.mail-api")
173+
.contains("<groupId>jakarta.mail</groupId>")
174+
.contains("<artifactId>jakarta.mail-api</artifactId>")
175+
.containsPattern("<version>2.0.\\d+</version>")
165176
.actual())
166177
)
167178
)
168179
);
169180
}
170181

171182
@Test
172-
void ignoresJakartaMailDependencyIfAlreadyExisting() {
183+
void upgradesJakartaMailApiDependencyIfAlreadyExistingAtALowerVersion() {
173184
rewriteRun(
174185
mavenProject(
175186
"Sample",
176187
//language=xml
177188
pomXml(
178189
"""
179-
<?xml version="1.0" encoding="UTF-8"?>
180-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
181-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
190+
<project>
191+
<modelVersion>4.0.0</modelVersion>
192+
<groupId>com.example</groupId>
193+
<artifactId>demo</artifactId>
194+
<version>0.0.1-SNAPSHOT</version>
195+
<dependencies>
196+
<dependency>
197+
<groupId>jakarta.mail</groupId>
198+
<artifactId>jakarta.mail-api</artifactId>
199+
<version>1.6.8</version>
200+
</dependency>
201+
</dependencies>
202+
</project>
203+
""",
204+
spec -> spec.after(pom -> assertThat(pom)
205+
.containsPattern("<version>2.0.\\d+</version>")
206+
.actual())
207+
)
208+
)
209+
);
210+
}
211+
212+
@Test
213+
void ignoresJakartaMailApiDependencyIfAlreadyExisting() {
214+
rewriteRun(
215+
mavenProject(
216+
"Sample",
217+
srcMainJava(
218+
//language=java
219+
java(
220+
"""
221+
import javax.mail.Session;
222+
public class TestApplication {
223+
}
224+
""",
225+
"""
226+
import jakarta.mail.Session;
227+
public class TestApplication {
228+
}
229+
"""
230+
)
231+
),
232+
//language=xml
233+
pomXml(
234+
"""
235+
<project>
182236
<modelVersion>4.0.0</modelVersion>
183237
<groupId>com.example</groupId>
184238
<artifactId>demo</artifactId>
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
/*
2+
* Copyright 2025 the original author or authors.
3+
* <p>
4+
* Licensed under the Moderne Source Available License (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
* <p>
8+
* https://docs.moderne.io/licensing/moderne-source-available-license
9+
* <p>
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.openrewrite.java.migrate.jakarta;
17+
18+
import org.junit.jupiter.api.Test;
19+
import org.openrewrite.java.JavaParser;
20+
import org.openrewrite.test.RecipeSpec;
21+
import org.openrewrite.test.RewriteTest;
22+
23+
import static org.assertj.core.api.Assertions.assertThat;
24+
import static org.openrewrite.java.Assertions.*;
25+
import static org.openrewrite.maven.Assertions.pomXml;
26+
27+
class JavaxServletToJakartaServletTest implements RewriteTest {
28+
@Override
29+
public void defaults(RecipeSpec spec) {
30+
spec.parser(JavaParser.fromJavaVersion()
31+
.classpath("javax.servlet-api-4.0.1"))
32+
.recipeFromResource(
33+
"/META-INF/rewrite/jakarta-ee-9.yml",
34+
"org.openrewrite.java.migrate.jakarta.JavaxServletToJakartaServlet");
35+
}
36+
37+
@Test
38+
void switchesJavaxServletApiDependencyToJakartaServletApiDependency() {
39+
rewriteRun(
40+
mavenProject(
41+
"Sample",
42+
//language=xml
43+
pomXml(
44+
"""
45+
<project>
46+
<modelVersion>4.0.0</modelVersion>
47+
<groupId>com.example</groupId>
48+
<artifactId>demo</artifactId>
49+
<version>0.0.1-SNAPSHOT</version>
50+
<dependencies>
51+
<dependency>
52+
<groupId>javax.servlet</groupId>
53+
<artifactId>javax.servlet-api</artifactId>
54+
<version>4.0.1</version>
55+
</dependency>
56+
</dependencies>
57+
</project>
58+
""",
59+
spec -> spec.after(pom -> assertThat(pom)
60+
.contains("<groupId>jakarta.servlet</groupId>")
61+
.contains("<artifactId>jakarta.servlet-api</artifactId>")
62+
.containsPattern("<version>5.0.\\d+</version>")
63+
.doesNotContain("<groupId>javax.servlet</groupId>")
64+
.doesNotContain("<artifactId>javax.servlet-api</artifactId>")
65+
.actual())
66+
)
67+
),
68+
srcMainJava(
69+
//language=java
70+
java(
71+
"""
72+
import javax.servlet.Filter;
73+
public class TestApplication {
74+
}
75+
""",
76+
"""
77+
import jakarta.servlet.Filter;
78+
public class TestApplication {
79+
}
80+
"""
81+
)
82+
)
83+
);
84+
}
85+
86+
@Test
87+
void addsJakartaServletApiDependencyIfJavaxServletApiOnlyExistsInTransitive() {
88+
rewriteRun(
89+
mavenProject(
90+
"Sample",
91+
srcMainJava(
92+
//language=java
93+
java(
94+
"""
95+
import javax.servlet.Filter;
96+
public class TestApplication {
97+
}
98+
""",
99+
"""
100+
import jakarta.servlet.Filter;
101+
public class TestApplication {
102+
}
103+
"""
104+
)
105+
),
106+
//language=xml
107+
pomXml(
108+
"""
109+
<project>
110+
<modelVersion>4.0.0</modelVersion>
111+
<groupId>com.example</groupId>
112+
<artifactId>demo</artifactId>
113+
<version>0.0.1-SNAPSHOT</version>
114+
<dependencies>
115+
<dependency>
116+
<groupId>org.springframework.boot</groupId>
117+
<artifactId>spring-boot</artifactId>
118+
<version>2.1.9.RELEASE</version>
119+
</dependency>
120+
</dependencies>
121+
</project>
122+
""",
123+
spec -> spec.after(pom -> assertThat(pom)
124+
.contains("<groupId>jakarta.servlet</groupId>")
125+
.contains("<artifactId>jakarta.servlet-api</artifactId>")
126+
.containsPattern("<version>5.0.\\d+</version>")
127+
.actual())
128+
)
129+
)
130+
);
131+
}
132+
133+
@Test
134+
void upgradesJakartaServletApiDependencyIfAlreadyExistingAtLowerVersion() {
135+
rewriteRun(
136+
mavenProject(
137+
"Sample",
138+
//language=xml
139+
pomXml(
140+
"""
141+
<project>
142+
<modelVersion>4.0.0</modelVersion>
143+
<groupId>com.example</groupId>
144+
<artifactId>demo</artifactId>
145+
<version>0.0.1-SNAPSHOT</version>
146+
<dependencies>
147+
<dependency>
148+
<groupId>jakarta.servlet</groupId>
149+
<artifactId>jakarta.servlet-api</artifactId>
150+
<version>4.0.4</version>
151+
</dependency>
152+
</dependencies>
153+
</project>
154+
""",
155+
spec -> spec.after(pom -> assertThat(pom)
156+
.containsPattern("<version>5.0.\\d+</version>")
157+
.actual())
158+
)
159+
)
160+
);
161+
}
162+
163+
@Test
164+
void ignoresJakartaServletApiDependencyIfAlreadyExisting() {
165+
rewriteRun(
166+
mavenProject(
167+
"Sample",
168+
srcMainJava(
169+
//language=java
170+
java(
171+
"""
172+
import javax.servlet.Filter;
173+
public class TestApplication {
174+
}
175+
""",
176+
"""
177+
import jakarta.servlet.Filter;
178+
public class TestApplication {
179+
}
180+
"""
181+
)
182+
),
183+
//language=xml
184+
pomXml(
185+
"""
186+
<project>
187+
<modelVersion>4.0.0</modelVersion>
188+
<groupId>com.example</groupId>
189+
<artifactId>demo</artifactId>
190+
<version>0.0.1-SNAPSHOT</version>
191+
<dependencies>
192+
<dependency>
193+
<groupId>jakarta.servlet</groupId>
194+
<artifactId>jakarta.servlet-api</artifactId>
195+
<version>5.0.0</version>
196+
</dependency>
197+
</dependencies>
198+
</project>
199+
"""
200+
)
201+
)
202+
);
203+
}
204+
}

0 commit comments

Comments
 (0)