Skip to content

Commit 23ddb3b

Browse files
ranuradhAnuRam123MBoegers
authored
Java 11 recipe for default keystore change (#667)
* first commit * add .yml and updated description * small update * post review comments * small updates * add no change tests and additional precondition for `java.security.KeyStore#getDefaultType()` --------- Co-authored-by: anuram <[email protected]> Co-authored-by: Merlin Bögershausen <[email protected]>
1 parent 3bdb201 commit 23ddb3b

File tree

3 files changed

+205
-1
lines changed

3 files changed

+205
-1
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
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;
17+
18+
19+
import org.openrewrite.ExecutionContext;
20+
import org.openrewrite.Preconditions;
21+
import org.openrewrite.Recipe;
22+
import org.openrewrite.TreeVisitor;
23+
import org.openrewrite.java.JavaVisitor;
24+
import org.openrewrite.java.MethodMatcher;
25+
import org.openrewrite.java.search.UsesJavaVersion;
26+
import org.openrewrite.java.search.UsesMethod;
27+
import org.openrewrite.java.tree.J;
28+
import org.openrewrite.java.tree.JavaType;
29+
import org.openrewrite.java.tree.Space;
30+
import org.openrewrite.marker.Markers;
31+
32+
import static org.openrewrite.Tree.randomId;
33+
34+
35+
public class ChangeDefaultKeyStore extends Recipe {
36+
private static final MethodMatcher KEYSTORE_METHOD_REF = new MethodMatcher("java.security.KeyStore getDefaultType()", true);
37+
38+
@Override
39+
public String getDisplayName() {
40+
return "Return String `jks` when `KeyStore.getDefaultType()` is called";
41+
}
42+
43+
@Override
44+
public String getDescription() {
45+
return "In Java 11 the default keystore was updated from JKS to PKCS12." + "As a result, applications relying on KeyStore.getDefaultType() may encounter issues after migrating, unless their JKS keystore has been converted to PKCS12." + "This recipe returns default key store of `jks` when `KeyStore.getDefaultType()` method is called to use the pre Java 11 default keystore.";
46+
}
47+
48+
@Override
49+
public TreeVisitor<?, ExecutionContext> getVisitor() {
50+
return Preconditions.check(
51+
Preconditions.and(
52+
new UsesJavaVersion<>(11),
53+
new UsesMethod<>("java.security.KeyStore getDefaultType()")),
54+
new JavaVisitor<ExecutionContext>() {
55+
@Override
56+
public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) {
57+
if (KEYSTORE_METHOD_REF.matches(method)) {
58+
return new J.Literal(randomId(), Space.EMPTY, Markers.EMPTY, "\"jks\"", "\"jks\"", null, JavaType.Primitive.String);
59+
}
60+
return super.visitMethodInvocation(method, ctx);
61+
}
62+
});
63+
}
64+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ recipeList:
7676
- org.openrewrite.java.migrate.ReplaceLocalizedStreamMethods
7777
- org.openrewrite.java.migrate.ArrayStoreExceptionToTypeNotPresentException
7878
- org.openrewrite.java.migrate.IllegalArgumentExceptionToAlreadyConnectedException
79-
79+
- org.openrewrite.java.migrate.ChangeDefaultKeyStore
8080
---
8181
type: specs.openrewrite.org/v1beta/recipe
8282
name: org.openrewrite.java.migrate.UpgradeBuildToJava11
@@ -292,3 +292,4 @@ recipeList:
292292
- org.openrewrite.java.ChangeMethodName:
293293
methodPattern: java.nio.file.Path get(..)
294294
newMethodName: of
295+
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/*
2+
* Copyright 2024 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;
17+
18+
import org.junit.jupiter.api.Test;
19+
import org.openrewrite.DocumentExample;
20+
import org.openrewrite.test.RecipeSpec;
21+
import org.openrewrite.test.RewriteTest;
22+
23+
import static org.openrewrite.java.Assertions.java;
24+
import static org.openrewrite.java.Assertions.javaVersion;
25+
26+
class ChangeDefaultKeyStoreTest implements RewriteTest {
27+
@Override
28+
public void defaults(RecipeSpec spec) {
29+
spec.recipe(new ChangeDefaultKeyStore())
30+
.allSources(src -> src.markers(javaVersion(11)));
31+
}
32+
33+
@DocumentExample
34+
@Test
35+
void keyStore() {
36+
rewriteRun(
37+
//language=java
38+
java(
39+
"""
40+
import java.io.FileInputStream;
41+
import java.io.IOException;
42+
import java.security.Key;
43+
import java.security.KeyStore;
44+
45+
class Foo {
46+
void bar() {
47+
try{
48+
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
49+
char[] password = "your_keystore_password".toCharArray();
50+
FileInputStream keystoreFile = new FileInputStream("path_to_your_keystore_file.jks");
51+
keystore.load(keystoreFile, password);
52+
}
53+
catch (Exception e) {
54+
e.printStackTrace();
55+
}
56+
}
57+
}
58+
""",
59+
"""
60+
import java.io.FileInputStream;
61+
import java.io.IOException;
62+
import java.security.Key;
63+
import java.security.KeyStore;
64+
65+
class Foo {
66+
void bar() {
67+
try{
68+
KeyStore keystore = KeyStore.getInstance("jks");
69+
char[] password = "your_keystore_password".toCharArray();
70+
FileInputStream keystoreFile = new FileInputStream("path_to_your_keystore_file.jks");
71+
keystore.load(keystoreFile, password);
72+
}
73+
catch (Exception e) {
74+
e.printStackTrace();
75+
}
76+
}
77+
}
78+
"""
79+
)
80+
);
81+
}
82+
83+
@Test
84+
void keepString() {
85+
rewriteRun(
86+
//language=java
87+
java(
88+
"""
89+
import java.io.FileInputStream;
90+
import java.io.IOException;
91+
import java.security.Key;
92+
import java.security.KeyStore;
93+
94+
class Foo {
95+
void bar() {
96+
try{
97+
KeyStore keystore = KeyStore.getInstance("jks");
98+
char[] password = "your_keystore_password".toCharArray();
99+
FileInputStream keystoreFile = new FileInputStream("path_to_your_keystore_file.jks");
100+
keystore.load(keystoreFile, password);
101+
}
102+
catch (Exception e) {
103+
e.printStackTrace();
104+
}
105+
}
106+
}
107+
""")
108+
);
109+
}
110+
111+
@Test
112+
void keepStringForJava8() {
113+
rewriteRun(
114+
//language=java
115+
java(
116+
"""
117+
import java.io.FileInputStream;
118+
import java.io.IOException;
119+
import java.security.Key;
120+
import java.security.KeyStore;
121+
122+
class Foo {
123+
void bar() {
124+
try{
125+
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
126+
char[] password = "your_keystore_password".toCharArray();
127+
FileInputStream keystoreFile = new FileInputStream("path_to_your_keystore_file.jks");
128+
keystore.load(keystoreFile, password);
129+
}
130+
catch (Exception e) {
131+
e.printStackTrace();
132+
}
133+
}
134+
}
135+
""",
136+
spec -> spec.markers(javaVersion(8)))
137+
);
138+
}
139+
}

0 commit comments

Comments
 (0)