Skip to content

Commit 6f08933

Browse files
committed
Guard UseJavaUtilBase64 from making changes when another "Base64" class is already present
1 parent b9da22f commit 6f08933

File tree

2 files changed

+62
-12
lines changed

2 files changed

+62
-12
lines changed

src/main/java/org/openrewrite/java/migrate/UseJavaUtilBase64.java

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@
2222
import org.openrewrite.java.search.UsesType;
2323
import org.openrewrite.java.tree.J;
2424
import org.openrewrite.java.tree.JavaSourceFile;
25+
import org.openrewrite.java.tree.JavaType;
26+
import org.openrewrite.marker.Markup;
2527

2628
import java.util.Base64;
29+
import java.util.Objects;
2730

2831
public class UseJavaUtilBase64 extends Recipe {
2932
private final String sunPackage;
@@ -79,6 +82,21 @@ protected JavaVisitor<ExecutionContext> getVisitor() {
7982
.imports("java.util.Base64")
8083
.build();
8184

85+
@Override
86+
public J visitJavaSourceFile(JavaSourceFile cu, ExecutionContext ctx) {
87+
if(alreadyUsingIncompatibleBase64(cu)) {
88+
return Markup.warn(cu, new IllegalStateException(
89+
"Already using a class named Base64 other than java.util.Base64. Manual intervention required."));
90+
}
91+
JavaSourceFile c = (JavaSourceFile) super.visitJavaSourceFile(cu, ctx);
92+
93+
c = (J.CompilationUnit) new ChangeType(sunPackage + ".BASE64Encoder", "java.util.Base64$Encoder", true)
94+
.getVisitor().visitNonNull(c, ctx);
95+
c = (J.CompilationUnit) new ChangeType(sunPackage + ".BASE64Decoder", "java.util.Base64$Decoder", true)
96+
.getVisitor().visitNonNull(c, ctx);
97+
return c;
98+
}
99+
82100
@Override
83101
public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) {
84102
J.MethodInvocation m = (J.MethodInvocation) super.visitMethodInvocation(method, ctx);
@@ -101,18 +119,6 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx)
101119
return m;
102120
}
103121

104-
@Override
105-
public J visitJavaSourceFile(JavaSourceFile cu, ExecutionContext ctx) {
106-
107-
JavaSourceFile c = (JavaSourceFile) super.visitJavaSourceFile(cu, ctx);
108-
109-
c = (J.CompilationUnit) new ChangeType(sunPackage + ".BASE64Encoder", "java.util.Base64$Encoder", true)
110-
.getVisitor().visitNonNull(c, ctx);
111-
c = (J.CompilationUnit) new ChangeType(sunPackage + ".BASE64Decoder", "java.util.Base64$Decoder", true)
112-
.getVisitor().visitNonNull(c, ctx);
113-
return c;
114-
}
115-
116122
@Override
117123
public J visitNewClass(J.NewClass newClass, ExecutionContext ctx) {
118124
J.NewClass c = (J.NewClass) super.visitNewClass(newClass, ctx);
@@ -130,4 +136,14 @@ public J visitNewClass(J.NewClass newClass, ExecutionContext ctx) {
130136
}
131137
};
132138
}
139+
140+
private boolean alreadyUsingIncompatibleBase64(JavaSourceFile cu) {
141+
return cu.getClasses().stream().anyMatch(it -> "Base64".equals(it.getSimpleName())) ||
142+
cu.getTypesInUse().getTypesInUse().stream()
143+
.filter(it -> it instanceof JavaType.FullyQualified)
144+
.map(JavaType.FullyQualified.class::cast)
145+
.map(JavaType.FullyQualified::getFullyQualifiedName)
146+
.filter(it -> !"java.util.Base64".equals(it))
147+
.anyMatch(it -> it.endsWith(".Base64"));
148+
}
133149
}

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import org.junit.jupiter.api.Test;
1919

20+
import org.openrewrite.Issue;
2021
import org.openrewrite.java.JavaParser;
2122
import org.openrewrite.test.RecipeSpec;
2223
import org.openrewrite.test.RewriteTest;
@@ -29,6 +30,7 @@ public class UseJavaUtilBase64Test implements RewriteTest {
2930
public void defaults(RecipeSpec spec) {
3031
spec.recipe(new UseJavaUtilBase64("test.sun.misc"))
3132
.parser(JavaParser.fromJavaVersion()
33+
.logCompilationWarningsAndErrors(true)
3234
//language=java
3335
.dependsOn(
3436
"""
@@ -168,4 +170,36 @@ void test(byte[] bBytes) {
168170
)
169171
);
170172
}
173+
174+
@Issue("https://github.com/openrewrite/rewrite-migrate-java/issues/212")
175+
@Test
176+
void otherBase64() {
177+
//language=java
178+
rewriteRun(
179+
java("""
180+
package test.sun.misc;
181+
182+
public class App {
183+
public static void main(String[] args) {
184+
String encode = new BASE64Encoder().encode(new byte[16]);
185+
}
186+
}
187+
188+
class Base64 {
189+
}
190+
""",
191+
"""
192+
/*~~(Already using a class named Base64 other than java.util.Base64. Manual intervention required.)~~>*/package test.sun.misc;
193+
194+
public class App {
195+
public static void main(String[] args) {
196+
String encode = new BASE64Encoder().encode(new byte[16]);
197+
}
198+
}
199+
200+
class Base64 {
201+
}
202+
""")
203+
);
204+
}
171205
}

0 commit comments

Comments
 (0)