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' 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' ) } 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..bcfa76710669 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,44 @@ 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" + // 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" } +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 +158,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) 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" 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..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 @@ -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()) @@ -305,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/Context.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java index e70d5a6e04f0..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 @@ -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; @@ -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 e483b07d6045..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 @@ -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; @@ -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; @@ -512,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 ); @@ -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(), 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..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 @@ -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; @@ -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 123589a1f799..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 @@ -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; @@ -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; } @@ -419,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) ) { @@ -1506,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 ) @@ -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/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/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 ea4c04224f52..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 @@ -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; @@ -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, 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/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/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/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/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/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 } 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..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 @@ -24,8 +24,9 @@ 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 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 08d0cc1ebebd..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 @@ -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; @@ -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 ); } 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/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..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 @@ -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() ); } @@ -156,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( 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/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/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/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/JpaDescriptorParser.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/JpaDescriptorParser.java index 7a24e37c2551..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 @@ -43,8 +43,9 @@ 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 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/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..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 @@ -44,10 +44,11 @@ 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; +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 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; 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;