diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryObserverForNamedQueryValidation.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryObserverForNamedQueryValidation.java index 5046bf9113dc..8757652a86cb 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryObserverForNamedQueryValidation.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryObserverForNamedQueryValidation.java @@ -30,8 +30,8 @@ class SessionFactoryObserverForNamedQueryValidation implements SessionFactoryObs @Override public void sessionFactoryCreated(SessionFactory factory) { - final SessionFactoryImplementor sessionFactory = (SessionFactoryImplementor) factory; - final QueryEngine queryEngine = sessionFactory.getQueryEngine(); + final var sessionFactory = (SessionFactoryImplementor) factory; + final var queryEngine = sessionFactory.getQueryEngine(); queryEngine.getNamedObjectRepository().prepare( sessionFactory, metadata ); if ( sessionFactory.getSessionFactoryOptions().isNamedQueryStartupCheckingEnabled() ) { queryEngine.validateNamedQueries(); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryObserverForRegistration.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryObserverForRegistration.java index 79416435c8d8..251cc23954fb 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryObserverForRegistration.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryObserverForRegistration.java @@ -25,7 +25,7 @@ class SessionFactoryObserverForRegistration implements SessionFactoryObserver { @Override public void sessionFactoryCreated(SessionFactory factory) { - final SessionFactoryImplementor sessionFactory = (SessionFactoryImplementor) factory; + final var sessionFactory = (SessionFactoryImplementor) factory; jndiService = sessionFactory.getServiceRegistry().getService( JndiService.class ); SessionFactoryRegistry.INSTANCE.addSessionFactory( sessionFactory.getUuid(), @@ -38,7 +38,7 @@ public void sessionFactoryCreated(SessionFactory factory) { @Override public void sessionFactoryClosed(SessionFactory factory) { - final SessionFactoryImplementor sessionFactory = (SessionFactoryImplementor) factory; + final var sessionFactory = (SessionFactoryImplementor) factory; SessionFactoryRegistry.INSTANCE.removeSessionFactory( sessionFactory.getUuid(), sessionFactory.getName(), diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/TypeBeanInstanceProducer.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/TypeBeanInstanceProducer.java index 5ba59858e048..261d31cbb32b 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/TypeBeanInstanceProducer.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/TypeBeanInstanceProducer.java @@ -11,7 +11,6 @@ import org.hibernate.type.spi.TypeBootstrapContext; import org.hibernate.service.ServiceRegistry; -import java.lang.reflect.Constructor; import java.util.Map; import static org.hibernate.internal.util.ReflectHelper.getConstructorOrNull; @@ -33,7 +32,7 @@ public TypeBeanInstanceProducer(ConfigurationService configurationService, Servi @Override public B produceBeanInstance(Class beanType) { - final Constructor bootstrapContextAwareConstructor = + final var bootstrapContextAwareConstructor = getConstructorOrNull( beanType, TypeBootstrapContext.class ); if ( bootstrapContextAwareConstructor != null ) { try { @@ -44,7 +43,7 @@ public B produceBeanInstance(Class beanType) { } } else { - final Constructor constructor = getConstructorOrNull( beanType ); + final var constructor = getConstructorOrNull( beanType ); if ( constructor != null ) { try { return constructor.newInstance(); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/TypeDefinition.java b/hibernate-core/src/main/java/org/hibernate/boot/model/TypeDefinition.java index 65b2e97e7e63..227c78dc08d4 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/TypeDefinition.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/TypeDefinition.java @@ -16,11 +16,9 @@ import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.spi.MetadataBuildingContext; import org.hibernate.boot.spi.MetadataBuildingOptions; -import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.mapping.BasicValue; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.resource.beans.spi.BeanInstanceProducer; -import org.hibernate.resource.beans.spi.ManagedBean; import org.hibernate.resource.beans.spi.ManagedBeanRegistry; import org.hibernate.type.BasicType; import org.hibernate.type.CustomType; @@ -39,6 +37,7 @@ import static java.util.Collections.emptyMap; import static org.hibernate.boot.model.process.internal.InferredBasicValueResolver.resolveSqlTypeIndicators; +import static org.hibernate.internal.util.collections.CollectionHelper.isEmpty; import static org.hibernate.mapping.MappingHelper.injectParameters; /** @@ -97,13 +96,21 @@ public Map getParameters() { public BasicValue.Resolution resolve( Map localConfigParameters, + MetadataBuildingContext context, + JdbcTypeIndicators indicators) { + return resolve( localConfigParameters, null, context, indicators ); + } + + public BasicValue.Resolution resolve( + Map localConfigParameters, + // TODO: why is this parameter ignored?? MutabilityPlan explicitMutabilityPlan, MetadataBuildingContext context, JdbcTypeIndicators indicators) { - if ( CollectionHelper.isEmpty( localConfigParameters ) ) { + if ( isEmpty( localConfigParameters ) ) { // we can use the re-usable resolution... if ( reusableResolution == null ) { - reusableResolution = createResolution( name, emptyMap(), indicators, context ); + reusableResolution = createResolution( this.name, emptyMap(), indicators, context ); } return reusableResolution; } @@ -152,7 +159,7 @@ private static BasicValue.Resolution createResolution( configurationAware.setTypeConfiguration( typeConfiguration ); } - final Properties combinedTypeParameters = new Properties(); + final var combinedTypeParameters = new Properties(); if ( parameters!=null ) { combinedTypeParameters.putAll( parameters ); } @@ -225,19 +232,21 @@ public MutabilityPlan getMutabilityPlan() { private static BasicValue.Resolution resolveLegacyCases( Class typeImplementorClass, JdbcTypeIndicators indicators, TypeConfiguration typeConfiguration) { - final BasicType legacyType; + return createBasicTypeResolution( getLegacyType( typeImplementorClass ), + typeImplementorClass, indicators, typeConfiguration ); + } + + private static BasicType getLegacyType(Class typeImplementorClass) { if ( Serializable.class.isAssignableFrom( typeImplementorClass ) ) { - legacyType = new SerializableType( typeImplementorClass ); + return new SerializableType( typeImplementorClass ); } else if ( typeImplementorClass.isInterface() ) { - legacyType = (BasicType) new JavaObjectType(); + return (BasicType) new JavaObjectType(); } else { throw new IllegalArgumentException( "Named type [" + typeImplementorClass - + "] did not implement BasicType nor UserType" ); + + "] did not implement BasicType nor UserType" ); } - - return createBasicTypeResolution( legacyType, typeImplementorClass, indicators, typeConfiguration ); } private static BasicValue.Resolution createBasicTypeResolution( @@ -304,7 +313,7 @@ private static T instantiateType( } else { final var beanRegistry = serviceRegistry.requireService( ManagedBeanRegistry.class ); - final ManagedBean typeBean = name != null + final var typeBean = name != null ? beanRegistry.getBean( name, typeImplementorClass, instanceProducer ) : beanRegistry.getBean( typeImplementorClass, instanceProducer ); return typeBean.getBeanInstance(); @@ -321,29 +330,31 @@ public static BasicValue.Resolution createLocalResolution( typeImplementorClass, localTypeParams, null, - buildingContext.getBootstrapContext().getTypeConfiguration().getCurrentBaseSqlTypeIndicators(), + buildingContext.getBootstrapContext().getTypeConfiguration() + .getCurrentBaseSqlTypeIndicators(), buildingContext ); } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( !(o instanceof TypeDefinition that) ) { + else if ( !(object instanceof TypeDefinition that) ) { return false; } - - return Objects.equals( this.name, that.name ) - && Objects.equals( this.typeImplementorClass, that.typeImplementorClass ) - && Arrays.equals( this.registrationKeys, that.registrationKeys ) - && Objects.equals( this.parameters, that.parameters ); + else { + return Objects.equals( this.name, that.name ) + && Objects.equals( this.typeImplementorClass, that.typeImplementorClass ) + && Arrays.equals( this.registrationKeys, that.registrationKeys ) + && Objects.equals( this.parameters, that.parameters ); + } } @Override public int hashCode() { - return Objects.hash( name, typeImplementorClass, registrationKeys, parameters ); + return Objects.hash( name, typeImplementorClass, Arrays.hashCode( registrationKeys ), parameters ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java index 9a9c288a874f..44005bab151e 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java @@ -1178,12 +1178,12 @@ private void bindCollectionMetadata(MappingDocument mappingDocument, PluralAttri final Map typeParameters = new HashMap<>(); if ( typeName != null ) { // see if there is a corresponding type-def - final TypeDefinition typeDef = + final var typeDefinition = mappingDocument.getMetadataCollector().getTypeDefinition( typeName ); - if ( typeDef != null ) { - typeName = typeDef.getTypeImplementorClass().getName(); - if ( typeDef.getParameters() != null ) { - typeParameters.putAll( typeDef.getParameters() ); + if ( typeDefinition != null ) { + typeName = typeDefinition.getTypeImplementorClass().getName(); + if ( typeDefinition.getParameters() != null ) { + typeParameters.putAll( typeDefinition.getParameters() ); } } else { @@ -2081,16 +2081,12 @@ private BasicType resolveExplicitlyNamedAnyDiscriminatorType( } // see if it is a named TypeDefinition - final TypeDefinition typeDefinition = + final var typeDefinition = metadataBuildingContext.getTypeDefinitionRegistry().resolve( typeName ); if ( typeDefinition != null ) { - final BasicValue.Resolution resolution = typeDefinition.resolve( - parameters, - null, - metadataBuildingContext, - typeConfiguration.getCurrentBaseSqlTypeIndicators() - ); - + final var resolution = + typeDefinition.resolve( parameters, metadataBuildingContext, + typeConfiguration.getCurrentBaseSqlTypeIndicators() ); if ( resolution.getCombinedTypeParameters() != null ) { discriminatorMapping.setTypeParameters( resolution.getCombinedTypeParameters() ); } @@ -2222,7 +2218,7 @@ private String toCascadeString(EnumSet defaultCascadeTypes) { } else { boolean firstPass = true; - final StringBuilder buffer = new StringBuilder(); + final var buffer = new StringBuilder(); for ( var cascadeType : defaultCascadeTypes ) { if ( firstPass ) { firstPass = false; @@ -2530,7 +2526,7 @@ private static TypeResolution resolveType( return null; } - final TypeDefinition typeDefinition = + final var typeDefinition = sourceDocument.getMetadataCollector() .getTypeDefinition( typeSource.getName() ); final Map typeParameters = new HashMap<>(); diff --git a/hibernate-core/src/main/java/org/hibernate/internal/util/ReflectHelper.java b/hibernate-core/src/main/java/org/hibernate/internal/util/ReflectHelper.java index f3d136b7e473..f14f29e159a1 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/util/ReflectHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/util/ReflectHelper.java @@ -297,7 +297,7 @@ public static Constructor getDefaultConstructor(Class clazz) throws Pr } try { - final Constructor constructor = clazz.getDeclaredConstructor( NO_PARAM_SIGNATURE ); + final var constructor = clazz.getDeclaredConstructor( NO_PARAM_SIGNATURE ); ensureAccessibility( constructor ); return constructor; } @@ -314,7 +314,7 @@ public static Supplier getDefaultSupplier(Class clazz) { } try { - final Constructor constructor = clazz.getDeclaredConstructor( NO_PARAM_SIGNATURE ); + final var constructor = clazz.getDeclaredConstructor( NO_PARAM_SIGNATURE ); ensureAccessibility( constructor ); return () -> { try { @@ -370,20 +370,19 @@ public static boolean isFinalClass(Class clazz) { public static Constructor getConstructorOrNull( Class clazz, Class... constructorArgs) { - Constructor constructor = null; try { - constructor = clazz.getDeclaredConstructor( constructorArgs ); + final var constructor = clazz.getDeclaredConstructor( constructorArgs ); try { ensureAccessibility( constructor ); } catch ( SecurityException e ) { - constructor = null; + return null; } + return constructor; } catch ( NoSuchMethodException ignore ) { + return null; } - - return constructor; } public static Method getMethod(Class clazz, Method method) { diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/BasicValue.java b/hibernate-core/src/main/java/org/hibernate/mapping/BasicValue.java index da083ca34b2d..955c836b34c2 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/BasicValue.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/BasicValue.java @@ -638,7 +638,7 @@ private Resolution resolution(BasicJavaType explicitJavaType, JavaType final var autoAppliedTypeDef = context.getTypeDefinitionRegistry().resolveAutoApplied( castType ); if ( autoAppliedTypeDef != null ) { LOG.trace( "BasicValue resolution matched auto-applied type definition" ); - return autoAppliedTypeDef.resolve( getTypeParameters(), null, context, this ); + return autoAppliedTypeDef.resolve( getTypeParameters(), context, this ); } } @@ -874,7 +874,7 @@ public TypeConfiguration getTypeConfiguration() { // see if it is a named TypeDefinition final var typeDefinition = context.getTypeDefinitionRegistry().resolve( name ); if ( typeDefinition != null ) { - final Resolution resolution = typeDefinition.resolve( + final var resolution = typeDefinition.resolve( localTypeParams, getMutabilityPlan( explicitMutabilityPlanAccess, typeConfiguration ), context, @@ -1099,14 +1099,15 @@ private UserType getConfiguredUserTypeBean(Class> expli return typeInstance; } - private ManagedBean getUserTypeBean(Class explicitCustomType, Properties properties) { + private ManagedBean getUserTypeBean(Class explicitCustomType, Properties properties) { final var producer = getBuildingContext().getBootstrapContext().getCustomTypeProducer(); + final var managedBeanRegistry = getManagedBeanRegistry(); if ( isNotEmpty( properties ) ) { final String name = explicitCustomType.getName() + COUNTER++; - return getManagedBeanRegistry().getBean( name, explicitCustomType, producer ); + return managedBeanRegistry.getBean( name, explicitCustomType, producer ); } else { - return getManagedBeanRegistry().getBean( explicitCustomType, producer ); + return managedBeanRegistry.getBean( explicitCustomType, producer ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/resource/beans/internal/FallbackBeanInstanceProducer.java b/hibernate-core/src/main/java/org/hibernate/resource/beans/internal/FallbackBeanInstanceProducer.java index 379d32ea0b2e..eb38270ac75f 100644 --- a/hibernate-core/src/main/java/org/hibernate/resource/beans/internal/FallbackBeanInstanceProducer.java +++ b/hibernate-core/src/main/java/org/hibernate/resource/beans/internal/FallbackBeanInstanceProducer.java @@ -4,7 +4,6 @@ */ package org.hibernate.resource.beans.internal; -import java.lang.reflect.Constructor; import org.hibernate.InstantiationException; import org.hibernate.resource.beans.spi.BeanInstanceProducer; @@ -36,7 +35,7 @@ private FallbackBeanInstanceProducer() { public B produceBeanInstance(Class beanType) { LOG.tracef( "Creating ManagedBean [%s] using direct instantiation", beanType.getName() ); try { - final Constructor constructor = beanType.getDeclaredConstructor(); + final var constructor = beanType.getDeclaredConstructor(); constructor.setAccessible( true ); return constructor.newInstance(); } diff --git a/hibernate-core/src/main/java/org/hibernate/resource/beans/internal/ManagedBeanRegistryImpl.java b/hibernate-core/src/main/java/org/hibernate/resource/beans/internal/ManagedBeanRegistryImpl.java index 6a83ce28dfdb..d2a2001b5f8b 100644 --- a/hibernate-core/src/main/java/org/hibernate/resource/beans/internal/ManagedBeanRegistryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/resource/beans/internal/ManagedBeanRegistryImpl.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.Map; +import org.hibernate.AssertionFailure; import org.hibernate.resource.beans.container.spi.BeanContainer; import org.hibernate.resource.beans.container.spi.FallbackContainedBean; import org.hibernate.resource.beans.spi.BeanInstanceProducer; @@ -50,36 +51,43 @@ public ManagedBean getBean(Class beanClass) { @Override public ManagedBean getBean(Class beanClass, BeanInstanceProducer fallbackBeanInstanceProducer) { - final ManagedBean existing = registrations.get( beanClass.getName() ); + final String beanClassName = beanClass.getName(); + final var existing = registrations.get( beanClassName ); if ( existing != null ) { - //noinspection unchecked + if ( !beanClass.equals( existing.getBeanClass() ) ) { + throw new AssertionFailure( "Wrong type of bean: " + beanClassName ); + } + //noinspection unchecked (safe since we just checked) return (ManagedBean) existing; } else { - final ManagedBean bean = createBean( beanClass, fallbackBeanInstanceProducer ); - registrations.put( beanClass.getName(), bean ); + final var bean = createBean( beanClass, fallbackBeanInstanceProducer ); + registrations.put( beanClassName, bean ); return bean; } } @Override - public ManagedBean getBean(String beanName, Class beanContract) { + public ManagedBean getBean(String beanName, Class beanContract) { return getBean( beanName, beanContract, FallbackBeanInstanceProducer.INSTANCE ); } @Override - public ManagedBean getBean( + public ManagedBean getBean( String beanName, Class beanContract, BeanInstanceProducer fallbackBeanInstanceProducer) { final String key = beanContract.getName() + ':' + beanName; - final ManagedBean existing = registrations.get( key ); + final var existing = registrations.get( key ); if ( existing != null ) { - //noinspection unchecked - return (ManagedBean) existing; + if ( !beanContract.isAssignableFrom( existing.getBeanClass() ) ) { + throw new AssertionFailure( "Wrong type of bean: " + key ); + } + //noinspection unchecked (safe since we just checked) + return (ManagedBean) existing; } else { - final ManagedBean bean = createBean( beanName, beanContract, fallbackBeanInstanceProducer ); + final var bean = createBean( beanName, beanContract, fallbackBeanInstanceProducer ); registrations.put( key, bean ); return bean; } @@ -91,7 +99,7 @@ private ManagedBean createBean(Class beanClass, BeanInstanceProducer f : beanContainer.getBean( beanClass, this, fallbackBeanInstanceProducer ); } - private ManagedBean createBean( + private ManagedBean createBean( String beanName, Class beanContract, BeanInstanceProducer fallbackBeanInstanceProducer) { return beanContainer == null ? new FallbackContainedBean<>( beanName, beanContract, fallbackBeanInstanceProducer ) diff --git a/hibernate-core/src/main/java/org/hibernate/resource/beans/spi/ManagedBeanRegistry.java b/hibernate-core/src/main/java/org/hibernate/resource/beans/spi/ManagedBeanRegistry.java index 422f86b62fe3..184dd46718c3 100644 --- a/hibernate-core/src/main/java/org/hibernate/resource/beans/spi/ManagedBeanRegistry.java +++ b/hibernate-core/src/main/java/org/hibernate/resource/beans/spi/ManagedBeanRegistry.java @@ -8,10 +8,10 @@ import org.hibernate.service.Service; /** - * A registry for {@link ManagedBean} instances. Responsible for managing the lifecycle. + * A registry for {@link ManagedBean} instances. Responsible for managing the lifecycle. *

- * Access to the beans and usage of them are only valid between the time - * the registry is initialized and released (however those events are recognized). + * Access to the beans and usage of them are only valid between the time the registry is + * initialized and released (however those events are recognized). * * @author Steve Ebersole */ @@ -24,24 +24,24 @@ public interface ManagedBeanRegistry extends Service { /** * Get a bean reference by name and contract. */ - ManagedBean getBean(String beanName, Class beanContract); + ManagedBean getBean(String beanName, Class beanContract); /** * Get a bean reference by class with an explicit fallback bean instance producer. */ - ManagedBean getBean(Class beanContract, BeanInstanceProducer fallbackBeanInstanceProducer); + ManagedBean getBean(Class beanClass, BeanInstanceProducer fallbackBeanInstanceProducer); /** * Get a bean reference by name and contract with an explicit fallback bean instance producer. */ - ManagedBean getBean( + ManagedBean getBean( String beanName, Class beanContract, BeanInstanceProducer fallbackBeanInstanceProducer); /** - * Get a reference to the underlying BeanContainer. May return {@code null} - * indicating that no back-end container has been configured + * Get a reference to the underlying {@link BeanContainer}. + * May return {@code null}, indicating that no back-end container has been configured */ BeanContainer getBeanContainer(); }