Skip to content

Commit 4aa3f71

Browse files
Add Bouncy Castle upgrade recipe for Java < 8 (#790)
* add bouncycastle upgrade recipe for java < 8 * include in UpgradeToJava7 * * Add migration from Jdk15to18 -> Jdk18on * Add test for the added migration * Refactor tests * readability * fix test names * Slight polish * Move static method to the top --------- Co-authored-by: Tim te Beek <tim@moderne.io>
1 parent ad9a9d1 commit 4aa3f71

File tree

4 files changed

+158
-20
lines changed

4 files changed

+158
-20
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
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+
17+
---
18+
type: specs.openrewrite.org/v1beta/recipe
19+
name: org.openrewrite.java.migrate.BouncyCastleFromJdk15OnToJdk15to18
20+
displayName: Migrate Bouncy Castle from `jdk15on` to `jdk15to18` for Java < 8
21+
description: >-
22+
This recipe replaces the Bouncy Castle artifacts from `jdk15on` to `jdk15to18`.
23+
`jdk15on` isn't maintained anymore and `jdk18on` is only for Java 8 and above.
24+
The `jdk15to18` artifact is the up-to-date replacement of the unmaintained `jdk15on` for Java < 8.
25+
tags:
26+
- bouncycastle
27+
recipeList:
28+
- org.openrewrite.java.dependencies.ChangeDependency:
29+
oldGroupId: org.bouncycastle
30+
oldArtifactId: bcprov-jdk15on
31+
newArtifactId: bcprov-jdk15to18
32+
newVersion: latest.release
33+
- org.openrewrite.java.dependencies.ChangeDependency:
34+
oldGroupId: org.bouncycastle
35+
oldArtifactId: bcutil-jdk15on
36+
newArtifactId: bcutil-jdk15to18
37+
newVersion: latest.release
38+
- org.openrewrite.java.dependencies.ChangeDependency:
39+
oldGroupId: org.bouncycastle
40+
oldArtifactId: bcpkix-jdk15on
41+
newArtifactId: bcpkix-jdk15to18
42+
newVersion: latest.release
43+
- org.openrewrite.java.dependencies.ChangeDependency:
44+
oldGroupId: org.bouncycastle
45+
oldArtifactId: bcmail-jdk15on
46+
newArtifactId: bcmail-jdk15to18
47+
newVersion: latest.release
48+
- org.openrewrite.java.dependencies.ChangeDependency:
49+
oldGroupId: org.bouncycastle
50+
oldArtifactId: bcjmail-jdk15on
51+
newArtifactId: bcjmail-jdk15to18
52+
newVersion: latest.release
53+
- org.openrewrite.java.dependencies.ChangeDependency:
54+
oldGroupId: org.bouncycastle
55+
oldArtifactId: bcpg-jdk15on
56+
newArtifactId: bcpg-jdk15to18
57+
newVersion: latest.release
58+
- org.openrewrite.java.dependencies.ChangeDependency:
59+
oldGroupId: org.bouncycastle
60+
oldArtifactId: bctls-jdk15on
61+
newArtifactId: bctls-jdk15to18
62+
newVersion: latest.release

src/main/resources/META-INF/rewrite/bouncycastle-jdk18on.yml

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@
1717
---
1818
type: specs.openrewrite.org/v1beta/recipe
1919
name: org.openrewrite.java.migrate.BounceCastleFromJdk15OntoJdk18On
20-
displayName: Migrate BouncyCastle to jdk18on
20+
displayName: Migrate Bouncy Castle to `jdk18on`
2121
description: >-
22-
This recipe will upgrade BouncyCastle dependencies from -jdk15on to -jdk18on.
22+
This recipe will upgrade Bouncy Castle dependencies from `-jdk15on` or `-jdk15to18` to `-jdk18on`.
2323
tags:
2424
- bouncycastle
2525
recipeList:
26+
# -jdk15on migration
2627
- org.openrewrite.java.dependencies.ChangeDependency:
2728
oldGroupId: org.bouncycastle
2829
oldArtifactId: bcprov-jdk15on
@@ -58,3 +59,40 @@ recipeList:
5859
oldArtifactId: bctls-jdk15on
5960
newArtifactId: bctls-jdk18on
6061
newVersion: latest.release
62+
63+
# -jdk15to18 migration
64+
- org.openrewrite.java.dependencies.ChangeDependency:
65+
oldGroupId: org.bouncycastle
66+
oldArtifactId: bcprov-jdk15to18
67+
newArtifactId: bcprov-jdk18on
68+
newVersion: latest.release
69+
- org.openrewrite.java.dependencies.ChangeDependency:
70+
oldGroupId: org.bouncycastle
71+
oldArtifactId: bcutil-jdk15to18
72+
newArtifactId: bcutil-jdk18on
73+
newVersion: latest.release
74+
- org.openrewrite.java.dependencies.ChangeDependency:
75+
oldGroupId: org.bouncycastle
76+
oldArtifactId: bcpkix-jdk15to18
77+
newArtifactId: bcpkix-jdk18on
78+
newVersion: latest.release
79+
- org.openrewrite.java.dependencies.ChangeDependency:
80+
oldGroupId: org.bouncycastle
81+
oldArtifactId: bcmail-jdk15to18
82+
newArtifactId: bcmail-jdk18on
83+
newVersion: latest.release
84+
- org.openrewrite.java.dependencies.ChangeDependency:
85+
oldGroupId: org.bouncycastle
86+
oldArtifactId: bcjmail-jdk15to18
87+
newArtifactId: bcjmail-jdk18on
88+
newVersion: latest.release
89+
- org.openrewrite.java.dependencies.ChangeDependency:
90+
oldGroupId: org.bouncycastle
91+
oldArtifactId: bcpg-jdk15to18
92+
newArtifactId: bcpg-jdk18on
93+
newVersion: latest.release
94+
- org.openrewrite.java.dependencies.ChangeDependency:
95+
oldGroupId: org.bouncycastle
96+
oldArtifactId: bctls-jdk15to18
97+
newArtifactId: bctls-jdk18on
98+
newVersion: latest.release

src/main/resources/META-INF/rewrite/java-version-7.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ recipeList:
2828
- org.openrewrite.java.migrate.JREJdbcInterfaceNewMethods
2929
- org.openrewrite.java.migrate.JREThrowableFinalMethods
3030
- org.openrewrite.java.migrate.util.ReplaceMathRandomWithThreadLocalRandomRecipe
31+
- org.openrewrite.java.migrate.BouncyCastleFromJdk15OnToJdk15to18
3132
---
3233
type: specs.openrewrite.org/v1beta/recipe
3334
name: org.openrewrite.java.migrate.JREJdbcInterfaceNewMethods
@@ -69,4 +70,4 @@ recipeList:
6970
- org.openrewrite.java.migrate.AddMissingMethodImplementation:
7071
fullyQualifiedClassName: javax.sql.CommonDataSource
7172
methodPattern: "*..* getParentLogger()"
72-
methodTemplateString: "public java.util.logging.Logger getParentLogger() { \n\t// TODO Auto-generated method stub\n return null; }"
73+
methodTemplateString: "public java.util.logging.Logger getParentLogger() { \n\t// TODO Auto-generated method stub\n return null; }"

src/test/java/org/openrewrite/java/migrate/BouncyCastleTest.java

Lines changed: 54 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,42 +17,42 @@
1717

1818
import org.junit.jupiter.api.Test;
1919
import org.junit.jupiter.params.ParameterizedTest;
20-
import org.junit.jupiter.params.provider.ValueSource;
20+
import org.junit.jupiter.params.provider.MethodSource;
2121
import org.openrewrite.DocumentExample;
2222
import org.openrewrite.maven.tree.MavenResolutionResult;
2323
import org.openrewrite.maven.tree.Scope;
24-
import org.openrewrite.test.RecipeSpec;
2524
import org.openrewrite.test.RewriteTest;
2625

26+
import java.util.Arrays;
27+
import java.util.List;
28+
2729
import static java.util.function.UnaryOperator.identity;
2830
import static org.assertj.core.api.Assertions.assertThat;
2931
import static org.openrewrite.java.Assertions.mavenProject;
3032
import static org.openrewrite.maven.Assertions.pomXml;
3133

3234
class BouncyCastleTest implements RewriteTest {
3335

34-
@Override
35-
public void defaults(RecipeSpec spec) {
36-
spec.recipeFromResource(
37-
"/META-INF/rewrite/bouncycastle-jdk18on.yml",
38-
"org.openrewrite.java.migrate.BounceCastleFromJdk15OntoJdk18On");
36+
static List<String> artifactBaseNames() {
37+
return Arrays.asList("bcprov", "bcutil", "bcpkix", "bcmail", "bcjmail", "bcpg", "bctls");
3938
}
4039

4140
@DocumentExample
4241
@Test
4342
void document() {
4443
rewriteRun(
44+
spec -> spec.recipeFromResource(
45+
"/META-INF/rewrite/bouncycastle-jdk18on.yml",
46+
"org.openrewrite.java.migrate.BounceCastleFromJdk15OntoJdk18On"),
4547
mavenProject("project",
4648
//language=xml
4749
pomXml(
4850
"""
4951
<project>
5052
<modelVersion>4.0.0</modelVersion>
51-
5253
<groupId>com.mycompany.app</groupId>
5354
<artifactId>my-app</artifactId>
5455
<version>1</version>
55-
5656
<dependencies>
5757
<dependency>
5858
<groupId>org.bouncycastle</groupId>
@@ -86,31 +86,68 @@ void document() {
8686
);
8787
}
8888

89+
@ParameterizedTest
90+
@MethodSource("artifactBaseNames")
91+
void jdk15onToJdk18on(String artifactBaseName) {
92+
runBouncyCastleArtifactUpgradeRecipe(
93+
"/META-INF/rewrite/bouncycastle-jdk18on.yml",
94+
"org.openrewrite.java.migrate.BounceCastleFromJdk15OntoJdk18On",
95+
artifactBaseName,
96+
"jdk15on",
97+
"jdk18on"
98+
);
99+
}
89100

90101
@ParameterizedTest
91-
@ValueSource(strings = {"bcprov", "bcutil", "bcpkix", "bcmail", "bcjmail", "bcpg", "bctls"})
92-
void updateBouncyCastle(String value) {
102+
@MethodSource("artifactBaseNames")
103+
void jdk15to18ToJdk18on(String artifactBaseName) {
104+
runBouncyCastleArtifactUpgradeRecipe(
105+
"/META-INF/rewrite/bouncycastle-jdk18on.yml",
106+
"org.openrewrite.java.migrate.BounceCastleFromJdk15OntoJdk18On",
107+
artifactBaseName,
108+
"jdk15to18",
109+
"jdk18on"
110+
);
111+
}
112+
113+
@ParameterizedTest
114+
@MethodSource("artifactBaseNames")
115+
void jdk15onToJdk15To18(String artifactBaseName) {
116+
runBouncyCastleArtifactUpgradeRecipe(
117+
"/META-INF/rewrite/bouncycastle-jdk15to18.yml",
118+
"org.openrewrite.java.migrate.BouncyCastleFromJdk15OnToJdk15to18",
119+
artifactBaseName,
120+
"jdk15on",
121+
"jdk15to18"
122+
);
123+
}
124+
125+
void runBouncyCastleArtifactUpgradeRecipe(
126+
String yamlFile,
127+
String recipe,
128+
String baseArtifactId,
129+
String originalArtifactSuffix,
130+
String expectedArtifactSuffix) {
93131
rewriteRun(
132+
recipeSpec -> recipeSpec.recipeFromResource(yamlFile, recipe),
94133
mavenProject("project",
95134
//language=xml
96135
pomXml(
97-
"""
136+
"""
98137
<project>
99138
<modelVersion>4.0.0</modelVersion>
100-
101139
<groupId>com.mycompany.app</groupId>
102140
<artifactId>my-app</artifactId>
103141
<version>1</version>
104-
105142
<dependencies>
106143
<dependency>
107144
<groupId>org.bouncycastle</groupId>
108-
<artifactId>%s-jdk15on</artifactId>
145+
<artifactId>%s-%s</artifactId>
109146
<version>1.70</version>
110147
</dependency>
111148
</dependencies>
112149
</project>
113-
""".formatted(value),
150+
""".formatted(baseArtifactId, originalArtifactSuffix),
114151
spec -> spec
115152
.after(identity())
116153
.afterRecipe(doc -> assertThat(doc.getMarkers().findFirst(MavenResolutionResult.class)
@@ -119,7 +156,7 @@ void updateBouncyCastle(String value) {
119156
.singleElement()
120157
.satisfies(rd -> {
121158
assertThat(rd.getGroupId()).isEqualTo("org.bouncycastle");
122-
assertThat(rd.getArtifactId()).isEqualTo(value + "-jdk18on");
159+
assertThat(rd.getArtifactId()).isEqualTo(String.format("%s-%s", baseArtifactId, expectedArtifactSuffix));
123160
}))
124161
)
125162
)

0 commit comments

Comments
 (0)