From abd0ab5fc4cca95675b6cf7e32ec3ef53c3d3e8d Mon Sep 17 00:00:00 2001 From: seonghun lee Date: Wed, 16 Sep 2026 23:57:13 +0900 Subject: [PATCH] Convert 5-arg URL constructor with URLStreamHandler to URL.of The URLStreamHandler variant of the deprecated URL constructor was left out of URLConstructorsToNewURI, so occurrences like new URL(protocol, host, port, file, handler) were not migrated. Convert them to URL.of(new URI(protocol, null, host, port, file, null, null), handler), which preserves the custom handler. Fixes: https://github.com/openrewrite/rewrite-migrate-java/issues/849 --- .../migrate/net/URLConstructorsToNewURI.java | 16 ++++++++++ .../net/URLConstructorsToNewURITest.java | 30 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/main/java/org/openrewrite/java/migrate/net/URLConstructorsToNewURI.java b/src/main/java/org/openrewrite/java/migrate/net/URLConstructorsToNewURI.java index 1071f0ad3d..0cc600ab54 100644 --- a/src/main/java/org/openrewrite/java/migrate/net/URLConstructorsToNewURI.java +++ b/src/main/java/org/openrewrite/java/migrate/net/URLConstructorsToNewURI.java @@ -33,6 +33,7 @@ public class URLConstructorsToNewURI extends Recipe { private static final String URL_FQN = "java.net.URL"; private static final MethodMatcher methodMatcherThreeArg = new MethodMatcher(URL_FQN + " (java.lang.String, java.lang.String, java.lang.String)"); private static final MethodMatcher methodMatcherFourArg = new MethodMatcher(URL_FQN + " (java.lang.String, java.lang.String, int, java.lang.String)"); + private static final MethodMatcher methodMatcherFiveArg = new MethodMatcher(URL_FQN + " (java.lang.String, java.lang.String, int, java.lang.String, java.net.URLStreamHandler)"); @Getter final String displayName = "Convert `new URL(String, ..)` to `new URI(String, ..).toURL()`"; @@ -73,6 +74,21 @@ public J visitNewClass(J.NewClass nc, ExecutionContext ctx) { nc.getArguments().get(2), nc.getArguments().get(3)); } + if (methodMatcherFiveArg.matches(nc)) { + JavaTemplate template = JavaTemplate.builder("URL.of(new URI(#{any(String)}, null, #{any(String)}, #{any(int)}, #{any(String)}, null, null), #{any(java.net.URLStreamHandler)})") + .imports(URI_FQN, URL_FQN) + .contextSensitive() + .javaParser(JavaParser.fromJavaVersion()) + .build(); + + maybeAddImport(URI_FQN); + return template.apply(getCursor(), nc.getCoordinates().replace(), + nc.getArguments().get(0), + nc.getArguments().get(1), + nc.getArguments().get(2), + nc.getArguments().get(3), + nc.getArguments().get(4)); + } return super.visitNewClass(nc, ctx); } }); diff --git a/src/test/java/org/openrewrite/java/migrate/net/URLConstructorsToNewURITest.java b/src/test/java/org/openrewrite/java/migrate/net/URLConstructorsToNewURITest.java index 107d4cd8de..377ad61aa6 100644 --- a/src/test/java/org/openrewrite/java/migrate/net/URLConstructorsToNewURITest.java +++ b/src/test/java/org/openrewrite/java/migrate/net/URLConstructorsToNewURITest.java @@ -28,6 +28,36 @@ public void defaults(RecipeSpec spec) { spec.recipe(new URLConstructorsToNewURI()); } + @Test + void urlConstructorWithStreamHandler() { + rewriteRun( + //language=java + java( + """ + import java.net.URL; + import java.net.URLStreamHandler; + + class Test { + URL url(String protocol, String host, int port, String file, URLStreamHandler handler) throws Exception { + return new URL(protocol, host, port, file, handler); + } + } + """, + """ + import java.net.URI; + import java.net.URL; + import java.net.URLStreamHandler; + + class Test { + URL url(String protocol, String host, int port, String file, URLStreamHandler handler) throws Exception { + return URL.of(new URI(protocol, null, host, port, file, null, null), handler); + } + } + """ + ) + ); + } + @DocumentExample @Test void urlConstructor() {