2222import org .openrewrite .java .search .UsesType ;
2323import org .openrewrite .java .tree .J ;
2424import org .openrewrite .java .tree .JavaSourceFile ;
25+ import org .openrewrite .java .tree .JavaType ;
26+ import org .openrewrite .marker .Markup ;
2527
2628import java .util .Base64 ;
29+ import java .util .Objects ;
2730
2831public 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}
0 commit comments