From 945e59b106139ff97535937d9997927149e13a38 Mon Sep 17 00:00:00 2001
From: Rey <89825425+Kingg22@users.noreply.github.com>
Date: Tue, 26 Aug 2025 16:07:53 -0500
Subject: [PATCH 01/14] build(code quality): replace checkerframework plugin
with error prone and nullaway
---
build.gradle | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/build.gradle b/build.gradle
index c661531e733f..7122d727e1fc 100644
--- a/build.gradle
+++ b/build.gradle
@@ -24,7 +24,9 @@ plugins {
id 'biz.aQute.bnd' version '7.1.0' apply false
id "com.diffplug.spotless" version "7.0.4"
- id 'org.checkerframework' version '0.6.56'
+ //id 'org.checkerframework' version '0.6.56'
+ id "net.ltgt.errorprone" version "4.3.0"
+ id "net.ltgt.nullaway" version "2.3.0"
id 'org.hibernate.orm.build.jdks'
id 'io.github.gradle-nexus.publish-plugin' version '2.0.0'
From 431771665f6b44f7f98e19ad60ee94486e8d2a78 Mon Sep 17 00:00:00 2001
From: Rey <89825425+Kingg22@users.noreply.github.com>
Date: Tue, 26 Aug 2025 16:09:09 -0500
Subject: [PATCH 02/14] build(code quality): configure nullaway, add jspecify
---
.../src/main/groovy/local.code-quality.gradle | 42 +++++++++++++++++--
1 file changed, 38 insertions(+), 4 deletions(-)
diff --git a/local-build-plugins/src/main/groovy/local.code-quality.gradle b/local-build-plugins/src/main/groovy/local.code-quality.gradle
index 8e79bb839212..52fc8491303b 100644
--- a/local-build-plugins/src/main/groovy/local.code-quality.gradle
+++ b/local-build-plugins/src/main/groovy/local.code-quality.gradle
@@ -4,7 +4,9 @@
*/
plugins {
- id "org.checkerframework"
+ //id "org.checkerframework"
+ id "net.ltgt.errorprone"
+ id "net.ltgt.nullaway"
id "de.thetaphi.forbiddenapis"
id "com.diffplug.spotless"
}
@@ -106,11 +108,42 @@ spotless {
tasks.compileJava.dependsOn tasks.spotlessJavaApply
dependencies {
- compileOnly libs.checkerFramework
- testCompileOnly libs.checkerFramework
- checkerFramework libs.checkerFrameworkChecker
+ //compileOnly libs.checkerFramework
+ //testCompileOnly libs.checkerFramework
+ //checkerFramework libs.checkerFrameworkChecker
+ api "org.jspecify:jspecify:1.0.0"
+ compileOnly "org.jetbrains:annotations:26.0.2"
+ errorprone "com.uber.nullaway:nullaway:0.12.9"
+ errorprone "com.google.errorprone:error_prone_core:2.41.0"
}
+tasks.withType(JavaCompile).configureEach {
+ if (gradle.startParameter.taskNames.contains("ciCheck")) {
+ // options.errorprone.enabled = true
+ }
+ if (it.name.toLowerCase().contains("test")) {
+ options.errorprone.enabled = false
+ }
+ options.errorprone {
+ disableWarningsInGeneratedCode.set(true)
+
+ // error prone core = warnings
+ errorproneArgs.add("-XepAllErrorsAsWarnings")
+
+ nullaway {
+ error()
+ // annotatedPackages.add("org.hibernate")
+ onlyNullMarked.set(true)
+ treatGeneratedAsUnannotated.set(true)
+ checkContracts.set(true)
+ checkOptionalEmptiness.set(true)
+ exhaustiveOverride.set(true)
+ jspecifyMode.set(true)
+ }
+ }
+}
+
+/*
checkerFramework {
excludeTests = true
skipCheckerFramework = !gradle.startParameter.taskNames.contains("ciCheck")
@@ -123,6 +156,7 @@ checkerFramework {
'-AonlyDefs=^org\\.hibernate\\.(jdbc|exception|integrator|processor|service|spi|pretty|property\\.access|stat|engine\\.(config|jndi|profile|spi|transaction)|(action|context|bytecode)\\.spi)\\.'
]
}
+*/
tasks.forbiddenApisMain {
// unfortunately we currently have many uses of default Locale implicitly (~370)
From c627cf35be412ed7cea2becc5d49844a77301b17 Mon Sep 17 00:00:00 2001
From: Rey <89825425+Kingg22@users.noreply.github.com>
Date: Tue, 26 Aug 2025 16:10:20 -0500
Subject: [PATCH 03/14] build(code quality): add compile only checkerframework
null annotations
Only for compile the unmodified code, is not checked
---
.../hibernate-community-dialects.gradle | 2 ++
hibernate-core/hibernate-core.gradle | 5 ++++-
hibernate-micrometer/hibernate-micrometer.gradle | 2 ++
hibernate-vector/hibernate-vector.gradle | 2 ++
4 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/hibernate-community-dialects/hibernate-community-dialects.gradle b/hibernate-community-dialects/hibernate-community-dialects.gradle
index c2089b483917..702821ceeb1d 100644
--- a/hibernate-community-dialects/hibernate-community-dialects.gradle
+++ b/hibernate-community-dialects/hibernate-community-dialects.gradle
@@ -13,6 +13,8 @@ description = 'Hibernate\'s community supported dialects'
dependencies {
api project( ':hibernate-core' )
+ compileOnly libs.checkerFramework
+
testImplementation project( ':hibernate-testing' )
testImplementation project( path: ':hibernate-core', configuration: 'tests' )
}
diff --git a/hibernate-core/hibernate-core.gradle b/hibernate-core/hibernate-core.gradle
index a417f71604bd..4cdf15d08a2e 100644
--- a/hibernate-core/hibernate-core.gradle
+++ b/hibernate-core/hibernate-core.gradle
@@ -20,7 +20,6 @@ configurations {
}
}
-
dependencies {
api jakartaLibs.jpa
api jakartaLibs.jta
@@ -35,6 +34,8 @@ dependencies {
implementation libs.antlrRuntime
+ compileOnly libs.checkerFramework
+
compileOnly jakartaLibs.jacc
compileOnly jakartaLibs.validation
compileOnly jakartaLibs.cdi
@@ -61,6 +62,8 @@ dependencies {
testImplementation jdbcLibs.h2
testImplementation libs.hibernateModelsJandex
+ testCompileOnly libs.checkerFramework
+
testRuntimeOnly libs.byteBuddy
testRuntimeOnly testLibs.weld
testRuntimeOnly testLibs.wildFlyTxnClient
diff --git a/hibernate-micrometer/hibernate-micrometer.gradle b/hibernate-micrometer/hibernate-micrometer.gradle
index 461d5cca2a28..85306b67b589 100644
--- a/hibernate-micrometer/hibernate-micrometer.gradle
+++ b/hibernate-micrometer/hibernate-micrometer.gradle
@@ -9,6 +9,8 @@ dependencies {
implementation project( ':hibernate-core' )
implementation libs.micrometer
+ compileOnly libs.checkerFramework
+
testImplementation project( ':hibernate-testing' )
testAnnotationProcessor project( ':hibernate-processor' )
diff --git a/hibernate-vector/hibernate-vector.gradle b/hibernate-vector/hibernate-vector.gradle
index 61e10169bc30..9fdd435ae7aa 100644
--- a/hibernate-vector/hibernate-vector.gradle
+++ b/hibernate-vector/hibernate-vector.gradle
@@ -13,6 +13,8 @@ description = 'Hibernate\'s extensions for vector support'
dependencies {
api project( ':hibernate-core' )
+ compileOnly libs.checkerFramework
+
testImplementation project( ':hibernate-testing' )
testImplementation project( path: ':hibernate-core', configuration: 'tests' )
}
From ad2ccc2b2a53f197070a8c886ed6c020756e91cc Mon Sep 17 00:00:00 2001
From: Rey <89825425+Kingg22@users.noreply.github.com>
Date: Tue, 26 Aug 2025 16:35:30 -0500
Subject: [PATCH 04/14] perf(packages): annotate with null marked and
NullUnmarked only for mock
---
.../java/org/hibernate/processor/annotation/package-info.java | 1 +
.../main/java/org/hibernate/processor/model/package-info.java | 1 +
.../src/main/java/org/hibernate/processor/package-info.java | 1 +
.../src/main/java/org/hibernate/processor/util/package-info.java | 1 +
.../main/java/org/hibernate/processor/util/xml/package-info.java | 1 +
.../java/org/hibernate/processor/validation/package-info.java | 1 +
.../src/main/java/org/hibernate/processor/xml/package-info.java | 1 +
7 files changed, 7 insertions(+)
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/package-info.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/package-info.java
index 49c36b5002a3..3c06b78097ef 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/package-info.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/package-info.java
@@ -5,4 +5,5 @@
/**
* Implementation of the model classes backed by annotations.
*/
+@org.jspecify.annotations.NullMarked
package org.hibernate.processor.annotation;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/package-info.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/package-info.java
index 731671b84a9e..9aa54da956cc 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/package-info.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/package-info.java
@@ -2,4 +2,5 @@
* SPDX-License-Identifier: Apache-2.0
* Copyright Red Hat Inc. and Hibernate Authors
*/
+@org.jspecify.annotations.NullMarked
package org.hibernate.processor.model;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/package-info.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/package-info.java
index 18d4ab4819ea..c6b1a11642c4 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/package-info.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/package-info.java
@@ -6,4 +6,5 @@
* The main package of this annotation processor.
* The actual processor class is {@link org.hibernate.processor.HibernateProcessor}.
*/
+@org.jspecify.annotations.NullMarked
package org.hibernate.processor;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/package-info.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/package-info.java
index d176a73bd5ce..3777e04df320 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/package-info.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/package-info.java
@@ -5,4 +5,5 @@
/**
* Helper classes for string and type processing as well as access type detection.
*/
+@org.jspecify.annotations.NullMarked
package org.hibernate.processor.util;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/package-info.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/package-info.java
index 2e3f7e6cab59..79216e3ebd57 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/package-info.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/package-info.java
@@ -5,4 +5,5 @@
/**
* XML helper classes. Used for parsing persistence.xml and orm.xml.
*/
+@org.jspecify.annotations.NullMarked
package org.hibernate.processor.util.xml;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/package-info.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/package-info.java
index f78fe27b6ba7..a4828b82ba00 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/package-info.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/package-info.java
@@ -7,4 +7,5 @@
*
* @see org.hibernate.processor.validation.Validation#validate
*/
+@org.jspecify.annotations.NullUnmarked
package org.hibernate.processor.validation;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/package-info.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/package-info.java
index f237d42f54fd..15ef7f0ef298 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/package-info.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/package-info.java
@@ -5,4 +5,5 @@
/**
* Implementation of the model classes backed by annotations.
*/
+@org.jspecify.annotations.NullMarked
package org.hibernate.processor.xml;
From 1884c37c3eb4a35d346b25b3e4de1044d2f9c9ca Mon Sep 17 00:00:00 2001
From: Rey <89825425+Kingg22@users.noreply.github.com>
Date: Tue, 26 Aug 2025 16:36:59 -0500
Subject: [PATCH 05/14] perf(hibernate-processor): remove unused code and
replace with jspecify
---
.../processor/util/NullnessUtil.java | 269 +-----------------
1 file changed, 8 insertions(+), 261 deletions(-)
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/NullnessUtil.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/NullnessUtil.java
index 3cadd5b5488c..9b9f3d9c001c 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/NullnessUtil.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/NullnessUtil.java
@@ -4,10 +4,9 @@
*/
package org.hibernate.processor.util;
-import org.checkerframework.checker.nullness.qual.EnsuresNonNull;
-import org.checkerframework.checker.nullness.qual.NonNull;
-import org.checkerframework.checker.nullness.qual.Nullable;
-import org.checkerframework.framework.qual.AnnotatedFor;
+import org.jspecify.annotations.Nullable;
+
+import static java.util.Objects.requireNonNull;
/**
* Utility class for the Nullness Checker.
@@ -23,11 +22,6 @@
*
Runtime Dependency: If you use this class, you must distribute (or link to) {@code
* checker-qual.jar}, along with your binaries. Or, you can copy this class into your own project.
*/
-@SuppressWarnings({
- "nullness", // Nullness utilities are trusted regarding nullness.
- "cast" // Casts look redundant if Nullness Checker is not run.
-})
-@AnnotatedFor("nullness")
public final class NullnessUtil {
private NullnessUtil() {
@@ -70,10 +64,8 @@ private NullnessUtil() {
*
* @return the argument, cast to have the type qualifier @NonNull
*/
- @EnsuresNonNull("#1")
- public static @NonNull T castNonNull(@Nullable T ref) {
- assert ref != null : "Misuse of castNonNull: called with a null argument";
- return ref;
+ public static T castNonNull(@Nullable T ref) {
+ return requireNonNull( ref, "Misuse of castNonNull: called with a null argument" );
}
/**
@@ -88,254 +80,9 @@ private NullnessUtil() {
*
* @see #castNonNull(Object)
*/
- public static @EnsuresNonNull("#1") @NonNull T castNonNull(
- @Nullable T ref, String message) {
- assert ref != null : "Misuse of castNonNull: called with a null argument: " + message;
- return ref;
- }
-
- /**
- * Like castNonNull, but whereas that method only checks and casts the reference itself, this
- * traverses all levels of the argument array. The array is recursively checked to ensure that all
- * elements at every array level are non-null.
- *
- * @param the component type of the array
- * @param arr an array all of whose elements, and their elements recursively, are non-null at run
- * time
- *
- * @return the argument, cast to have the type qualifier @NonNull at all levels
- *
- * @see #castNonNull(Object)
- */
- @EnsuresNonNull("#1")
- public static @NonNull T @NonNull [] castNonNullDeep(
- T @Nullable [] arr) {
- return castNonNullArray( arr, null );
- }
-
- /**
- * Like castNonNull, but whereas that method only checks and casts the reference itself, this
- * traverses all levels of the argument array. The array is recursively checked to ensure that all
- * elements at every array level are non-null.
- *
- * @param the component type of the array
- * @param arr an array all of whose elements, and their elements recursively, are non-null at run
- * time
- * @param message text to include if this method is misused
- *
- * @return the argument, cast to have the type qualifier @NonNull at all levels
- *
- * @see #castNonNull(Object)
- */
- @EnsuresNonNull("#1")
- public static @NonNull T @NonNull [] castNonNullDeep(
- T @Nullable [] arr, String message) {
- return castNonNullArray( arr, message );
- }
-
- /**
- * Like castNonNull, but whereas that method only checks and casts the reference itself, this
- * traverses all levels of the argument array. The array is recursively checked to ensure that all
- * elements at every array level are non-null.
- *
- * @param the component type of the component type of the array
- * @param arr an array all of whose elements, and their elements recursively, are non-null at run
- * time
- *
- * @return the argument, cast to have the type qualifier @NonNull at all levels
- *
- * @see #castNonNull(Object)
- */
- @EnsuresNonNull("#1")
- public static @NonNull T @NonNull [][] castNonNullDeep(
- T @Nullable [] @Nullable [] arr) {
- return castNonNullArray( arr, null );
- }
-
- /**
- * Like castNonNull, but whereas that method only checks and casts the reference itself, this
- * traverses all levels of the argument array. The array is recursively checked to ensure that all
- * elements at every array level are non-null.
- *
- * @param the component type of the component type of the array
- * @param arr an array all of whose elements, and their elements recursively, are non-null at run
- * time
- * @param message text to include if this method is misused
- *
- * @return the argument, cast to have the type qualifier @NonNull at all levels
- *
- * @see #castNonNull(Object)
- */
- @EnsuresNonNull("#1")
- public static @NonNull T @NonNull [][] castNonNullDeep(
- T @Nullable [] @Nullable [] arr, String message) {
- return castNonNullArray( arr, message );
- }
-
- /**
- * Like castNonNull, but whereas that method only checks and casts the reference itself, this
- * traverses all levels of the argument array. The array is recursively checked to ensure that all
- * elements at every array level are non-null.
- *
- * @param the component type (three levels in) of the array
- * @param arr an array all of whose elements, and their elements recursively, are non-null at run
- * time
- *
- * @return the argument, cast to have the type qualifier @NonNull at all levels
- *
- * @see #castNonNull(Object)
- */
- @EnsuresNonNull("#1")
- public static @NonNull T @NonNull [][][] castNonNullDeep(
- T @Nullable [] @Nullable [] @Nullable [] arr) {
- return castNonNullArray( arr, null );
- }
-
- /**
- * Like castNonNull, but whereas that method only checks and casts the reference itself, this
- * traverses all levels of the argument array. The array is recursively checked to ensure that all
- * elements at every array level are non-null.
- *
- * @param the component type (three levels in) of the array
- * @param arr an array all of whose elements, and their elements recursively, are non-null at run
- * time
- * @param message text to include if this method is misused
- *
- * @return the argument, cast to have the type qualifier @NonNull at all levels
- *
- * @see #castNonNull(Object)
- */
- @EnsuresNonNull("#1")
- public static @NonNull T @NonNull [][][] castNonNullDeep(
- T @Nullable [] @Nullable [] @Nullable [] arr, String message) {
- return castNonNullArray( arr, message );
- }
-
- /**
- * Like castNonNull, but whereas that method only checks and casts the reference itself, this
- * traverses all levels of the argument array. The array is recursively checked to ensure that all
- * elements at every array level are non-null.
- *
- * @param the component type of the array
- * @param arr an array all of whose elements, and their elements recursively, are non-null at run
- * time
- *
- * @return the argument, cast to have the type qualifier @NonNull at all levels
- *
- * @see #castNonNull(Object)
- */
- @EnsuresNonNull("#1")
- public static @NonNull T @NonNull [][][][] castNonNullDeep(
- T @Nullable [] @Nullable [] @Nullable [] @Nullable [] arr) {
- return castNonNullArray( arr, null );
- }
-
- /**
- * Like castNonNull, but whereas that method only checks and casts the reference itself, this
- * traverses all levels of the argument array. The array is recursively checked to ensure that all
- * elements at every array level are non-null.
- *
- * @param the component type (four levels in) of the array
- * @param arr an array all of whose elements, and their elements recursively, are non-null at run
- * time
- * @param message text to include if this method is misused
- *
- * @return the argument, cast to have the type qualifier @NonNull at all levels
- *
- * @see #castNonNull(Object)
- */
- @EnsuresNonNull("#1")
- public static @NonNull T @NonNull [][][][] castNonNullDeep(
- T @Nullable [] @Nullable [] @Nullable [] @Nullable [] arr, String message) {
- return castNonNullArray( arr, message );
- }
-
- /**
- * Like castNonNull, but whereas that method only checks and casts the reference itself, this
- * traverses all levels of the argument array. The array is recursively checked to ensure that all
- * elements at every array level are non-null.
- *
- * @param the component type (four levels in) of the array
- * @param arr an array all of whose elements, and their elements recursively, are non-null at run
- * time
- *
- * @return the argument, cast to have the type qualifier @NonNull at all levels
- *
- * @see #castNonNull(Object)
- */
- @EnsuresNonNull("#1")
- public static @NonNull T @NonNull [][][][][] castNonNullDeep(
- T @Nullable [] @Nullable [] @Nullable [] @Nullable [] @Nullable [] arr) {
- return castNonNullArray( arr, null );
- }
-
- /**
- * Like castNonNull, but whereas that method only checks and casts the reference itself, this
- * traverses all levels of the argument array. The array is recursively checked to ensure that all
- * elements at every array level are non-null.
- *
- * @param the component type (five levels in) of the array
- * @param arr an array all of whose elements, and their elements recursively, are non-null at run
- * time
- * @param message text to include if this method is misused
- *
- * @return the argument, cast to have the type qualifier @NonNull at all levels
- *
- * @see #castNonNull(Object)
- */
- @EnsuresNonNull("#1")
- public static @NonNull T @NonNull [][][][][] castNonNullDeep(
- T @Nullable [] @Nullable [] @Nullable [] @Nullable [] @Nullable [] arr, String message) {
- return castNonNullArray( arr, message );
- }
-
- /**
- * The implementation of castNonNullDeep.
- *
- * @param the component type (five levels in) of the array
- * @param arr an array all of whose elements, and their elements recursively, are non-null at run
- * time
- * @param message text to include if there is a non-null value, or null to use uncustomized
- * message
- *
- * @return the argument, cast to have the type qualifier @NonNull at all levels
- */
- private static @NonNull T @NonNull [] castNonNullArray(
- T @Nullable [] arr, @Nullable String message) {
- assert arr != null
- : "Misuse of castNonNullArray: called with a null array argument"
- + ( message == null ? "" : ": " + message );
- for ( int i = 0; i < arr.length; ++i ) {
- assert arr[i] != null
- : "Misuse of castNonNull: called with a null array element"
- + ( message == null ? "" : ": " + message );
- checkIfArray( arr[i], message );
- }
- return arr;
+ public static T castNonNull(@Nullable T ref, String message) {
+ return requireNonNull( ref, "Misuse of castNonNull: called with a null argument: " + message );
}
- /**
- * If the argument is an array, requires it to be non-null at all levels.
- *
- * @param ref a value; if an array, all of its elements, and their elements recursively, are
- * non-null at run time
- * @param message text to include if there is a non-null value, or null to use uncustomized
- * message
- */
- private static void checkIfArray(@NonNull Object ref, @Nullable String message) {
- assert ref != null
- : "Misuse of checkIfArray: called with a null argument"
- + ( ( message == null ) ? "" : ( ": " + message ) );
- Class> comp = ref.getClass().getComponentType();
- if ( comp != null ) {
- // comp is non-null for arrays, otherwise null.
- if ( comp.isPrimitive() ) {
- // Nothing to do for arrays of primitive type: primitives are
- // never null.
- }
- else {
- castNonNullArray( (Object[]) ref, message );
- }
- }
- }
+ // removed unused code and very deeply arrays
}
From e079ad266adb529e10ae907f90e32688e5d2e028 Mon Sep 17 00:00:00 2001
From: Rey <89825425+Kingg22@users.noreply.github.com>
Date: Tue, 26 Aug 2025 17:14:20 -0500
Subject: [PATCH 06/14] build(code quality): remove jetbrains annotations
---
local-build-plugins/src/main/groovy/local.code-quality.gradle | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/local-build-plugins/src/main/groovy/local.code-quality.gradle b/local-build-plugins/src/main/groovy/local.code-quality.gradle
index 52fc8491303b..bcfa76710669 100644
--- a/local-build-plugins/src/main/groovy/local.code-quality.gradle
+++ b/local-build-plugins/src/main/groovy/local.code-quality.gradle
@@ -112,7 +112,9 @@ dependencies {
//testCompileOnly libs.checkerFramework
//checkerFramework libs.checkerFrameworkChecker
api "org.jspecify:jspecify:1.0.0"
- compileOnly "org.jetbrains:annotations:26.0.2"
+ // for use contract like @Nullable Boolean foo(final String a) @Contract(null->null)
+ // see https://github.com/uber/NullAway/wiki/Supported-Annotations#contracts
+ // compileOnly "org.jetbrains:annotations:26.0.2"
errorprone "com.uber.nullaway:nullaway:0.12.9"
errorprone "com.google.errorprone:error_prone_core:2.41.0"
}
From 03b118a5d478e4d24c10654645956f5c8210ae90 Mon Sep 17 00:00:00 2001
From: Rey <89825425+Kingg22@users.noreply.github.com>
Date: Tue, 26 Aug 2025 17:56:24 -0500
Subject: [PATCH 07/14] perf(hibernate processor): replace Nullable with
jspecify annotation
20 errors with nullaway compile
---
.../src/main/java/org/hibernate/processor/Context.java | 2 +-
.../main/java/org/hibernate/processor/HibernateProcessor.java | 2 +-
.../src/main/java/org/hibernate/processor/Version.java | 2 +-
.../hibernate/processor/annotation/AbstractCriteriaMethod.java | 2 +-
.../hibernate/processor/annotation/AbstractFinderMethod.java | 2 +-
.../org/hibernate/processor/annotation/AbstractQueryMethod.java | 2 +-
.../java/org/hibernate/processor/annotation/AnnotationMeta.java | 2 +-
.../hibernate/processor/annotation/AnnotationMetaEntity.java | 2 +-
.../hibernate/processor/annotation/AnnotationMetaPackage.java | 2 +-
.../hibernate/processor/annotation/CriteriaFinderMethod.java | 2 +-
.../processor/annotation/DataAnnotationMetaAttribute.java | 2 +-
.../annotation/DataMetaAttributeGenerationVisitor.java | 2 +-
.../org/hibernate/processor/annotation/DefaultConstructor.java | 2 +-
.../java/org/hibernate/processor/annotation/IdFinderMethod.java | 2 +-
.../processor/annotation/MetaAttributeGenerationVisitor.java | 2 +-
.../org/hibernate/processor/annotation/NamedQueryMethod.java | 2 +-
.../hibernate/processor/annotation/NaturalIdFinderMethod.java | 2 +-
.../org/hibernate/processor/annotation/NonManagedMetamodel.java | 2 +-
.../java/org/hibernate/processor/annotation/QueryMethod.java | 2 +-
.../hibernate/processor/annotation/RepositoryConstructor.java | 2 +-
.../org/hibernate/processor/annotation/TypedMetaAttribute.java | 2 +-
.../src/main/java/org/hibernate/processor/model/Metamodel.java | 2 +-
.../org/hibernate/processor/util/AccessTypeInformation.java | 2 +-
.../java/org/hibernate/processor/util/FileTimeStampChecker.java | 2 +-
.../java/org/hibernate/processor/util/TypeRenderingVisitor.java | 2 +-
.../src/main/java/org/hibernate/processor/util/TypeUtils.java | 2 +-
.../java/org/hibernate/processor/util/xml/XmlParserHelper.java | 2 +-
.../org/hibernate/processor/validation/MockSessionFactory.java | 2 +-
.../hibernate/processor/validation/ProcessorSessionFactory.java | 2 +-
.../java/org/hibernate/processor/validation/Validation.java | 2 +-
.../java/org/hibernate/processor/xml/JpaDescriptorParser.java | 2 +-
.../org/hibernate/processor/xml/ResourceStreamLocatorImpl.java | 2 +-
.../main/java/org/hibernate/processor/xml/XmlMetaEntity.java | 2 +-
33 files changed, 33 insertions(+), 33 deletions(-)
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java
index e70d5a6e04f0..0295d5dc33dc 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java
@@ -29,7 +29,7 @@
import org.hibernate.processor.util.AccessTypeInformation;
import jakarta.persistence.AccessType;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import static java.lang.Boolean.parseBoolean;
import static java.util.Collections.emptyList;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java
index e483b07d6045..0bb7d7e91e24 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.processor.annotation.AnnotationMetaEntity;
import org.hibernate.processor.annotation.AnnotationMetaPackage;
import org.hibernate.processor.annotation.NonManagedMetamodel;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Version.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Version.java
index a0f0f5676e36..43276452a085 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Version.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Version.java
@@ -6,7 +6,7 @@
import org.hibernate.processor.util.NullnessUtil;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Information about the Meta Model Generator version.
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java
index 5c8eb7565da3..a0815234e53f 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.annotation;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractFinderMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractFinderMethod.java
index 79640626bd4a..3e256dbdb664 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractFinderMethod.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractFinderMethod.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.annotation;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import javax.lang.model.element.ExecutableElement;
import java.util.List;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractQueryMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractQueryMethod.java
index 65e43eef6ab6..d7786f1be56d 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractQueryMethod.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractQueryMethod.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.annotation;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.AssertionFailure;
import javax.lang.model.element.ExecutableElement;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMeta.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMeta.java
index 233e9f25df18..2fae58b7e4e1 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMeta.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMeta.java
@@ -6,7 +6,7 @@
import org.antlr.v4.runtime.RecognitionException;
import org.antlr.v4.runtime.Recognizer;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.processor.Context;
import org.hibernate.processor.model.MetaAttribute;
import org.hibernate.processor.model.Metamodel;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java
index 123589a1f799..d0437086b23d 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java
@@ -5,7 +5,7 @@
package org.hibernate.processor.annotation;
import org.antlr.v4.runtime.Token;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.AssertionFailure;
import org.hibernate.grammars.hql.HqlLexer;
import org.hibernate.metamodel.mapping.ordering.OrderByFragmentTranslator;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaPackage.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaPackage.java
index dde5471ece66..657ae844fb38 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaPackage.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaPackage.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.annotation;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.processor.Context;
import org.hibernate.processor.ImportContextImpl;
import org.hibernate.processor.model.ImportContext;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaFinderMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaFinderMethod.java
index 9545578ce2d1..71b8cc64f915 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaFinderMethod.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaFinderMethod.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.annotation;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import javax.lang.model.element.ExecutableElement;
import java.util.List;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataAnnotationMetaAttribute.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataAnnotationMetaAttribute.java
index 53032f9faac5..c79dad56e193 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataAnnotationMetaAttribute.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataAnnotationMetaAttribute.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.annotation;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.processor.model.MetaAttribute;
import org.hibernate.processor.model.Metamodel;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataMetaAttributeGenerationVisitor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataMetaAttributeGenerationVisitor.java
index 2c06d7123a36..06efc5b5688f 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataMetaAttributeGenerationVisitor.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataMetaAttributeGenerationVisitor.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.annotation;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.processor.Context;
import org.hibernate.processor.util.Constants;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DefaultConstructor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DefaultConstructor.java
index 54cd106ae92c..0a5fc515bf41 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DefaultConstructor.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DefaultConstructor.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.annotation;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.processor.model.MetaAttribute;
import org.hibernate.processor.model.Metamodel;
import org.hibernate.processor.util.Constants;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/IdFinderMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/IdFinderMethod.java
index fc27c6eb4405..2be27b197c92 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/IdFinderMethod.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/IdFinderMethod.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.annotation;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import javax.lang.model.element.ExecutableElement;
import java.util.List;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/MetaAttributeGenerationVisitor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/MetaAttributeGenerationVisitor.java
index ea4c04224f52..a2fa5b407824 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/MetaAttributeGenerationVisitor.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/MetaAttributeGenerationVisitor.java
@@ -5,7 +5,7 @@
package org.hibernate.processor.annotation;
import jakarta.persistence.AccessType;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.processor.Context;
import org.hibernate.processor.util.AccessTypeInformation;
import org.hibernate.processor.util.Constants;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NamedQueryMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NamedQueryMethod.java
index 0e86826aab89..9e94eb4cbf85 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NamedQueryMethod.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NamedQueryMethod.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.annotation;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.processor.model.MetaAttribute;
import org.hibernate.processor.model.Metamodel;
import org.hibernate.processor.util.Constants;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NaturalIdFinderMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NaturalIdFinderMethod.java
index d9d98e0ee071..4ad45995bd2e 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NaturalIdFinderMethod.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NaturalIdFinderMethod.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.annotation;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import javax.lang.model.element.ExecutableElement;
import java.util.List;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NonManagedMetamodel.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NonManagedMetamodel.java
index 6127612d4022..33800e9372a8 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NonManagedMetamodel.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NonManagedMetamodel.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.annotation;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.processor.Context;
import javax.lang.model.element.TypeElement;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java
index 15770caf2c69..a17590a9798f 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.annotation;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.internal.util.StringHelper;
import javax.lang.model.element.ExecutableElement;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/RepositoryConstructor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/RepositoryConstructor.java
index 20727f6cfb95..906e15ea0525 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/RepositoryConstructor.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/RepositoryConstructor.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.annotation;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.processor.model.MetaAttribute;
import org.hibernate.processor.model.Metamodel;
import org.hibernate.processor.util.Constants;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/TypedMetaAttribute.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/TypedMetaAttribute.java
index 14f577610c12..89851720ebaa 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/TypedMetaAttribute.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/TypedMetaAttribute.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.annotation;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.processor.model.Metamodel;
import static org.hibernate.processor.util.StringUtil.nameToMethodName;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/Metamodel.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/Metamodel.java
index 6a19f2ab4928..a6420486dead 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/Metamodel.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/Metamodel.java
@@ -4,7 +4,7 @@
*/
package org.hibernate.processor.model;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.processor.Context;
import java.util.List;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/AccessTypeInformation.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/AccessTypeInformation.java
index 40748c39727d..d9b74ee82666 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/AccessTypeInformation.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/AccessTypeInformation.java
@@ -5,7 +5,7 @@
package org.hibernate.processor.util;
import jakarta.persistence.AccessType;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Encapsulates the access type information for a single class.
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/FileTimeStampChecker.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/FileTimeStampChecker.java
index 68c723826018..98e2334270e1 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/FileTimeStampChecker.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/FileTimeStampChecker.java
@@ -8,7 +8,7 @@
import java.util.HashMap;
import java.util.Map;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* @author Hardy Ferentschik
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeRenderingVisitor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeRenderingVisitor.java
index ab5ca1173271..dd5fc248ca71 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeRenderingVisitor.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeRenderingVisitor.java
@@ -24,7 +24,7 @@
import javax.lang.model.type.WildcardType;
import javax.lang.model.util.SimpleTypeVisitor8;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import static org.hibernate.processor.util.Constants.JAVA_OBJECT;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeUtils.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeUtils.java
index 08d0cc1ebebd..b1a7b778518a 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeUtils.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeUtils.java
@@ -5,7 +5,7 @@
package org.hibernate.processor.util;
import jakarta.persistence.AccessType;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.processor.Context;
import org.hibernate.processor.MetaModelGenerationException;
import org.hibernate.processor.model.Metamodel;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/XmlParserHelper.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/XmlParserHelper.java
index 844383990d30..358a60074d86 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/XmlParserHelper.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/XmlParserHelper.java
@@ -25,7 +25,7 @@
import org.hibernate.processor.Context;
import org.hibernate.processor.util.NullnessUtil;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.xml.sax.SAXException;
/**
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java
index 187aedb60109..efbf7c7f8d59 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java
@@ -5,7 +5,7 @@
package org.hibernate.processor.validation;
import jakarta.persistence.metamodel.Bindable;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.CustomEntityDirtinessStrategy;
import org.hibernate.EntityNameResolver;
import org.hibernate.MappingException;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/ProcessorSessionFactory.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/ProcessorSessionFactory.java
index 3533fe1f87ad..c5f442c9c899 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/ProcessorSessionFactory.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/ProcessorSessionFactory.java
@@ -5,7 +5,7 @@
package org.hibernate.processor.validation;
import jakarta.persistence.AccessType;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.PropertyNotFoundException;
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
import org.hibernate.metamodel.mapping.EntityVersionMapping;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/Validation.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/Validation.java
index e46d4e73cf2d..f4f86b5c779d 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/Validation.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/Validation.java
@@ -9,7 +9,7 @@
import org.antlr.v4.runtime.DefaultErrorStrategy;
import org.antlr.v4.runtime.atn.PredictionMode;
import org.antlr.v4.runtime.misc.ParseCancellationException;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.hibernate.PropertyNotFoundException;
import org.hibernate.QueryException;
import org.hibernate.engine.spi.SessionFactoryImplementor;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/JpaDescriptorParser.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/JpaDescriptorParser.java
index 7a24e37c2551..7e45d682dca1 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/JpaDescriptorParser.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/JpaDescriptorParser.java
@@ -43,7 +43,7 @@
import org.hibernate.processor.util.xml.XmlParserHelper;
import jakarta.persistence.AccessType;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import static org.hibernate.processor.util.StringUtil.determineFullyQualifiedClassName;
import static org.hibernate.processor.util.StringUtil.packageNameFromFullyQualifiedName;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/ResourceStreamLocatorImpl.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/ResourceStreamLocatorImpl.java
index 310fe718e4d0..a7a54d09a86f 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/ResourceStreamLocatorImpl.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/ResourceStreamLocatorImpl.java
@@ -12,7 +12,7 @@
import org.hibernate.boot.ResourceStreamLocator;
import org.hibernate.processor.Context;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* @author Steve Ebersole
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/XmlMetaEntity.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/XmlMetaEntity.java
index 8106213bdcfe..4d445d52efc9 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/XmlMetaEntity.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/XmlMetaEntity.java
@@ -44,7 +44,7 @@
import org.hibernate.processor.util.TypeUtils;
import jakarta.persistence.AccessType;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import static jakarta.persistence.AccessType.FIELD;
import static java.util.Collections.emptyList;
From b4dfb56694876b2934b517cf67cc4fdd30cf75c6 Mon Sep 17 00:00:00 2001
From: Rey <89825425+Kingg22@users.noreply.github.com>
Date: Tue, 26 Aug 2025 17:56:53 -0500
Subject: [PATCH 08/14] perf(hibernate processor): add NonNull to deprecated
processor
---
.../org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java
index 922cf3c4a792..1aa9a150fe83 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java
@@ -5,6 +5,7 @@
package org.hibernate.jpamodelgen;
import org.hibernate.processor.HibernateProcessor;
+import org.jspecify.annotations.NonNull;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
@@ -65,7 +66,7 @@
@Deprecated(forRemoval = true)
public class JPAMetaModelEntityProcessor extends HibernateProcessor {
@Override
- public synchronized void init(ProcessingEnvironment processingEnvironment) {
+ public synchronized void init(@NonNull ProcessingEnvironment processingEnvironment) {
processingEnvironment.getMessager().printMessage(
Diagnostic.Kind.WARNING,
"JPAMetaModelEntityProcessor is deprecated, replaced by org.hibernate.processor.HibernateProcessor"
From dfb61b210306f537ea2f051ddfd326367174b807 Mon Sep 17 00:00:00 2001
From: Rey <89825425+Kingg22@users.noreply.github.com>
Date: Tue, 26 Aug 2025 18:08:08 -0500
Subject: [PATCH 09/14] perf(hibernate processor): fix nullable things in
annotations package
---
.../processor/annotation/AnnotationMeta.java | 3 ++-
.../annotation/AnnotationMetaEntity.java | 17 +++++++++--------
.../processor/annotation/LifecycleMethod.java | 3 ++-
.../MetaAttributeGenerationVisitor.java | 5 +++--
4 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMeta.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMeta.java
index 2fae58b7e4e1..6af5f4e7fc52 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMeta.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMeta.java
@@ -22,6 +22,7 @@
import java.util.List;
import static java.lang.Character.isJavaIdentifierStart;
+import static java.util.Objects.requireNonNull;
import static org.hibernate.processor.util.Constants.ENTITY_GRAPH;
import static org.hibernate.processor.util.Constants.HIB_ENABLED_FETCH_PROFILE;
import static org.hibernate.processor.util.Constants.JAVA_OBJECT;
@@ -56,7 +57,7 @@ void addAuxiliaryMembers() {
void checkNamedQueries() {
boolean checkHql = containsAnnotation( getElement(), Constants.CHECK_HQL )
- || containsAnnotation( getElement().getEnclosingElement(), Constants.CHECK_HQL );
+ || containsAnnotation( requireNonNull( getElement().getEnclosingElement() ), Constants.CHECK_HQL );
handleNamedQueryAnnotation( NAMED_QUERY, checkHql );
handleNamedQueryRepeatableAnnotation( Constants.NAMED_QUERIES, checkHql );
handleNamedQueryAnnotation( Constants.HIB_NAMED_QUERY, checkHql );
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java
index d0437086b23d..1d3c9f2eb71a 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java
@@ -69,6 +69,7 @@
import static java.beans.Introspector.decapitalize;
import static java.lang.Boolean.FALSE;
import static java.util.Collections.emptyList;
+import static java.util.Objects.requireNonNull;
import static java.util.Objects.requireNonNullElse;
import static java.util.stream.Collectors.toList;
import static javax.lang.model.util.ElementFilter.fieldsIn;
@@ -130,10 +131,10 @@ public class AnnotationMetaEntity extends AnnotationMeta {
private boolean jakartaDataRepository;
private final boolean quarkusInjection;
private final boolean springInjection;
- private String qualifiedName;
+ private @Nullable String qualifiedName;
private final boolean jakartaDataStaticModel;
- private AccessTypeInformation entityAccessTypeInfo;
+ private @Nullable AccessTypeInformation entityAccessTypeInfo;
/**
* Whether the members of this type have already been initialized or not.
@@ -153,7 +154,7 @@ public class AnnotationMetaEntity extends AnnotationMeta {
* lazily is required for embeddables and mapped supertypes, to only pull in those members matching the access
* type as configured via the embedding entity or subclass (also see METAGEN-85).
*/
- private Metamodel entityToMerge;
+ private @Nullable Metamodel entityToMerge;
/**
* True if this "metamodel class" is actually an instantiable DAO-style repository.
@@ -229,7 +230,7 @@ public static AnnotationMetaEntity create(
return memberTypes.get( qualify(entityType, memberName) );
}
- public AccessTypeInformation getEntityAccessTypeInfo() {
+ public @Nullable AccessTypeInformation getEntityAccessTypeInfo() {
return entityAccessTypeInfo;
}
@@ -2559,7 +2560,7 @@ enum FieldType {
final var attributeType = requireNonNullElse(
resolveTypeMirror(
entityType,
- member.getEnclosingElement(),
+ requireNonNull( member.getEnclosingElement() ),
memberType.toString()
), memberType
);
@@ -2623,7 +2624,7 @@ private TypeMirror actualParameterType(VariableElement param) {
context.getTypeUtils()
.asMemberOf( (DeclaredType) element.asType(), method );
return methodType.getParameterTypes()
- .get( method.getParameters().indexOf( param ) );
+ .get( requireNonNull( method ).getParameters().indexOf( param ) );
}
/**
@@ -3442,7 +3443,7 @@ private String typeAsString(TypeMirror type) {
private TypeMirror parameterType(VariableElement parameter) {
final ExecutableElement method =
- (ExecutableElement) parameter.getEnclosingElement();
+ (ExecutableElement) requireNonNull( parameter.getEnclosingElement() );
final TypeMirror type =
memberMethodType(method).getParameterTypes()
.get( method.getParameters().indexOf(parameter) );
@@ -3690,7 +3691,7 @@ public void message(Element method, AnnotationMirror mirror, AnnotationValue val
private static String messageWithLocation(Element element, String message) {
return element.getKind() == ElementKind.PARAMETER
? message + " for parameter '" + element.getSimpleName()
- + "' of inherited member '" + element.getEnclosingElement().getSimpleName() + "'"
+ + "' of inherited member '" + requireNonNull( element.getEnclosingElement() ).getSimpleName() + "'"
: message + " for inherited member '" + element.getSimpleName() + "'";
}
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java
index 4736c6545406..b0be348d0d72 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java
@@ -19,6 +19,7 @@
import java.util.Set;
import static java.lang.Character.toUpperCase;
+import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toSet;
import static javax.lang.model.type.TypeKind.VOID;
@@ -400,7 +401,7 @@ else if ( type instanceof TypeVariable typeVariable ) {
if ( methodTypeParameters.contains( value ) ) {
return value;
}
- return annotationMetaEntity.importType( resolveTypeName( element, method.getEnclosingElement(), value ) );
+ return annotationMetaEntity.importType( resolveTypeName( element, requireNonNull( method.getEnclosingElement() ), value ) );
}
else if ( type instanceof WildcardType wildcardType ) {
return "?"
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/MetaAttributeGenerationVisitor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/MetaAttributeGenerationVisitor.java
index a2fa5b407824..d4e19d7b7b3a 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/MetaAttributeGenerationVisitor.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/MetaAttributeGenerationVisitor.java
@@ -25,6 +25,7 @@
import javax.tools.Diagnostic;
import java.util.List;
+import static java.util.Objects.requireNonNull;
import static org.hibernate.processor.util.Constants.ELEMENT_COLLECTION;
import static org.hibernate.processor.util.Constants.LIST_ATTRIBUTE;
import static org.hibernate.processor.util.Constants.MANY_TO_ANY;
@@ -139,10 +140,10 @@ private AnnotationMetaAttribute createMetaAttribute(
}
}
- private void setAccessType(TypeMirror collectionElementType, TypeElement collectionElement) {
+ private void setAccessType(TypeMirror collectionElementType, @Nullable TypeElement collectionElement) {
final String elementTypeName = collectionElementType.toString();
final AccessTypeInformation accessTypeInfo = context.getAccessTypeInfo( elementTypeName );
- final AccessType entityAccessType = entity.getEntityAccessTypeInfo().getAccessType();
+ final AccessType entityAccessType = requireNonNull( entity.getEntityAccessTypeInfo() ).getAccessType();
if ( accessTypeInfo == null ) {
context.addAccessTypeInformation(
elementTypeName,
From 0f85a394981a8ed7bc7c81a07c72ff321bb72df0 Mon Sep 17 00:00:00 2001
From: Rey <89825425+Kingg22@users.noreply.github.com>
Date: Tue, 26 Aug 2025 18:10:24 -0500
Subject: [PATCH 10/14] perf(hibernate processor): fix nullable things in xml
util
docs say return null and uninitialized fields
---
.../xml/ContextProvidingValidationEventHandler.java | 5 +++--
.../util/xml/JpaNamespaceTransformingEventReader.java | 10 ++++++----
2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/ContextProvidingValidationEventHandler.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/ContextProvidingValidationEventHandler.java
index 93765a0d0ff6..d9932f80fc19 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/ContextProvidingValidationEventHandler.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/ContextProvidingValidationEventHandler.java
@@ -7,6 +7,7 @@
import jakarta.xml.bind.ValidationEvent;
import jakarta.xml.bind.ValidationEventHandler;
import jakarta.xml.bind.ValidationEventLocator;
+import org.jspecify.annotations.Nullable;
/**
* Validation event handler used for obtaining line and column numbers in case of parsing failures.
@@ -16,7 +17,7 @@
public class ContextProvidingValidationEventHandler implements ValidationEventHandler {
private int lineNumber;
private int columnNumber;
- private String message;
+ private @Nullable String message;
@Override
public boolean handleEvent(ValidationEvent validationEvent) {
@@ -35,7 +36,7 @@ public int getColumnNumber() {
return columnNumber;
}
- public String getMessage() {
+ public @Nullable String getMessage() {
return message;
}
}
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/JpaNamespaceTransformingEventReader.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/JpaNamespaceTransformingEventReader.java
index 56765ecfbec3..5ff447f9a9b1 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/JpaNamespaceTransformingEventReader.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/JpaNamespaceTransformingEventReader.java
@@ -4,6 +4,8 @@
*/
package org.hibernate.processor.util.xml;
+import org.jspecify.annotations.Nullable;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@@ -86,7 +88,7 @@ public class JpaNamespaceTransformingEventReader extends EventReaderDelegate {
private static final String EMPTY_PREFIX = "";
private final XMLEventFactory xmlEventFactory;
- private String currentDocumentNamespaceUri;
+ private @Nullable String currentDocumentNamespaceUri;
public JpaNamespaceTransformingEventReader(XMLEventReader reader) {
super( reader );
@@ -94,16 +96,16 @@ public JpaNamespaceTransformingEventReader(XMLEventReader reader) {
}
@Override
- public XMLEvent peek() throws XMLStreamException {
+ public @Nullable XMLEvent peek() throws XMLStreamException {
return wrap( super.peek() );
}
@Override
- public XMLEvent nextEvent() throws XMLStreamException {
+ public @Nullable XMLEvent nextEvent() throws XMLStreamException {
return wrap( super.nextEvent() );
}
- private XMLEvent wrap(XMLEvent event) {
+ private @Nullable XMLEvent wrap(@Nullable XMLEvent event) {
if ( event != null && event.isStartElement() ) {
return transform( event.asStartElement() );
}
From 9120febd848925e3fcc48e33ed8fb4bdad3870eb Mon Sep 17 00:00:00 2001
From: Rey <89825425+Kingg22@users.noreply.github.com>
Date: Tue, 26 Aug 2025 18:23:21 -0500
Subject: [PATCH 11/14] perf(hibernate processor): fix nullable things in util
package
---
.../org/hibernate/processor/util/TypeRenderingVisitor.java | 5 +++--
.../main/java/org/hibernate/processor/util/TypeUtils.java | 4 ++--
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeRenderingVisitor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeRenderingVisitor.java
index dd5fc248ca71..51591b7f67be 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeRenderingVisitor.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeRenderingVisitor.java
@@ -26,6 +26,7 @@
import org.jspecify.annotations.Nullable;
+import static java.util.Objects.requireNonNull;
import static org.hibernate.processor.util.Constants.JAVA_OBJECT;
/**
@@ -45,7 +46,7 @@ public static String toString(TypeMirror typeMirror) {
final Element typeVariableElement = ( (TypeVariable) typeMirror ).asElement();
if ( typeVariableElement instanceof TypeParameterElement ) {
final TypeParameterElement typeParameter = (TypeParameterElement) typeVariableElement;
- if ( typeParameter.getEnclosingElement().getKind() == ElementKind.METHOD ) {
+ if ( requireNonNull( typeParameter.getEnclosingElement() ).getKind() == ElementKind.METHOD ) {
// But for method level type variable we return the upper bound
// because the type variable has no meaning except for that method
typeMirror = ( (TypeVariable) typeMirror ).getUpperBound();
@@ -106,7 +107,7 @@ else if ( typeMirror instanceof IntersectionType ) {
}
@Override
- public @Nullable Object visitArray(ArrayType t, @Nullable Object o) {
+ public Object visitArray(ArrayType t, @Nullable Object o) {
t.getComponentType().accept( this, null );
sb.append( "[]" );
return t;
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeUtils.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeUtils.java
index b1a7b778518a..7f4f5ed7b9bc 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeUtils.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeUtils.java
@@ -163,7 +163,7 @@ public static String extractClosestRealTypeAsString(TypeMirror type, Context con
}
}
- public static @Nullable TypeMirror extractClosestRealType(TypeMirror type, Context context, Set beingVisited) {
+ public static @Nullable TypeMirror extractClosestRealType(@Nullable TypeMirror type, Context context, Set beingVisited) {
if ( type == null ) {
return null;
}
@@ -722,7 +722,7 @@ public static String getGeneratedClassFullyQualifiedName(TypeElement typeElement
+ "." + (jakartaDataStyle ? '_' + simpleName : simpleName + '_');
}
- private static String qualifiedName(Element enclosingElement, boolean jakartaDataStyle) {
+ private static String qualifiedName(@Nullable Element enclosingElement, boolean jakartaDataStyle) {
if ( enclosingElement instanceof TypeElement typeElement ) {
return getGeneratedClassFullyQualifiedName( typeElement, jakartaDataStyle );
}
From 959d71c29e2da8089ee9b4092f8cea34d32d41b7 Mon Sep 17 00:00:00 2001
From: Rey <89825425+Kingg22@users.noreply.github.com>
Date: Tue, 26 Aug 2025 18:32:27 -0500
Subject: [PATCH 12/14] perf(hibernate processor): fix nullable things in
processor package
---
.../main/java/org/hibernate/processor/ClassWriter.java | 3 ++-
.../src/main/java/org/hibernate/processor/Context.java | 10 +++++-----
.../org/hibernate/processor/HibernateProcessor.java | 5 +++--
3 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java
index 56987d856151..dd2477733177 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java
@@ -29,6 +29,7 @@
import java.util.List;
import java.util.Set;
+import static java.util.Objects.requireNonNull;
import static org.hibernate.processor.util.Constants.SPRING_COMPONENT;
import static org.hibernate.processor.util.TypeUtils.getGeneratedClassFullyQualifiedName;
import static org.hibernate.processor.util.TypeUtils.isMemberType;
@@ -270,7 +271,7 @@ private static String getGeneratedSuperclassName(Element superClassElement, bool
private static String getGeneratedClassName(TypeElement typeElement, boolean jakartaDataStyle) {
final String simpleName = typeElement.getSimpleName().toString();
- final Element enclosingElement = typeElement.getEnclosingElement();
+ final Element enclosingElement = requireNonNull( typeElement.getEnclosingElement() );
return (enclosingElement instanceof TypeElement
? getGeneratedSuperclassName( enclosingElement, jakartaDataStyle )
: ((PackageElement) enclosingElement).getQualifiedName().toString())
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java
index 0295d5dc33dc..98bb816b8107 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java
@@ -81,16 +81,16 @@ public final class Context {
* Whether all mapping files are xml-mapping-metadata-complete. In this case no annotation processing will take
* place.
*/
- private Boolean fullyXmlConfigured;
+ private @Nullable Boolean fullyXmlConfigured;
private boolean addInjectAnnotation = false;
private boolean addDependentAnnotation = false;
private boolean addComponentAnnotation = false;
private boolean addNonnullAnnotation = false;
private boolean addGeneratedAnnotation = true;
private boolean addGenerationDate;
- private String[] suppressedWarnings;
+ private String @Nullable [] suppressedWarnings;
private boolean addTransactionScopedAnnotation;
- private AccessType persistenceUnitDefaultAccessType;
+ private @Nullable AccessType persistenceUnitDefaultAccessType;
private boolean generateJakartaDataStaticMetamodel;
private boolean quarkusInjection;
private boolean springInjection;
@@ -213,7 +213,7 @@ public boolean addSuppressWarningsAnnotation() {
return suppressedWarnings != null;
}
- public String[] getSuppressedWarnings() {
+ public String @Nullable [] getSuppressedWarnings() {
return suppressedWarnings;
}
@@ -402,7 +402,7 @@ public void mappingDocumentFullyXmlConfigured(boolean fullyXmlConfigured) {
: this.fullyXmlConfigured && fullyXmlConfigured;
}
- public AccessType getPersistenceUnitDefaultAccessType() {
+ public @Nullable AccessType getPersistenceUnitDefaultAccessType() {
return persistenceUnitDefaultAccessType;
}
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java
index 0bb7d7e91e24..4cdbc2997875 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java
@@ -45,6 +45,7 @@
import java.util.function.Function;
import static java.lang.Boolean.parseBoolean;
+import static java.util.Objects.requireNonNull;
import static javax.lang.model.util.ElementFilter.fieldsIn;
import static javax.lang.model.util.ElementFilter.methodsIn;
import static org.hibernate.processor.HibernateProcessor.ADD_GENERATED_ANNOTATION;
@@ -711,7 +712,7 @@ && hasAnnotation( element, ENTITY, MAPPED_SUPERCLASS )
}
private static boolean hasHandwrittenMetamodel(Element element) {
- return element.getEnclosingElement().getEnclosedElements()
+ return requireNonNull( element.getEnclosingElement() ).getEnclosedElements()
.stream().anyMatch(e -> e.getSimpleName()
.contentEquals('_' + element.getSimpleName().toString()));
}
@@ -764,7 +765,7 @@ private void indexEnumValues(TypeMirror type) {
if ( fieldType.getKind() == ElementKind.ENUM ) {
for ( Element enumMember : fieldType.getEnclosedElements() ) {
if ( enumMember.getKind() == ElementKind.ENUM_CONSTANT ) {
- final Element enclosingElement = fieldType.getEnclosingElement();
+ final Element enclosingElement = requireNonNull( fieldType.getEnclosingElement() );
final boolean hasOuterType =
enclosingElement.getKind().isClass() || enclosingElement.getKind().isInterface();
context.addEnumValue( fieldType.getQualifiedName().toString(),
From a48655f5591175aee30bdf123b8070d41cd0b1ff Mon Sep 17 00:00:00 2001
From: Rey <89825425+Kingg22@users.noreply.github.com>
Date: Tue, 26 Aug 2025 18:39:20 -0500
Subject: [PATCH 13/14] perf(hibernate processor): fix nullable things in util
package
---
.../processor/xml/JpaDescriptorParser.java | 19 +++++----
.../processor/xml/XmlMetaEntity.java | 42 ++++++++++++-------
2 files changed, 36 insertions(+), 25 deletions(-)
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/JpaDescriptorParser.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/JpaDescriptorParser.java
index 7e45d682dca1..9c0724fe7fb0 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/JpaDescriptorParser.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/JpaDescriptorParser.java
@@ -45,6 +45,7 @@
import jakarta.persistence.AccessType;
import org.jspecify.annotations.Nullable;
+import static java.util.Objects.requireNonNull;
import static org.hibernate.processor.util.StringUtil.determineFullyQualifiedClassName;
import static org.hibernate.processor.util.StringUtil.packageNameFromFullyQualifiedName;
@@ -261,7 +262,7 @@ private FileTimeStampChecker loadTimeStampCache() {
private void parseEntities(List entities, String defaultPackageName) {
for ( JaxbEntityImpl entity : entities ) {
- String fqcn = determineFullyQualifiedClassName( defaultPackageName, entity.getClazz() );
+ String fqcn = determineFullyQualifiedClassName( defaultPackageName, requireNonNull( entity.getClazz() ) );
if ( !xmlMappedTypeExists( fqcn ) ) {
context.logMessage(
@@ -288,7 +289,7 @@ private void parseEmbeddable(
List embeddables,
String defaultPackageName) {
for ( JaxbEmbeddableImpl embeddable : embeddables ) {
- String fqcn = determineFullyQualifiedClassName( defaultPackageName, embeddable.getClazz() );
+ String fqcn = determineFullyQualifiedClassName( defaultPackageName, requireNonNull( embeddable.getClazz() ) );
// we have to extract the package name from the fqcn. Maybe the entity was setting a fqcn directly
String pkg = packageNameFromFullyQualifiedName( fqcn );
@@ -316,7 +317,7 @@ private void parseMappedSuperClass(
String defaultPackageName) {
for ( JaxbMappedSuperclassImpl mappedSuperClass : mappedSuperClasses ) {
String fqcn = determineFullyQualifiedClassName(
- defaultPackageName, mappedSuperClass.getClazz()
+ defaultPackageName, requireNonNull( mappedSuperClass.getClazz() )
);
// we have to extract the package name from the fqcn. Maybe the entity was setting a fqcn directly
String pkg = packageNameFromFullyQualifiedName( fqcn );
@@ -352,7 +353,7 @@ private TypeElement getXmlMappedType(String fullyQualifiedClassName) {
return utils.getTypeElement( fullyQualifiedClassName );
}
- private AccessType determineEntityAccessType(JaxbEntityMappingsImpl mappings) {
+ private @Nullable AccessType determineEntityAccessType(JaxbEntityMappingsImpl mappings) {
final AccessType contextAccessType = context.getPersistenceUnitDefaultAccessType();
final AccessType mappingsAccess = mappings.getAccess();
if ( mappingsAccess != null ) {
@@ -368,7 +369,7 @@ private void determineXmlAccessTypes() {
AccessType defaultAccessType = determineEntityAccessType( mappings );
for ( JaxbEntityImpl entity : mappings.getEntities() ) {
- final String name = entity.getClazz();
+ final String name = requireNonNull( entity.getClazz() );
fqcn = determineFullyQualifiedClassName( packageName, name );
final AccessType explicitAccessType = entity.getAccess();
final AccessTypeInformation accessInfo = new AccessTypeInformation( fqcn, explicitAccessType, defaultAccessType );
@@ -376,7 +377,7 @@ private void determineXmlAccessTypes() {
}
for ( JaxbMappedSuperclassImpl mappedSuperClass : mappings.getMappedSuperclasses() ) {
- final String name = mappedSuperClass.getClazz();
+ final String name = requireNonNull( mappedSuperClass.getClazz() );
fqcn = determineFullyQualifiedClassName( packageName, name );
final AccessType explicitAccessType = mappedSuperClass.getAccess();
final AccessTypeInformation accessInfo = new AccessTypeInformation( fqcn, explicitAccessType, defaultAccessType );
@@ -384,7 +385,7 @@ private void determineXmlAccessTypes() {
}
for ( JaxbEmbeddableImpl embeddable : mappings.getEmbeddables() ) {
- final String name = embeddable.getClazz();
+ final String name = requireNonNull( embeddable.getClazz() );
fqcn = determineFullyQualifiedClassName( packageName, name );
final AccessType explicitAccessType = embeddable.getAccess();
final AccessTypeInformation accessInfo = new AccessTypeInformation( fqcn, explicitAccessType, defaultAccessType );
@@ -399,7 +400,7 @@ private void determineAnnotationAccessTypes() {
String packageName = mappings.getPackage();
for ( JaxbEntityImpl entity : mappings.getEntities() ) {
- String name = entity.getClazz();
+ String name = requireNonNull( entity.getClazz() );
fqcn = determineFullyQualifiedClassName( packageName, name );
TypeElement element = context.getTypeElementForFullyQualifiedName( fqcn );
if ( element != null ) {
@@ -408,7 +409,7 @@ private void determineAnnotationAccessTypes() {
}
for ( JaxbMappedSuperclassImpl mappedSuperClass : mappings.getMappedSuperclasses() ) {
- String name = mappedSuperClass.getClazz();
+ String name = requireNonNull( mappedSuperClass.getClazz() );
fqcn = determineFullyQualifiedClassName( packageName, name );
TypeElement element = context.getTypeElementForFullyQualifiedName( fqcn );
if ( element != null ) {
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/XmlMetaEntity.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/XmlMetaEntity.java
index 4d445d52efc9..d308a266cafa 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/XmlMetaEntity.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/XmlMetaEntity.java
@@ -48,6 +48,7 @@
import static jakarta.persistence.AccessType.FIELD;
import static java.util.Collections.emptyList;
+import static java.util.Objects.requireNonNull;
import static org.hibernate.processor.util.StringUtil.classNameFromFullyQualifiedName;
import static org.hibernate.processor.util.StringUtil.determineFullyQualifiedClassName;
import static org.hibernate.processor.util.StringUtil.isFullyQualified;
@@ -74,7 +75,7 @@ public class XmlMetaEntity implements Metamodel {
private @Nullable JaxbAttributesContainerImpl attributes;
private @Nullable JaxbEmbeddableAttributesContainerImpl embeddableAttributes;
- private AccessTypeInformation accessTypeInfo;
+ private @Nullable AccessTypeInformation accessTypeInfo;
/**
* Whether the members of this type have already been initialized or not.
@@ -90,7 +91,7 @@ public class XmlMetaEntity implements Metamodel {
private boolean initialized;
XmlMetaEntity(JaxbEntityImpl ormEntity, String defaultPackageName, TypeElement element, Context context) {
- this( ormEntity.getClazz(), defaultPackageName, element, context, ormEntity.isMetadataComplete() );
+ this( requireNonNull( ormEntity.getClazz() ), defaultPackageName, element, context, ormEntity.isMetadataComplete() );
this.attributes = ormEntity.getAttributes();
this.embeddableAttributes = null;
}
@@ -104,7 +105,7 @@ static XmlMetaEntity create(JaxbEntityImpl ormEntity, String defaultPackageName,
XmlMetaEntity(JaxbMappedSuperclassImpl mappedSuperclass, String defaultPackageName, TypeElement element, Context context) {
this(
- mappedSuperclass.getClazz(),
+ requireNonNull( mappedSuperclass.getClazz() ),
defaultPackageName,
element,
context,
@@ -115,12 +116,12 @@ static XmlMetaEntity create(JaxbEntityImpl ormEntity, String defaultPackageName,
}
XmlMetaEntity(JaxbEmbeddableImpl embeddable, String defaultPackageName, TypeElement element, Context context) {
- this( embeddable.getClazz(), defaultPackageName, element, context, embeddable.isMetadataComplete() );
+ this( requireNonNull( embeddable.getClazz() ), defaultPackageName, element, context, embeddable.isMetadataComplete() );
this.attributes = null;
this.embeddableAttributes = embeddable.getAttributes();
}
- private XmlMetaEntity(String clazz, String defaultPackageName, TypeElement element, Context context, Boolean metaComplete) {
+ private XmlMetaEntity(String clazz, String defaultPackageName, TypeElement element, Context context, @Nullable Boolean metaComplete) {
this.defaultPackageName = defaultPackageName;
String className = clazz;
String pkg = defaultPackageName;
@@ -210,11 +211,14 @@ public String toString() {
return sb.toString();
}
- private static boolean initIsMetaComplete(Context context, Boolean metadataComplete) {
+ private static boolean initIsMetaComplete(Context context, @Nullable Boolean metadataComplete) {
return context.isFullyXmlConfigured() || Boolean.TRUE.equals( metadataComplete );
}
- private @Nullable String @Nullable[] getCollectionTypes(String propertyName, String explicitTargetEntity, @Nullable String explicitMapKeyClass, ElementKind expectedElementKind) {
+ private @Nullable String @Nullable[] getCollectionTypes(String propertyName,
+ @Nullable String explicitTargetEntity,
+ @Nullable String explicitMapKeyClass,
+ ElementKind expectedElementKind) {
for ( Element elem : element.getEnclosedElements() ) {
if ( !expectedElementKind.equals( elem.getKind() ) ) {
continue;
@@ -251,7 +255,10 @@ else if ( elem.asType() instanceof ExecutableType ) {
return type;
}
- private @Nullable String[] determineTypes(String propertyName, String explicitTargetEntity, @Nullable String explicitMapKeyClass, DeclaredType type) {
+ private @Nullable String[] determineTypes(String propertyName,
+ @Nullable String explicitTargetEntity,
+ @Nullable String explicitMapKeyClass,
+ DeclaredType type) {
@Nullable String[] types = new String[3];
determineTargetType( type, propertyName, explicitTargetEntity, types );
if ( determineCollectionType( type, types ).equals( Constants.MAP_ATTRIBUTE ) ) {
@@ -273,7 +280,10 @@ private String determineCollectionType(DeclaredType type, @Nullable String[] typ
return NullnessUtil.castNonNull( types[1] = Constants.COLLECTIONS.get( type.asElement().toString() ) );
}
- private void determineTargetType(DeclaredType type, String propertyName, String explicitTargetEntity, @Nullable String[] types) {
+ private void determineTargetType(DeclaredType type,
+ String propertyName,
+ @Nullable String explicitTargetEntity,
+ @Nullable String[] types) {
List extends TypeMirror> typeArguments = type.getTypeArguments();
if ( typeArguments.isEmpty() && explicitTargetEntity == null ) {
@@ -362,7 +372,7 @@ private void determineTargetType(DeclaredType type, String propertyName, String
context.logMessage(
Diagnostic.Kind.WARNING,
"Unable to determine type for property " + propertyName + " of class " + getQualifiedName()
- + " using access type " + accessTypeInfo.getDefaultAccessType()
+ + " using access type " + requireNonNull( accessTypeInfo ).getDefaultAccessType()
);
return null;
}
@@ -498,15 +508,15 @@ private void parseEmbedded(JaxbEmbeddedImpl embedded) {
}
}
- private String determineExplicitTargetEntity(String targetClass) {
- String explicitTargetClass = targetClass;
- if ( explicitTargetClass != null ) {
+ private @Nullable String determineExplicitTargetEntity(@Nullable String targetClass) {
+ String explicitTargetClass = null;
+ if ( targetClass != null ) {
explicitTargetClass = determineFullyQualifiedClassName( defaultPackageName, targetClass );
}
return explicitTargetClass;
}
- private @Nullable String determineExplicitMapKeyClass(JaxbMapKeyClassImpl mapKeyClass) {
+ private @Nullable String determineExplicitMapKeyClass(@Nullable JaxbMapKeyClassImpl mapKeyClass) {
String explicitMapKey = null;
if ( mapKeyClass != null ) {
explicitMapKey = determineFullyQualifiedClassName( defaultPackageName, mapKeyClass.getClazz() );
@@ -616,9 +626,9 @@ private void logMetaModelException(String name, MetaModelGenerationException e)
);
}
- private ElementKind getElementKind(AccessType accessType) {
+ private ElementKind getElementKind(@Nullable AccessType accessType) {
// if no explicit access type was specified in xml we use the entity access type
- if ( accessType == null ) {
+ if ( accessType == null && accessTypeInfo != null ) {
return getElementKindForAccessType( accessTypeInfo.getAccessType() );
}
return FIELD.equals( accessType ) ? ElementKind.FIELD : ElementKind.METHOD;
From 0611ad39836e41bfc215798901c6491cd7aa8651 Mon Sep 17 00:00:00 2001
From: Rey <89825425+Kingg22@users.noreply.github.com>
Date: Tue, 26 Aug 2025 18:44:06 -0500
Subject: [PATCH 14/14] perf(hibernate processor): fix null errors
---
.../src/main/java/org/hibernate/processor/ClassWriter.java | 3 +++
.../main/java/org/hibernate/processor/HibernateProcessor.java | 2 +-
.../hibernate/processor/annotation/AnnotationMetaEntity.java | 4 ++--
.../util/xml/JpaNamespaceTransformingEventReader.java | 3 ++-
4 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java
index dd2477733177..3acfd66d23c2 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java
@@ -306,6 +306,9 @@ private static String writeGeneratedAnnotation(Metamodel entity, Context context
private static String writeSuppressWarnings(Context context) {
final StringBuilder annotation = new StringBuilder("@SuppressWarnings({");
final String[] warnings = context.getSuppressedWarnings();
+ if (warnings == null || warnings.length == 0) {
+ return "@SuppressWarnings({})";
+ }
for (int i = 0; i < warnings.length; i++) {
if ( i>0 ) {
annotation.append(", ");
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java
index 4cdbc2997875..76121a1f54f4 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java
@@ -513,7 +513,7 @@ private void createMetaModelClasses() {
for ( Metamodel aux : context.getMetaAuxiliaries() ) {
if ( !context.isAlreadyGenerated(aux)
- && !isClassRecordOrInterfaceType( aux.getElement().getEnclosingElement() ) ) {
+ && !isClassRecordOrInterfaceType( requireNonNull( aux.getElement().getEnclosingElement() ) ) ) {
context.logMessage( Diagnostic.Kind.OTHER,
"Writing metamodel for auxiliary '" + aux + "'" );
ClassWriter.writeFile( aux, context );
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java
index 1d3c9f2eb71a..dcb04a1a8470 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java
@@ -420,7 +420,7 @@ else if ( hasAnnotation( method, JD_DELETE ) ) {
queryMethods.add( method );
}
}
- else if ( method.getEnclosingElement().getKind().isInterface()
+ else if ( requireNonNull( method.getEnclosingElement() ).getKind().isInterface()
&& !method.isDefault()
&& !method.getModifiers().contains(Modifier.PRIVATE)
&& !isSessionGetter(method) ) {
@@ -1507,7 +1507,7 @@ else if ( typeUtils.isSameType( backType, element.asType() ) ) {
}
private boolean isPersistent(Element memberOfClass, AccessType membersKind) {
- return ( entityAccessTypeInfo.getAccessType() == membersKind
+ return ( ( entityAccessTypeInfo != null && entityAccessTypeInfo.getAccessType() == membersKind )
|| determineAnnotationSpecifiedAccessType( memberOfClass ) != null )
&& !containsAnnotation( memberOfClass, TRANSIENT )
&& !memberOfClass.getModifiers().contains( Modifier.TRANSIENT )
diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/JpaNamespaceTransformingEventReader.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/JpaNamespaceTransformingEventReader.java
index 5ff447f9a9b1..0d27692c2ac1 100644
--- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/JpaNamespaceTransformingEventReader.java
+++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/xml/JpaNamespaceTransformingEventReader.java
@@ -158,7 +158,8 @@ private List updateElementAttributes(StartElement startElement) {
while ( existingAttributesIterator.hasNext() ) {
Attribute attribute = existingAttributesIterator.next();
if ( VERSION_ATTRIBUTE_NAME.equals( attribute.getName().getLocalPart() ) ) {
- if ( currentDocumentNamespaceUri.equals( DEFAULT_PERSISTENCE_NAMESPACE ) ) {
+ if ( currentDocumentNamespaceUri != null &&
+ currentDocumentNamespaceUri.equals( DEFAULT_PERSISTENCE_NAMESPACE ) ) {
if ( !DEFAULT_PERSISTENCE_VERSION.equals( attribute.getName().getPrefix() ) ) {
newElementAttributeList.add(
xmlEventFactory.createAttribute(