From 3c1b5c7a1dfc8c25c40ce692401f4daec77679eb Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Wed, 28 Aug 2024 13:48:24 +0200 Subject: [PATCH] HHH-18520 Upgrade to hibernate-models 0.9.0 + HHH-18521 Leverage hibernate-models ModelsConfiguration --- hibernate-core/hibernate-core.gradle | 2 + .../InFlightMetadataCollectorImpl.java | 14 +- .../model/internal/PropertyInferredData.java | 12 +- .../process/spi/MetadataBuildingProcess.java | 40 +----- .../internal/ClassLoaderServiceLoading.java | 11 ++ .../spi/ManagedResourcesProcessor.java | 20 +-- .../boot/models/internal/ModelsHelper.java | 53 ++++--- .../models/internal/OrmAnnotationHelper.java | 8 +- .../xml/internal/ManagedTypeProcessor.java | 24 ++-- .../models/xml/spi/XmlDocumentContext.java | 19 +-- .../annotations/xml/ejb3/Ejb3XmlTestCase.java | 5 +- .../boot/models/SourceModelTestHelper.java | 85 ++++++------ .../SourceModelTestHelperSmokeTests.java | 2 +- .../AdditionalMappingContributorTests.java | 129 +++++------------- settings.gradle | 3 +- 15 files changed, 165 insertions(+), 262 deletions(-) diff --git a/hibernate-core/hibernate-core.gradle b/hibernate-core/hibernate-core.gradle index 195c5a2393..d3b1634a21 100644 --- a/hibernate-core/hibernate-core.gradle +++ b/hibernate-core/hibernate-core.gradle @@ -28,6 +28,7 @@ dependencies { api jakartaLibs.jta implementation libs.hibernateModels + implementation libs.hibernateModelsJandex implementation libs.jandex implementation libs.classmate implementation libs.byteBuddy @@ -65,6 +66,7 @@ dependencies { } testImplementation "joda-time:joda-time:2.3" testImplementation dbLibs.h2 + testImplementation libs.hibernateModelsJandex testRuntimeOnly libs.byteBuddy testRuntimeOnly testLibs.weld diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java index 18ea5b63b3..18fcf2fdcf 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java @@ -105,8 +105,8 @@ import org.hibernate.mapping.Table; import org.hibernate.metamodel.CollectionClassification; import org.hibernate.metamodel.mapping.DiscriminatorType; import org.hibernate.metamodel.spi.EmbeddableInstantiator; -import org.hibernate.models.internal.SourceModelBuildingContextImpl; import org.hibernate.models.spi.ClassDetails; +import org.hibernate.models.spi.ModelsConfiguration; import org.hibernate.models.spi.SourceModelBuildingContext; import org.hibernate.query.named.NamedObjectRepository; import org.hibernate.query.sqm.function.SqmFunctionDescriptor; @@ -228,11 +228,13 @@ public class InFlightMetadataCollectorImpl implements InFlightMetadataCollector, private static SourceModelBuildingContext createModelBuildingContext(BootstrapContext bootstrapContext) { final ClassLoaderService classLoaderService = bootstrapContext.getServiceRegistry().getService( ClassLoaderService.class ); final ClassLoaderServiceLoading classLoading = new ClassLoaderServiceLoading( classLoaderService ); - return new SourceModelBuildingContextImpl( - classLoading, - bootstrapContext.getJandexView(), - ModelsHelper::preFillRegistries - ); + + final ModelsConfiguration modelsConfiguration = new ModelsConfiguration(); + modelsConfiguration.setClassLoading(classLoading); +// modelsConfiguration.setExplicitContextProvider( ); + modelsConfiguration.configValue( "hibernate.models.jandex.index", bootstrapContext.getJandexView() ); + modelsConfiguration.setRegistryPrimer( ModelsHelper::preFillRegistries ); + return modelsConfiguration.bootstrap(); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyInferredData.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyInferredData.java index 000cde6257..f2c0ba35ee 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyInferredData.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyInferredData.java @@ -87,10 +87,8 @@ public class PropertyInferredData implements PropertyData { if ( targetAnnotation != null ) { final String targetName = targetAnnotation.value(); final SourceModelBuildingContext sourceModelBuildingContext = sourceModelContext; - final ClassDetails classDetails = sourceModelBuildingContext.getClassDetailsRegistry().resolveClassDetails( - targetName, - name -> new DynamicClassDetails( targetName, sourceModelBuildingContext ) - ); + final ClassDetails classDetails = sourceModelBuildingContext.getClassDetailsRegistry() + .resolveClassDetails( targetName ); return new ClassTypeDetailsImpl( classDetails, TypeDetails.Kind.CLASS ); } @@ -119,10 +117,8 @@ public class PropertyInferredData implements PropertyData { final org.hibernate.boot.internal.Target annotationUsage = propertyMember.getDirectAnnotationUsage( org.hibernate.boot.internal.Target.class ); if ( annotationUsage != null ) { final String targetName = annotationUsage.value(); - final ClassDetails classDetails = sourceModelBuildingContext.getClassDetailsRegistry().resolveClassDetails( - targetName, - name -> new DynamicClassDetails( targetName, sourceModelBuildingContext ) - ); + final ClassDetails classDetails = sourceModelBuildingContext.getClassDetailsRegistry() + .resolveClassDetails( targetName ); return new ClassTypeDetailsImpl( classDetails, TypeDetails.Kind.CLASS ); } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/process/spi/MetadataBuildingProcess.java b/hibernate-core/src/main/java/org/hibernate/boot/model/process/spi/MetadataBuildingProcess.java index 2f5c24172a..a1d9042ef9 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/process/spi/MetadataBuildingProcess.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/process/spi/MetadataBuildingProcess.java @@ -72,7 +72,8 @@ import org.hibernate.engine.config.spi.ConfigurationService; import org.hibernate.engine.config.spi.StandardConverters; import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.mapping.Table; -import org.hibernate.models.internal.jandex.JandexIndexerHelper; +import org.hibernate.models.internal.MutableClassDetailsRegistry; +import org.hibernate.models.jandex.internal.JandexIndexerHelper; import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.ClassDetailsRegistry; import org.hibernate.models.spi.ClassLoading; @@ -458,7 +459,7 @@ public class MetadataBuildingProcess { xmlProcessingResult.apply( xmlPreProcessingResult.getPersistenceUnitMetadata() ); return new DomainModelSource( - classDetailsRegistry.makeImmutableCopy(), + classDetailsRegistry, jandexIndex, allKnownClassNames, modelCategorizationCollector.getGlobalRegistrations(), @@ -516,40 +517,6 @@ public class MetadataBuildingProcess { return CompositeIndex.create( suppliedJandexIndex, jandexIndexer.complete() ); } -// -// public static void preFillRegistries(RegistryPrimer.Contributions contributions, SourceModelBuildingContext buildingContext) { -// OrmAnnotationHelper.forEachOrmAnnotation( contributions::registerAnnotation ); -// -// final IndexView jandexIndex = buildingContext.getJandexIndex(); -// if ( jandexIndex == null ) { -// return; -// } -// -// final ClassDetailsRegistry classDetailsRegistry = buildingContext.getClassDetailsRegistry(); -// final AnnotationDescriptorRegistry annotationDescriptorRegistry = buildingContext.getAnnotationDescriptorRegistry(); -// -// for ( ClassInfo knownClass : jandexIndex.getKnownClasses() ) { -// final String className = knownClass.name().toString(); -// -// if ( knownClass.isAnnotation() ) { -// // it is always safe to load the annotation classes - we will never be enhancing them -// //noinspection rawtypes -// final Class annotationClass = buildingContext -// .getClassLoading() -// .classForName( className ); -// //noinspection unchecked -// annotationDescriptorRegistry.resolveDescriptor( -// annotationClass, -// (t) -> JdkBuilders.buildAnnotationDescriptor( annotationClass, buildingContext ) -// ); -// } -// -// classDetailsRegistry.resolveClassDetails( -// className, -// (name) -> new JandexClassDetails( knownClass, buildingContext ) -// ); -// } -// } private static void processAdditionalMappingContributions( InFlightMetadataCollectorImpl metadataCollector, @@ -628,6 +595,7 @@ public class MetadataBuildingProcess { additionalClassDetails.add( classDetails ); metadataCollector.getSourceModelBuildingContext() .getClassDetailsRegistry() + .as( MutableClassDetailsRegistry.class ) .addClassDetails( classDetails.getName(), classDetails ); } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/categorize/internal/ClassLoaderServiceLoading.java b/hibernate-core/src/main/java/org/hibernate/boot/models/categorize/internal/ClassLoaderServiceLoading.java index 7667a34c62..9f947d5c51 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/categorize/internal/ClassLoaderServiceLoading.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/categorize/internal/ClassLoaderServiceLoading.java @@ -7,6 +7,12 @@ package org.hibernate.boot.models.categorize.internal; import java.net.URL; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.ServiceLoader; +import java.util.Set; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.models.spi.ClassLoading; @@ -37,4 +43,9 @@ public class ClassLoaderServiceLoading implements ClassLoading { public URL locateResource(String resourceName) { return classLoaderService.locateResource( resourceName ); } + + @Override + public Collection loadJavaServices(Class serviceType) { + return classLoaderService.loadJavaServices( serviceType ); + } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/categorize/spi/ManagedResourcesProcessor.java b/hibernate-core/src/main/java/org/hibernate/boot/models/categorize/spi/ManagedResourcesProcessor.java index 61a7191a61..767ace47b3 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/categorize/spi/ManagedResourcesProcessor.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/categorize/spi/ManagedResourcesProcessor.java @@ -31,8 +31,8 @@ import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.classloading.spi.ClassLoadingException; import org.hibernate.boot.spi.BootstrapContext; import org.hibernate.boot.spi.MetadataBuildingOptions; -import org.hibernate.models.internal.SourceModelBuildingContextImpl; -import org.hibernate.models.internal.jandex.JandexIndexerHelper; +import org.hibernate.models.internal.BasicModelBuildingContextImpl; +import org.hibernate.models.jandex.internal.JandexIndexerHelper; import org.hibernate.models.spi.AnnotationDescriptorRegistry; import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.ClassDetailsRegistry; @@ -103,9 +103,8 @@ public class ManagedResourcesProcessor { // At this point we know all managed class names across all sources. // Resolve the Jandex Index and build the SourceModelBuildingContext. final IndexView jandexIndex = resolveJandexIndex( allKnownClassNames, bootstrapContext.getJandexView(), classLoading ); - final SourceModelBuildingContextImpl sourceModelBuildingContext = new SourceModelBuildingContextImpl( + final BasicModelBuildingContextImpl sourceModelBuildingContext = new BasicModelBuildingContextImpl( classLoading, - jandexIndex, ModelsHelper::preFillRegistries ); @@ -174,16 +173,11 @@ public class ManagedResourcesProcessor { // OUTPUTS: // - CategorizedDomainModel - final ClassDetailsRegistry classDetailsRegistryImmutable = classDetailsRegistry - .makeImmutableCopy(); - - final AnnotationDescriptorRegistry annotationDescriptorRegistryImmutable = descriptorRegistry - .makeImmutableCopy(); // Collect the entity hierarchies based on the set of `rootEntities` final ModelCategorizationContextImpl mappingBuildingContext = new ModelCategorizationContextImpl( - classDetailsRegistryImmutable, - annotationDescriptorRegistryImmutable, + classDetailsRegistry, + descriptorRegistry, globalRegistrations ); @@ -212,8 +206,8 @@ public class ManagedResourcesProcessor { return modelCategorizationCollector.createResult( entityHierarchies, xmlPreProcessingResult.getPersistenceUnitMetadata(), - classDetailsRegistryImmutable, - annotationDescriptorRegistryImmutable + classDetailsRegistry, + descriptorRegistry ); } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/internal/ModelsHelper.java b/hibernate-core/src/main/java/org/hibernate/boot/models/internal/ModelsHelper.java index 7c4c96ca27..0e653fdf0e 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/internal/ModelsHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/internal/ModelsHelper.java @@ -7,8 +7,8 @@ package org.hibernate.boot.models.internal; import org.hibernate.annotations.TenantId; -import org.hibernate.models.internal.jandex.JandexClassDetails; import org.hibernate.models.internal.jdk.JdkBuilders; +import org.hibernate.models.jandex.spi.JandexModelBuildingContext; import org.hibernate.models.spi.AnnotationDescriptorRegistry; import org.hibernate.models.spi.ClassDetailsRegistry; import org.hibernate.models.spi.RegistryPrimer; @@ -26,34 +26,33 @@ public class ModelsHelper { buildingContext.getAnnotationDescriptorRegistry().getDescriptor( TenantId.class ); - final IndexView jandexIndex = buildingContext.getJandexIndex(); - if ( jandexIndex == null ) { - return; - } - - final ClassDetailsRegistry classDetailsRegistry = buildingContext.getClassDetailsRegistry(); - final AnnotationDescriptorRegistry annotationDescriptorRegistry = buildingContext.getAnnotationDescriptorRegistry(); - - for ( ClassInfo knownClass : jandexIndex.getKnownClasses() ) { - final String className = knownClass.name().toString(); - - if ( knownClass.isAnnotation() ) { - // it is always safe to load the annotation classes - we will never be enhancing them - //noinspection rawtypes - final Class annotationClass = buildingContext - .getClassLoading() - .classForName( className ); - //noinspection unchecked - annotationDescriptorRegistry.resolveDescriptor( - annotationClass, - (t) -> JdkBuilders.buildAnnotationDescriptor( annotationClass, buildingContext ) - ); + if ( buildingContext instanceof JandexModelBuildingContext ) { + final IndexView jandexIndex = buildingContext.as( JandexModelBuildingContext.class ).getJandexIndex(); + if ( jandexIndex == null ) { + return; } - classDetailsRegistry.resolveClassDetails( - className, - (name) -> new JandexClassDetails( knownClass, buildingContext ) - ); + final ClassDetailsRegistry classDetailsRegistry = buildingContext.getClassDetailsRegistry(); + final AnnotationDescriptorRegistry annotationDescriptorRegistry = buildingContext.getAnnotationDescriptorRegistry(); + + for ( ClassInfo knownClass : jandexIndex.getKnownClasses() ) { + final String className = knownClass.name().toString(); + + if ( knownClass.isAnnotation() ) { + // it is always safe to load the annotation classes - we will never be enhancing them + //noinspection rawtypes + final Class annotationClass = buildingContext + .getClassLoading() + .classForName( className ); + //noinspection unchecked + annotationDescriptorRegistry.resolveDescriptor( + annotationClass, + (t) -> JdkBuilders.buildAnnotationDescriptor( annotationClass, buildingContext ) + ); + } + + classDetailsRegistry.resolveClassDetails( className ); + } } } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/internal/OrmAnnotationHelper.java b/hibernate-core/src/main/java/org/hibernate/boot/models/internal/OrmAnnotationHelper.java index 7266dd05e9..c7b64abd36 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/internal/OrmAnnotationHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/internal/OrmAnnotationHelper.java @@ -15,7 +15,6 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Locale; -import java.util.Map; import java.util.function.Consumer; import org.hibernate.boot.models.DialectOverrideAnnotations; @@ -23,13 +22,13 @@ import org.hibernate.boot.models.HibernateAnnotations; import org.hibernate.boot.models.JpaAnnotations; import org.hibernate.boot.models.XmlAnnotations; import org.hibernate.models.AnnotationAccessException; +import org.hibernate.models.jandex.spi.JandexModelBuildingContext; +import org.hibernate.models.jandex.spi.JandexValueExtractor; import org.hibernate.models.spi.AnnotationDescriptor; import org.hibernate.models.spi.AttributeDescriptor; -import org.hibernate.models.spi.JandexValueExtractor; import org.hibernate.models.spi.SourceModelBuildingContext; import org.jboss.jandex.AnnotationInstance; -import org.jboss.jandex.AnnotationValue; /** * @author Steve Ebersole @@ -76,7 +75,8 @@ public class OrmAnnotationHelper { } public static V extractJandexValue(AnnotationInstance jandexAnnotation, AttributeDescriptor attributeDescriptor, SourceModelBuildingContext modelContext) { - final JandexValueExtractor extractor = attributeDescriptor.getTypeDescriptor().createJandexValueExtractor( modelContext ); + final JandexValueExtractor extractor = modelContext.as( JandexModelBuildingContext.class ) + .getJandexValueExtractor( attributeDescriptor.getTypeDescriptor() ); return extractor.extractValue( jandexAnnotation, attributeDescriptor, modelContext ); // final AnnotationValue value = jandexAnnotation.value( attributeDescriptor.getName() ); // return attributeDescriptor diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/ManagedTypeProcessor.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/ManagedTypeProcessor.java index 0ebb0335f7..bdc3e35bf6 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/ManagedTypeProcessor.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/ManagedTypeProcessor.java @@ -44,9 +44,10 @@ import org.hibernate.models.ModelsException; import org.hibernate.models.internal.ClassTypeDetailsImpl; import org.hibernate.models.internal.ModelsClassLogging; import org.hibernate.models.internal.ModifierUtils; -import org.hibernate.models.internal.RenderingCollectorImpl; import org.hibernate.models.internal.dynamic.DynamicClassDetails; import org.hibernate.models.internal.dynamic.DynamicFieldDetails; +import org.hibernate.models.rendering.internal.RenderingTargetCollectingImpl; +import org.hibernate.models.rendering.internal.SimpleRenderer; import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.ClassDetailsRegistry; import org.hibernate.models.spi.FieldDetails; @@ -99,17 +100,7 @@ public class ManagedTypeProcessor { memberAdjuster = ManagedTypeProcessor::adjustDynamicTypeMember; classAccessType = AccessType.FIELD; - classDetails = (MutableClassDetails) classDetailsRegistry.resolveClassDetails( - jaxbEntity.getName(), - (name) -> new DynamicClassDetails( - jaxbEntity.getName(), - null, - false, - null, - null, - xmlDocumentContext.getModelBuildingContext() - ) - ); + classDetails = (MutableClassDetails) classDetailsRegistry.resolveClassDetails( jaxbEntity.getName() ); prepareDynamicClass( classDetails, jaxbEntity, xmlDocumentContext ); } @@ -625,9 +616,10 @@ public class ManagedTypeProcessor { return; } - final RenderingCollectorImpl renderingCollector = new RenderingCollectorImpl(); - classDetails.render( renderingCollector, xmlDocumentContext.getModelBuildingContext() ); - XML_PROCESS_LOGGER.debugf( "Class annotations from XML for %s:\n%s", classDetails.getName(), renderingCollector.toString() ); + final RenderingTargetCollectingImpl collectingTarget = new RenderingTargetCollectingImpl(); + final SimpleRenderer renderer = new SimpleRenderer( collectingTarget ); + renderer.renderClass( classDetails, xmlDocumentContext.getModelBuildingContext() ); + XML_PROCESS_LOGGER.debugf( "Class annotations from XML for %s:\n%s", classDetails.getName(), renderer.toString() ); } private static void applyAccessAnnotation( @@ -943,7 +935,7 @@ public class ManagedTypeProcessor { } // no class == dynamic... classDetails = (MutableClassDetails) classDetailsRegistry - .resolveClassDetails( jaxbEmbeddable.getName(), DynamicClassDetails::new ); + .resolveClassDetails( jaxbEmbeddable.getName() ); classAccessType = AccessType.FIELD; memberAdjuster = ManagedTypeProcessor::adjustDynamicTypeMember; diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlDocumentContext.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlDocumentContext.java index bc84e13e1b..90728ab3ee 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlDocumentContext.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlDocumentContext.java @@ -137,10 +137,8 @@ public interface XmlDocumentContext { // , final String target = jaxbEmbeddedMapping.getTarget(); if ( isNotEmpty( target ) ) { - return (MutableClassDetails) getModelBuildingContext().getClassDetailsRegistry().resolveClassDetails( - target, - (name) -> new DynamicClassDetails( target, getModelBuildingContext() ) - ); + return (MutableClassDetails) getModelBuildingContext().getClassDetailsRegistry() + .resolveClassDetails( target ); } // fall through to exception } @@ -148,17 +146,8 @@ public interface XmlDocumentContext { if ( jaxbPersistentAttribute instanceof JaxbAssociationAttribute jaxbAssociationAttribute ) { final String target = jaxbAssociationAttribute.getTargetEntity(); if ( isNotEmpty( target ) ) { - return (MutableClassDetails) getModelBuildingContext().getClassDetailsRegistry().resolveClassDetails( - target, - (name) -> new DynamicClassDetails( - target, - null, - false, - null, - null, - getModelBuildingContext() - ) - ); + return (MutableClassDetails) getModelBuildingContext().getClassDetailsRegistry() + .resolveClassDetails( target ); } // fall through to exception } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/xml/ejb3/Ejb3XmlTestCase.java b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/xml/ejb3/Ejb3XmlTestCase.java index 6f5b10b882..844ef2fd0f 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/xml/ejb3/Ejb3XmlTestCase.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/xml/ejb3/Ejb3XmlTestCase.java @@ -20,7 +20,7 @@ import org.hibernate.boot.models.xml.spi.XmlProcessingResult; import org.hibernate.boot.models.xml.spi.XmlProcessor; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.spi.BootstrapContext; -import org.hibernate.models.internal.SourceModelBuildingContextImpl; +import org.hibernate.models.internal.BasicModelBuildingContextImpl; import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.FieldDetails; import org.hibernate.models.spi.MemberDetails; @@ -91,9 +91,8 @@ public abstract class Ejb3XmlTestCase extends BaseUnitTestCase { persistenceUnitMetadata ); - final SourceModelBuildingContext modelBuildingContext = new SourceModelBuildingContextImpl( + final SourceModelBuildingContext modelBuildingContext = new BasicModelBuildingContextImpl( SIMPLE_CLASS_LOADING, - null, (contributions, inFlightContext) -> { OrmAnnotationHelper.forEachOrmAnnotation( contributions::registerAnnotation ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/SourceModelTestHelper.java b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/SourceModelTestHelper.java index b3e6716242..f0f1a8110f 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/SourceModelTestHelper.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/SourceModelTestHelper.java @@ -52,17 +52,15 @@ import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.MappingSettings; import org.hibernate.engine.config.spi.ConfigurationService; -import org.hibernate.models.internal.AnnotationDescriptorRegistryStandard; import org.hibernate.models.internal.BaseLineJavaTypes; -import org.hibernate.models.internal.SourceModelBuildingContextImpl; -import org.hibernate.models.internal.jandex.JandexBuilders; -import org.hibernate.models.internal.jandex.JandexIndexerHelper; +import org.hibernate.models.internal.BasicModelBuildingContextImpl; import org.hibernate.models.internal.jdk.JdkBuilders; +import org.hibernate.models.jandex.internal.JandexIndexerHelper; +import org.hibernate.models.jandex.internal.JandexModelBuildingContextImpl; import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.ClassDetailsRegistry; import org.hibernate.models.spi.ClassLoading; import org.hibernate.models.spi.SourceModelBuildingContext; -import org.hibernate.service.ServiceRegistry; import org.jboss.jandex.ClassInfo; import org.jboss.jandex.Index; @@ -87,49 +85,50 @@ public class SourceModelTestHelper { return createBuildingContext( jandexIndex, modelClasses ); } - public static SourceModelBuildingContextImpl createBuildingContext(Index jandexIndex, Class... modelClasses) { + public static SourceModelBuildingContext createBuildingContext(Index jandexIndex, Class... modelClasses) { return createBuildingContext( jandexIndex, SIMPLE_CLASS_LOADING, modelClasses ); } - public static SourceModelBuildingContextImpl createBuildingContext( + public static SourceModelBuildingContext createBuildingContext( Index jandexIndex, ClassLoading classLoadingAccess, Class... modelClasses) { - final SourceModelBuildingContextImpl buildingContext = new SourceModelBuildingContextImpl( - classLoadingAccess, - jandexIndex, - (contributions, buildingContext1) -> OrmAnnotationHelper.forEachOrmAnnotation( contributions::registerAnnotation ) - ); - final ClassDetailsRegistry classDetailsRegistry = buildingContext.getClassDetailsRegistry(); - final AnnotationDescriptorRegistryStandard annotationDescriptorRegistry = (AnnotationDescriptorRegistryStandard) buildingContext.getAnnotationDescriptorRegistry(); + final SourceModelBuildingContext ctx; - for ( ClassInfo knownClass : jandexIndex.getKnownClasses() ) { -// if ( knownClass.simpleName().endsWith( "package-info" ) ) { -// new PackageDetailsImpl( knownClass, buildingContext ); -// continue; -// } - - classDetailsRegistry.resolveClassDetails( - knownClass.name().toString(), - JandexBuilders.DEFAULT_BUILDER + if ( jandexIndex == null ) { + ctx = new BasicModelBuildingContextImpl( + classLoadingAccess, + (contributions, buildingContext1) -> OrmAnnotationHelper.forEachOrmAnnotation( contributions::registerAnnotation ) + ); + } + else { + ctx = new JandexModelBuildingContextImpl( + jandexIndex, + classLoadingAccess, + (contributions, buildingContext1) -> OrmAnnotationHelper.forEachOrmAnnotation( contributions::registerAnnotation ) ); - if ( knownClass.isAnnotation() ) { - final Class annotationClass = buildingContext - .getClassLoading() - .classForName( knownClass.name().toString() ); - annotationDescriptorRegistry.resolveDescriptor( annotationClass, annotationType -> JdkBuilders.buildAnnotationDescriptor( - annotationType, - buildingContext - ) ); + for ( ClassInfo knownClass : jandexIndex.getKnownClasses() ) { + ctx.getClassDetailsRegistry().resolveClassDetails( knownClass.name().toString() ); + + if ( knownClass.isAnnotation() ) { + final Class annotationClass = classLoadingAccess.classForName( knownClass.name().toString() ); + ctx.getAnnotationDescriptorRegistry().resolveDescriptor( + annotationClass, + annotationType -> JdkBuilders.buildAnnotationDescriptor( + annotationType, + ctx + ) + ); + } } } for ( int i = 0; i < modelClasses.length; i++ ) { - classDetailsRegistry.resolveClassDetails( modelClasses[i].getName() ); + ctx.getClassDetailsRegistry().resolveClassDetails( modelClasses[i].getName() ); } - return buildingContext; + return ctx; } public static Index buildJandexIndex(Class... modelClasses) { @@ -275,11 +274,21 @@ public class SourceModelTestHelper { ? buildJandexIndex( classLoading, allKnownClassNames ) : null; - final SourceModelBuildingContextImpl sourceModelBuildingContext = new SourceModelBuildingContextImpl( - classLoading, - jandexIndex, - ModelsHelper::preFillRegistries - ); + final SourceModelBuildingContext sourceModelBuildingContext; + + if ( jandexIndex == null ) { + sourceModelBuildingContext = new BasicModelBuildingContextImpl( + classLoading, + ModelsHelper::preFillRegistries + ); + } + else { + sourceModelBuildingContext = new JandexModelBuildingContextImpl( + jandexIndex, + classLoading, + ModelsHelper::preFillRegistries + ); + } final RootMappingDefaults rootMappingDefaults = new RootMappingDefaults( metadataBuildingOptions.getMappingDefaults(), diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/SourceModelTestHelperSmokeTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/SourceModelTestHelperSmokeTests.java index 8fa37a8117..eec5d3475d 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/SourceModelTestHelperSmokeTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/SourceModelTestHelperSmokeTests.java @@ -7,7 +7,7 @@ package org.hibernate.orm.test.boot.models; import org.hibernate.models.AnnotationAccessException; -import org.hibernate.models.internal.jandex.JandexClassDetails; +import org.hibernate.models.jandex.internal.JandexClassDetails; import org.hibernate.models.spi.AnnotationDescriptor; import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.FieldDetails; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/intg/AdditionalMappingContributorTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/intg/AdditionalMappingContributorTests.java index d2f1543bcb..9df889504f 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/intg/AdditionalMappingContributorTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/intg/AdditionalMappingContributorTests.java @@ -11,20 +11,13 @@ import java.io.InputStream; import java.util.List; import org.hibernate.boot.ResourceStreamLocator; -import org.hibernate.boot.models.HibernateAnnotations; -import org.hibernate.boot.models.JpaAnnotations; -import org.hibernate.boot.models.annotations.internal.EntityJpaAnnotation; import org.hibernate.boot.spi.AdditionalMappingContributions; import org.hibernate.boot.spi.AdditionalMappingContributor; import org.hibernate.boot.spi.InFlightMetadataCollector; import org.hibernate.boot.spi.MetadataBuildingContext; import org.hibernate.mapping.PersistentClass; -import org.hibernate.models.internal.dynamic.DynamicClassDetails; -import org.hibernate.models.internal.dynamic.DynamicFieldDetails; -import org.hibernate.models.internal.jdk.JdkClassDetails; import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.ClassDetailsRegistry; -import org.hibernate.models.spi.MutableMemberDetails; import org.hibernate.testing.orm.junit.BootstrapServiceRegistry; import org.hibernate.testing.orm.junit.BootstrapServiceRegistry.JavaService; @@ -43,7 +36,6 @@ import static org.assertj.core.api.Assertions.assertThat; /** * @author Steve Ebersole - * * @implNote hibernate-envers is already a full testing of contributing a {@code hbm.xml} * document; so we skip that here until if/when we transition it to use a better approach */ @@ -105,13 +97,17 @@ public class AdditionalMappingContributorTests { @DomainModel @SessionFactory @SuppressWarnings("JUnitMalformedDeclaration") - void verifyJdkClassDetailsContributions(DomainModelScope domainModelScope, SessionFactoryScope sessionFactoryScope) { - final PersistentClass entity4Binding = domainModelScope.getDomainModel().getEntityBinding( Entity4.class.getName() ); + void verifyJdkClassDetailsContributions( + DomainModelScope domainModelScope, + SessionFactoryScope sessionFactoryScope) { + final PersistentClass entity4Binding = domainModelScope.getDomainModel() + .getEntityBinding( Entity4.class.getName() ); assertThat( entity4Binding ).isNotNull(); assertThat( entity4Binding.getIdentifierProperty() ).isNotNull(); assertThat( entity4Binding.getProperties() ).hasSize( 1 ); - final PersistentClass entity5Binding = domainModelScope.getDomainModel().getEntityBinding( Entity5.class.getName() ); + final PersistentClass entity5Binding = domainModelScope.getDomainModel() + .getEntityBinding( Entity5.class.getName() ); assertThat( entity5Binding ).isNotNull(); assertThat( entity5Binding.getIdentifierProperty() ).isNotNull(); assertThat( entity5Binding.getProperties() ).hasSize( 1 ); @@ -137,7 +133,9 @@ public class AdditionalMappingContributorTests { @DomainModel @SessionFactory @SuppressWarnings("JUnitMalformedDeclaration") - void verifyDynamicClassDetailsContributions(DomainModelScope domainModelScope, SessionFactoryScope sessionFactoryScope) { + void verifyDynamicClassDetailsContributions( + DomainModelScope domainModelScope, + SessionFactoryScope sessionFactoryScope) { final PersistentClass entity6Binding = domainModelScope.getDomainModel().getEntityBinding( "Entity6" ); assertThat( entity6Binding ).isNotNull(); assertThat( entity6Binding.getIdentifierProperty() ).isNotNull(); @@ -150,12 +148,12 @@ public class AdditionalMappingContributorTests { } ); } - @Entity( name = "Entity1" ) - @Table( name = "Entity1" ) + @Entity(name = "Entity1") + @Table(name = "Entity1") public static class Entity1 { - @Id - private Integer id; - @Basic + @Id + private Integer id; + @Basic private String name; @SuppressWarnings("unused") @@ -182,12 +180,12 @@ public class AdditionalMappingContributorTests { } - @Entity( name = "Entity2" ) - @Table( name = "Entity2" ) + @Entity(name = "Entity2") + @Table(name = "Entity2") public static class Entity2 { - @Id - private Integer id; - @Basic + @Id + private Integer id; + @Basic private String name; @SuppressWarnings("unused") @@ -213,12 +211,12 @@ public class AdditionalMappingContributorTests { } } - @Entity( name = "Entity3" ) - @Table( name = "Entity3" ) + @Entity(name = "Entity3") + @Table(name = "Entity3") public static class Entity3 { - @Id - private Integer id; - @Basic + @Id + private Integer id; + @Basic private String name; @SuppressWarnings("unused") @@ -245,8 +243,8 @@ public class AdditionalMappingContributorTests { } @SuppressWarnings("unused") - @Entity(name="Entity4") - @Table(name="Entity4") + @Entity(name = "Entity4") + @Table(name = "Entity4") public static class Entity4 { @Id private Integer id; @@ -277,7 +275,8 @@ public class AdditionalMappingContributorTests { InFlightMetadataCollector metadata, ResourceStreamLocator resourceStreamLocator, MetadataBuildingContext buildingContext) { - try ( final InputStream stream = resourceStreamLocator.locateResourceStream( "mappings/intg/contributed-mapping.xml" ) ) { + try (final InputStream stream = resourceStreamLocator.locateResourceStream( + "mappings/intg/contributed-mapping.xml" )) { contributions.contributeBinding( stream ); } catch (IOException e) { @@ -297,50 +296,24 @@ public class AdditionalMappingContributorTests { .getSourceModelBuildingContext() .getClassDetailsRegistry(); - contributeEntity4Details( contributions, buildingContext, classDetailsRegistry ); - contributeEntity5Details( contributions, buildingContext, classDetailsRegistry ); + contributeEntity4Details( contributions, classDetailsRegistry ); + contributeEntity5Details( contributions, classDetailsRegistry ); } private static void contributeEntity4Details( AdditionalMappingContributions contributions, - MetadataBuildingContext buildingContext, ClassDetailsRegistry classDetailsRegistry) { final ClassDetails entity4Details = classDetailsRegistry.resolveClassDetails( - Entity4.class.getName(), - (name, modelBuildingContext) -> { - assertThat( name ).isEqualTo( Entity4.class.getName() ); - assertThat( modelBuildingContext ).isSameAs( buildingContext.getMetadataCollector().getSourceModelBuildingContext() ); - return new JdkClassDetails( Entity4.class, modelBuildingContext ); - } + Entity4.class.getName() ); contributions.contributeManagedClass( entity4Details ); } private static void contributeEntity5Details( AdditionalMappingContributions contributions, - MetadataBuildingContext buildingContext, ClassDetailsRegistry classDetailsRegistry) { final ClassDetails entity5Details = classDetailsRegistry.resolveClassDetails( - Entity5.class.getName(), - (name, modelBuildingContext) -> { - assertThat( name ).isEqualTo( Entity5.class.getName() ); - assertThat( modelBuildingContext ).isSameAs( buildingContext.getMetadataCollector().getSourceModelBuildingContext() ); - final JdkClassDetails jdkClassDetails = new JdkClassDetails( - Entity5.class, - modelBuildingContext - ); - - final EntityJpaAnnotation entityUsage = (EntityJpaAnnotation) jdkClassDetails.applyAnnotationUsage( - JpaAnnotations.ENTITY, - modelBuildingContext - ); - entityUsage.name( "___Entity5___" ); - - final MutableMemberDetails idField = (MutableMemberDetails) jdkClassDetails.findFieldByName( "id" ); - idField.applyAnnotationUsage( JpaAnnotations.ID, modelBuildingContext ); - - return jdkClassDetails; - } + Entity5.class.getName() ); contributions.contributeManagedClass( entity5Details ); } @@ -356,46 +329,14 @@ public class AdditionalMappingContributorTests { final ClassDetailsRegistry classDetailsRegistry = buildingContext.getMetadataCollector() .getSourceModelBuildingContext() .getClassDetailsRegistry(); - contributeEntity6Details( contributions, buildingContext, classDetailsRegistry ); + contributeEntity6Details( contributions, classDetailsRegistry ); } private void contributeEntity6Details( AdditionalMappingContributions contributions, - MetadataBuildingContext buildingContext, ClassDetailsRegistry classDetailsRegistry) { final ClassDetails entity6Details = classDetailsRegistry.resolveClassDetails( - "Entity6", - (name, modelBuildingContext) -> { - assertThat( name ).isEqualTo( "Entity6" ); - assertThat( modelBuildingContext ).isSameAs( buildingContext.getMetadataCollector().getSourceModelBuildingContext() ); - - final DynamicClassDetails classDetails = new DynamicClassDetails( "Entity6", modelBuildingContext ); - final EntityJpaAnnotation entityUsage = (EntityJpaAnnotation) classDetails.applyAnnotationUsage( - JpaAnnotations.ENTITY, - modelBuildingContext - ); - entityUsage.name( "Entity6" ); - - final DynamicFieldDetails idMember = classDetails.applyAttribute( - "id", - classDetailsRegistry.resolveClassDetails( Integer.class.getName() ), - false, - false, - modelBuildingContext - ); - idMember.applyAnnotationUsage( JpaAnnotations.ID, modelBuildingContext ); - - final DynamicFieldDetails nameMember = classDetails.applyAttribute( - "name", - classDetailsRegistry.resolveClassDetails( String.class.getName() ), - false, - false, - modelBuildingContext - ); - nameMember.applyAnnotationUsage( HibernateAnnotations.NATIONALIZED, modelBuildingContext ); - - return classDetails; - } + "Entity6" ); contributions.contributeManagedClass( entity6Details ); } diff --git a/settings.gradle b/settings.gradle index 7a9c260780..856c7cb6cc 100644 --- a/settings.gradle +++ b/settings.gradle @@ -76,7 +76,7 @@ dependencyResolutionManagement { def byteBuddyVersion = version "byteBuddy", "1.14.18" def classmateVersion = version "classmate", "1.5.1" def geolatteVersion = version "geolatte", "1.9.1" - def hibernateModelsVersion = version "hibernateModels", "0.8.6" + def hibernateModelsVersion = version "hibernateModels", "0.9.0" def jandexVersion = version "jandex", "3.2.0" def jacksonVersion = version "jackson", "2.17.0" def jbossLoggingVersion = version "jbossLogging", "3.6.0.Final" @@ -107,6 +107,7 @@ dependencyResolutionManagement { library( "loggingProcessor", "org.jboss.logging", "jboss-logging-processor" ).versionRef( jbossLoggingToolVersion ) library( "hibernateModels", "org.hibernate.models", "hibernate-models" ).versionRef( hibernateModelsVersion ) + library( "hibernateModelsJandex", "org.hibernate.models", "hibernate-models-jandex" ).versionRef( hibernateModelsVersion ) library( "jandex", "io.smallrye", "jandex" ).versionRef( jandexVersion ) library( "classmate", "com.fasterxml", "classmate" ).versionRef( classmateVersion )