Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@
import org.hibernate.InstantiationException;
import org.hibernate.Internal;
import org.hibernate.engine.config.spi.ConfigurationService;
import org.hibernate.internal.util.ReflectHelper;
import org.hibernate.resource.beans.spi.BeanInstanceProducer;
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;

/**
* {@link BeanInstanceProducer} implementation for building beans related to custom types.
*
Expand All @@ -32,8 +33,8 @@ public TypeBeanInstanceProducer(ConfigurationService configurationService, Servi

@Override
public <B> B produceBeanInstance(Class<B> beanType) {
final Constructor<B> bootstrapContextAwareConstructor =
ReflectHelper.getConstructorOrNull( beanType, TypeBootstrapContext.class );
final Constructor<? extends B> bootstrapContextAwareConstructor =
getConstructorOrNull( beanType, TypeBootstrapContext.class );
if ( bootstrapContextAwareConstructor != null ) {
try {
return bootstrapContextAwareConstructor.newInstance( this );
Expand All @@ -43,7 +44,7 @@ public <B> B produceBeanInstance(Class<B> beanType) {
}
}
else {
final Constructor<B> constructor = ReflectHelper.getConstructorOrNull( beanType );
final Constructor<? extends B> constructor = getConstructorOrNull( beanType );
if ( constructor != null ) {
try {
return constructor.newInstance();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -476,11 +476,11 @@ private static Generator instantiateGenerator(
* @param beanContainer an optional {@code BeanContainer}
* @param generatorClass a class which implements {@code Generator}
*/
private static Generator instantiateGeneratorAsBean(
private static <T extends Generator> Generator instantiateGeneratorAsBean(
Annotation annotation,
BeanContainer beanContainer,
GeneratorCreationContext creationContext,
Class<? extends Generator> generatorClass,
Class<T> generatorClass,
MemberDetails memberDetails,
Class<? extends Annotation> annotationType) {
return Helper.getBean(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ public ConnectionProvider initiateService(
}
else if ( explicitSetting instanceof Class<?> providerClass ) {
LOG.instantiatingExplicitConnectionProvider( providerClass.getName() );
return instantiateExplicitConnectionProvider( providerClass, beanContainer );
return instantiateExplicitConnectionProvider( connectionProviderClass( providerClass ), beanContainer );
}
else {
final String providerName = nullIfBlank( explicitSetting.toString() );
Expand All @@ -118,10 +118,21 @@ else if ( explicitSetting instanceof Class<?> providerClass ) {
return instantiateConnectionProvider( configurationValues, strategySelector, beanContainer );
}

private static Class<? extends ConnectionProvider> connectionProviderClass(Class<?> providerClass) {
if ( !ConnectionProvider.class.isAssignableFrom( providerClass ) ) {
throw new ConnectionProviderConfigurationException( "Class '" + providerClass.getName()
+ "' does not implement 'ConnectionProvider'" );
}
@SuppressWarnings("unchecked")
final Class<? extends ConnectionProvider> connectionProviderClass =
(Class<? extends ConnectionProvider>) providerClass;
return connectionProviderClass;
}

private ConnectionProvider instantiateNamedConnectionProvider(
String providerName, StrategySelector strategySelector, BeanContainer beanContainer) {
LOG.instantiatingExplicitConnectionProvider( providerName );
final Class<?> providerClass =
final Class<? extends ConnectionProvider> providerClass =
strategySelector.selectStrategyImplementor( ConnectionProvider.class, providerName );
try {
return instantiateExplicitConnectionProvider( providerClass, beanContainer );
Expand Down Expand Up @@ -192,7 +203,8 @@ private Class<? extends ConnectionProvider> getSingleRegisteredProvider(Strategy
: null;
}

private ConnectionProvider instantiateExplicitConnectionProvider(Class<?> providerClass, BeanContainer beanContainer) {
private <T extends ConnectionProvider> T instantiateExplicitConnectionProvider(
Class<T> providerClass, BeanContainer beanContainer) {
try {
if ( beanContainer != null ) {
return Helper.getBean(
Expand All @@ -202,7 +214,7 @@ private ConnectionProvider instantiateExplicitConnectionProvider(Class<?> provid
true,
() -> {
try {
return (ConnectionProvider) providerClass.getConstructor().newInstance();
return providerClass.getConstructor().newInstance();
}
catch (Exception e) {
throw new HibernateException( "Could not instantiate connection provider [" + providerClass.getName() + "]", e );
Expand All @@ -211,7 +223,7 @@ private ConnectionProvider instantiateExplicitConnectionProvider(Class<?> provid
);
}
else {
return (ConnectionProvider) providerClass.getConstructor().newInstance();
return providerClass.getConstructor().newInstance();
}
}
catch (Exception e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,101 +4,39 @@
*/
package org.hibernate.resource.beans.container.internal;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Locale;

import org.hibernate.HibernateException;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import jakarta.enterprise.inject.spi.BeanManager;
import org.hibernate.AssertionFailure;
import org.hibernate.engine.config.spi.ConfigurationService;
import org.hibernate.engine.config.spi.StandardConverters;
import org.hibernate.internal.util.ReflectHelper;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.resource.beans.container.spi.BeanContainer;
import org.hibernate.resource.beans.spi.ManagedBeanRegistryInitiator;
import org.hibernate.resource.beans.container.spi.ExtendedBeanManager;
import org.hibernate.service.ServiceRegistry;

import static org.hibernate.cfg.ManagedBeanSettings.DELAY_CDI_ACCESS;

/**
* Helper class for helping deal with the reflection calls relating to CDI
* in terms of building CDI-based {@link BeanContainer}
* instance
*
* We need to avoid statically linking CDI classed into the ClassLoader which
* would lead to errors if CDI is not available on the classpath.
* Helper class for building a CDI-based {@link BeanContainer}.
*
* @author Steve Ebersole
*/
public class CdiBeanContainerBuilder {
private static final String CONTAINER_FQN_IMMEDIATE = "org.hibernate.resource.beans.container.internal.CdiBeanContainerImmediateAccessImpl";
private static final String CONTAINER_FQN_DELAYED = "org.hibernate.resource.beans.container.internal.CdiBeanContainerDelayedAccessImpl";
private static final String CONTAINER_FQN_EXTENDED = "org.hibernate.resource.beans.container.internal.CdiBeanContainerExtendedAccessImpl";

private static final String BEAN_MANAGER_EXTENSION_FQN = "org.hibernate.resource.beans.container.spi.ExtendedBeanManager";

public static BeanContainer fromBeanManagerReference(
Object beanManagerRef,
ServiceRegistry serviceRegistry) {
final ClassLoaderService classLoaderService = serviceRegistry.requireService( ClassLoaderService.class );
final Class<?> beanManagerClass = ManagedBeanRegistryInitiator.cdiBeanManagerClass( classLoaderService );
final Class<?> extendedBeanManagerClass = getHibernateClass( BEAN_MANAGER_EXTENSION_FQN );

final Class<? extends BeanContainer> containerClass;
final Class<?> ctorArgType;

if ( extendedBeanManagerClass.isInstance( beanManagerRef ) ) {
containerClass = getHibernateClass( CONTAINER_FQN_EXTENDED );
ctorArgType = extendedBeanManagerClass;
public static BeanContainer fromBeanManagerReference(Object beanManager, ServiceRegistry serviceRegistry) {
if ( beanManager instanceof ExtendedBeanManager extendedBeanManager ) {
return new CdiBeanContainerExtendedAccessImpl( extendedBeanManager );
}
else {
ctorArgType = beanManagerClass;

final ConfigurationService cfgService = serviceRegistry.requireService( ConfigurationService.class );
final boolean delayAccessToCdi = cfgService.getSetting( AvailableSettings.DELAY_CDI_ACCESS, StandardConverters.BOOLEAN, false );
if ( delayAccessToCdi ) {
containerClass = getHibernateClass( CONTAINER_FQN_DELAYED );
}
else {
containerClass = getHibernateClass( CONTAINER_FQN_IMMEDIATE );
}
}

try {
final Constructor<? extends BeanContainer> ctor = containerClass.getDeclaredConstructor( ctorArgType );
try {
ReflectHelper.ensureAccessibility( ctor );
return ctor.newInstance( ctorArgType.cast( beanManagerRef ) );
}
catch (InvocationTargetException e) {
throw new HibernateException( "Problem building " + containerClass.getName(), e.getCause() );
}
catch (Exception e) {
throw new HibernateException( "Problem building " + containerClass.getName(), e );
}
else if ( beanManager instanceof BeanManager cdiBeanManager ) {
return delayCdiAccess( serviceRegistry )
? new CdiBeanContainerDelayedAccessImpl( cdiBeanManager )
: new CdiBeanContainerImmediateAccessImpl( cdiBeanManager );
}
catch (NoSuchMethodException e) {
throw new HibernateException(
String.format(
Locale.ENGLISH,
"Could not locate proper %s constructor",
containerClass.getName()
),
e
);
else {
throw new AssertionFailure( "Unsupported bean manager: " + beanManager );
}
}

@SuppressWarnings("unchecked")
private static <T> Class<T> getHibernateClass(String fqn) {
// we use this Class's ClassLoader...
try {
return (Class<T>) Class.forName(
fqn,
true,
CdiBeanContainerBuilder.class.getClassLoader()
);
}
catch (ClassNotFoundException e) {
throw new HibernateException( "Unable to locate Hibernate class by name via reflection : " + fqn, e );
}
private static boolean delayCdiAccess(ServiceRegistry serviceRegistry) {
return serviceRegistry.requireService( ConfigurationService.class )
.getSetting( DELAY_CDI_ACCESS, StandardConverters.BOOLEAN, false );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,10 @@
/**
* @author Steve Ebersole
*/
@SuppressWarnings("unused")
public class CdiBeanContainerDelayedAccessImpl extends AbstractCdiBeanContainer {
private final BeanManager beanManager;

private CdiBeanContainerDelayedAccessImpl(BeanManager beanManager) {
CdiBeanContainerDelayedAccessImpl(BeanManager beanManager) {
this.beanManager = beanManager;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
package org.hibernate.resource.beans.container.internal;

import jakarta.enterprise.inject.spi.BeanManager;

import org.hibernate.Internal;
import org.hibernate.resource.beans.container.spi.AbstractCdiBeanContainer;
import org.hibernate.resource.beans.container.spi.BeanLifecycleStrategy;
Expand All @@ -14,25 +13,22 @@
import org.hibernate.resource.beans.container.spi.ExtendedBeanManager;
import org.hibernate.resource.beans.spi.BeanInstanceProducer;

import org.jboss.logging.Logger;
import static org.hibernate.resource.beans.internal.BeansMessageLogger.BEANS_MSG_LOGGER;

/**
* @author Steve Ebersole
*/
@SuppressWarnings("unused")
public class CdiBeanContainerExtendedAccessImpl
extends AbstractCdiBeanContainer
implements ExtendedBeanManager.LifecycleListener {

// NOTE : we continue to use the deprecated form for now since that is what WildFly needs for the time being still

private static final Logger log = Logger.getLogger( CdiBeanContainerExtendedAccessImpl.class );
// NOTE : we continue to use the deprecated form for now since that is what WildFly needs for the time being

private BeanManager usableBeanManager;

private CdiBeanContainerExtendedAccessImpl(ExtendedBeanManager beanManager) {
CdiBeanContainerExtendedAccessImpl(ExtendedBeanManager beanManager) {
beanManager.registerLifecycleListener( this );
log.debugf( "Extended access requested to CDI BeanManager : %s", beanManager );
BEANS_MSG_LOGGER.extendedAccessToBeanManager();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,22 @@
package org.hibernate.resource.beans.container.internal;

import jakarta.enterprise.inject.spi.BeanManager;

import org.hibernate.resource.beans.container.spi.AbstractCdiBeanContainer;
import org.hibernate.resource.beans.container.spi.BeanLifecycleStrategy;
import org.hibernate.resource.beans.container.spi.ContainedBeanImplementor;
import org.hibernate.resource.beans.spi.BeanInstanceProducer;

import org.jboss.logging.Logger;
import static org.hibernate.resource.beans.internal.BeansMessageLogger.BEANS_MSG_LOGGER;

/**
* @author Steve Ebersole
*/
@SuppressWarnings("unused")
public class CdiBeanContainerImmediateAccessImpl extends AbstractCdiBeanContainer {
private static final Logger log = Logger.getLogger( CdiBeanContainerImmediateAccessImpl.class );

private final BeanManager beanManager;

private CdiBeanContainerImmediateAccessImpl(BeanManager beanManager) {
log.debugf( "Standard access requested to CDI BeanManager : %s", beanManager );
CdiBeanContainerImmediateAccessImpl(BeanManager beanManager) {
BEANS_MSG_LOGGER.standardAccessToBeanManager();
this.beanManager = beanManager;
}

Expand All @@ -37,7 +34,8 @@ protected <B> ContainedBeanImplementor<B> createBean(
Class<B> beanType,
BeanLifecycleStrategy lifecycleStrategy,
BeanInstanceProducer fallbackProducer) {
final ContainedBeanImplementor<B> bean = lifecycleStrategy.createBean( beanType, fallbackProducer, this );
final ContainedBeanImplementor<B> bean =
lifecycleStrategy.createBean( beanType, fallbackProducer, this );
bean.initialize();
return bean;
}
Expand All @@ -48,12 +46,8 @@ protected <B> ContainedBeanImplementor<B> createBean(
Class<B> beanType,
BeanLifecycleStrategy lifecycleStrategy,
BeanInstanceProducer fallbackProducer) {
final ContainedBeanImplementor<B> bean = lifecycleStrategy.createBean(
name,
beanType,
fallbackProducer,
this
);
final ContainedBeanImplementor<B> bean =
lifecycleStrategy.createBean( name, beanType, fallbackProducer, this );
bean.initialize();
return bean;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ protected Instance<B> resolveContainerInstance() {
return root.select( beanType, new NamedBeanQualifier( beanName ) );
}
catch (Exception e) {
throw new NoSuchBeanException( "Bean class not known to CDI : " + beanType.getName(), e );
throw new NoSuchBeanException( "Bean class not known to CDI: " + beanType.getName(), e );
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,8 @@ public void initialize() {
beanInstance = fallbackProducer.produceBeanInstance( beanType );

try {
if ( this.creationalContext != null ) {
this.creationalContext.release();
if ( creationalContext != null ) {
creationalContext.release();
}
}
catch (Exception ignore) {
Expand Down
Loading
Loading