From 0fa6e11f57c3bcf2671b1c640d977615e3ac5f2e Mon Sep 17 00:00:00 2001 From: Jente Sondervorst Date: Fri, 29 May 2026 23:57:57 +0200 Subject: [PATCH] Migrate `com.sun.xml.bind.marshaller.NamespacePrefixMapper` to `org.glassfish.jaxb.runtime.marshaller.NamespacePrefixMapper` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The JAXB RI relocated `NamespacePrefixMapper` as part of the 2.x→3.x repackaging that accompanies the `javax.xml.bind` → `jakarta.xml.bind` move. Wire a declarative `ChangeType` into `JavaxXmlBindMigrationToJakartaXmlBind` so subclasses migrate alongside the rest of the Jakarta XML Binding 3.0 wave. Refs: https://github.com/moderneinc/customer-requests/issues/2462 (item 8) --- .../META-INF/rewrite/jakarta-ee-9.yml | 4 ++ ...xXmlBindMigrationToJakartaXmlBindTest.java | 59 +++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/src/main/resources/META-INF/rewrite/jakarta-ee-9.yml b/src/main/resources/META-INF/rewrite/jakarta-ee-9.yml index 572ae46478..a0ca274043 100644 --- a/src/main/resources/META-INF/rewrite/jakarta-ee-9.yml +++ b/src/main/resources/META-INF/rewrite/jakarta-ee-9.yml @@ -986,6 +986,10 @@ recipeList: oldPackageName: javax.xml.bind newPackageName: jakarta.xml.bind recursive: true + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: com.sun.xml.bind.marshaller.NamespacePrefixMapper + newFullyQualifiedTypeName: org.glassfish.jaxb.runtime.marshaller.NamespacePrefixMapper + ignoreDefinition: true - org.openrewrite.maven.UpgradePluginVersion: groupId: org.codehaus.mojo artifactId: jaxb2-maven-plugin diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxXmlBindMigrationToJakartaXmlBindTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxXmlBindMigrationToJakartaXmlBindTest.java index 8b4223e864..bebb91cf75 100644 --- a/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxXmlBindMigrationToJakartaXmlBindTest.java +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxXmlBindMigrationToJakartaXmlBindTest.java @@ -53,6 +53,24 @@ public void defaults(RecipeSpec spec) { public @interface XmlElement {} """; + @Language("java") + private static final String SUN_NAMESPACE_PREFIX_MAPPER_STUB = """ + package com.sun.xml.bind.marshaller; + public abstract class NamespacePrefixMapper { + public abstract String[] getPreDeclaredNamespaceUris(); + public abstract String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix); + } + """; + + @Language("java") + private static final String GLASSFISH_NAMESPACE_PREFIX_MAPPER_STUB = """ + package org.glassfish.jaxb.runtime.marshaller; + public abstract class NamespacePrefixMapper { + public abstract String[] getPreDeclaredNamespaceUris(); + public abstract String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix); + } + """; + @DocumentExample @Test void dontRetainJaxbApiWhenJacksonNotPresent() { @@ -211,4 +229,45 @@ public class Test { ) ); } + + @Test + void migrateNamespacePrefixMapper() { + rewriteRun( + spec -> spec.parser(JavaParser.fromJavaVersion() + .dependsOn(SUN_NAMESPACE_PREFIX_MAPPER_STUB, GLASSFISH_NAMESPACE_PREFIX_MAPPER_STUB)), + //language=java + java( + """ + import com.sun.xml.bind.marshaller.NamespacePrefixMapper; + + public class MyPrefixMapper extends NamespacePrefixMapper { + @Override + public String[] getPreDeclaredNamespaceUris() { + return new String[0]; + } + + @Override + public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) { + return suggestion; + } + } + """, + """ + import org.glassfish.jaxb.runtime.marshaller.NamespacePrefixMapper; + + public class MyPrefixMapper extends NamespacePrefixMapper { + @Override + public String[] getPreDeclaredNamespaceUris() { + return new String[0]; + } + + @Override + public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) { + return suggestion; + } + } + """ + ) + ); + } }