diff --git a/src/main/java/org/openrewrite/java/migrate/jakarta/ChangeJaxbApiDependency.java b/src/main/java/org/openrewrite/java/migrate/jakarta/ChangeJaxbApiDependency.java new file mode 100644 index 0000000000..958dd0481a --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/jakarta/ChangeJaxbApiDependency.java @@ -0,0 +1,93 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import org.openrewrite.ExecutionContext; +import org.openrewrite.ScanningRecipe; +import org.openrewrite.SourceFile; +import org.openrewrite.Tree; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.dependencies.ChangeDependency; +import org.openrewrite.maven.tree.MavenResolutionResult; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +@Value +@EqualsAndHashCode(callSuper = false) +public class ChangeJaxbApiDependency extends ScanningRecipe { + private static final ChangeDependency CHANGE = new ChangeDependency( + "javax.xml.bind", "jaxb-api", "jakarta.xml.bind", "jakarta.xml.bind-api", "3.0.x", null, null, null); + + String displayName = "Migrate the JAXB API dependency unless Recorder still needs it"; + String description = "Migrate JAXB API coordinates while preserving the legacy API needed alongside Jakarta JAXB " + + "by external Arquillian Recorder 1.x binaries. Recorder modules migrated in the same reactor are excluded."; + + static class Accumulator { + final Set projects = new HashSet<>(); + final ChangeDependency.Accumulator dependency; + + Accumulator(ChangeDependency.Accumulator dependency) { + this.dependency = dependency; + } + } + + @Override + public Accumulator getInitialValue(ExecutionContext ctx) { + return new Accumulator(CHANGE.getInitialValue(ctx)); + } + + @Override + public TreeVisitor getScanner(Accumulator acc) { + TreeVisitor delegate = CHANGE.getScanner(acc.dependency); + return new TreeVisitor() { + @Override + public Tree preVisit(Tree tree, ExecutionContext ctx) { + stopAfterPreVisit(); + tree.getMarkers().findFirst(MavenResolutionResult.class) + .ifPresent(model -> acc.projects.add(RetainJaxbApiForArquillianRecorder.projectKey(model))); + if (tree instanceof SourceFile && delegate.isAcceptable((SourceFile) tree, ctx)) { + delegate.visit(tree, ctx); + } + return tree; + } + }; + } + + @Override + public TreeVisitor getVisitor(Accumulator acc) { + TreeVisitor delegate = CHANGE.getVisitor(acc.dependency); + return new TreeVisitor() { + @Override + public Tree preVisit(Tree tree, ExecutionContext ctx) { + stopAfterPreVisit(); + MavenResolutionResult model = tree.getMarkers().findFirst(MavenResolutionResult.class).orElse(null); + if (model != null && RetainJaxbApiForArquillianRecorder.hasJakartaApi(model) && + model.getDependencies().values().stream().flatMap(Collection::stream) + .anyMatch(d -> RetainJaxbApiForArquillianRecorder.externalRecorder(d, acc.projects))) { + return tree; + } + if (tree instanceof SourceFile && delegate.isAcceptable((SourceFile) tree, ctx)) { + return delegate.visitNonNull(tree, ctx); + } + return tree; + } + }; + } +} diff --git a/src/main/java/org/openrewrite/java/migrate/jakarta/DoesNotHaveProvidedApiDependency.java b/src/main/java/org/openrewrite/java/migrate/jakarta/DoesNotHaveProvidedApiDependency.java new file mode 100644 index 0000000000..1e3640674e --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/jakarta/DoesNotHaveProvidedApiDependency.java @@ -0,0 +1,76 @@ +/* + * Copyright 2025 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Recipe; +import org.openrewrite.Option; +import org.openrewrite.Tree; +import org.openrewrite.TreeVisitor; +import org.openrewrite.gradle.marker.GradleDependencyConfiguration; +import org.openrewrite.gradle.marker.GradleProject; +import org.openrewrite.marker.SearchResult; +import org.openrewrite.maven.tree.MavenResolutionResult; + +import java.util.Collection; +import java.util.List; + +@Value +@EqualsAndHashCode(callSuper = false) +public class DoesNotHaveProvidedApiDependency extends Recipe { + String displayName = "Build does not declare a provided API dependency"; + + String description = "Find build files without an explicitly provided or compile-only API, " + + "so adding a compile dependency does not promote a container-provided API to runtime scope."; + + @Option(displayName = "API coordinates", + description = "Legacy and Jakarta groupId:artifactId coordinates whose provided scope must be preserved.", + example = "javax.enterprise:cdi-api, jakarta.enterprise:jakarta.enterprise.cdi-api") + List coordinates; + + @Override + public TreeVisitor getVisitor() { + return new TreeVisitor() { + @Override + public Tree preVisit(Tree tree, ExecutionContext ctx) { + stopAfterPreVisit(); + MavenResolutionResult maven = tree.getMarkers().findFirst(MavenResolutionResult.class).orElse(null); + if (maven != null && maven.getDependencies().values().stream().flatMap(Collection::stream) + .anyMatch(d -> d.getDepth() == 0 && + "provided".equals(maven.getPom().getValue(d.getRequested().getScope())) && + coordinates.contains(d.getGroupId() + ":" + d.getArtifactId()))) { + return tree; + } + GradleProject gradle = tree.getMarkers().findFirst(GradleProject.class).orElse(null); + if (gradle != null) { + GradleDependencyConfiguration compileOnly = gradle.getConfiguration("compileOnly"); + if (compileOnly != null) { + for (String coordinate : coordinates) { + String[] ga = coordinate.split(":", 2); + if (ga.length == 2 && compileOnly.findRequestedDependency(ga[0], ga[1]) != null) { + return tree; + } + } + } + } + return SearchResult.found(tree); + } + }; + } + +} diff --git a/src/main/java/org/openrewrite/java/migrate/jakarta/HasJettyDependency.java b/src/main/java/org/openrewrite/java/migrate/jakarta/HasJettyDependency.java new file mode 100644 index 0000000000..26e7a8c3cf --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/jakarta/HasJettyDependency.java @@ -0,0 +1,91 @@ +/* + * Copyright 2025 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import org.openrewrite.ExecutionContext; +import org.openrewrite.ScanningRecipe; +import org.openrewrite.Tree; +import org.openrewrite.TreeVisitor; +import org.openrewrite.gradle.marker.GradleProject; +import org.openrewrite.marker.SearchResult; +import org.openrewrite.maven.tree.MavenResolutionResult; + +import java.util.Arrays; +import java.util.Collection; +import java.util.concurrent.atomic.AtomicBoolean; + +@Value +@EqualsAndHashCode(callSuper = false) +public class HasJettyDependency extends ScanningRecipe { + String displayName = "Build uses Jetty before version 12"; + + String description = "Mark the source set when a Maven or Gradle module depends on servlet or WebSocket artifacts relocated by the Jetty 12 migration. " + + "This permits updating the Java baseline in parent build files as well as the module using Jetty."; + + @Override + public AtomicBoolean getInitialValue(ExecutionContext ctx) { + return new AtomicBoolean(); + } + + @Override + public TreeVisitor getScanner(AtomicBoolean usesJetty) { + return new TreeVisitor() { + @Override + public Tree preVisit(Tree tree, ExecutionContext ctx) { + stopAfterPreVisit(); + tree.getMarkers().findFirst(MavenResolutionResult.class).ifPresent(model -> { + if (model.getDependencies().values().stream().flatMap(Collection::stream) + .filter(d -> d.getDepth() == 0) + .anyMatch(d -> isLegacyJetty(d.getGroupId(), d.getArtifactId(), d.getVersion()))) { + usesJetty.set(true); + } + }); + tree.getMarkers().findFirst(GradleProject.class).ifPresent(model -> { + if (model.getConfigurations().stream().flatMap(c -> c.getDirectResolved().stream()) + .anyMatch(d -> isLegacyJetty(d.getGroupId(), d.getArtifactId(), d.getVersion()))) { + usesJetty.set(true); + } + }); + return tree; + } + }; + } + + private static boolean isLegacyJetty(String groupId, String artifactId, String version) { + if (version == null || !version.matches("(?:8|9|10|11)(?:\\..*)?")) { + return false; + } + return "org.eclipse.jetty".equals(groupId) && Arrays.asList( + "apache-jsp", "jetty-servlets", "jetty-servlet", "jetty-webapp", "jetty-security", + "jetty-proxy", "jetty-annotations").contains(artifactId) || + "org.eclipse.jetty.websocket".equals(groupId) && Arrays.asList( + "websocket-api", "websocket-server", "websocket-client", + "javax-websocket-server-impl", "javax-websocket-client-impl").contains(artifactId); + } + + @Override + public TreeVisitor getVisitor(AtomicBoolean usesJetty) { + return new TreeVisitor() { + @Override + public Tree preVisit(Tree tree, ExecutionContext ctx) { + stopAfterPreVisit(); + return usesJetty.get() ? SearchResult.found(tree) : tree; + } + }; + } +} diff --git a/src/main/java/org/openrewrite/java/migrate/jakarta/InvocationContextGetConstructor.java b/src/main/java/org/openrewrite/java/migrate/jakarta/InvocationContextGetConstructor.java new file mode 100644 index 0000000000..13d47e2b6c --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/jakarta/InvocationContextGetConstructor.java @@ -0,0 +1,98 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import lombok.Getter; +import org.openrewrite.Cursor; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaParser; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.tree.*; + +public class InvocationContextGetConstructor extends Recipe { + @Getter + final String displayName = "Complete InvocationContext decorators"; + @Getter + final String description = "Delegate getConstructor() when a legacy InvocationContext wrapper delegates getMethod()."; + + @Override + public TreeVisitor getVisitor() { + return new JavaIsoVisitor() { + @Override + public J.NewClass visitNewClass(J.NewClass newClass, ExecutionContext ctx) { + J.NewClass n = super.visitNewClass(newClass, ctx); + if (n.getBody() != null && n.getClazz() != null && + TypeUtils.isOfClassType(n.getClazz().getType(), "jakarta.interceptor.InvocationContext")) { + n = n.withBody(complete(n.getBody(), updateCursor(n))); + } + return n; + } + + @Override + public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { + J.ClassDeclaration c = super.visitClassDeclaration(classDecl, ctx); + if (c.getKind() == J.ClassDeclaration.Kind.Type.Class && + TypeUtils.isAssignableTo("jakarta.interceptor.InvocationContext", c.getType()) && + c.getType() != null && (c.getType().getSupertype() == null || + "java.lang.Object".equals(c.getType().getSupertype().getFullyQualifiedName()))) { + c = c.withBody(complete(c.getBody(), updateCursor(c))); + } + return c; + } + + private J.Block complete(J.Block body, Cursor parent) { + Expression delegate = null; + for (Statement statement : body.getStatements()) { + if (!(statement instanceof J.MethodDeclaration)) { + continue; + } + J.MethodDeclaration method = (J.MethodDeclaration) statement; + if ("getConstructor".equals(method.getSimpleName()) && method.getMethodType() != null && + method.getMethodType().getParameterTypes().isEmpty()) { + return body; + } + if ("getMethod".equals(method.getSimpleName()) && method.getMethodType() != null && + method.getMethodType().getParameterTypes().isEmpty() && method.getBody() != null && + method.getBody().getStatements().size() == 1 && + method.getBody().getStatements().get(0) instanceof J.Return) { + Expression returned = ((J.Return) method.getBody().getStatements().get(0)).getExpression(); + if (returned instanceof J.MethodInvocation) { + J.MethodInvocation call = (J.MethodInvocation) returned; + Expression select = call.getSelect(); + if ("getMethod".equals(call.getSimpleName()) && + (select instanceof J.Identifier || select instanceof J.FieldAccess) && + TypeUtils.isAssignableTo("jakarta.interceptor.InvocationContext", select.getType())) { + delegate = select; + } + } + } + } + if (delegate == null) { + return body; + } + maybeAddImport("java.lang.reflect.Constructor"); + return JavaTemplate.builder("@Override public Constructor getConstructor() { return #{any(jakarta.interceptor.InvocationContext)}.getConstructor(); }") + .contextSensitive().imports("java.lang.reflect.Constructor") + .javaParser(JavaParser.fromJavaVersion().dependsOn( + "package jakarta.interceptor; public interface InvocationContext { java.lang.reflect.Method getMethod(); java.lang.reflect.Constructor getConstructor(); }")) + .build().apply(new Cursor(parent, body), body.getCoordinates().lastStatement(), delegate); + } + }; + } +} diff --git a/src/main/java/org/openrewrite/java/migrate/jakarta/JacksonProviderOverrides.java b/src/main/java/org/openrewrite/java/migrate/jakarta/JacksonProviderOverrides.java new file mode 100644 index 0000000000..64cc42884c --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/jakarta/JacksonProviderOverrides.java @@ -0,0 +1,88 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import lombok.Getter; +import org.openrewrite.Cursor; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Recipe; +import org.openrewrite.Tree; +import org.openrewrite.TreeVisitor; +import org.openrewrite.internal.ListUtils; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.VariableNameUtils; +import org.openrewrite.java.tree.Expression; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.JavaType; +import org.openrewrite.java.tree.Space; +import org.openrewrite.marker.Markers; + +public class JacksonProviderOverrides extends Recipe { + @Getter + final String displayName = "Migrate Jackson provider configuration overrides"; + @Getter + final String description = "Add and forward the default view parameter required by Jakarta Jackson providers."; + + @Override + public TreeVisitor getVisitor() { + return new JavaIsoVisitor() { + final MethodMatcher oldMethod = new MethodMatcher( + "com.fasterxml.jackson.jaxrs.base.ProviderBase _configForWriting(com.fasterxml.jackson.databind.ObjectMapper, java.lang.annotation.Annotation[])", true); + + @Override + public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, ExecutionContext ctx) { + if (!oldMethod.matches(method.getMethodType()) || method.getParameters().size() != 2) { + return super.visitMethodDeclaration(method, ctx); + } + String viewName = VariableNameUtils.generateVariableName("defaultView", getCursor(), + VariableNameUtils.GenerationStrategy.INCREMENT_NUMBER); + J.MethodDeclaration m = JavaTemplate.builder("#{}, #{}, Class " + viewName).contextSensitive().build() + .apply(getCursor(), method.getCoordinates().replaceParameters(), + method.getParameters().get(0).printTrimmed(getCursor()), + method.getParameters().get(1).printTrimmed(getCursor())); + m = m.withParameters(ListUtils.concat(method.getParameters(), m.getParameters().get(2))); + J.VariableDeclarations.NamedVariable view = ((J.VariableDeclarations) m.getParameters().get(2)).getVariables().get(0); + JavaType.Method updatedType = addView(method.getMethodType(), view.getType(), viewName); + m = m.withMethodType(updatedType).withName(m.getName().withType(updatedType)); + updateCursor(m).putMessage("jacksonDefaultView", view.getName()); + return super.visitMethodDeclaration(m, ctx); + } + + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation invocation, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(invocation, ctx); + if (!oldMethod.matches(mi)) { + return mi; + } + Cursor methodCursor = getCursor().dropParentUntil(value -> value instanceof J.MethodDeclaration || value instanceof J.CompilationUnit); + J.Identifier view = methodCursor.getMessage("jacksonDefaultView"); + Expression argument = view == null ? + new J.Literal(Tree.randomId(), Space.SINGLE_SPACE, Markers.EMPTY, null, "null", null, JavaType.Primitive.Null) : + view.withId(Tree.randomId()).withPrefix(Space.SINGLE_SPACE); + JavaType.Method updatedType = addView(mi.getMethodType(), JavaType.buildType("java.lang.Class"), "defaultView"); + return mi.withArguments(ListUtils.concat(mi.getArguments(), argument)).withMethodType(updatedType) + .withName(mi.getName().withType(updatedType)); + } + + private JavaType.Method addView(JavaType.Method method, JavaType type, String name) { + return method.withParameterTypes(ListUtils.concat(method.getParameterTypes(), type)) + .withParameterNames(ListUtils.concat(method.getParameterNames(), name)); + } + }; + } +} diff --git a/src/main/java/org/openrewrite/java/migrate/jakarta/JettyConnectorGetPort.java b/src/main/java/org/openrewrite/java/migrate/jakarta/JettyConnectorGetPort.java new file mode 100644 index 0000000000..6ff3815614 --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/jakarta/JettyConnectorGetPort.java @@ -0,0 +1,58 @@ +/* + * Copyright 2025 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaParser; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.tree.J; + +@Value +@EqualsAndHashCode(callSuper = false) +public class JettyConnectorGetPort extends Recipe { + String displayName = "Access Jetty connector ports through `NetworkConnector`"; + + String description = "Jetty 9 moved `getPort()` from `Connector` to `NetworkConnector`. " + + "Cast legacy connector receivers to the network connector interface when upgrading Jetty."; + + @Override + public TreeVisitor getVisitor() { + return new JavaIsoVisitor() { + final MethodMatcher getPort = new MethodMatcher("org.eclipse.jetty.server.Connector getPort()"); + final JavaTemplate template = JavaTemplate.builder("((NetworkConnector) #{any()}).getPort()") + .imports("org.eclipse.jetty.server.NetworkConnector") + .javaParser(JavaParser.fromJavaVersion().dependsOn( + "package org.eclipse.jetty.server; public interface NetworkConnector { int getPort(); }")) + .build(); + + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation m = super.visitMethodInvocation(method, ctx); + if (m.getSelect() != null && getPort.matches(m)) { + maybeAddImport("org.eclipse.jetty.server.NetworkConnector"); + return template.apply(getCursor(), m.getCoordinates().replace(), m.getSelect()); + } + return m; + } + }; + } +} diff --git a/src/main/java/org/openrewrite/java/migrate/jakarta/RetainJaxbApiForArquillianRecorder.java b/src/main/java/org/openrewrite/java/migrate/jakarta/RetainJaxbApiForArquillianRecorder.java new file mode 100644 index 0000000000..dfdddb9df3 --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/jakarta/RetainJaxbApiForArquillianRecorder.java @@ -0,0 +1,101 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import org.openrewrite.ExecutionContext; +import org.openrewrite.ScanningRecipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.maven.AddDependencyVisitor; +import org.openrewrite.maven.MavenIsoVisitor; +import org.openrewrite.maven.tree.MavenResolutionResult; +import org.openrewrite.maven.tree.ResolvedDependency; +import org.openrewrite.maven.tree.Scope; +import org.openrewrite.semver.Semver; +import org.openrewrite.semver.VersionComparator; +import org.openrewrite.xml.tree.Xml; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Value +@EqualsAndHashCode(callSuper = false) +public class RetainJaxbApiForArquillianRecorder extends ScanningRecipe> { + private static final VersionComparator JAKARTA_API = Objects.requireNonNull(Semver.validate("[3,)", null).getValue()); + String displayName = "Retain the JAXB 2 API for Arquillian Recorder 1.x"; + String description = "Retain the legacy JAXB API in Maven modules using Arquillian Recorder 1.x binaries, " + + "which still reference javax.xml.bind classes after the application's Jakarta migration."; + + @Override + public Set getInitialValue(ExecutionContext ctx) { + return new HashSet<>(); + } + + @Override + public TreeVisitor getScanner(Set projects) { + return new MavenIsoVisitor() { + @Override + public Xml.Document visitDocument(Xml.Document document, ExecutionContext ctx) { + projects.add(projectKey(getResolutionResult())); + return document; + } + }; + } + + static String projectKey(MavenResolutionResult model) { + return model.getPom().getGroupId() + ":" + model.getPom().getArtifactId() + ":" + model.getPom().getVersion(); + } + + static boolean hasJakartaApi(MavenResolutionResult model) { + return model.getDependencies().values().stream().flatMap(Collection::stream) + .anyMatch(d -> "jakarta.xml.bind".equals(d.getGroupId()) && + "jakarta.xml.bind-api".equals(d.getArtifactId()) && JAKARTA_API.isValid(null, d.getVersion())); + } + + static boolean externalRecorder(ResolvedDependency dependency, Set projects) { + return "org.arquillian.extension".equals(dependency.getGroupId()) && + dependency.getArtifactId().startsWith("arquillian-recorder-") && + dependency.getVersion().startsWith("1.") && + !projects.contains(dependency.getGroupId() + ":" + dependency.getArtifactId() + ":" + dependency.getVersion()); + } + + @Override + public TreeVisitor getVisitor(Set projects) { + return new MavenIsoVisitor() { + @Override + public Xml.Document visitDocument(Xml.Document document, ExecutionContext ctx) { + if (!hasJakartaApi(getResolutionResult())) { + return document; + } + for (Scope scope : new Scope[]{Scope.Compile, Scope.Runtime, Scope.Provided, Scope.Test}) { + for (ResolvedDependency dependency : getResolutionResult().getDependencies() + .getOrDefault(scope, Collections.emptyList())) { + if (externalRecorder(dependency, projects)) { + return (Xml.Document) new AddDependencyVisitor("javax.xml.bind", "jaxb-api", "2.3.x", null, + scope == Scope.Test ? "test" : "runtime", null, null, null, null, null) + .visitNonNull(document, ctx); + } + } + } + return document; + } + }; + } +} 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 fd289e493e..6a0d752367 100644 --- a/src/main/resources/META-INF/rewrite/jakarta-ee-9.yml +++ b/src/main/resources/META-INF/rewrite/jakarta-ee-9.yml @@ -30,6 +30,7 @@ preconditions: # NOTE: The spec versions in this section comes from https://github.com/jakartaee/jakartaee-api/blob/9.1.0/pom.xml recipeList: - org.openrewrite.java.migrate.javaee8 + - org.openrewrite.java.migrate.jakarta.JavaxRuntimeTypeNamesToJakarta - org.openrewrite.java.migrate.jakarta.JavaxActivationMigrationToJakartaActivation - org.openrewrite.java.migrate.jakarta.JavaxAnnotationMigrationToJakartaAnnotation - org.openrewrite.java.migrate.jakarta.JavaxAuthenticationMigrationToJakartaAuthentication @@ -40,6 +41,7 @@ recipeList: - org.openrewrite.java.migrate.jakarta.JavaxElToJakartaEl - org.openrewrite.java.migrate.jakarta.FileuploadToFileUpload2 - org.openrewrite.java.migrate.jakarta.JavaxEnterpriseToJakartaEnterprise + - org.openrewrite.java.migrate.jakarta.WeldToJakarta - org.openrewrite.java.migrate.jakarta.Faces2xMigrationToJakartaFaces3x - org.openrewrite.java.migrate.jakarta.JavaxInjectMigrationToJakartaInject - org.openrewrite.java.migrate.jakarta.JavaxInterceptorToJakartaInterceptor @@ -121,6 +123,12 @@ tags: preconditions: - org.openrewrite.Singleton recipeList: + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: javax.annotation + oldArtifactId: jsr250-api + newGroupId: jakarta.annotation + newArtifactId: jakarta.annotation-api + newVersion: 2.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: javax.annotation oldArtifactId: javax.annotation-api @@ -137,12 +145,7 @@ recipeList: groupId: jakarta.annotation artifactId: jakarta.annotation-api newVersion: 2.0.x - - org.openrewrite.java.dependencies.AddDependency: - groupId: jakarta.annotation - artifactId: jakarta.annotation-api - version: 2.0.x - onlyIfUsing: javax.annotation..* - acceptTransitive: true + - org.openrewrite.java.migrate.jakarta.AddJakartaAnnotationDependency - org.openrewrite.java.migrate.javax.AddApiDependencyForImports: packageName: jakarta.annotation groupId: jakarta.annotation @@ -282,6 +285,19 @@ tags: preconditions: - org.openrewrite.Singleton recipeList: + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-validator + newGroupId: org.hibernate.validator + newArtifactId: hibernate-validator + newVersion: 7.0.x + - org.openrewrite.java.dependencies.UpgradeDependencyVersion: + groupId: org.hibernate.validator + artifactId: hibernate-validator + newVersion: 7.0.x + - org.openrewrite.java.ReplaceStringLiteralValue: + oldLiteralValue: javax.validation:validation-api + newLiteralValue: jakarta.validation:jakarta.validation-api - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: javax.validation oldArtifactId: validation-api @@ -336,12 +352,7 @@ recipeList: groupId: jakarta.enterprise artifactId: jakarta.enterprise.cdi-api newVersion: 3.0.x - - org.openrewrite.java.dependencies.AddDependency: - groupId: jakarta.enterprise - artifactId: jakarta.enterprise.cdi-api - version: 3.0.x - onlyIfUsing: javax.decorator..* - acceptTransitive: true + - org.openrewrite.java.migrate.jakarta.AddJakartaCdiDependency - org.openrewrite.java.ChangePackage: oldPackageName: javax.decorator newPackageName: jakarta.decorator @@ -354,6 +365,18 @@ description: Java EE has been rebranded to Jakarta EE, necessitating a package r preconditions: - org.openrewrite.Singleton recipeList: + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.jboss.spec.javax.ejb + oldArtifactId: jboss-ejb-api_3.1_spec + newGroupId: jakarta.ejb + newArtifactId: jakarta.ejb-api + newVersion: 4.0.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: javax.ejb + oldArtifactId: ejb-api + newGroupId: jakarta.ejb + newArtifactId: jakarta.ejb-api + newVersion: 4.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: javax.ejb oldArtifactId: javax.ejb-api @@ -370,12 +393,7 @@ recipeList: groupId: jakarta.ejb artifactId: jakarta.ejb-api newVersion: 4.0.x - - org.openrewrite.java.dependencies.AddDependency: - groupId: jakarta.ejb - artifactId: jakarta.ejb-api - version: 4.0.x - onlyIfUsing: javax.ejb..* - acceptTransitive: true + - org.openrewrite.java.migrate.jakarta.AddJakartaEjbDependency - org.openrewrite.maven.UpgradePluginVersion: groupId: org.apache.maven.plugins artifactId: maven-ejb-plugin @@ -393,6 +411,12 @@ description: Java EE has been rebranded to Jakarta EE, necessitating a package r preconditions: - org.openrewrite.Singleton recipeList: + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: javax.el + oldArtifactId: el-api + newGroupId: jakarta.el + newArtifactId: jakarta.el-api + newVersion: 4.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: javax.el oldArtifactId: javax.el-api @@ -403,12 +427,7 @@ recipeList: groupId: jakarta.el artifactId: jakarta.el-api newVersion: 4.0.x - - org.openrewrite.java.dependencies.AddDependency: - groupId: jakarta.el - artifactId: jakarta.el-api - version: 4.0.x - onlyIfUsing: javax.el..* - acceptTransitive: true + - org.openrewrite.java.migrate.jakarta.AddJakartaElDependency - org.openrewrite.java.ChangePackage: oldPackageName: javax.el newPackageName: jakarta.el @@ -471,12 +490,7 @@ recipeList: groupId: jakarta.enterprise artifactId: jakarta.enterprise.cdi-api newVersion: 3.0.x - - org.openrewrite.java.dependencies.AddDependency: - groupId: jakarta.enterprise - artifactId: jakarta.enterprise.cdi-api - version: 3.0.x - onlyIfUsing: javax.enterprise..* - acceptTransitive: true + - org.openrewrite.java.migrate.jakarta.AddJakartaCdiDependency - org.openrewrite.java.ChangePackage: oldPackageName: javax.enterprise newPackageName: jakarta.enterprise @@ -509,12 +523,7 @@ recipeList: groupId: jakarta.inject artifactId: jakarta.inject-api newVersion: 2.0.x - - org.openrewrite.java.dependencies.AddDependency: - groupId: jakarta.inject - artifactId: jakarta.inject-api - version: 2.0.x - onlyIfUsing: javax.inject..* - acceptTransitive: true + - org.openrewrite.java.migrate.jakarta.AddJakartaInjectDependency - org.openrewrite.java.ChangePackage: oldPackageName: javax.inject newPackageName: jakarta.inject @@ -547,6 +556,7 @@ recipeList: oldPackageName: javax.interceptor newPackageName: jakarta.interceptor recursive: true + - org.openrewrite.java.migrate.jakarta.InvocationContextGetConstructor --- type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.migrate.jakarta.JavaxJmsToJakartaJms @@ -713,12 +723,7 @@ recipeList: groupId: jakarta.mail artifactId: jakarta.mail-api newVersion: 2.0.x - - org.openrewrite.java.dependencies.AddDependency: - groupId: jakarta.mail - artifactId: jakarta.mail-api - version: 2.0.x - onlyIfUsing: javax.mail.* - acceptTransitive: true + - org.openrewrite.java.migrate.jakarta.AddJakartaMailDependency - org.openrewrite.java.ChangePackage: oldPackageName: javax.mail newPackageName: jakarta.mail @@ -980,12 +985,7 @@ recipeList: groupId: jakarta.ws.rs artifactId: jakarta.ws.rs-api newVersion: 3.0.x - - org.openrewrite.java.dependencies.AddDependency: - groupId: jakarta.ws.rs - artifactId: jakarta.ws.rs-api - version: 3.0.x - onlyIfUsing: javax.ws.rs.core.* - acceptTransitive: true + - org.openrewrite.java.migrate.jakarta.AddJakartaRestDependency - org.openrewrite.java.ChangePackage: oldPackageName: javax.ws newPackageName: jakarta.ws @@ -1003,17 +1003,13 @@ preconditions: - org.openrewrite.Singleton recipeList: - org.openrewrite.java.migrate.javax.MigrateOneGfwJaxbDependencies - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: javax.xml.bind - oldArtifactId: jaxb-api - newGroupId: jakarta.xml.bind - newArtifactId: jakarta.xml.bind-api - newVersion: 3.0.x + - org.openrewrite.java.migrate.jakarta.ChangeJaxbApiDependency - org.openrewrite.java.migrate.jakarta.RetainJaxbApiForJackson - org.openrewrite.java.dependencies.UpgradeDependencyVersion: groupId: jakarta.xml.bind artifactId: jakarta.xml.bind-api newVersion: 3.0.x + - org.openrewrite.java.migrate.jakarta.RetainJaxbApiForArquillianRecorder - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.sun.xml.bind oldArtifactId: jaxb-impl @@ -1254,99 +1250,98 @@ description: >- preconditions: - org.openrewrite.Singleton recipeList: + - org.openrewrite.java.migrate.jakarta.JacksonProviderOverrides + # Raise older versions before changing coordinates, preserving newer versions and shared properties. + - org.openrewrite.java.dependencies.UpgradeDependencyVersion: + groupId: com.fasterxml.jackson.module + artifactId: jackson-module-jaxb-annotations + newVersion: 2.13.x + - org.openrewrite.java.dependencies.UpgradeDependencyVersion: + groupId: com.fasterxml.jackson.jaxrs + artifactId: jackson-jaxrs-* + newVersion: 2.13.x + - org.openrewrite.java.dependencies.UpgradeDependencyVersion: + groupId: com.fasterxml.jackson.datatype + artifactId: jackson-datatype-jsr353 + newVersion: 2.13.x # JAXB annotations support - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.fasterxml.jackson.module oldArtifactId: jackson-module-jaxb-annotations newGroupId: com.fasterxml.jackson.module newArtifactId: jackson-module-jakarta-xmlbind-annotations - newVersion: 2.13.x - org.openrewrite.maven.ChangeManagedDependencyGroupIdAndArtifactId: oldGroupId: com.fasterxml.jackson.module oldArtifactId: jackson-module-jaxb-annotations newGroupId: com.fasterxml.jackson.module newArtifactId: jackson-module-jakarta-xmlbind-annotations - newVersion: 2.13.x # JAXRS providers - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.fasterxml.jackson.jaxrs oldArtifactId: jackson-jaxrs-cbor-provider newGroupId: com.fasterxml.jackson.jakarta.rs newArtifactId: jackson-jakarta-rs-cbor-provider - newVersion: 2.13.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.fasterxml.jackson.jaxrs oldArtifactId: jackson-jaxrs-base newGroupId: com.fasterxml.jackson.jakarta.rs newArtifactId: jackson-jakarta-rs-base - newVersion: 2.13.x - org.openrewrite.maven.ChangeManagedDependencyGroupIdAndArtifactId: oldGroupId: com.fasterxml.jackson.jaxrs oldArtifactId: jackson-jaxrs-cbor-provider newGroupId: com.fasterxml.jackson.jakarta.rs newArtifactId: jackson-jakarta-rs-cbor-provider - newVersion: 2.13.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.fasterxml.jackson.jaxrs oldArtifactId: jackson-jaxrs-json-provider newGroupId: com.fasterxml.jackson.jakarta.rs newArtifactId: jackson-jakarta-rs-json-provider - newVersion: 2.13.x - org.openrewrite.maven.ChangeManagedDependencyGroupIdAndArtifactId: oldGroupId: com.fasterxml.jackson.jaxrs oldArtifactId: jackson-jaxrs-json-provider newGroupId: com.fasterxml.jackson.jakarta.rs newArtifactId: jackson-jakarta-rs-json-provider - newVersion: 2.13.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.fasterxml.jackson.jaxrs oldArtifactId: jackson-jaxrs-smile-provider newGroupId: com.fasterxml.jackson.jakarta.rs newArtifactId: jackson-jakarta-rs-smile-provider - newVersion: 2.13.x - org.openrewrite.maven.ChangeManagedDependencyGroupIdAndArtifactId: oldGroupId: com.fasterxml.jackson.jaxrs oldArtifactId: jackson-jaxrs-smile-provider newGroupId: com.fasterxml.jackson.jakarta.rs newArtifactId: jackson-jakarta-rs-smile-provider - newVersion: 2.13.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.fasterxml.jackson.jaxrs oldArtifactId: jackson-jaxrs-xml-provider newGroupId: com.fasterxml.jackson.jakarta.rs newArtifactId: jackson-jakarta-rs-xml-provider - newVersion: 2.13.x - org.openrewrite.maven.ChangeManagedDependencyGroupIdAndArtifactId: oldGroupId: com.fasterxml.jackson.jaxrs oldArtifactId: jackson-jaxrs-xml-provider newGroupId: com.fasterxml.jackson.jakarta.rs newArtifactId: jackson-jakarta-rs-xml-provider - newVersion: 2.13.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.fasterxml.jackson.jaxrs oldArtifactId: jackson-jaxrs-yaml-provider newGroupId: com.fasterxml.jackson.jakarta.rs newArtifactId: jackson-jakarta-rs-yaml-provider - newVersion: 2.13.x - org.openrewrite.maven.ChangeManagedDependencyGroupIdAndArtifactId: oldGroupId: com.fasterxml.jackson.jaxrs oldArtifactId: jackson-jaxrs-yaml-provider newGroupId: com.fasterxml.jackson.jakarta.rs newArtifactId: jackson-jakarta-rs-yaml-provider - newVersion: 2.13.x # JSONP datatypes - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.fasterxml.jackson.datatype oldArtifactId: jackson-datatype-jsr353 newGroupId: com.fasterxml.jackson.datatype newArtifactId: jackson-datatype-jakarta-jsonp - newVersion: 2.13.x - org.openrewrite.maven.ChangeManagedDependencyGroupIdAndArtifactId: oldGroupId: com.fasterxml.jackson.datatype oldArtifactId: jackson-datatype-jsr353 newGroupId: com.fasterxml.jackson.datatype newArtifactId: jackson-datatype-jakarta-jsonp - newVersion: 2.13.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.glassfish oldArtifactId: javax.json @@ -1563,6 +1558,8 @@ description: Update Jetty dependencies from version 9 to version 12. preconditions: - org.openrewrite.Singleton recipeList: + - org.openrewrite.java.migrate.jakarta.UpgradeJavaForJetty12 + - org.openrewrite.java.migrate.jakarta.JettyConnectorGetPort - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.eclipse.jetty.websocket oldArtifactId: websocket-api @@ -1635,6 +1632,45 @@ recipeList: newGroupId: org.eclipse.jetty.ee9 newArtifactId: jetty-ee9-annotations newVersion: 12.0.x + - org.openrewrite.java.migrate.jakarta.UpgradeJettyCoreDependencies + - org.openrewrite.java.ChangePackage: + oldPackageName: org.eclipse.jetty.servlet + newPackageName: org.eclipse.jetty.ee9.servlet + recursive: true + - org.openrewrite.java.ChangePackage: + oldPackageName: org.eclipse.jetty.servlets + newPackageName: org.eclipse.jetty.ee9.servlets + recursive: true + - org.openrewrite.java.ChangePackage: + oldPackageName: org.eclipse.jetty.webapp + newPackageName: org.eclipse.jetty.ee9.webapp + recursive: true + - org.openrewrite.java.ChangePackage: + oldPackageName: org.eclipse.jetty.annotations + newPackageName: org.eclipse.jetty.ee9.annotations + recursive: true +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.jakarta.UpgradeJettyCoreDependencies +displayName: Align legacy Jetty core dependencies with Jetty 12 +description: Upgrade explicitly declared Jetty core dependencies alongside the relocated servlet dependencies. +preconditions: + - org.openrewrite.java.migrate.jakarta.HasJettyDependency +recipeList: + - org.openrewrite.java.dependencies.UpgradeDependencyVersion: + groupId: org.eclipse.jetty + artifactId: '*' + newVersion: 12.0.x +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.jakarta.UpgradeJavaForJetty12 +displayName: Use Java 17 for Jetty 12 +description: Update the Java baseline of builds using Jetty to the minimum required by Jetty 12. +preconditions: + - org.openrewrite.java.migrate.jakarta.HasJettyDependency +recipeList: + - org.openrewrite.java.migrate.UpgradeJavaVersion: + version: 17 --- type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.migrate.jakarta.UpdateRestLet2_6 @@ -1667,3 +1703,194 @@ recipeList: groupId: org.apache.maven.plugins artifactId: maven-ear-plugin newVersion: 3.3.x + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.jakarta.JavaxRuntimeTypeNamesToJakarta +displayName: Migrate Jakarta EE runtime type names +description: Migrate CDI, EJB, Servlet and resource annotation names used for reflective lookup and annotation matching while retaining Java SE type names. +recipeList: + - org.openrewrite.java.ChangePackageInStringLiteral: + oldPackageName: javax.inject + newPackageName: jakarta.inject + - org.openrewrite.java.ChangePackageInStringLiteral: + oldPackageName: javax.enterprise + newPackageName: jakarta.enterprise + - org.openrewrite.java.ChangePackageInStringLiteral: + oldPackageName: javax.ejb + newPackageName: jakarta.ejb + - org.openrewrite.java.ChangePackageInStringLiteral: + oldPackageName: javax.servlet + newPackageName: jakarta.servlet + - org.openrewrite.java.ChangeTypeInStringLiteral: + oldFullyQualifiedTypeName: javax.annotation.Resource + newFullyQualifiedTypeName: jakarta.annotation.Resource + - org.openrewrite.java.ChangeTypeInStringLiteral: + oldFullyQualifiedTypeName: javax.annotation.Resources + newFullyQualifiedTypeName: jakarta.annotation.Resources + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.jakarta.WeldToJakarta +displayName: Migrate Weld implementations to Jakarta CDI +description: Replace legacy Weld core artifacts and upgrade javax-based Weld implementations to Weld 4, which implements Jakarta CDI 3. +recipeList: + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.jboss.weld + oldArtifactId: weld-core + newArtifactId: weld-core-impl + newVersion: 4.0.x + - org.openrewrite.java.dependencies.UpgradeDependencyVersion: + groupId: org.jboss.weld + artifactId: weld-core-impl + newVersion: 4.0.x + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.jakarta.AddJakartaCdiDependency +displayName: Add the Jakarta CDI API when needed +description: Add the Jakarta CDI API for migrated source without promoting an explicitly provided or compile-only API to a runtime dependency. +preconditions: + - org.openrewrite.java.migrate.jakarta.DoesNotHaveProvidedApiDependency: + coordinates: + - javax:javaee-api + - jakarta.platform:jakarta.jakartaee-api + - javax.enterprise:cdi-api + - jakarta.enterprise:jakarta.enterprise.cdi-api +recipeList: + - org.openrewrite.java.dependencies.AddDependency: + groupId: jakarta.enterprise + artifactId: jakarta.enterprise.cdi-api + version: 3.0.x + onlyIfUsing: javax.enterprise..* + acceptTransitive: true + - org.openrewrite.java.dependencies.AddDependency: + groupId: jakarta.enterprise + artifactId: jakarta.enterprise.cdi-api + version: 3.0.x + onlyIfUsing: javax.decorator..* + acceptTransitive: true + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.jakarta.AddJakartaAnnotationDependency +displayName: Add the Jakarta Annotation API when needed +description: Add the migrated API without promoting an explicitly provided or compile-only dependency. +preconditions: + - org.openrewrite.java.migrate.jakarta.DoesNotHaveProvidedApiDependency: + coordinates: + - javax.annotation:javax.annotation-api + - javax.annotation:jsr250-api + - org.glassfish.main:javax.annotation + - jakarta.annotation:jakarta.annotation-api +recipeList: + - org.openrewrite.java.dependencies.AddDependency: + groupId: jakarta.annotation + artifactId: jakarta.annotation-api + version: 2.0.x + onlyIfUsing: javax.annotation..* + acceptTransitive: true + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.jakarta.AddJakartaElDependency +displayName: Add the Jakarta El API when needed +description: Add the migrated API without promoting an explicitly provided or compile-only dependency. +preconditions: + - org.openrewrite.java.migrate.jakarta.DoesNotHaveProvidedApiDependency: + coordinates: + - javax.el:javax.el-api + - javax.el:el-api + - jakarta.el:jakarta.el-api +recipeList: + - org.openrewrite.java.dependencies.AddDependency: + groupId: jakarta.el + artifactId: jakarta.el-api + version: 4.0.x + onlyIfUsing: javax.el..* + acceptTransitive: true + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.jakarta.AddJakartaEjbDependency +displayName: Add the Jakarta Ejb API when needed +description: Add the migrated API without promoting an explicitly provided or compile-only dependency. +preconditions: + - org.openrewrite.java.migrate.jakarta.DoesNotHaveProvidedApiDependency: + coordinates: + - javax:javaee-api + - jakarta.platform:jakarta.jakartaee-api + - javax.ejb:javax.ejb-api + - javax.ejb:ejb-api + - org.glassfish.main:javax.ejb + - org.jboss.spec.javax.ejb:jboss-ejb-api_3.1_spec + - jakarta.ejb:jakarta.ejb-api +recipeList: + - org.openrewrite.java.dependencies.AddDependency: + groupId: jakarta.ejb + artifactId: jakarta.ejb-api + version: 4.0.x + onlyIfUsing: javax.ejb..* + acceptTransitive: true + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.jakarta.AddJakartaMailDependency +displayName: Add the Jakarta Mail API when needed +description: Add the migrated API without promoting an explicitly provided or compile-only dependency. +preconditions: + - org.openrewrite.java.migrate.jakarta.DoesNotHaveProvidedApiDependency: + coordinates: + - com.sun.mail:javax.mail + - com.sun.mail:jakarta.mail + - javax.mail:mail + - javax.mail:javax.mail-api + - jakarta.mail:jakarta.mail-api +recipeList: + - org.openrewrite.java.dependencies.AddDependency: + groupId: jakarta.mail + artifactId: jakarta.mail-api + version: 2.0.x + onlyIfUsing: javax.mail.* + acceptTransitive: true + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.jakarta.AddJakartaInjectDependency +displayName: Add the jakarta.inject API when needed +description: Add a standalone API only when no explicitly provided API or full platform already supplies it. +preconditions: + - org.openrewrite.java.migrate.jakarta.DoesNotHaveProvidedApiDependency: + coordinates: + - javax:javaee-api + - jakarta.platform:jakarta.jakartaee-api + - javax.inject:javax.inject + - javax.inject:javax.inject-api + - jakarta.inject:jakarta.inject-api +recipeList: + - org.openrewrite.java.dependencies.AddDependency: + groupId: jakarta.inject + artifactId: jakarta.inject-api + version: 2.0.x + onlyIfUsing: javax.inject..* + acceptTransitive: true + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.jakarta.AddJakartaRestDependency +displayName: Add the jakarta.ws.rs API when needed +description: Add a standalone API only when no explicitly provided API or full platform already supplies it. +preconditions: + - org.openrewrite.java.migrate.jakarta.DoesNotHaveProvidedApiDependency: + coordinates: + - javax:javaee-api + - jakarta.platform:jakarta.jakartaee-api + - javax.ws.rs:javax.ws.rs-api + - jakarta.ws.rs:jakarta.ws.rs-api +recipeList: + - org.openrewrite.java.dependencies.AddDependency: + groupId: jakarta.ws.rs + artifactId: jakarta.ws.rs-api + version: 3.0.x + onlyIfUsing: javax.ws.rs.core.* + acceptTransitive: true diff --git a/src/main/resources/META-INF/rewrite/recipes.csv b/src/main/resources/META-INF/rewrite/recipes.csv index bab461a438..430762daee 100644 --- a/src/main/resources/META-INF/rewrite/recipes.csv +++ b/src/main/resources/META-INF/rewrite/recipes.csv @@ -210,9 +210,18 @@ maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.i maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.io.ReplaceFileInOrOutputStreamFinalizeWithClose,Replace invocations of `finalize()` on `FileInputStream` and `FileOutputStream` with `close()`,Replace invocations of the deprecated `finalize()` method on `FileInputStream` and `FileOutputStream` with `close()`.,1,,`java.io` APIs,Modernize,Java,,,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.io.ReplaceSystemOutWithIOPrint,Migrate `System.out.print` to Java 25 IO utility class,"Replace `System.out.print()`, `System.out.println()` with `IO.print()` and `IO.println()`. Migrates to the new IO utility class introduced in Java 25.",1,,`java.io` APIs,Modernize,Java,,,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jacoco.UpgradeJaCoCo,Upgrade JaCoCo,"This recipe will upgrade JaCoCo to the latest patch version, which traditionally advertises full backwards compatibility for older Java versions.",3,,JaCoCo,Modernize,Java,,,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.AddJakartaAnnotationDependency,Add the Jakarta Annotation API when needed,Add the migrated API without promoting an explicitly provided or compile-only dependency.,2,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.AddJakartaCdiDependency,Add the Jakarta CDI API when needed,Add the Jakarta CDI API for migrated source without promoting an explicitly provided or compile-only API to a runtime dependency.,3,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.AddJakartaEjbDependency,Add the Jakarta Ejb API when needed,Add the migrated API without promoting an explicitly provided or compile-only dependency.,2,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.AddJakartaElDependency,Add the Jakarta El API when needed,Add the migrated API without promoting an explicitly provided or compile-only dependency.,2,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.AddJakartaInjectDependency,Add the jakarta.inject API when needed,Add a standalone API only when no explicitly provided API or full platform already supplies it.,2,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.AddJakartaMailDependency,Add the Jakarta Mail API when needed,Add the migrated API without promoting an explicitly provided or compile-only dependency.,2,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.AddJakartaRestDependency,Add the jakarta.ws.rs API when needed,Add a standalone API only when no explicitly provided API or full platform already supplies it.,2,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.AddJakartaXmlBindRuntime,Add a Jakarta JAXB runtime for Maven applications,Add a Jakarta JAXB 3 runtime when a Maven module calls JAXBContext.newInstance and has no explicit JAXB provider or provided Jakarta platform. Java 8's built-in javax provider cannot serve Jakarta calls. Annotation-only modules are left alone and test-only calls receive a test dependency.,1,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.ApplicationPathWildcardNoLongerAccepted,Remove trailing slash from `jakarta.ws.rs.ApplicationPath` values,Remove trailing `/*` from `jakarta.ws.rs.ApplicationPath` values.,1,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.ChangeJaxbApiDependency,Migrate the JAXB API dependency unless Recorder still needs it,Migrate JAXB API coordinates while preserving the legacy API needed alongside Jakarta JAXB by external Arquillian Recorder 1.x binaries. Recorder modules migrated in the same reactor are excluded.,1,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.DeprecatedCDIAPIsRemoved40,Remove deprecated API's not supported in CDI4.0,Deprecated APIs have been removed in CDI 4.0. This recipe removes and updates the corresponding deprecated methods.,4,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.DoesNotHaveProvidedApiDependency,Build does not declare a provided API dependency,"Find build files without an explicitly provided or compile-only API, so adding a compile dependency does not promote a container-provided API to runtime scope.",1,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,"[{""name"":""coordinates"",""type"":""List"",""displayName"":""API coordinates"",""description"":""Legacy and Jakarta groupId:artifactId coordinates whose provided scope must be preserved."",""example"":""javax.enterprise:cdi-api, jakarta.enterprise:jakarta.enterprise.cdi-api"",""required"":true}]", maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.EhcacheJavaxToJakarta,Migrate Ehcache from javax to jakarta namespace,Java EE has been rebranded to Jakarta EE. This recipe replaces existing Ehcache dependencies with their counterparts that are compatible with Jakarta EE 9.,5,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.Faces2xMigrationToJakartaFaces3x,JSF 2.x to Jakarta Faces 3.x,"Jakarta EE 9 uses Faces 3.0, a major upgrade to Jakarta packages and XML namespaces.",79,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.Faces3xMigrationToFaces4x,Upgrade to Jakarta Faces 4.x,Jakarta EE 10 uses Faces 4.0.,137,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, @@ -220,10 +229,13 @@ maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.j maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.FacesJNDINamesChanged,"JNDI name `jsf/ClientSideSecretKey` has been renamed to `faces/ClientSideSecretKey`, and the `jsf/FlashSecretKey` JNDI name has been renamed to `faces/FlashSecretKey`","The `jsf/ClientSideSecretKey` JNDI name has been renamed to `faces/ClientSideSecretKey`, and the `jsf/FlashSecretKey` JNDI name has been renamed to `faces/FlashSecretKey`. The JNDI keys that have been renamed are updated to allow use of the keys.",3,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.FacesManagedBeansRemoved,Substitute removed Faces Managed Beans,"This recipe substitutes Faces Managed Beans, which were deprecated in JavaServer Faces 2.3 and have been removed from Jakarta Faces 4.0.",15,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.FileuploadToFileUpload2,Migrate deprecated `org.apache.commons.fileload` packages to `org.apache.commons.fileload.core`,Migrate deprecated `org.apache.commons.fileload` packages to `org.apache.commons.fileload.core`.,6,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.HasJettyDependency,Build uses Jetty before version 12,Mark the source set when a Maven or Gradle module depends on servlet or WebSocket artifacts relocated by the Jetty 12 migration. This permits updating the Java baseline in parent build files as well as the module using Jetty.,1,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.HasNoJakartaAnnotations,Project has no Jakarta annotations,Mark all source as found per `JavaProject` where no Jakarta annotations are found. This is useful mostly as a precondition for recipes that require Jakarta annotations to be present.,1,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JacksonJavaxToJakarta,Migrate Jackson from javax to jakarta namespace,Java EE has been rebranded to Jakarta EE. This recipe replaces existing Jackson dependencies with their counterparts that are compatible with Jakarta EE 9.,23,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JakartaEE10,Migrate to Jakarta EE 10,"These recipes help with the Migration to Jakarta EE 10, flagging and updating deprecated methods.",615,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JakartaEE11,Migrate to Jakarta EE 11,"These recipes help with the Migration to Jakarta EE 11, flagging and updating deprecated methods.",633,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.InvocationContextGetConstructor,Complete InvocationContext decorators,Delegate getConstructor() when a legacy InvocationContext wrapper delegates getMethod().,1,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JacksonJavaxToJakarta,Migrate Jackson from javax to jakarta namespace,Java EE has been rebranded to Jakarta EE. This recipe replaces existing Jackson dependencies with their counterparts that are compatible with Jakarta EE 9.,27,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JacksonProviderOverrides,Migrate Jackson provider configuration overrides,Add and forward the default view parameter required by Jakarta Jackson providers.,1,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JakartaEE10,Migrate to Jakarta EE 10,"These recipes help with the Migration to Jakarta EE 10, flagging and updating deprecated methods.",666,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JakartaEE11,Migrate to Jakarta EE 11,"These recipes help with the Migration to Jakarta EE 11, flagging and updating deprecated methods.",684,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JakartaFacesConfigXml4,Migrate xmlns entries in `faces-config.xml` files,Jakarta EE 10 uses Faces version 4.,3,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JakartaFacesEcmaScript,Migrate JSF values inside EcmaScript files,"Convert JSF to Faces values inside JavaScript,TypeScript, and Properties files.",4,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JakartaFacesTagLibraryXml4,Migrate xmlns entries in `taglib.xml` files,Faces 4 uses facelet-taglib 4.0.,3,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, @@ -232,48 +244,50 @@ maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.j maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JakartaWebFragmentXml6,Migrate xmlns entries in `web-fragment.xml` files,Faces 4 uses web-fragment 6.0.,3,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JakartaWebXml6,Migrate xmlns entries in `web.xml` files,Faces 4 uses web-app 6.0.,3,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxActivationMigrationToJakartaActivation,Migrate deprecated `javax.activation` packages to `jakarta.activation`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",6,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxAnnotationMigrationToJakartaAnnotation,Migrate deprecated `javax.annotation` to `jakarta.annotation`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",9,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxAnnotationMigrationToJakartaAnnotation,Migrate deprecated `javax.annotation` to `jakarta.annotation`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",11,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxAuthenticationMigrationToJakartaAuthentication,Migrate deprecated `javax.security.auth.message` packages to `jakarta.security.auth.message`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",6,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxAuthorizationMigrationToJakartaAuthorization,Migrate deprecated `javax.security.jacc` packages to `jakarta.security.jacc`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",6,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxBatchMigrationToJakartaBatch,Migrate deprecated `javax.batch` packages to `jakarta.batch`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",5,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxBeanValidationXmlToJakartaBeanValidationXml,Migrate xmlns entries and javax. packages in `validation.xml` files,"Java EE has been rebranded to Jakarta EE, necessitating an XML namespace relocation.",5,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxBeansXmlToJakartaBeansXml,Migrate xmlns entries in `beans.xml` files,"Java EE has been rebranded to Jakarta EE, necessitating an XML namespace relocation.",4,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxDecoratorToJakartaDecorator,Migrate deprecated `javax.decorator` packages to `jakarta.decorator`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",5,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxDecoratorToJakartaDecorator,Migrate deprecated `javax.decorator` packages to `jakarta.decorator`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",7,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxEEApiToJakarta,Migrate deprecated `javaee-api` dependencies to `jakarta.platform`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",4,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxEjbJarXmlToJakartaEjbJarXml,Migrate xmlns entries and javax. packages in `ejb-jar.xml` files,"Java EE has been rebranded to Jakarta EE, necessitating an XML namespace relocation.",5,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxEjbToJakartaEjb,Migrate deprecated `javax.ejb` packages to `jakarta.ejb`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",8,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxElToJakartaEl,Migrate deprecated `javax.el` packages to `jakarta.el`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",5,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxEnterpriseToJakartaEnterprise,Migrate deprecated `javax.enterprise` packages to `jakarta.enterprise`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",7,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxEjbToJakartaEjb,Migrate deprecated `javax.ejb` packages to `jakarta.ejb`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",11,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxElToJakartaEl,Migrate deprecated `javax.el` packages to `jakarta.el`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",7,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxEnterpriseToJakartaEnterprise,Migrate deprecated `javax.enterprise` packages to `jakarta.enterprise`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",9,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxFacesConfigXmlToJakartaFacesConfigXml,Migrate xmlns entries in `faces-config.xml` files,"Java EE has been rebranded to Jakarta EE, necessitating an XML namespace relocation.",5,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxFacesTagLibraryXmlToJakartaFacesTagLibraryXml,Migrate xmlns entries in `taglib.xml` files,"Java EE has been rebranded to Jakarta EE, necessitating an XML namespace relocation.",5,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxInjectMigrationToJakartaInject,Migrate deprecated `javax.inject` packages to `jakarta.inject`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",6,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxInterceptorToJakartaInterceptor,Migrate deprecated `javax.interceptor` packages to `jakarta.interceptor`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",5,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxInjectMigrationToJakartaInject,Migrate deprecated `javax.inject` packages to `jakarta.inject`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",7,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxInterceptorToJakartaInterceptor,Migrate deprecated `javax.interceptor` packages to `jakarta.interceptor`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",6,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxJmsToJakartaJms,Migrate deprecated `javax.jms` packages to `jakarta.jms`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",6,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxJsonToJakartaJson,Migrate deprecated `javax.json` packages to `jakarta.json`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",5,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxJspToJakartaJsp,Migrate deprecated `javax.jsp` packages to `jakarta.jsp`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",6,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxJwsToJakartaJws,Migrate deprecated `javax.jws` packages to `jakarta.jws`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",6,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxMailToJakartaMail,Migrate deprecated `javax.mail` packages to `jakarta.mail`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",8,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta,Migrate to Jakarta EE 9,Jakarta EE 9 is the first version of Jakarta EE that uses the new `jakarta` namespace.,389,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxMailToJakartaMail,Migrate deprecated `javax.mail` packages to `jakarta.mail`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",9,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta,Migrate to Jakarta EE 9,Jakarta EE 9 is the first version of Jakarta EE that uses the new `jakarta` namespace.,440,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxOrmXmlToJakartaOrmXml,Migrate xmlns entries in `orm.xml` files,"Java EE has been rebranded to Jakarta EE, necessitating an XML namespace relocation.",4,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxPersistenceToJakartaPersistence,Migrate deprecated `javax.persistence` packages to `jakarta.persistence`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",6,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxPersistenceXmlToJakartaPersistenceXml,Migrate xmlns entries in `persistence.xml` files,"Java EE has been rebranded to Jakarta EE, necessitating an XML namespace relocation.",6,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxResourceToJakartaResource,Migrate deprecated `javax.resource` packages to `jakarta.resource`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",6,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxRuntimeTypeNamesToJakarta,Migrate Jakarta EE runtime type names,"Migrate CDI, EJB, Servlet and resource annotation names used for reflective lookup and annotation matching while retaining Java SE type names.",7,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxSecurityToJakartaSecurity,Migrate deprecated `javax.security.enterprise` packages to `jakarta.security.enterprise`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",5,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxServletToJakartaServlet,Migrate deprecated `javax.servlet` packages to `jakarta.servlet`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",5,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxToJakartaCdiExtensions,Rename CDI Extension to Jakarta,Rename `javax.enterprise.inject.spi.Extension` to `jakarta.enterprise.inject.spi.Extension`.,2,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxTransactionMigrationToJakartaTransaction,Migrate deprecated `javax.transaction` packages to `jakarta.transaction`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",6,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxValidationMigrationToJakartaValidation,Migrate deprecated `javax.validation` packages to `jakarta.validation`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",9,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxValidationMigrationToJakartaValidation,Migrate deprecated `javax.validation` packages to `jakarta.validation`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",12,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxWebFragmentXmlToJakartaWebFragmentXml,Migrate xmlns entries in `web-fragment.xml` files,"Java EE has been rebranded to Jakarta EE, necessitating an XML namespace relocation.",6,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxWebXmlToJakartaWebXml,Migrate xmlns entries in `web.xml` files,"Java EE has been rebranded to Jakarta EE, necessitating an XML namespace relocation.",6,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxWebsocketToJakartaWebsocket,Migrate deprecated `javax.websocket` packages to `jakarta.websocket`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",9,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxWsToJakartaWs,Migrate deprecated `javax.ws` packages to `jakarta.ws`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",13,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxXmlBindMigrationToJakartaXmlBind,Migrate deprecated `javax.xml.bind` packages to `jakarta.xml.bind`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",23,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxWsToJakartaWs,Migrate deprecated `javax.ws` packages to `jakarta.ws`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",14,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxXmlBindMigrationToJakartaXmlBind,Migrate deprecated `javax.xml.bind` packages to `jakarta.xml.bind`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",24,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxXmlSoapToJakartaXmlSoap,Migrate deprecated `javax.soap` packages to `jakarta.soap`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",5,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxXmlToJakartaXmlXJCBinding,Migrate XJC Bindings to Jakata XML,"Java EE has been rebranded to Jakarta EE, migrates the namespace and version in XJC bindings.",3,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JavaxXmlWsMigrationToJakartaXmlWs,Migrate deprecated `javax.xml.ws` packages to `jakarta.xml.ws`,"Java EE has been rebranded to Jakarta EE, necessitating a package relocation.",8,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JerseyLoggingFilterToFeature,Replace Jersey logging filter with logging feature,"Replace the removed Jersey `LoggingFilter(Logger, boolean)` constructor when passed directly to JAX-RS `Configurable.register`, preserving the logger and entity logging setting. Other usages require manual migration.",1,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JettyConnectorGetPort,Access Jetty connector ports through `NetworkConnector`,Jetty 9 moved `getPort()` from `Connector` to `NetworkConnector`. Cast legacy connector receivers to the network connector interface when upgrading Jetty.,1,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JettyUpgradeEE10,Update Jetty EE9 to Jetty EE10,"Update Jetty dependencies from EE9 to EE10, changing the groupId and artifactIds as needed.",14,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JettyUpgradeEE9,Update Jetty9 to Jetty12,Update Jetty dependencies from version 9 to version 12.,13,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JettyUpgradeEE9,Update Jetty9 to Jetty12,Update Jetty dependencies from version 9 to version 12.,31,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.JohnzonJavaxToJakarta,Migrate Johnzon from javax to jakarta namespace,Java EE has been rebranded to Jakarta EE. This recipe replaces existing Johnzon dependencies with their counterparts that are compatible with Jakarta EE 9.,3,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.MigrateFastjsonForJakarta10,Update Fastjson for Jakarta EE 10,Update Fastjson to be compatible with Jakarta EE 10.,19,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.MigratePluginsForJakarta10,Update Plugins for Jakarta EE 10,Update plugin to be compatible with Jakarta EE 10.,3,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""instanceName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" @@ -292,6 +306,7 @@ maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.j maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.RemovedUIComponentConstant,Replace `CURRENT_COMPONENT` and `CURRENT_COMPOSITE_COMPONENT` with `getCurrentComponent()` and `getCurrentCompositeComponent()`,Replace `jakarta.faces.component.UIComponent.CURRENT_COMPONENT` and `CURRENT_COMPOSITE_COMPONENT` constants with `jakarta.faces.component.UIComponent.getCurrentComponent()` and `getCurrentCompositeComponent()`. that were added in JSF 2.0.,3,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.ReplaceJakartaJwsWithJakartaXmlWs,Replace `jakarta.jws-api` with `jakarta.xml.ws-api`,"Starting with Jakarta EE 10, the standalone `jakarta.jws-api` artifact was retired and its content was merged into `jakarta.xml.ws-api`. This recipe replaces a declared `jakarta.jws:jakarta.jws-api` dependency in place with `jakarta.xml.ws:jakarta.xml.ws-api`, and adds `jakarta.xml.ws:jakarta.xml.ws-api` directly when `jakarta.jws` was only available transitively.",3,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.RestAssuredJavaxToJakarta,Migrate RestAssured from javax to jakarta namespace by upgrading to a version compatible with J2EE9,Java EE has been rebranded to Jakarta EE. This recipe replaces existing RestAssured dependencies with their counterparts that are compatible with Jakarta EE 9.,2,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.RetainJaxbApiForArquillianRecorder,Retain the JAXB 2 API for Arquillian Recorder 1.x,"Retain the legacy JAXB API in Maven modules using Arquillian Recorder 1.x binaries, which still reference javax.xml.bind classes after the application's Jakarta migration.",1,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.RetainJaxbApiForJackson,Retain `javax.xml.bind:jaxb-api` when `jackson-module-jaxb-annotations` is present,"When migrating from `javax.xml.bind` to `jakarta.xml.bind` 3.0+, the `javax.xml.bind:jaxb-api` dependency is normally replaced. However, if `jackson-module-jaxb-annotations` is on the classpath (and still uses the `javax.xml.bind` namespace), this recipe ensures `javax.xml.bind:jaxb-api` remains available as a runtime dependency to prevent `NoClassDefFoundError`.",2,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.ServletCookieBehaviorChangeRFC6265,Remove `getComment` and `getVersion` methods,"Jakarta Servlet methods have been deprecated for removal in Jakarta Servlet 6.0 to align with RFC 6265. In addition, the behavior of these methods has been changed so the setters no longer have any effect, the getComment methods return null, and the getVersion method returns 0. The deprecated methods are removed.",7,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.UpdateAddAnnotatedTypes,"Replace `BeforeBeanDiscovery.addAnnotatedType(AnnotatedType)` with `addAnnotatedType(AnnotatedType, String)`","`BeforeBeanDiscovery.addAnnotatedType(AnnotatedType)` is deprecated in CDI 1.1. It is Replaced by `BeforeBeanDiscovery.addAnnotatedType(AnnotatedType, String)`.",1,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, @@ -317,7 +332,10 @@ maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.j maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.UpgradeFaces3OpenSourceLibraries,Upgrade Faces open source libraries,"Upgrade PrimeFaces, OmniFaces, and MyFaces libraries to Jakarta EE9 versions.",8,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.UpgradeFaces41OpenSourceLibraries,Upgrade Faces open source libraries,Upgrade OmniFaces and MyFaces/Mojarra libraries to Jakarta EE11 versions.,5,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.UpgradeFaces4OpenSourceLibraries,Upgrade Faces open source libraries,"Upgrade PrimeFaces, OmniFaces, and MyFaces libraries to Jakarta EE10 versions.",8,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.UpgradeJavaForJetty12,Use Java 17 for Jetty 12,Update the Java baseline of builds using Jetty to the minimum required by Jetty 12.,11,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.UpgradeJettyCoreDependencies,Align legacy Jetty core dependencies with Jetty 12,Upgrade explicitly declared Jetty core dependencies alongside the relocated servlet dependencies.,2,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.UpgradeMavenEjbPluginConfiguration,Set `maven-ejb-plugin` ejbVersion to 4.0,"Updates the `` configuration of `maven-ejb-plugin` to `4.0` when the current value (or its resolved Maven property) indicates EJB 3.x. Handles the common pattern where `` is coupled to the `javax.ejb-api` dependency version via a shared property, decoupling them after migration.",1,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.WeldToJakarta,Migrate Weld implementations to Jakarta CDI,"Replace legacy Weld core artifacts and upgrade javax-based Weld implementations to Weld 4, which implements Jakarta CDI 3.",3,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.jakarta.WsWsocServerContainerDeprecation,Replace `doUpgrade(..)` with `ServerContainer.upgradeHttpToWebSocket(..)`,Deprecated `WsWsocServerContainer.doUpgrade(..)` is replaced by the Jakarta WebSocket 2.1 specification `ServerContainer.upgradeHttpToWebSocket(..)`.,3,,Jakarta,Modernize,Java,,Recipes for migrating to [Jakarta EE](https://jakarta.ee/).,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.javaee6,Migrate to JavaEE6,"These recipes help with the Migration to Java EE 6, flagging and updating deprecated methods.",2,,,Modernize,Java,,,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-migrate-java,org.openrewrite.java.migrate.javaee7,Migrate to JavaEE7,"These recipes help with the Migration to Java EE 7, flagging and updating deprecated methods.",8,,,Modernize,Java,,,Modernize your code to best use the project's current JDK version. Take advantage of newly available APIs and reduce the dependency of your code on third party dependencies where there is equivalent functionality in the Java standard library.,Basic building blocks for transforming Java code.,, diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/InvocationContextGetConstructorTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/InvocationContextGetConstructorTest.java new file mode 100644 index 0000000000..6a12699fd3 --- /dev/null +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/InvocationContextGetConstructorTest.java @@ -0,0 +1,135 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import org.junit.jupiter.api.Test; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class InvocationContextGetConstructorTest implements RewriteTest { + @Override + public void defaults(RecipeSpec spec) { + spec.recipe(new InvocationContextGetConstructor()).parser(JavaParser.fromJavaVersion().dependsOn( + "package jakarta.interceptor; public interface InvocationContext { java.lang.reflect.Method getMethod(); java.lang.reflect.Constructor getConstructor(); }" + )); + } + + @Test + void completeAnonymousDecorator() { + rewriteRun(java( + """ + import jakarta.interceptor.InvocationContext; + import java.lang.reflect.Method; + + class A { + InvocationContext wrap(InvocationContext delegate) { + return new InvocationContext() { + @Override + public Method getMethod() { + return delegate.getMethod(); + } + }; + } + } + """, + """ + import jakarta.interceptor.InvocationContext; + + import java.lang.reflect.Constructor; + import java.lang.reflect.Method; + + class A { + InvocationContext wrap(InvocationContext delegate) { + return new InvocationContext() { + @Override + public Method getMethod() { + return delegate.getMethod(); + } + + @Override + public Constructor getConstructor() { + return delegate.getConstructor(); + } + }; + } + } + """ + )); + } + @Test + void preserveExistingConstructorImplementation() { + rewriteRun(java( + """ + import jakarta.interceptor.InvocationContext; + import java.lang.reflect.Constructor; + import java.lang.reflect.Method; + class Wrapper implements InvocationContext { + InvocationContext delegate; + public Method getMethod() { return delegate.getMethod(); } + public Constructor getConstructor() { return null; } + } + """ + )); + } + + @Test + void doNotGuessForNonDelegatingContext() { + rewriteRun(java( + """ + import jakarta.interceptor.InvocationContext; + import java.lang.reflect.Method; + abstract class MethodContext implements InvocationContext { + public Method getMethod() { return null; } + } + """ + )); + } + + @Test + void completeNamedDecorator() { + rewriteRun(java( + """ + import jakarta.interceptor.InvocationContext; + import java.lang.reflect.Method; + + class Wrapper implements InvocationContext { + private InvocationContext delegate; + public Method getMethod() { return delegate.getMethod(); } + } + """, + """ + import jakarta.interceptor.InvocationContext; + + import java.lang.reflect.Constructor; + import java.lang.reflect.Method; + + class Wrapper implements InvocationContext { + private InvocationContext delegate; + public Method getMethod() { return delegate.getMethod(); } + + @Override + public Constructor getConstructor() { + return delegate.getConstructor(); + } + } + """ + )); + } + +} diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/JacksonJavaxtoJakartaTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/JacksonJavaxtoJakartaTest.java index 48131e069d..dc697ca2da 100644 --- a/src/test/java/org/openrewrite/java/migrate/jakarta/JacksonJavaxtoJakartaTest.java +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/JacksonJavaxtoJakartaTest.java @@ -36,6 +36,130 @@ public void defaults(RecipeSpec spec) { .activateRecipes("org.openrewrite.java.migrate.jakarta.JacksonJavaxToJakarta")); } + @Test + void retainNewerSharedJacksonVersion() { + rewriteRun( + pomXml( + """ + + 4.0.0 + com.example + app + 1.0 + + 2.16.0 + + + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${jackson.version} + + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + """, + """ + + 4.0.0 + com.example + app + 1.0 + + 2.16.0 + + + + + com.fasterxml.jackson.jakarta.rs + jackson-jakarta-rs-json-provider + ${jackson.version} + + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + """ + ) + ); + } + + @Test + void alignOlderSharedJacksonVersion() { + rewriteRun( + pomXml( + """ + + 4.0.0 + com.example + app + 1.0 + + 2.2.2 + + + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${jackson.version} + + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + """, + """ + + 4.0.0 + com.example + app + 1.0 + + 2.13.5 + + + + + com.fasterxml.jackson.jakarta.rs + jackson-jakarta-rs-json-provider + ${jackson.version} + + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + """ + ) + ); + } + @DocumentExample @Test void migrateJacksonDependencies() { diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/JacksonProviderOverridesTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/JacksonProviderOverridesTest.java new file mode 100644 index 0000000000..8daf35ce89 --- /dev/null +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/JacksonProviderOverridesTest.java @@ -0,0 +1,138 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import org.junit.jupiter.api.Test; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class JacksonProviderOverridesTest implements RewriteTest { + @Override + public void defaults(RecipeSpec spec) { + spec.recipe(new JacksonProviderOverrides()).parser(JavaParser.fromJavaVersion().dependsOn( + "package com.fasterxml.jackson.databind; public class ObjectMapper { public void configure() {} }", + "package com.fasterxml.jackson.jaxrs.base; public class ProviderBase { protected Object _configForWriting(com.fasterxml.jackson.databind.ObjectMapper m, java.lang.annotation.Annotation[] a) { return null; } }" + )); + } + + @Test + void forwardDefaultViewInOverride() { + rewriteRun(java( + """ + import com.fasterxml.jackson.databind.ObjectMapper; + import com.fasterxml.jackson.jaxrs.base.ProviderBase; + import java.lang.annotation.Annotation; + + class CustomProvider extends ProviderBase { + @Override + protected Object _configForWriting(ObjectMapper mapper, Annotation[] annotations) { + mapper.configure(); + return super._configForWriting(mapper, annotations); + } + } + """, + """ + import com.fasterxml.jackson.databind.ObjectMapper; + import com.fasterxml.jackson.jaxrs.base.ProviderBase; + import java.lang.annotation.Annotation; + + class CustomProvider extends ProviderBase { + @Override + protected Object _configForWriting(ObjectMapper mapper, Annotation[] annotations, Class defaultView) { + mapper.configure(); + return super._configForWriting(mapper, annotations, defaultView); + } + } + """ + )); + } + @Test + void leaveUnrelatedMethodUnchanged() { + rewriteRun(java( + """ + import com.fasterxml.jackson.databind.ObjectMapper; + import java.lang.annotation.Annotation; + class Unrelated { + Object _configForWriting(ObjectMapper mapper, Annotation[] annotations) { return null; } + } + """ + )); + } + + @Test + void avoidLocalNameCollision() { + rewriteRun(java( + """ + import com.fasterxml.jackson.databind.ObjectMapper; + import com.fasterxml.jackson.jaxrs.base.ProviderBase; + import java.lang.annotation.Annotation; + class CustomProvider extends ProviderBase { + protected Object _configForWriting(ObjectMapper mapper, Annotation[] annotations) { + Object defaultView = null; + return super._configForWriting(mapper, annotations); + } + } + """, + """ + import com.fasterxml.jackson.databind.ObjectMapper; + import com.fasterxml.jackson.jaxrs.base.ProviderBase; + import java.lang.annotation.Annotation; + class CustomProvider extends ProviderBase { + protected Object _configForWriting(ObjectMapper mapper, Annotation[] annotations, Class defaultView1) { + Object defaultView = null; + return super._configForWriting(mapper, annotations, defaultView1); + } + } + """ + )); + } + + @Test + void updatesCallsToTheMigratedOverride() { + rewriteRun(java( + """ + import com.fasterxml.jackson.databind.ObjectMapper; + import com.fasterxml.jackson.jaxrs.base.ProviderBase; + import java.lang.annotation.Annotation; + class CustomProvider extends ProviderBase { + protected Object _configForWriting(ObjectMapper mapper, Annotation[] annotations) { + return super._configForWriting(mapper, annotations); + } + Object configure(ObjectMapper mapper, Annotation[] annotations) { + return _configForWriting(mapper, annotations); + } + } + """, + """ + import com.fasterxml.jackson.databind.ObjectMapper; + import com.fasterxml.jackson.jaxrs.base.ProviderBase; + import java.lang.annotation.Annotation; + class CustomProvider extends ProviderBase { + protected Object _configForWriting(ObjectMapper mapper, Annotation[] annotations, Class defaultView) { + return super._configForWriting(mapper, annotations, defaultView); + } + Object configure(ObjectMapper mapper, Annotation[] annotations) { + return _configForWriting(mapper, annotations, null); + } + } + """ + )); + } + +} diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxEnterpriseToJakartaEnterpriseTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxEnterpriseToJakartaEnterpriseTest.java new file mode 100644 index 0000000000..b02a8ed0b1 --- /dev/null +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxEnterpriseToJakartaEnterpriseTest.java @@ -0,0 +1,133 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import org.junit.jupiter.api.Test; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.openrewrite.java.Assertions.*; +import static org.openrewrite.maven.Assertions.pomXml; + +class JavaxEnterpriseToJakartaEnterpriseTest implements RewriteTest { + @Override + public void defaults(RecipeSpec spec) { + spec.recipeFromResources("org.openrewrite.java.migrate.jakarta.JavaxEnterpriseToJakartaEnterprise"); + } + + @Test + void preservesProvidedCdiApi() { + rewriteRun( + spec -> spec.parser(JavaParser.fromJavaVersion().dependsOn( + "package javax.enterprise.inject.spi; public interface BeanManager {}")), + mavenProject("demo", + pomXml( + """ + + 4.0.0 + com.example + demo + 1.0 + + + javax.enterprise + cdi-api + 1.0 + provided + + + + """, + spec -> spec.after(pom -> assertThat(pom) + .contains("jakarta.enterprise.cdi-api", "provided") + .doesNotContain("compile").actual()) + ), + srcMainJava( + java( + "class A { javax.enterprise.inject.spi.BeanManager manager; }", + "class A { jakarta.enterprise.inject.spi.BeanManager manager; }" + ) + ) + ) + ); + } + @Test + void stillAddsMissingCdiApi() { + rewriteRun( + spec -> spec.parser(JavaParser.fromJavaVersion().dependsOn( + "package javax.enterprise.inject.spi; public interface BeanManager {}")), + mavenProject("demo", + pomXml( + """ + + 4.0.0 + com.example + demo + 1.0 + + """, + spec -> spec.after(pom -> assertThat(pom).contains("jakarta.enterprise.cdi-api").actual()) + ), + srcMainJava( + java( + "class A { javax.enterprise.inject.spi.BeanManager manager; }", + "class A { jakarta.enterprise.inject.spi.BeanManager manager; }" + ) + ) + ) + ); + } + + @Test + void promotesRuntimeApiForMainSource() { + rewriteRun( + spec -> spec.parser(JavaParser.fromJavaVersion().dependsOn( + "package javax.enterprise.inject.spi; public interface BeanManager {}")), + mavenProject("demo", + pomXml( + """ + + 4.0.0 + com.example + demo + 1.0 + + + javax.enterprise + cdi-api + 1.0 + runtime + + + + """, + spec -> spec.after(pom -> assertThat(pom) + .contains("jakarta.enterprise.cdi-api", "compile") + .doesNotContain("runtime").actual()) + ), + srcMainJava( + java( + "class A { javax.enterprise.inject.spi.BeanManager manager; }", + "class A { jakarta.enterprise.inject.spi.BeanManager manager; }" + ) + ) + ) + ); + } + +} diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxMailToJakartaMailTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxMailToJakartaMailTest.java index 7a59692c39..d6e5431e85 100644 --- a/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxMailToJakartaMailTest.java +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxMailToJakartaMailTest.java @@ -35,6 +35,102 @@ public void defaults(RecipeSpec spec) { "org.openrewrite.java.migrate.jakarta.JavaxMailToJakartaMail"); } + @Test + void preserveProvidedMailApiForMainSource() { + rewriteRun( + mavenProject("app", + srcMainJava( + java( + "import javax.mail.Session; class A { Session session; }", + "import jakarta.mail.Session; class A { Session session; }" + ) + ), + pomXml( + """ + + 4.0.0 + com.example + app + 1 + + + javax.mail + mail + 1.4.7 + provided + + + + """, + """ + + 4.0.0 + com.example + app + 1 + + + jakarta.mail + jakarta.mail-api + 2.0.2 + provided + + + + """ + ) + ) + ); + } + + @Test + void promoteRuntimeMailApiForMainSource() { + rewriteRun( + mavenProject("app", + srcMainJava( + java( + "import javax.mail.Session; class A { Session session; }", + "import jakarta.mail.Session; class A { Session session; }" + ) + ), + pomXml( + """ + + 4.0.0 + com.example + app + 1 + + + javax.mail + mail + 1.4.7 + runtime + + + + """, + """ + + 4.0.0 + com.example + app + 1 + + + jakarta.mail + jakarta.mail-api + 2.0.2 + compile + + + + """ + ) + ) + ); + } + @DocumentExample @Test void switchesJavaxMailApiDependencyToJakartaMailApiDependency() { diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxToJakartaTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxToJakartaTest.java index 1d4e0614d8..289fc7ee8c 100644 --- a/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxToJakartaTest.java +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxToJakartaTest.java @@ -73,6 +73,62 @@ public void foo() {} } """; + @Test + void migrateRuntimeTypeNamesWithoutChangingJavaSeNames() { + rewriteRun( + java( + """ + class A { + String inject = "javax.inject.Inject"; + String named = "javax.inject.Named"; + String manager = "javax.enterprise.inject.spi.BeanManager"; + String servlet = "javax.servlet.ServletContext"; + String ejb = "javax.ejb.EJB"; + String resource = "javax.annotation.Resource"; + String processor = "javax.annotation.processing.Processor"; + String context = "javax.naming.InitialContext"; + String ssl = "javax.net.ssl.SSLContext"; + String xa = "javax.transaction.xa.XAResource"; + } + """, + """ + class A { + String inject = "jakarta.inject.Inject"; + String named = "jakarta.inject.Named"; + String manager = "jakarta.enterprise.inject.spi.BeanManager"; + String servlet = "jakarta.servlet.ServletContext"; + String ejb = "jakarta.ejb.EJB"; + String resource = "jakarta.annotation.Resource"; + String processor = "javax.annotation.processing.Processor"; + String context = "javax.naming.InitialContext"; + String ssl = "javax.net.ssl.SSLContext"; + String xa = "javax.transaction.xa.XAResource"; + } + """ + ) + ); + } + + @Test + void migrateProgrammaticCdiServiceDescriptorPath() { + rewriteRun( + java( + """ + class A { + String service = "services/javax.enterprise.inject.spi.Extension"; + String resource = "META-INF/services/javax.enterprise.inject.spi.Extension"; + } + """, + """ + class A { + String service = "services/jakarta.enterprise.inject.spi.Extension"; + String resource = "META-INF/services/jakarta.enterprise.inject.spi.Extension"; + } + """ + ) + ); + } + @Override public void defaults(RecipeSpec spec) { spec.recipe( diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxValidationMigrationToJakartaValidationTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxValidationMigrationToJakartaValidationTest.java index df6b2bd027..147a1d8a0b 100644 --- a/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxValidationMigrationToJakartaValidationTest.java +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxValidationMigrationToJakartaValidationTest.java @@ -41,6 +41,66 @@ public void defaults(RecipeSpec spec) { ); } + @Test + void migrateLegacyHibernateValidatorProvider() { + rewriteRun( + pomXml( + """ + + 4.0.0 + com.example + app + 1 + + + org.hibernate + hibernate-validator + 4.3.0.Final + test + + + + """, + """ + + 4.0.0 + com.example + app + 1 + + + org.hibernate.validator + hibernate-validator + 7.0.5.Final + test + + + + """ + ) + ); + } + + @Test + void migratesVersionlessMavenCoordinateLiteral() { + rewriteRun( + java( + """ + class Deployment { + String coordinate = "javax.validation:validation-api"; + String unrelated = "example:validation-api"; + } + """, + """ + class Deployment { + String coordinate = "jakarta.validation:jakarta.validation-api"; + String unrelated = "example:validation-api"; + } + """ + ) + ); + } + @DocumentExample @Test void javaxValidationToJakartaValidation() { 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 09279f1a02..e943a758e9 100644 --- a/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxXmlBindMigrationToJakartaXmlBindTest.java +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/JavaxXmlBindMigrationToJakartaXmlBindTest.java @@ -409,4 +409,89 @@ void upgradeMoxyProvider() { ) ); } + + @Test + void retainsJavaxApiForUnmigratedArquillianRecorder() { + rewriteRun( + spec -> spec.cycles(3).expectedCyclesThatMakeChanges(1), + pomXml( + """ + + 4.0.0 + example + app + 1 + + + org.arquillian.extension + arquillian-recorder-screenshooter-impl-base + 1.1.6.Final + + + jakarta.xml.bind + jakarta.xml.bind-api + 2.3.3 + + + + """, + source -> source.after(pom -> assertThat(pom) + .contains("javax.xml.bind") + .contains("jaxb-api") + .contains("runtime") + .containsPattern("3\\.0\\.\\d+").actual()) + ) + ); + } + + @Test + void retainsApiInRecorderModule() { + rewriteRun( + mavenProject("parent", + pomXml( + """ + + 4.0.0 + example + parent + 1 + pom + child + + """ + ), + mavenProject("child", + pomXml( + """ + + 4.0.0 + + example + parent + 1 + + child + + + org.arquillian.extension + arquillian-recorder-screenshooter-impl-base + 1.1.6.Final + + + jakarta.xml.bind + jakarta.xml.bind-api + 2.3.3 + + + + """, + source -> source.after(pom -> assertThat(pom) + .contains("javax.xml.bind") + .contains("jaxb-api") + .contains("runtime").actual()) + ) + ) + ) + ); + } } diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/JettyUpgradeEE9Test.java b/src/test/java/org/openrewrite/java/migrate/jakarta/JettyUpgradeEE9Test.java new file mode 100644 index 0000000000..aa96101b00 --- /dev/null +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/JettyUpgradeEE9Test.java @@ -0,0 +1,221 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import org.junit.jupiter.api.Test; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.maven.Assertions.pomXml; + +class JettyUpgradeEE9Test implements RewriteTest { + @Override + public void defaults(RecipeSpec spec) { + spec.recipeFromResources("org.openrewrite.java.migrate.jakarta.JettyUpgradeEE9"); + } + + @Test + void alignsServerServletAndJavaVersion() { + rewriteRun( + pomXml( + """ + + 4.0.0 + com.example + demo + 1.0 + + 11 + 11 + + + + org.eclipse.jetty + jetty-server + 9.4.58.v20250814 + + + org.eclipse.jetty + jetty-servlet + 9.4.58.v20250814 + + + + """, + spec -> spec.after(pom -> assertThat(pom) + .doesNotContain("9.4.58.v20250814", ">111712\\.0\\.\\d+") + .actual()) + ) + ); + } + + @Test + void relocatesServletTypes() { + rewriteRun( + spec -> spec.parser(JavaParser.fromJavaVersion().dependsOn( + "package org.eclipse.jetty.servlet; public class ServletContextHandler {}")), + java( + """ + import org.eclipse.jetty.servlet.ServletContextHandler; + class ServerTest { ServletContextHandler context; } + """, + """ + import org.eclipse.jetty.ee9.servlet.ServletContextHandler; + class ServerTest { ServletContextHandler context; } + """ + ) + ); + } + + @Test + void castsLegacyConnectorPortAccess() { + rewriteRun( + spec -> spec.parser(JavaParser.fromJavaVersion().dependsOn( + "package org.eclipse.jetty.server; public interface Connector { int getPort(); }")), + java( + """ + import org.eclipse.jetty.server.Connector; + class ServerTest { int port(Connector connector) { return connector.getPort(); } } + """, + """ + import org.eclipse.jetty.server.Connector; + import org.eclipse.jetty.server.NetworkConnector; + + class ServerTest { int port(Connector connector) { return ((NetworkConnector) connector).getPort(); } } + """ + ) + ); + } + + @Test + void retainsSharedJettySecurityTypes() { + rewriteRun( + spec -> spec.parser(JavaParser.fromJavaVersion().dependsOn( + "package org.eclipse.jetty.security; public class HashLoginService {}")), + java( + """ + import org.eclipse.jetty.security.HashLoginService; + class ServerTest { HashLoginService login; } + """ + ) + ); + } + + @Test + void doesNotChangeJavaVersionWithoutJetty() { + rewriteRun( + pomXml( + """ + + 4.0.0 + com.example + demo + 1.0 + + 8 + 8 + + + """ + ) + ); + } + + @Test + void doesNotDowngradeNewerJetty() { + rewriteRun( + pomXml( + """ + + 4.0.0 + com.example + demo + 1.0 + + 21 + 21 + + + + org.eclipse.jetty + jetty-server + 12.1.0 + + + + """ + ) + ); + } + @Test + void leavesStandaloneJettyCoreAlone() { + rewriteRun( + pomXml( + """ + + 4.0.0 + com.example + demo + 1.0 + + 8 + 8 + + + + org.eclipse.jetty + jetty-util + 9.4.58.v20250814 + + + + """ + ) + ); + } + @Test + void leavesTransitiveServletDependenciesAlone() { + rewriteRun( + pomXml( + """ + + 4.0.0 + com.example + demo + 1.0 + + 8 + 8 + + + + org.eclipse.jetty + jetty-deploy + 9.4.58.v20250814 + + + + """ + ) + ); + } + +} diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/LegacyJakartaApiCoordinatesTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/LegacyJakartaApiCoordinatesTest.java new file mode 100644 index 0000000000..aff9aaec00 --- /dev/null +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/LegacyJakartaApiCoordinatesTest.java @@ -0,0 +1,64 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.openrewrite.test.RewriteTest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.openrewrite.java.Assertions.*; +import static org.openrewrite.maven.Assertions.pomXml; + +class LegacyJakartaApiCoordinatesTest implements RewriteTest { + @ParameterizedTest + @CsvSource({ + "JavaxAnnotationMigrationToJakartaAnnotation,javax.annotation,jsr250-api,1.0,annotation,Resource", + "JavaxElToJakartaEl,javax.el,el-api,2.2,el,ExpressionFactory", + "JavaxEjbToJakartaEjb,javax.ejb,ejb-api,3.0,ejb,EJB", + "JavaxEjbToJakartaEjb,org.jboss.spec.javax.ejb,jboss-ejb-api_3.1_spec,1.0.2.Final,ejb,EJB" + }) + void migratesLegacyApiAndPreservesProvidedScope(String recipe, String group, String artifact, + String version, String namespace, String type) { + rewriteRun( + spec -> spec.recipeFromResources("org.openrewrite.java.migrate.jakarta." + recipe), + mavenProject("demo", + pomXml( + """ + + 4.0.0 + com.example + demo + 1.0 + + + %s + %s + %s + provided + + + + """.formatted(group, artifact, version), + spec -> spec.after(pom -> assertThat(pom) + .contains("jakarta." + namespace + "", + "jakarta." + namespace + "-api", "provided") + .doesNotContain("" + artifact + "", "compile").actual()) + ) + ) + ); + } +} diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/ProvidedJakartaApiScopeTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/ProvidedJakartaApiScopeTest.java new file mode 100644 index 0000000000..31dda6a020 --- /dev/null +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/ProvidedJakartaApiScopeTest.java @@ -0,0 +1,74 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RewriteTest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.openrewrite.java.Assertions.*; +import static org.openrewrite.maven.Assertions.pomXml; + +class ProvidedJakartaApiScopeTest implements RewriteTest { + @ParameterizedTest + @CsvSource({ + "JavaxAnnotationMigrationToJakartaAnnotation,javax.annotation,jsr250-api,1.0,annotation,Resource", + "JavaxElToJakartaEl,javax.el,el-api,2.2,el,ExpressionFactory", + "JavaxEjbToJakartaEjb,javax.ejb,ejb-api,3.0,ejb,EJB", + "JavaxEjbToJakartaEjb,org.jboss.spec.javax.ejb,jboss-ejb-api_3.1_spec,1.0.2.Final,ejb,EJB", + "JavaxMailToJakartaMail,javax.mail,mail,1.4.7,mail,Session" + }) + void migratesLegacyApiAndPreservesProvidedScope(String recipe, String group, String artifact, + String version, String namespace, String type) { + rewriteRun( + spec -> spec.recipeFromResources("org.openrewrite.java.migrate.jakarta." + recipe) + .parser(JavaParser.fromJavaVersion().dependsOn( + "package javax." + namespace + "; public class " + type + " {}")), + mavenProject("demo", + pomXml( + """ + + 4.0.0 + com.example + demo + 1.0 + + + %s + %s + %s + provided + + + + """.formatted(group, artifact, version), + spec -> spec.after(pom -> assertThat(pom) + .contains("jakarta." + namespace + "", + "jakarta." + namespace + "-api", "provided") + .doesNotContain("" + artifact + "", "compile").actual()) + ), + srcMainJava( + java( + "class A { javax." + namespace + "." + type + " api; }", + "class A { jakarta." + namespace + "." + type + " api; }" + ) + ) + ) + ); + } +} diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/ProvidedJakartaPlatformApiTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/ProvidedJakartaPlatformApiTest.java new file mode 100644 index 0000000000..7464ab0734 --- /dev/null +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/ProvidedJakartaPlatformApiTest.java @@ -0,0 +1,66 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.*; +import static org.openrewrite.maven.Assertions.pomXml; + +class ProvidedJakartaPlatformApiTest implements RewriteTest { + @ParameterizedTest + @CsvSource({ + "JavaxEnterpriseToJakartaEnterprise, javax.enterprise.event.Event, javax, javaee-api, 7.0", + "JavaxEnterpriseToJakartaEnterprise, javax.enterprise.event.Event, jakarta.platform, jakarta.jakartaee-api, 9.1.0", + "JavaxEjbToJakartaEjb, javax.ejb.EJBContext, javax, javaee-api, 7.0", + "JavaxEjbToJakartaEjb, javax.ejb.EJBContext, jakarta.platform, jakarta.jakartaee-api, 9.1.0", + "JavaxInjectMigrationToJakartaInject, javax.inject.Provider, javax, javaee-api, 7.0", + "JavaxInjectMigrationToJakartaInject, javax.inject.Provider, jakarta.platform, jakarta.jakartaee-api, 9.1.0", + "JavaxWsToJakartaWs, javax.ws.rs.core.Response, javax, javaee-api, 7.0", + "JavaxWsToJakartaWs, javax.ws.rs.core.Response, jakarta.platform, jakarta.jakartaee-api, 9.1.0" + }) + void platformAlreadySuppliesApi(String recipe, String type, String group, String artifact, String version) { + int dot = type.lastIndexOf('.'); + rewriteRun( + spec -> spec.recipeFromResource("/META-INF/rewrite/jakarta-ee-9.yml", "org.openrewrite.java.migrate.jakarta." + recipe) + .parser(JavaParser.fromJavaVersion().dependsOn("package " + type.substring(0, dot) + "; public interface " + type.substring(dot + 1) + " {}")), + mavenProject("app", + srcMainJava(java("class A { " + type + " value; }", "class A { " + type.replace("javax.", "jakarta.") + " value; }")), + pomXml( + """ + + 4.0.0 + com.example + app + 1 + + + %s + %s + %s + provided + + + + """.formatted(group, artifact, version) + ) + ) + ); + } +} diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/RetainJaxbApiForArquillianRecorderTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/RetainJaxbApiForArquillianRecorderTest.java new file mode 100644 index 0000000000..2a5f00a83e --- /dev/null +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/RetainJaxbApiForArquillianRecorderTest.java @@ -0,0 +1,89 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import org.junit.jupiter.api.Test; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.mavenProject; +import static org.openrewrite.maven.Assertions.pomXml; + +class RetainJaxbApiForArquillianRecorderTest implements RewriteTest { + @Override + public void defaults(RecipeSpec spec) { + spec.recipe(new RetainJaxbApiForArquillianRecorder()); + } + + @Test + void doesNotAddWithoutJakartaJaxbApi() { + rewriteRun(pomXml( + """ + + 4.0.0 + example + app + 1 + + + org.arquillian.extension + arquillian-recorder-spi + 1.1.6.Final + + + + """ + )); + } + + @Test + void doesNotRetainForMigratedReactorDependency() { + rewriteRun( + mavenProject("recorder", pomXml( + """ + + 4.0.0 + org.arquillian.extension + arquillian-recorder-spi + 1.1.6.Final + + """ + )), + mavenProject("app", pomXml( + """ + + 4.0.0 + example + app + 1 + + + org.arquillian.extension + arquillian-recorder-spi + 1.1.6.Final + + + jakarta.xml.bind + jakarta.xml.bind-api + 3.0.1 + + + + """ + )) + ); + } +} diff --git a/src/test/java/org/openrewrite/java/migrate/jakarta/WeldToJakartaTest.java b/src/test/java/org/openrewrite/java/migrate/jakarta/WeldToJakartaTest.java new file mode 100644 index 0000000000..ac1f5bec79 --- /dev/null +++ b/src/test/java/org/openrewrite/java/migrate/jakarta/WeldToJakartaTest.java @@ -0,0 +1,73 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.migrate.jakarta; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.openrewrite.config.Environment; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.maven.Assertions.pomXml; + +class WeldToJakartaTest implements RewriteTest { + @Override + public void defaults(RecipeSpec spec) { + spec.recipe(Environment.builder().scanRuntimeClasspath("org.openrewrite.java.migrate") + .build().activateRecipes("org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta")); + } + + @ParameterizedTest + @CsvSource({"weld-core,1.1.5.Final", "weld-core,2.4.8.Final", "weld-core-impl,3.1.9.Final"}) + void migrateJavaxWeldImplementation(String artifact, String version) { + rewriteRun( + pomXml( + """ + + 4.0.0 + com.example + app + 1 + + + org.jboss.weld + %s + %s + test + + + + """.formatted(artifact, version), + """ + + 4.0.0 + com.example + app + 1 + + + org.jboss.weld + weld-core-impl + 4.0.3.Final + test + + + + """ + ) + ); + } +}