diff --git a/.gitignore b/.gitignore index 03ed5d5..344c2c5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ build/ .idea/ .boot-releases out/ +.vscode/ \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 8134ed6..7d3e402 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -26,6 +26,7 @@ dependencies { implementation("org.openrewrite:rewrite-properties:${rewriteVersion}") implementation("org.openrewrite.recipe:rewrite-java-dependencies:${rewriteVersion}") + implementation("org.openrewrite.recipe:rewrite-migrate-java:${rewriteVersion}") runtimeOnly("org.openrewrite:rewrite-java-17:${rewriteVersion}") @@ -38,6 +39,8 @@ dependencies { testImplementation("javax.xml.bind:jaxb-api:2.4.0-b180830.0359") testImplementation("jakarta.xml.bind:jakarta.xml.bind-api:3.0.0") + testImplementation("javax:javaee-api:7.0") + testRuntimeOnly("org.openrewrite:rewrite-java-17:${rewriteVersion}") testRuntimeOnly("io.quarkus:quarkus-grpc:1.13.+") diff --git a/src/main/resources/META-INF/rewrite/javaee7-to-quarkus.yml b/src/main/resources/META-INF/rewrite/javaee7-to-quarkus.yml new file mode 100644 index 0000000..2001bad --- /dev/null +++ b/src/main/resources/META-INF/rewrite/javaee7-to-quarkus.yml @@ -0,0 +1,196 @@ +# +# Copyright 2024 the original author or authors. +#

+# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +#

+# https://www.apache.org/licenses/LICENSE-2.0 +#

+# 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. +# +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.quarkus.migrate.javaee.JavaEEtoQuarkus2Migration +displayName: Migrate JavaEE to Quarkus 2 +description: These recipes help with the migration of a JavaEE application using EJBs and Hibernate to Quarkus 2. Additional transformations like JSF, JMS, Quarkus Tests may be necessary. +recipeList: + - org.openrewrite.quarkus.migrate.javaee.AddQuarkus2MavenPlugins + - org.openrewrite.quarkus.migrate.javaee.AddQuarkus2Dependencies + - org.openrewrite.quarkus.migrate.javaee.RemoveJavaEEDependencies + + - org.openrewrite.quarkus.migrate.javaee.JavaEEtoQuarkus2CodeMigration + - org.openrewrite.java.migrate.Java8toJava11 + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.quarkus.migrate.javaee.AddQuarkus2Dependencies +displayName: Add Quarkus 2 dependencies +description: Add Quarkus 2 dependencies to the project. +recipeList: + # Add Basic Quarkus Extensions + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.quarkus + artifactId: quarkus-arc + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.quarkus + artifactId: quarkus-resteasy + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.quarkus + artifactId: quarkus-resteasy-jackson + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.quarkus + artifactId: quarkus-undertow + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.quarkus + artifactId: quarkus-hibernate-orm + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.quarkus + artifactId: quarkus-jdbc-h2 + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.quarkus + artifactId: quarkus-junit5 + scope: test + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.rest-assured + artifactId: rest-assured + scope: test + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.quarkus.migrate.javaee.RemoveJavaEEDependencies +displayName: Remove JavaEE dependencies +description: Remove JavaEE dependencies from the project. +recipeList: + # Remove JavaEE dependencies + - org.openrewrite.java.dependencies.RemoveDependency: + groupId: javax* + artifactId: javaee-api + - org.openrewrite.java.dependencies.RemoveDependency: + groupId: javax* + artifactId: cdi-api + - org.openrewrite.java.dependencies.RemoveDependency: + groupId: javax* + artifactId: javax* + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.quarkus.migrate.javaee.AddQuarkus2MavenPlugins +displayName: Migrate JavaEE Maven Dependencies to Quarkus 2 +description: Upgrade Standard JavaEE dependencies to Quarkus 2 dependencies. +recipeList: + # Add Quarkus BOM + - org.openrewrite.maven.AddManagedDependency: + groupId: io.quarkus.platform + artifactId: quarkus-bom + version: '2.x' + type: pom + scope: import + + # Add Maven Plugins + - org.openrewrite.maven.AddPlugin: + groupId: io.quarkus.platform + artifactId: quarkus-maven-plugin + version: '2.16.12.Final' + executions: buildgenerate-codegenerate-code-tests + - org.openrewrite.maven.AddPlugin: + groupId: org.apache.maven.plugins + artifactId: maven-compiler-plugin + version: '3.13.0' + configuration: -parameters + - org.openrewrite.maven.AddPlugin: + groupId: org.apache.maven.plugins + artifactId: maven-surefire-plugin + version: '3.3.1' + configuration: org.jboss.logmanager.LogManager${maven.home} + - org.openrewrite.maven.AddPlugin: + groupId: org.apache.maven.plugins + artifactId: maven-failsafe-plugin + version: '3.3.1' + executions: integration-testverify + configuration: ${project.build.directory}/${project.build.finalName}-runnerorg.jboss.logmanager.LogManager${maven.home} + - org.openrewrite.maven.AddProfile: + id: native + activation: native + properties: falsenative + - org.openrewrite.quarkus.ConfigureQuarkusMavenPluginWithReasonableDefaults + - org.openrewrite.maven.BestPractices + + # Prep for Java 11 upgrade + - org.openrewrite.maven.AddProperty: + key: maven.compiler.source + value: 11 + - org.openrewrite.maven.AddProperty: + key: maven.compiler.target + value: 11 + - org.openrewrite.maven.ChangePackaging: + groupId: '*' + artifactId: '*' + packaging: jar + + - org.openrewrite.maven.RemovePlugin: + groupId: org.apache.maven.plugins + artifactId: maven-war-plugin + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.quarkus.migrate.javaee.JavaEEtoQuarkus2CodeMigration +displayName: Migrate JavaEE Code to Quarkus 2 +description: Migrate Standard JavaEE Code to Quarkus 2 +recipeList: + # Convert some EJB annotations to CDI + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: javax.ejb.Stateless + newFullyQualifiedTypeName: javax.enterprise.context.Dependent + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: javax.ejb.Stateful + newFullyQualifiedTypeName: javax.enterprise.context.SessionScoped + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: javax.ejb.Singleton + newFullyQualifiedTypeName: javax.enterprise.context.ApplicationScoped + - org.openrewrite.java.RemoveAnnotationAttribute: + annotationType: javax.ejb.EJB + attributeName: name + - org.openrewrite.java.RemoveAnnotationAttribute: + annotationType: javax.ejb.EJB + attributeName: description + - org.openrewrite.java.RemoveAnnotationAttribute: + annotationType: javax.ejb.EJB + attributeName: beanName + - org.openrewrite.java.RemoveAnnotationAttribute: + annotationType: javax.ejb.EJB + attributeName: beanInterface + - org.openrewrite.java.RemoveAnnotationAttribute: + annotationType: javax.ejb.EJB + attributeName: mappedName + - org.openrewrite.java.RemoveAnnotationAttribute: + annotationType: javax.ejb.EJB + attributeName: lookup + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: javax.ejb.EJB + newFullyQualifiedTypeName: javax.inject.Inject + - org.openrewrite.java.RemoveAnnotation: + annotationPattern: '@javax.ejb.Local' + + # Convert JPA annotations + - org.openrewrite.java.RemoveAnnotationAttribute: + annotationType: javax.persistence.PersistenceContext + attributeName: name + - org.openrewrite.java.RemoveAnnotationAttribute: + annotationType: javax.persistence.PersistenceContext + attributeName: unitName + - org.openrewrite.java.RemoveAnnotationAttribute: + annotationType: javax.persistence.PersistenceContext + attributeName: type + - org.openrewrite.java.RemoveAnnotationAttribute: + annotationType: javax.persistence.PersistenceContext + attributeName: synchronization + - org.openrewrite.java.RemoveAnnotationAttribute: + annotationType: javax.persistence.PersistenceContext + attributeName: properties + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: javax.persistence.PersistenceContext + newFullyQualifiedTypeName: javax.inject.Inject diff --git a/src/main/resources/META-INF/rewrite/quarkus.yml b/src/main/resources/META-INF/rewrite/quarkus.yml index c5dca9f..bd53688 100644 --- a/src/main/resources/META-INF/rewrite/quarkus.yml +++ b/src/main/resources/META-INF/rewrite/quarkus.yml @@ -140,4 +140,4 @@ recipeList: - org.openrewrite.java.ChangePackage: oldPackageName: io.vertx.core.http.HttpMethod newPackageName: io.quarkus.vertx.web.Route.HttpMethod - recursive: false + recursive: false \ No newline at end of file diff --git a/src/test/java/org/openrewrite/quarkus/migrate/javaee/JavaEEtoQuarkus2CodeTranformationsTest.java b/src/test/java/org/openrewrite/quarkus/migrate/javaee/JavaEEtoQuarkus2CodeTranformationsTest.java new file mode 100644 index 0000000..8374b7f --- /dev/null +++ b/src/test/java/org/openrewrite/quarkus/migrate/javaee/JavaEEtoQuarkus2CodeTranformationsTest.java @@ -0,0 +1,162 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * 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.quarkus.migrate.javaee; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class JavaEEtoQuarkus2CodeTranformationsTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec.parser(JavaParser.fromJavaVersion() + .logCompilationWarningsAndErrors(true) + .classpath("javaee-api")) + .recipeFromResources("org.openrewrite.quarkus.migrate.javaee.JavaEEtoQuarkus2CodeMigration"); + } + + @Test + @DocumentExample + void javaEEtoQuarkus2CodeTransformationsTest() { + rewriteRun( + java( + // language=java + """ + package org.acme; + + import javax.ejb.EJB; + import javax.ejb.Local; + import javax.ejb.SessionContext; + import javax.ejb.Singleton; + import javax.ejb.Stateful; + import javax.ejb.Stateless; + + import javax.annotation.Resource; + import javax.persistence.EntityManager; + import javax.persistence.PersistenceContext; + + @Stateless + public class PingEJBSLS { + + @PersistenceContext + private EntityManager entityManager; + + @Resource + private SessionContext context; + + @EJB + private PingEJBLocal pingEJBLocal; + + @EJB(lookup = "java:global/PingEJBSingleton") + private PingEJBSingleton pingEJBSingleton; + + public String getMsg() { + return "PingEJBSLS: " + pingEJBLocal.getMsg() + " " + pingEJBSingleton.getMsg(); + } + + } + + @Stateful + @Local + public class PingEJBLocal { + + private static int hitCount; + + public String getMsg() { + return "PingEJBLocal: " + hitCount++; + } + + } + + @Singleton + public class PingEJBSingleton { + + private static int hitCount; + + @PersistenceContext + private EntityManager entityManager; + + public String getMsg() { + return "PingEJBSingleton: " + hitCount++; + } + } + """, + // language=java + """ + package org.acme; + + import javax.ejb.SessionContext; + import javax.enterprise.context.ApplicationScoped; + import javax.enterprise.context.Dependent; + import javax.enterprise.context.SessionScoped; + import javax.inject.Inject; + import javax.annotation.Resource; + import javax.persistence.EntityManager; + + @Dependent + public class PingEJBSLS { + + @Inject + private EntityManager entityManager; + + @Resource + private SessionContext context; + + @Inject + private PingEJBLocal pingEJBLocal; + + @Inject + private PingEJBSingleton pingEJBSingleton; + + public String getMsg() { + return "PingEJBSLS: " + pingEJBLocal.getMsg() + " " + pingEJBSingleton.getMsg(); + } + + } + + @SessionScoped + public class PingEJBLocal { + + private static int hitCount; + + public String getMsg() { + return "PingEJBLocal: " + hitCount++; + } + + } + + @ApplicationScoped + public class PingEJBSingleton { + + private static int hitCount; + + @Inject + private EntityManager entityManager; + + public String getMsg() { + return "PingEJBSingleton: " + hitCount++; + } + } + """ + ) + ); + } +} diff --git a/src/test/java/org/openrewrite/quarkus/migrate/javaee/JavaEEtoQuarkus2MavenDependenciesMigrationTest.java b/src/test/java/org/openrewrite/quarkus/migrate/javaee/JavaEEtoQuarkus2MavenDependenciesMigrationTest.java new file mode 100644 index 0000000..206f5b2 --- /dev/null +++ b/src/test/java/org/openrewrite/quarkus/migrate/javaee/JavaEEtoQuarkus2MavenDependenciesMigrationTest.java @@ -0,0 +1,465 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * 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.quarkus.migrate.javaee; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.maven.Assertions.pomXml; + +class JavaEEtoQuarkus2MavenDependenciesMigrationTest implements RewriteTest { + @Override + public void defaults(RecipeSpec spec) { + spec.recipeFromResources("org.openrewrite.quarkus.migrate.javaee.JavaEEtoQuarkus2Migration"); + } + + @Test + @DocumentExample + void convertJavaEEToQuarkusDependencies1() { + rewriteRun( + spec -> spec.expectedCyclesThatMakeChanges(2), + // language=xml + pomXml( + """ + + + 4.0.0 + org.openrewrite.sample + Sample Java EE7 EJB Module + ee7-ejb + 1.0-SNAPSHOT + war + + + UTF-8 + UTF-8 + 1.8 + 1.8 + + + + + javax + javaee-api + 7.0 + provided + + + javax.annotation + javax.annotation-api + 1.3.2 + provided + + + + """, + """ + + + 4.0.0 + org.openrewrite.sample + ee7-ejb + 1.0-SNAPSHOT + Sample Java EE7 EJB Module + + + UTF-8 + UTF-8 + 11 + 11 + + + + + io.quarkus.platform + quarkus-bom + 2.16.12.Final + pom + import + + + + + + + io.quarkus + quarkus-arc + + + io.quarkus + quarkus-hibernate-orm + + + io.quarkus + quarkus-jdbc-h2 + + + io.quarkus + quarkus-resteasy + + + io.quarkus + quarkus-resteasy-jackson + + + io.quarkus + quarkus-undertow + + + io.quarkus + quarkus-junit5 + test + + + io.rest-assured + rest-assured + test + + + + + + io.quarkus.platform + quarkus-maven-plugin + 2.16.12.Final + + + + build + generate-code + generate-code-tests + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + + -parameters + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.3.1 + + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + org.apache.maven.plugins + maven-failsafe-plugin + 3.3.1 + + + + integration-test + verify + + + + + + ${project.build.directory}/${project.build.finalName}-runner + org.jboss.logmanager.LogManager + ${maven.home} + + + + + + + + native + + + native + + + + false + native + + + + + """ + ) + ); + } + + @Test + void convertJavaEEToQuarkusDependencies2() { + rewriteRun( + spec -> spec.expectedCyclesThatMakeChanges(2), + // language=xml + pomXml( + """ + + + 4.0.0 + com.dummyapp + oms-winter + 0.0.1-SNAPSHOT + oms-winter + war + Demo project for Java EE 7 JAX-RS, CDI, EJB, JPA, JTA + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + org.apache.maven.plugins + maven-war-plugin + 3.2.3 + + false + + + + + + + javax + javaee-api + 7.0 + provided + + + org.apache.commons + commons-lang3 + 3.12.0 + + + commons-beanutils + commons-beanutils + 1.9.4 + + + org.projectlombok + lombok + 1.18.30 + provided + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + 2.12.3 + + + junit + junit + 4.13 + test + + + org.mockito + mockito-core + 3.2.4 + test + + + + """, + """ + + + 4.0.0 + com.dummyapp + oms-winter + 0.0.1-SNAPSHOT + oms-winter + Demo project for Java EE 7 JAX-RS, CDI, EJB, JPA, JTA + + 11 + 11 + + + + + io.quarkus.platform + quarkus-bom + 2.16.12.Final + pom + import + + + + + + + org.apache.commons + commons-lang3 + + + commons-beanutils + commons-beanutils + 1.9.4 + + + io.quarkus + quarkus-arc + + + io.quarkus + quarkus-hibernate-orm + + + io.quarkus + quarkus-jdbc-h2 + + + io.quarkus + quarkus-resteasy + + + io.quarkus + quarkus-resteasy-jackson + + + io.quarkus + quarkus-undertow + + + org.projectlombok + lombok + 1.18.34 + provided + + + io.quarkus + quarkus-junit5 + test + + + io.rest-assured + rest-assured + test + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + 2.12.3 + + + junit + junit + 4.13 + test + + + org.mockito + mockito-core + 3.2.4 + test + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + 11 + + + + io.quarkus.platform + quarkus-maven-plugin + 2.16.12.Final + + + + build + generate-code + generate-code-tests + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.3.1 + + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + org.apache.maven.plugins + maven-failsafe-plugin + 3.3.1 + + + + integration-test + verify + + + + + + ${project.build.directory}/${project.build.finalName}-runner + org.jboss.logmanager.LogManager + ${maven.home} + + + + + + + + native + + + native + + + + false + native + + + + + """ + ) + ); + } + +}