From 048aa5fa27d686918e09ac43ae1af72981c4ae2b Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Fri, 27 Sep 2024 10:27:54 +0200 Subject: [PATCH 01/13] Add hibernate-6.0.yml Including new recipe for going from extend EmptyInterceptor to implements Interceptor/StatementInspector --- .../EmptyInterceptorToInterface.java | 87 +++++ .../META-INF/rewrite/hibernate-6.0.yml | 296 ++++++++++++++++++ .../META-INF/rewrite/hibernate-6.1.yml | 283 +---------------- .../EmptyInterceptorToInterfaceTest.java | 117 +++++++ 4 files changed, 504 insertions(+), 279 deletions(-) create mode 100644 src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java create mode 100644 src/main/resources/META-INF/rewrite/hibernate-6.0.yml create mode 100644 src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java diff --git a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java new file mode 100644 index 0000000..7509ffd --- /dev/null +++ b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java @@ -0,0 +1,87 @@ +/* + * 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.hibernate; + +import org.openrewrite.ExecutionContext; +import org.openrewrite.Preconditions; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.internal.ListUtils; +import org.openrewrite.java.AnnotationMatcher; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaParser; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.search.FindImplementations; +import org.openrewrite.java.tree.*; + +public class EmptyInterceptorToInterface extends Recipe { + + private final String EMPTY_INTERCEPTOR = "org.hibernate.EmptyInterceptor"; + private final String INTERCEPTOR = "org.hibernate.Interceptor"; + private final String STATEMENT_INSPECTOR = "org.hibernate.resource.jdbc.spi.StatementInspector"; + private static final AnnotationMatcher OVERRIDE_ANNOTATION_MATCHER = new AnnotationMatcher("java.lang.Override"); + + @Override + public String getDisplayName() { + return "Replace boolean type mappings with converters"; + } + + @Override + public String getDescription() { + return "Replaces type mapping of booleans with appropriate attribute converters."; + } + + @Override + public TreeVisitor getVisitor() { + return Preconditions.check(new FindImplementations(EMPTY_INTERCEPTOR), + new JavaIsoVisitor() { + @Override + public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { + J.ClassDeclaration cd = super.visitClassDeclaration(classDecl, ctx); + if (cd.getExtends() != null && TypeUtils.isOfClassType(cd.getExtends().getType(), EMPTY_INTERCEPTOR)) { + cd = cd.withExtends(null).withImplements(ListUtils.concat(cd.getImplements(), (TypeTree) TypeTree.build("Interceptor").withType(JavaType.buildType(INTERCEPTOR)).withPrefix(Space.SINGLE_SPACE))); + Boolean prepareStatement = getCursor().pollMessage("prepareStatementFound"); + if (Boolean.TRUE.equals(prepareStatement)) { + cd = cd.withImplements(ListUtils.concat(cd.getImplements(), (TypeTree) TypeTree.build("StatementInspector").withType(JavaType.buildType(STATEMENT_INSPECTOR)).withPrefix(Space.SINGLE_SPACE))); + } + maybeAddImport(INTERCEPTOR); + maybeAddImport(STATEMENT_INSPECTOR); + maybeRemoveImport(EMPTY_INTERCEPTOR); + } + return autoFormat(cd, ctx); + } + + @Override + public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, ExecutionContext ctx) { + J.MethodDeclaration md = super.visitMethodDeclaration(method, ctx); + if (md.getLeadingAnnotations().stream().anyMatch(OVERRIDE_ANNOTATION_MATCHER::matches) && md.getSimpleName().equals("onPrepareStatement")) { + getCursor().putMessageOnFirstEnclosing(J.ClassDeclaration.class, "prepareStatementFound", true); + String template = "@Override\n" + + "public String inspect() {\n" + + "}\n"; + J.MethodDeclaration inspect = JavaTemplate.builder(template) + .javaParser(JavaParser.fromJavaVersion()) + .build() + .apply(getCursor(), md.getCoordinates().replace()); + md = inspect.withBody(md.getBody()).withModifiers(md.getModifiers()).withLeadingAnnotations(md.getLeadingAnnotations()).withParameters(md.getParameters()); + } + return md; + } + } + ); + } +} diff --git a/src/main/resources/META-INF/rewrite/hibernate-6.0.yml b/src/main/resources/META-INF/rewrite/hibernate-6.0.yml new file mode 100644 index 0000000..cca347e --- /dev/null +++ b/src/main/resources/META-INF/rewrite/hibernate-6.0.yml @@ -0,0 +1,296 @@ +# +# 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.hibernate.MigrateToHibernate60 +displayName: Migrate to Hibernate 6.0.x +description: >- + This recipe will apply changes commonly needed when migrating to Hibernate 6.0.x. The hibernate dependencies will + be updated to use the new org.hibernate.orm group ID and the recipe will make changes necessary to use Hibernate + with Jakarta EE 9.0. + +recipeList: + - org.openrewrite.hibernate.MigrateToHibernateDependencies60 + - org.openrewrite.hibernate.EmptyInterceptorToInterface + - org.openrewrite.hibernate.MigrateBooleanMappings + - org.openrewrite.hibernate.TypeAnnotationParameter + - org.openrewrite.hibernate.TypeDescriptorToType + - org.openrewrite.java.migrate.jakarta.JavaxPersistenceToJakartaPersistence + - org.openrewrite.java.migrate.jakarta.JavaxPersistenceXmlToJakartaPersistenceXml + - org.openrewrite.hibernate.MigrateToHypersistenceUtilsHibernate6.0 + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.hibernate.MigrateToHibernateDependencies60 +displayName: Migrate Hibernate dependencies to 6.0.x +description: >- + This recipe will migrate any existing dependencies on Hibernate 5.x to the latest 6.0.x release. This migration will + include the adjustment to the new `org.hibernate.orm` group ID. It accounts for artifacts names that both do and do + not include the `jakarta` suffix and it will change both dependencies and managed dependencies. + +recipeList: + # hibernate-agroal + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-agroal + newGroupId: org.hibernate.orm + newArtifactId: hibernate-agroal + newVersion: 6.0.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-agroal-jakarta + newGroupId: org.hibernate.orm + newArtifactId: hibernate-agroal + newVersion: 6.0.x + # hibernate-c3p0 + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-c3p0 + newGroupId: org.hibernate.orm + newArtifactId: hibernate-c3p0 + newVersion: 6.0.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-c3p0-jakarta + newGroupId: org.hibernate.orm + newArtifactId: hibernate-c3p0 + newVersion: 6.0.x + # hibernate-community-dialects + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-community-dialects + newGroupId: org.hibernate.orm + newArtifactId: hibernate-community-dialects + newVersion: 6.0.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-community-dialects-jakarta + newGroupId: org.hibernate.orm + newArtifactId: hibernate-community-dialects + newVersion: 6.0.x + # hibernate-core + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-core + newGroupId: org.hibernate.orm + newArtifactId: hibernate-core + newVersion: 6.0.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-core-jakarta + newGroupId: org.hibernate.orm + newArtifactId: hibernate-core + newVersion: 6.0.x + # hibernate-envers + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-envers + newGroupId: org.hibernate.orm + newArtifactId: hibernate-envers + newVersion: 6.0.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-envers-jakarta + newGroupId: org.hibernate.orm + newArtifactId: hibernate-envers + newVersion: 6.0.x + # hibernate-graalvm + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-graalvm + newGroupId: org.hibernate.orm + newArtifactId: hibernate-graalvm + newVersion: 6.0.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-graalvm-jakarta + newGroupId: org.hibernate.orm + newArtifactId: hibernate-graalvm + newVersion: 6.0.x + # hibernate-hikaricp + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-hikaricp + newGroupId: org.hibernate.orm + newArtifactId: hibernate-hikaricp + newVersion: 6.0.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-hikaricp-jakarta + newGroupId: org.hibernate.orm + newArtifactId: hibernate-hikaricp + newVersion: 6.0.x + # hibernate-jcache + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-jcache + newGroupId: org.hibernate.orm + newArtifactId: hibernate-jcache + newVersion: 6.0.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-jcache-jakarta + newGroupId: org.hibernate.orm + newArtifactId: hibernate-jcache + newVersion: 6.0.x + # hibernate-jpamodelgen + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-jpamodelgen + newGroupId: org.hibernate.orm + newArtifactId: hibernate-jpamodelgen + newVersion: 6.0.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-jpamodelgen-jakarta + newGroupId: org.hibernate.orm + newArtifactId: hibernate-jpamodelgen + newVersion: 6.0.x + # hibernate-micrometer + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-micrometer + newGroupId: org.hibernate.orm + newArtifactId: hibernate-micrometer + newVersion: 6.0.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-micrometer-jakarta + newGroupId: org.hibernate.orm + newArtifactId: hibernate-micrometer + newVersion: 6.0.x + # hibernate-proxool + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-proxool + newGroupId: org.hibernate.orm + newArtifactId: hibernate-proxool + newVersion: 6.0.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-proxool-jakarta + newGroupId: org.hibernate.orm + newArtifactId: hibernate-proxool + newVersion: 6.0.x + # hibernate-spatial + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-spatial + newGroupId: org.hibernate.orm + newArtifactId: hibernate-spatial + newVersion: 6.0.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-spatial-jakarta + newGroupId: org.hibernate.orm + newArtifactId: hibernate-spatial + newVersion: 6.0.x + # hibernate-testing + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-testing + newGroupId: org.hibernate.orm + newArtifactId: hibernate-testing + newVersion: 6.0.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.hibernate + oldArtifactId: hibernate-testing-jakarta + newGroupId: org.hibernate.orm + newArtifactId: hibernate-testing + newVersion: 6.0.x + - org.openrewrite.java.dependencies.RemoveDependency: + groupId: org.hibernate + artifactId: hibernate-entitymanager + # Account for jaxb-runtime becoming `runtime` vs `compile` dependency + # Add the jakarta JAXB artifact if it is missing but a project uses types in java.xml.bind + - org.openrewrite.java.dependencies.AddDependency: + groupId: jakarta.xml.bind + artifactId: jakarta.xml.bind-api + version: 3.0.x + onlyIfUsing: javax.xml.bind..* + acceptTransitive: true + # If a project already had the jakarta api, make sure it is at the latest version. + - org.openrewrite.java.dependencies.UpgradeDependencyVersion: + groupId: jakarta.xml.bind + artifactId: jakarta.xml.bind-api + newVersion: 3.0.x + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.hibernate.TypeDescriptorToType +displayName: Rename `JavaTypeDescriptor` and `SqlTypeDescriptor` to `JavaType` and `SqlType` +description: >- + Rename `JavaTypeDescriptor` and `SqlTypeDescriptor` to `JavaType` and `SqlType` respectively. + See https://github.com/hibernate/hibernate-orm/blob/6.0/migration-guide.adoc#type-system + +recipeList: + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: org.hibernate.type.descriptor.java.JavaTypeDescriptor + newFullyQualifiedTypeName: org.hibernate.type.descriptor.java.JavaType + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: org.hibernate.type.descriptor.sql.SqlTypeDescriptor + newFullyQualifiedTypeName: org.hibernate.type.descriptor.sql.SqlType + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.hibernate.MigrateToHypersistenceUtilsHibernate6.0 +displayName: Migrate Hibernate Types to Hypersistence Utils 6.0 +description: >- + This recipe will migrate any existing dependencies on `com.vladmihalcea:hibernate-types` to `io.hypersistence:hypersistence-utils-hibernate-60`. + This migration will include the adjustment from `com.vladmihalcea` to `io.hypersistence.utils` package name. + +recipeList: + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: com.vladmihalcea + oldArtifactId: hibernate-types-4 + newGroupId: io.hypersistence + newArtifactId: hypersistence-utils-hibernate-60 + newVersion: 3.5.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: com.vladmihalcea + oldArtifactId: hibernate-types-5 + newGroupId: io.hypersistence + newArtifactId: hypersistence-utils-hibernate-60 + newVersion: 3.5.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: com.vladmihalcea + oldArtifactId: hibernate-types-43 + newGroupId: io.hypersistence + newArtifactId: hypersistence-utils-hibernate-60 + newVersion: 3.5.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: com.vladmihalcea + oldArtifactId: hibernate-types-52 + newGroupId: io.hypersistence + newArtifactId: hypersistence-utils-hibernate-60 + newVersion: 3.5.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: com.vladmihalcea + oldArtifactId: hibernate-types-55 + newGroupId: io.hypersistence + newArtifactId: hypersistence-utils-hibernate-60 + newVersion: 3.5.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: com.vladmihalcea + oldArtifactId: hibernate-types-60 + newGroupId: io.hypersistence + newArtifactId: hypersistence-utils-hibernate-60 + newVersion: 3.5.x + - org.openrewrite.java.ChangePackage: + oldPackageName: com.vladmihalcea + newPackageName: io.hypersistence.utils + recursive: true diff --git a/src/main/resources/META-INF/rewrite/hibernate-6.1.yml b/src/main/resources/META-INF/rewrite/hibernate-6.1.yml index 740f597..dc55576 100644 --- a/src/main/resources/META-INF/rewrite/hibernate-6.1.yml +++ b/src/main/resources/META-INF/rewrite/hibernate-6.1.yml @@ -24,284 +24,9 @@ description: >- with Jakarta EE 9.0. recipeList: - - org.openrewrite.hibernate.MigrateToHibernateDependencies61 - - org.openrewrite.hibernate.MigrateBooleanMappings - - org.openrewrite.hibernate.TypeAnnotationParameter - - org.openrewrite.hibernate.TypeDescriptorToType - - org.openrewrite.java.migrate.jakarta.JavaxPersistenceToJakartaPersistence - - org.openrewrite.java.migrate.jakarta.JavaxPersistenceXmlToJakartaPersistenceXml - - org.openrewrite.hibernate.MigrateToHypersistenceUtilsHibernate6.0 - ---- -type: specs.openrewrite.org/v1beta/recipe -name: org.openrewrite.hibernate.MigrateToHibernateDependencies61 -displayName: Migrate Hibernate dependencies to 6.1.x -description: >- - This recipe will migrate any existing dependencies on Hibernate 5.x to the latest 6.1.x release. This migration will - include the adjustment to the new `org.hibernate.orm` group ID. It accounts for artifacts names that both do and do - not include the `jakarta` suffix and it will change both dependencies and managed dependencies. - -recipeList: - # hibernate-agroal - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-agroal - newGroupId: org.hibernate.orm - newArtifactId: hibernate-agroal - newVersion: 6.1.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-agroal-jakarta - newGroupId: org.hibernate.orm - newArtifactId: hibernate-agroal - newVersion: 6.1.x - # hibernate-c3p0 - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-c3p0 - newGroupId: org.hibernate.orm - newArtifactId: hibernate-c3p0 - newVersion: 6.1.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-c3p0-jakarta - newGroupId: org.hibernate.orm - newArtifactId: hibernate-c3p0 - newVersion: 6.1.x - # hibernate-community-dialects - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-community-dialects - newGroupId: org.hibernate.orm - newArtifactId: hibernate-community-dialects - newVersion: 6.1.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-community-dialects-jakarta - newGroupId: org.hibernate.orm - newArtifactId: hibernate-community-dialects - newVersion: 6.1.x - # hibernate-core - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-core - newGroupId: org.hibernate.orm - newArtifactId: hibernate-core - newVersion: 6.1.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-core-jakarta - newGroupId: org.hibernate.orm - newArtifactId: hibernate-core - newVersion: 6.1.x - # hibernate-envers - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-envers - newGroupId: org.hibernate.orm - newArtifactId: hibernate-envers - newVersion: 6.1.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-envers-jakarta - newGroupId: org.hibernate.orm - newArtifactId: hibernate-envers - newVersion: 6.1.x - # hibernate-graalvm - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-graalvm - newGroupId: org.hibernate.orm - newArtifactId: hibernate-graalvm - newVersion: 6.1.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-graalvm-jakarta - newGroupId: org.hibernate.orm - newArtifactId: hibernate-graalvm - newVersion: 6.1.x - # hibernate-hikaricp - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-hikaricp - newGroupId: org.hibernate.orm - newArtifactId: hibernate-hikaricp - newVersion: 6.1.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-hikaricp-jakarta - newGroupId: org.hibernate.orm - newArtifactId: hibernate-hikaricp - newVersion: 6.1.x - # hibernate-jcache - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-jcache - newGroupId: org.hibernate.orm - newArtifactId: hibernate-jcache - newVersion: 6.1.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-jcache-jakarta - newGroupId: org.hibernate.orm - newArtifactId: hibernate-jcache - newVersion: 6.1.x - # hibernate-jpamodelgen - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-jpamodelgen - newGroupId: org.hibernate.orm - newArtifactId: hibernate-jpamodelgen - newVersion: 6.1.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-jpamodelgen-jakarta - newGroupId: org.hibernate.orm - newArtifactId: hibernate-jpamodelgen - newVersion: 6.1.x - # hibernate-micrometer - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-micrometer - newGroupId: org.hibernate.orm - newArtifactId: hibernate-micrometer - newVersion: 6.1.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-micrometer-jakarta - newGroupId: org.hibernate.orm - newArtifactId: hibernate-micrometer - newVersion: 6.1.x - # hibernate-proxool - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-proxool - newGroupId: org.hibernate.orm - newArtifactId: hibernate-proxool - newVersion: 6.1.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-proxool-jakarta - newGroupId: org.hibernate.orm - newArtifactId: hibernate-proxool - newVersion: 6.1.x - # hibernate-spatial - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-spatial - newGroupId: org.hibernate.orm - newArtifactId: hibernate-spatial - newVersion: 6.1.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-spatial-jakarta - newGroupId: org.hibernate.orm - newArtifactId: hibernate-spatial - newVersion: 6.1.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-testing - newGroupId: org.hibernate.orm - newArtifactId: hibernate-testing - newVersion: 6.1.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-testing-jakarta - newGroupId: org.hibernate.orm - newArtifactId: hibernate-testing - newVersion: 6.1.x - # hibernate-testing - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-testing - newGroupId: org.hibernate.orm - newArtifactId: hibernate-testing - newVersion: 6.1.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: org.hibernate - oldArtifactId: hibernate-testing-jakarta - newGroupId: org.hibernate.orm - newArtifactId: hibernate-testing - newVersion: 6.1.x - - org.openrewrite.java.dependencies.RemoveDependency: - groupId: org.hibernate - artifactId: hibernate-entitymanager - # Account for jaxb-runtime becoming `runtime` vs `compile` dependency - # Add the jakarta JAXB artifact if it is missing but a project uses types in java.xml.bind - - org.openrewrite.java.dependencies.AddDependency: - groupId: jakarta.xml.bind - artifactId: jakarta.xml.bind-api - version: 3.0.x - onlyIfUsing: javax.xml.bind..* - acceptTransitive: true - # If a project already had the jakarta api, make sure it is at the latest version. + - org.openrewrite.hibernate.MigrateToHibernate60 - org.openrewrite.java.dependencies.UpgradeDependencyVersion: - groupId: jakarta.xml.bind - artifactId: jakarta.xml.bind-api - newVersion: 3.0.x - ---- -type: specs.openrewrite.org/v1beta/recipe -name: org.openrewrite.hibernate.TypeDescriptorToType -displayName: Rename `JavaTypeDescriptor` and `SqlTypeDescriptor` to `JavaType` and `SqlType` -description: >- - Rename `JavaTypeDescriptor` and `SqlTypeDescriptor` to `JavaType` and `SqlType` respectively. - See https://github.com/hibernate/hibernate-orm/blob/6.0/migration-guide.adoc#type-system - -recipeList: - - org.openrewrite.java.ChangeType: - oldFullyQualifiedTypeName: org.hibernate.type.descriptor.java.JavaTypeDescriptor - newFullyQualifiedTypeName: org.hibernate.type.descriptor.java.JavaType - - org.openrewrite.java.ChangeType: - oldFullyQualifiedTypeName: org.hibernate.type.descriptor.sql.SqlTypeDescriptor - newFullyQualifiedTypeName: org.hibernate.type.descriptor.sql.SqlType - ---- -type: specs.openrewrite.org/v1beta/recipe -name: org.openrewrite.hibernate.MigrateToHypersistenceUtilsHibernate6.0 -displayName: Migrate Hibernate Types to Hypersistence Utils 6.0 -description: >- - This recipe will migrate any existing dependencies on `com.vladmihalcea:hibernate-types` to `io.hypersistence:hypersistence-utils-hibernate-60`. - This migration will include the adjustment from `com.vladmihalcea` to `io.hypersistence.utils` package name. + groupId: org.hibernate.orm + artifactId: '*' + newVersion: 6.1.x -recipeList: - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: com.vladmihalcea - oldArtifactId: hibernate-types-4 - newGroupId: io.hypersistence - newArtifactId: hypersistence-utils-hibernate-60 - newVersion: 3.5.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: com.vladmihalcea - oldArtifactId: hibernate-types-5 - newGroupId: io.hypersistence - newArtifactId: hypersistence-utils-hibernate-60 - newVersion: 3.5.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: com.vladmihalcea - oldArtifactId: hibernate-types-43 - newGroupId: io.hypersistence - newArtifactId: hypersistence-utils-hibernate-60 - newVersion: 3.5.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: com.vladmihalcea - oldArtifactId: hibernate-types-52 - newGroupId: io.hypersistence - newArtifactId: hypersistence-utils-hibernate-60 - newVersion: 3.5.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: com.vladmihalcea - oldArtifactId: hibernate-types-55 - newGroupId: io.hypersistence - newArtifactId: hypersistence-utils-hibernate-60 - newVersion: 3.5.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: com.vladmihalcea - oldArtifactId: hibernate-types-60 - newGroupId: io.hypersistence - newArtifactId: hypersistence-utils-hibernate-60 - newVersion: 3.5.x - - org.openrewrite.java.ChangePackage: - oldPackageName: com.vladmihalcea - newPackageName: io.hypersistence.utils - recursive: true diff --git a/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java b/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java new file mode 100644 index 0000000..e2ecec8 --- /dev/null +++ b/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java @@ -0,0 +1,117 @@ +package org.openrewrite.hibernate; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; +import org.openrewrite.test.SourceSpec; + +import static org.openrewrite.java.Assertions.java; + +class EmptyInterceptorToInterfaceTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec.recipe(new EmptyInterceptorToInterface()) + .parser(JavaParser.fromJavaVersion() + .classpathFromResources(new InMemoryExecutionContext(), "hibernate-core") + ); + } + + @DocumentExample + @Test + void shouldChangeEmptyInterceptor() { + //language=java + rewriteRun( + java( + """ + import org.hibernate.EmptyInterceptor; + + class MyInterceptor extends EmptyInterceptor { + + @Override + public String onPrepareStatement(String sql) { + return sql; + } + } + """, + """ + import org.hibernate.Interceptor; + import org.hibernate.resource.jdbc.spi.StatementInspector; + + class MyInterceptor implements Interceptor, StatementInspector { + + @Override + public String inspect(String sql) { + return sql; + } + }""" + ) + ); + } + + @Test + void shouldChangeEmptyInterceptorAlreadyImplements() { + //language=java + rewriteRun( + java( + """ + package com.example; + public interface MyInterface { } + """, + SourceSpec::skip + ), + java( + """ + import com.example.MyInterface; + import org.hibernate.EmptyInterceptor; + + class MyInterceptor extends EmptyInterceptor implements MyInterface { + + @Override + public String onPrepareStatement(String sql) { + return sql; + } + } + """, + """ + import com.example.MyInterface; + import org.hibernate.Interceptor; + import org.hibernate.resource.jdbc.spi.StatementInspector; + + class MyInterceptor implements MyInterface, Interceptor, StatementInspector { + + @Override + public String inspect(String sql) { + return sql; + } + }""" + ) + ); + } + + @Test + void shouldChangeEmptyInterceptorNoPrepareStatement() { + //language=java + rewriteRun( + java( + """ + import org.hibernate.EmptyInterceptor; + + class MyInterceptor extends EmptyInterceptor { + + } + """, + """ + import org.hibernate.Interceptor; + + class MyInterceptor implements Interceptor { + + }""" + ) + ); + } + +} \ No newline at end of file From d5dd2ff05f5320a1bc45c52669f9f4475a3c0d8c Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Fri, 27 Sep 2024 10:44:49 +0200 Subject: [PATCH 02/13] Formating, name and desc --- .../EmptyInterceptorToInterface.java | 4 +- .../EmptyInterceptorToInterfaceTest.java | 145 +++++++++--------- 2 files changed, 76 insertions(+), 73 deletions(-) diff --git a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java index 7509ffd..5b042d2 100644 --- a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java +++ b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java @@ -37,12 +37,12 @@ public class EmptyInterceptorToInterface extends Recipe { @Override public String getDisplayName() { - return "Replace boolean type mappings with converters"; + return "Replace `extends EmptyInterceptor` with `implements Interceptor` and potentially `StatementInspector`"; } @Override public String getDescription() { - return "Replaces type mapping of booleans with appropriate attribute converters."; + return "In Hibernate 6.0 the `Interceptor` interface received default implementations therefore the NOOP implementation that could be extended was no longer needed."; } @Override diff --git a/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java b/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java index e2ecec8..3314c6f 100644 --- a/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java +++ b/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java @@ -15,9 +15,9 @@ class EmptyInterceptorToInterfaceTest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { spec.recipe(new EmptyInterceptorToInterface()) - .parser(JavaParser.fromJavaVersion() - .classpathFromResources(new InMemoryExecutionContext(), "hibernate-core") - ); + .parser(JavaParser.fromJavaVersion() + .classpathFromResources(new InMemoryExecutionContext(), "hibernate-core") + ); } @DocumentExample @@ -25,30 +25,31 @@ public void defaults(RecipeSpec spec) { void shouldChangeEmptyInterceptor() { //language=java rewriteRun( - java( - """ - import org.hibernate.EmptyInterceptor; - - class MyInterceptor extends EmptyInterceptor { - - @Override - public String onPrepareStatement(String sql) { - return sql; + java( + """ + import org.hibernate.EmptyInterceptor; + + class MyInterceptor extends EmptyInterceptor { + + @Override + public String onPrepareStatement(String sql) { + return sql; + } } - } - """, - """ - import org.hibernate.Interceptor; - import org.hibernate.resource.jdbc.spi.StatementInspector; - - class MyInterceptor implements Interceptor, StatementInspector { - - @Override - public String inspect(String sql) { - return sql; + """, + """ + import org.hibernate.Interceptor; + import org.hibernate.resource.jdbc.spi.StatementInspector; + + class MyInterceptor implements Interceptor, StatementInspector { + + @Override + public String inspect(String sql) { + return sql; + } } - }""" - ) + """ + ) ); } @@ -56,39 +57,40 @@ public String inspect(String sql) { void shouldChangeEmptyInterceptorAlreadyImplements() { //language=java rewriteRun( - java( - """ - package com.example; - public interface MyInterface { } - """, - SourceSpec::skip - ), - java( - """ - import com.example.MyInterface; - import org.hibernate.EmptyInterceptor; - - class MyInterceptor extends EmptyInterceptor implements MyInterface { - - @Override - public String onPrepareStatement(String sql) { - return sql; + java( + """ + package com.example; + public interface MyInterface { } + """, + SourceSpec::skip + ), + java( + """ + import com.example.MyInterface; + import org.hibernate.EmptyInterceptor; + + class MyInterceptor extends EmptyInterceptor implements MyInterface { + + @Override + public String onPrepareStatement(String sql) { + return sql; + } } - } - """, - """ - import com.example.MyInterface; - import org.hibernate.Interceptor; - import org.hibernate.resource.jdbc.spi.StatementInspector; - - class MyInterceptor implements MyInterface, Interceptor, StatementInspector { - - @Override - public String inspect(String sql) { - return sql; + """, + """ + import com.example.MyInterface; + import org.hibernate.Interceptor; + import org.hibernate.resource.jdbc.spi.StatementInspector; + + class MyInterceptor implements MyInterface, Interceptor, StatementInspector { + + @Override + public String inspect(String sql) { + return sql; + } } - }""" - ) + """ + ) ); } @@ -96,21 +98,22 @@ public String inspect(String sql) { void shouldChangeEmptyInterceptorNoPrepareStatement() { //language=java rewriteRun( - java( - """ - import org.hibernate.EmptyInterceptor; - - class MyInterceptor extends EmptyInterceptor { - - } - """, - """ - import org.hibernate.Interceptor; - - class MyInterceptor implements Interceptor { - - }""" - ) + java( + """ + import org.hibernate.EmptyInterceptor; + + class MyInterceptor extends EmptyInterceptor { + + } + """, + """ + import org.hibernate.Interceptor; + + class MyInterceptor implements Interceptor { + + } + """ + ) ); } From 5364d53cecaf982eb8116e6bd8cbab8f38b5b7c0 Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Fri, 27 Sep 2024 10:45:15 +0200 Subject: [PATCH 03/13] License --- .../EmptyInterceptorToInterfaceTest.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java b/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java index 3314c6f..2930ba5 100644 --- a/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java +++ b/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java @@ -1,3 +1,18 @@ +/* + * 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.hibernate; import org.junit.jupiter.api.Test; From 9ed2707c4d134851be949fb0aba128041b4df709 Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Fri, 27 Sep 2024 10:48:05 +0200 Subject: [PATCH 04/13] Empty newline --- .../openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java b/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java index 2930ba5..2aaa5ce 100644 --- a/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java +++ b/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java @@ -131,5 +131,4 @@ class MyInterceptor implements Interceptor { ) ); } - -} \ No newline at end of file +} From a28b25d355722a8469280a5650926e07b0cce159 Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Fri, 27 Sep 2024 10:51:08 +0200 Subject: [PATCH 05/13] Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../openrewrite/hibernate/EmptyInterceptorToInterface.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java index 5b042d2..b654654 100644 --- a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java +++ b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java @@ -26,8 +26,11 @@ import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.search.FindImplementations; -import org.openrewrite.java.tree.*; - +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.JavaType; +import org.openrewrite.java.tree.Space; +import org.openrewrite.java.tree.TypeTree; +import org.openrewrite.java.tree.TypeUtils; public class EmptyInterceptorToInterface extends Recipe { private final String EMPTY_INTERCEPTOR = "org.hibernate.EmptyInterceptor"; From 3bc9ab52f71f25768da65180eb35694894e5487e Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 30 Sep 2024 15:12:33 +0200 Subject: [PATCH 06/13] Apply formatter --- .../EmptyInterceptorToInterface.java | 7 +- .../META-INF/rewrite/hibernate-6.1.yml | 1 - .../EmptyInterceptorToInterfaceTest.java | 156 +++++++++--------- 3 files changed, 80 insertions(+), 84 deletions(-) diff --git a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java index b654654..5b042d2 100644 --- a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java +++ b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java @@ -26,11 +26,8 @@ import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.search.FindImplementations; -import org.openrewrite.java.tree.J; -import org.openrewrite.java.tree.JavaType; -import org.openrewrite.java.tree.Space; -import org.openrewrite.java.tree.TypeTree; -import org.openrewrite.java.tree.TypeUtils; +import org.openrewrite.java.tree.*; + public class EmptyInterceptorToInterface extends Recipe { private final String EMPTY_INTERCEPTOR = "org.hibernate.EmptyInterceptor"; diff --git a/src/main/resources/META-INF/rewrite/hibernate-6.1.yml b/src/main/resources/META-INF/rewrite/hibernate-6.1.yml index dc55576..6478370 100644 --- a/src/main/resources/META-INF/rewrite/hibernate-6.1.yml +++ b/src/main/resources/META-INF/rewrite/hibernate-6.1.yml @@ -29,4 +29,3 @@ recipeList: groupId: org.hibernate.orm artifactId: '*' newVersion: 6.1.x - diff --git a/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java b/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java index 2aaa5ce..7f80632 100644 --- a/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java +++ b/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java @@ -30,9 +30,9 @@ class EmptyInterceptorToInterfaceTest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { spec.recipe(new EmptyInterceptorToInterface()) - .parser(JavaParser.fromJavaVersion() - .classpathFromResources(new InMemoryExecutionContext(), "hibernate-core") - ); + .parser(JavaParser.fromJavaVersion() + .classpathFromResources(new InMemoryExecutionContext(), "hibernate-core") + ); } @DocumentExample @@ -40,31 +40,31 @@ public void defaults(RecipeSpec spec) { void shouldChangeEmptyInterceptor() { //language=java rewriteRun( - java( - """ - import org.hibernate.EmptyInterceptor; - - class MyInterceptor extends EmptyInterceptor { - - @Override - public String onPrepareStatement(String sql) { - return sql; - } - } - """, - """ - import org.hibernate.Interceptor; - import org.hibernate.resource.jdbc.spi.StatementInspector; - - class MyInterceptor implements Interceptor, StatementInspector { - - @Override - public String inspect(String sql) { - return sql; - } - } - """ - ) + java( + """ + import org.hibernate.EmptyInterceptor; + + class MyInterceptor extends EmptyInterceptor { + + @Override + public String onPrepareStatement(String sql) { + return sql; + } + } + """, + """ + import org.hibernate.Interceptor; + import org.hibernate.resource.jdbc.spi.StatementInspector; + + class MyInterceptor implements Interceptor, StatementInspector { + + @Override + public String inspect(String sql) { + return sql; + } + } + """ + ) ); } @@ -72,40 +72,40 @@ public String inspect(String sql) { void shouldChangeEmptyInterceptorAlreadyImplements() { //language=java rewriteRun( - java( - """ - package com.example; - public interface MyInterface { } - """, - SourceSpec::skip - ), - java( - """ - import com.example.MyInterface; - import org.hibernate.EmptyInterceptor; - - class MyInterceptor extends EmptyInterceptor implements MyInterface { - - @Override - public String onPrepareStatement(String sql) { - return sql; - } - } - """, - """ - import com.example.MyInterface; - import org.hibernate.Interceptor; - import org.hibernate.resource.jdbc.spi.StatementInspector; - - class MyInterceptor implements MyInterface, Interceptor, StatementInspector { - - @Override - public String inspect(String sql) { - return sql; - } - } - """ - ) + java( + """ + package com.example; + public interface MyInterface { } + """, + SourceSpec::skip + ), + java( + """ + import com.example.MyInterface; + import org.hibernate.EmptyInterceptor; + + class MyInterceptor extends EmptyInterceptor implements MyInterface { + + @Override + public String onPrepareStatement(String sql) { + return sql; + } + } + """, + """ + import com.example.MyInterface; + import org.hibernate.Interceptor; + import org.hibernate.resource.jdbc.spi.StatementInspector; + + class MyInterceptor implements MyInterface, Interceptor, StatementInspector { + + @Override + public String inspect(String sql) { + return sql; + } + } + """ + ) ); } @@ -113,22 +113,22 @@ public String inspect(String sql) { void shouldChangeEmptyInterceptorNoPrepareStatement() { //language=java rewriteRun( - java( - """ - import org.hibernate.EmptyInterceptor; - - class MyInterceptor extends EmptyInterceptor { - - } - """, - """ - import org.hibernate.Interceptor; - - class MyInterceptor implements Interceptor { - - } - """ - ) + java( + """ + import org.hibernate.EmptyInterceptor; + + class MyInterceptor extends EmptyInterceptor { + + } + """, + """ + import org.hibernate.Interceptor; + + class MyInterceptor implements Interceptor { + + } + """ + ) ); } } From 8a7e7683d5d556f1230d405eab81be721240d451 Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Mon, 30 Sep 2024 15:54:33 +0200 Subject: [PATCH 07/13] Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../openrewrite/hibernate/EmptyInterceptorToInterface.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java index 5b042d2..b654654 100644 --- a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java +++ b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java @@ -26,8 +26,11 @@ import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.search.FindImplementations; -import org.openrewrite.java.tree.*; - +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.JavaType; +import org.openrewrite.java.tree.Space; +import org.openrewrite.java.tree.TypeTree; +import org.openrewrite.java.tree.TypeUtils; public class EmptyInterceptorToInterface extends Recipe { private final String EMPTY_INTERCEPTOR = "org.hibernate.EmptyInterceptor"; From 69e8901beb8b5437557605d4e0409c8396db2100 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 30 Sep 2024 15:59:48 +0200 Subject: [PATCH 08/13] Add test that fails; we can't assume `@Override` is present --- .../EmptyInterceptorToInterface.java | 3 +- .../EmptyInterceptorToInterfaceTest.java | 31 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java index b654654..a7c4b11 100644 --- a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java +++ b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java @@ -45,7 +45,8 @@ public String getDisplayName() { @Override public String getDescription() { - return "In Hibernate 6.0 the `Interceptor` interface received default implementations therefore the NOOP implementation that could be extended was no longer needed."; + return "In Hibernate 6.0 the `Interceptor` interface received default implementations therefore the NOOP implementation that could be extended was no longer needed. " + + "This recipe migrates 5.x `Interceptor#onPrepareStatement(String)` to 6.0 `StatementInspector#inspect()`."; } @Override diff --git a/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java b/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java index 7f80632..4e1e1d1 100644 --- a/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java +++ b/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java @@ -68,6 +68,37 @@ public String inspect(String sql) { ); } + @Test + void shouldChangeWhenOverrideAnnotationMissing() { + //language=java + rewriteRun( + java( + """ + import org.hibernate.EmptyInterceptor; + + class MyInterceptor extends EmptyInterceptor { + + public String onPrepareStatement(String sql) { + return sql; + } + } + """, + """ + import org.hibernate.Interceptor; + import org.hibernate.resource.jdbc.spi.StatementInspector; + + class MyInterceptor implements Interceptor, StatementInspector { + + @Override + public String inspect(String sql) { + return sql; + } + } + """ + ) + ); + } + @Test void shouldChangeEmptyInterceptorAlreadyImplements() { //language=java From 94fa4b6d9622323d5f021acdf513ed4af0f3aed9 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 30 Sep 2024 16:00:23 +0200 Subject: [PATCH 09/13] Drop duplicate `newArtifactId` --- .../resources/META-INF/rewrite/hibernate-6.0.yml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/main/resources/META-INF/rewrite/hibernate-6.0.yml b/src/main/resources/META-INF/rewrite/hibernate-6.0.yml index cca347e..7db4a70 100644 --- a/src/main/resources/META-INF/rewrite/hibernate-6.0.yml +++ b/src/main/resources/META-INF/rewrite/hibernate-6.0.yml @@ -48,7 +48,6 @@ recipeList: oldGroupId: org.hibernate oldArtifactId: hibernate-agroal newGroupId: org.hibernate.orm - newArtifactId: hibernate-agroal newVersion: 6.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.hibernate @@ -61,7 +60,6 @@ recipeList: oldGroupId: org.hibernate oldArtifactId: hibernate-c3p0 newGroupId: org.hibernate.orm - newArtifactId: hibernate-c3p0 newVersion: 6.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.hibernate @@ -74,7 +72,6 @@ recipeList: oldGroupId: org.hibernate oldArtifactId: hibernate-community-dialects newGroupId: org.hibernate.orm - newArtifactId: hibernate-community-dialects newVersion: 6.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.hibernate @@ -87,7 +84,6 @@ recipeList: oldGroupId: org.hibernate oldArtifactId: hibernate-core newGroupId: org.hibernate.orm - newArtifactId: hibernate-core newVersion: 6.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.hibernate @@ -100,7 +96,6 @@ recipeList: oldGroupId: org.hibernate oldArtifactId: hibernate-envers newGroupId: org.hibernate.orm - newArtifactId: hibernate-envers newVersion: 6.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.hibernate @@ -113,7 +108,6 @@ recipeList: oldGroupId: org.hibernate oldArtifactId: hibernate-graalvm newGroupId: org.hibernate.orm - newArtifactId: hibernate-graalvm newVersion: 6.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.hibernate @@ -126,7 +120,6 @@ recipeList: oldGroupId: org.hibernate oldArtifactId: hibernate-hikaricp newGroupId: org.hibernate.orm - newArtifactId: hibernate-hikaricp newVersion: 6.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.hibernate @@ -139,7 +132,6 @@ recipeList: oldGroupId: org.hibernate oldArtifactId: hibernate-jcache newGroupId: org.hibernate.orm - newArtifactId: hibernate-jcache newVersion: 6.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.hibernate @@ -152,7 +144,6 @@ recipeList: oldGroupId: org.hibernate oldArtifactId: hibernate-jpamodelgen newGroupId: org.hibernate.orm - newArtifactId: hibernate-jpamodelgen newVersion: 6.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.hibernate @@ -165,7 +156,6 @@ recipeList: oldGroupId: org.hibernate oldArtifactId: hibernate-micrometer newGroupId: org.hibernate.orm - newArtifactId: hibernate-micrometer newVersion: 6.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.hibernate @@ -178,7 +168,6 @@ recipeList: oldGroupId: org.hibernate oldArtifactId: hibernate-proxool newGroupId: org.hibernate.orm - newArtifactId: hibernate-proxool newVersion: 6.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.hibernate @@ -191,7 +180,6 @@ recipeList: oldGroupId: org.hibernate oldArtifactId: hibernate-spatial newGroupId: org.hibernate.orm - newArtifactId: hibernate-spatial newVersion: 6.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.hibernate @@ -204,7 +192,6 @@ recipeList: oldGroupId: org.hibernate oldArtifactId: hibernate-testing newGroupId: org.hibernate.orm - newArtifactId: hibernate-testing newVersion: 6.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.hibernate From 077b5970d9e8813ef6527de2f33ca19c2fdd73d3 Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Tue, 1 Oct 2024 10:47:22 +0200 Subject: [PATCH 10/13] Use MethodMatcher Instead of autoformat, apply correct padding --- .../EmptyInterceptorToInterface.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java index a7c4b11..fdb8dd2 100644 --- a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java +++ b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java @@ -21,22 +21,20 @@ import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; import org.openrewrite.internal.ListUtils; -import org.openrewrite.java.AnnotationMatcher; -import org.openrewrite.java.JavaIsoVisitor; -import org.openrewrite.java.JavaParser; -import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.*; import org.openrewrite.java.search.FindImplementations; -import org.openrewrite.java.tree.J; -import org.openrewrite.java.tree.JavaType; -import org.openrewrite.java.tree.Space; -import org.openrewrite.java.tree.TypeTree; -import org.openrewrite.java.tree.TypeUtils; +import org.openrewrite.java.tree.*; + +import java.util.ArrayList; +import java.util.List; + public class EmptyInterceptorToInterface extends Recipe { private final String EMPTY_INTERCEPTOR = "org.hibernate.EmptyInterceptor"; private final String INTERCEPTOR = "org.hibernate.Interceptor"; private final String STATEMENT_INSPECTOR = "org.hibernate.resource.jdbc.spi.StatementInspector"; private static final AnnotationMatcher OVERRIDE_ANNOTATION_MATCHER = new AnnotationMatcher("java.lang.Override"); + private static final MethodMatcher ON_PREPARE_STATEMENT = new MethodMatcher("* onPrepareStatement(java.lang.String)"); @Override public String getDisplayName() { @@ -66,13 +64,17 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex maybeAddImport(STATEMENT_INSPECTOR); maybeRemoveImport(EMPTY_INTERCEPTOR); } - return autoFormat(cd, ctx); + if (cd.getPadding().getImplements() != null) { + cd = cd.getPadding().withImplements(cd.getPadding().getImplements().withBefore(Space.SINGLE_SPACE)); + } + return cd; } @Override public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, ExecutionContext ctx) { J.MethodDeclaration md = super.visitMethodDeclaration(method, ctx); - if (md.getLeadingAnnotations().stream().anyMatch(OVERRIDE_ANNOTATION_MATCHER::matches) && md.getSimpleName().equals("onPrepareStatement")) { + J.ClassDeclaration cd = getCursor().firstEnclosing(J.ClassDeclaration.class); + if (cd != null && ON_PREPARE_STATEMENT.matches(md, cd)) { getCursor().putMessageOnFirstEnclosing(J.ClassDeclaration.class, "prepareStatementFound", true); String template = "@Override\n" + "public String inspect() {\n" + @@ -81,7 +83,11 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, Ex .javaParser(JavaParser.fromJavaVersion()) .build() .apply(getCursor(), md.getCoordinates().replace()); - md = inspect.withBody(md.getBody()).withModifiers(md.getModifiers()).withLeadingAnnotations(md.getLeadingAnnotations()).withParameters(md.getParameters()); + List annotations = new ArrayList<>(md.getLeadingAnnotations()); + if (annotations.stream().noneMatch(OVERRIDE_ANNOTATION_MATCHER::matches)) { + annotations.addAll(inspect.getLeadingAnnotations()); + } + md = inspect.withBody(md.getBody()).withLeadingAnnotations(annotations).withParameters(md.getParameters()); } return md; } From 8f76077d8c370086bdf971a290abc3650a70a4bc Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Mon, 7 Oct 2024 09:56:05 +0200 Subject: [PATCH 11/13] Apply suggestions from code review Co-authored-by: Tim te Beek --- .../org/openrewrite/hibernate/EmptyInterceptorToInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java index fdb8dd2..5f90829 100644 --- a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java +++ b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java @@ -34,7 +34,7 @@ public class EmptyInterceptorToInterface extends Recipe { private final String INTERCEPTOR = "org.hibernate.Interceptor"; private final String STATEMENT_INSPECTOR = "org.hibernate.resource.jdbc.spi.StatementInspector"; private static final AnnotationMatcher OVERRIDE_ANNOTATION_MATCHER = new AnnotationMatcher("java.lang.Override"); - private static final MethodMatcher ON_PREPARE_STATEMENT = new MethodMatcher("* onPrepareStatement(java.lang.String)"); + private static final MethodMatcher ON_PREPARE_STATEMENT = new MethodMatcher("org.hibernate.Interceptor onPrepareStatement(java.lang.String)", true); @Override public String getDisplayName() { From b0c3e6b6338f3ffd3dd66f270a952fc7bb7d5da4 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Tue, 8 Oct 2024 11:44:03 +0200 Subject: [PATCH 12/13] Polish to use JavaTemplate.apply & drop annotation handling --- .../EmptyInterceptorToInterface.java | 40 +++++++------------ 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java index 5f90829..938ded4 100644 --- a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java +++ b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java @@ -21,19 +21,17 @@ import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; import org.openrewrite.internal.ListUtils; -import org.openrewrite.java.*; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.MethodMatcher; import org.openrewrite.java.search.FindImplementations; import org.openrewrite.java.tree.*; -import java.util.ArrayList; -import java.util.List; - public class EmptyInterceptorToInterface extends Recipe { private final String EMPTY_INTERCEPTOR = "org.hibernate.EmptyInterceptor"; private final String INTERCEPTOR = "org.hibernate.Interceptor"; private final String STATEMENT_INSPECTOR = "org.hibernate.resource.jdbc.spi.StatementInspector"; - private static final AnnotationMatcher OVERRIDE_ANNOTATION_MATCHER = new AnnotationMatcher("java.lang.Override"); private static final MethodMatcher ON_PREPARE_STATEMENT = new MethodMatcher("org.hibernate.Interceptor onPrepareStatement(java.lang.String)", true); @Override @@ -49,23 +47,21 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return Preconditions.check(new FindImplementations(EMPTY_INTERCEPTOR), - new JavaIsoVisitor() { + return Preconditions.check(new FindImplementations(EMPTY_INTERCEPTOR), new JavaIsoVisitor() { @Override public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { J.ClassDeclaration cd = super.visitClassDeclaration(classDecl, ctx); if (cd.getExtends() != null && TypeUtils.isOfClassType(cd.getExtends().getType(), EMPTY_INTERCEPTOR)) { cd = cd.withExtends(null).withImplements(ListUtils.concat(cd.getImplements(), (TypeTree) TypeTree.build("Interceptor").withType(JavaType.buildType(INTERCEPTOR)).withPrefix(Space.SINGLE_SPACE))); - Boolean prepareStatement = getCursor().pollMessage("prepareStatementFound"); - if (Boolean.TRUE.equals(prepareStatement)) { + maybeAddImport(INTERCEPTOR); + if (getCursor().pollMessage("prepareStatementFound") != null) { cd = cd.withImplements(ListUtils.concat(cd.getImplements(), (TypeTree) TypeTree.build("StatementInspector").withType(JavaType.buildType(STATEMENT_INSPECTOR)).withPrefix(Space.SINGLE_SPACE))); + maybeAddImport(STATEMENT_INSPECTOR); } - maybeAddImport(INTERCEPTOR); - maybeAddImport(STATEMENT_INSPECTOR); maybeRemoveImport(EMPTY_INTERCEPTOR); - } - if (cd.getPadding().getImplements() != null) { - cd = cd.getPadding().withImplements(cd.getPadding().getImplements().withBefore(Space.SINGLE_SPACE)); + if (cd.getPadding().getImplements() != null) { + cd = cd.getPadding().withImplements(cd.getPadding().getImplements().withBefore(Space.SINGLE_SPACE)); + } } return cd; } @@ -76,18 +72,10 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, Ex J.ClassDeclaration cd = getCursor().firstEnclosing(J.ClassDeclaration.class); if (cd != null && ON_PREPARE_STATEMENT.matches(md, cd)) { getCursor().putMessageOnFirstEnclosing(J.ClassDeclaration.class, "prepareStatementFound", true); - String template = "@Override\n" + - "public String inspect() {\n" + - "}\n"; - J.MethodDeclaration inspect = JavaTemplate.builder(template) - .javaParser(JavaParser.fromJavaVersion()) - .build() - .apply(getCursor(), md.getCoordinates().replace()); - List annotations = new ArrayList<>(md.getLeadingAnnotations()); - if (annotations.stream().noneMatch(OVERRIDE_ANNOTATION_MATCHER::matches)) { - annotations.addAll(inspect.getLeadingAnnotations()); - } - md = inspect.withBody(md.getBody()).withLeadingAnnotations(annotations).withParameters(md.getParameters()); + J.MethodDeclaration inspect = JavaTemplate.apply( + "@Override public String inspect(String overriddenBelow) { return overriddenBelow; }", + getCursor(), md.getCoordinates().replace()); + return inspect.withParameters(md.getParameters()).withBody(md.getBody()); } return md; } From 014ae7e1909e2688beacbf91009123fb5fef3884 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Tue, 8 Oct 2024 11:59:41 +0200 Subject: [PATCH 13/13] Retain any other annotations, or lack of annotations --- .../EmptyInterceptorToInterface.java | 11 ++++-- .../EmptyInterceptorToInterfaceTest.java | 37 +++++++++++++++++-- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java index 938ded4..f3ec71b 100644 --- a/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java +++ b/src/main/java/org/openrewrite/hibernate/EmptyInterceptorToInterface.java @@ -72,10 +72,15 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, Ex J.ClassDeclaration cd = getCursor().firstEnclosing(J.ClassDeclaration.class); if (cd != null && ON_PREPARE_STATEMENT.matches(md, cd)) { getCursor().putMessageOnFirstEnclosing(J.ClassDeclaration.class, "prepareStatementFound", true); - J.MethodDeclaration inspect = JavaTemplate.apply( - "@Override public String inspect(String overriddenBelow) { return overriddenBelow; }", + J.MethodDeclaration inspectMD = JavaTemplate.apply( + (md.getLeadingAnnotations().isEmpty() ? "" : "@Override ") + + "public String inspect(String overriddenBelow) { return overriddenBelow; }", getCursor(), md.getCoordinates().replace()); - return inspect.withParameters(md.getParameters()).withBody(md.getBody()); + return inspectMD + .withPrefix(md.getPrefix()) + .withLeadingAnnotations(md.getLeadingAnnotations()) + .withParameters(md.getParameters()) + .withBody(md.getBody()); } return md; } diff --git a/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java b/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java index 4e1e1d1..1356f5b 100644 --- a/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java +++ b/src/test/java/org/openrewrite/hibernate/EmptyInterceptorToInterfaceTest.java @@ -77,7 +77,6 @@ void shouldChangeWhenOverrideAnnotationMissing() { import org.hibernate.EmptyInterceptor; class MyInterceptor extends EmptyInterceptor { - public String onPrepareStatement(String sql) { return sql; } @@ -88,8 +87,6 @@ public String onPrepareStatement(String sql) { import org.hibernate.resource.jdbc.spi.StatementInspector; class MyInterceptor implements Interceptor, StatementInspector { - - @Override public String inspect(String sql) { return sql; } @@ -140,6 +137,40 @@ public String inspect(String sql) { ); } + @Test + void shouldRetainOtherAnnotations() { + //language=java + rewriteRun( + java( + """ + import org.hibernate.EmptyInterceptor; + + class MyInterceptor extends EmptyInterceptor { + + @Override + @SuppressWarnings("ALL") + public String onPrepareStatement(String sql) { + return sql; + } + } + """, + """ + import org.hibernate.Interceptor; + import org.hibernate.resource.jdbc.spi.StatementInspector; + + class MyInterceptor implements Interceptor, StatementInspector { + + @Override + @SuppressWarnings("ALL") + public String inspect(String sql) { + return sql; + } + } + """ + ) + ); + } + @Test void shouldChangeEmptyInterceptorNoPrepareStatement() { //language=java