| 
4 | 4 |  */  | 
5 | 5 | package org.hibernate.resource.beans.container.internal;  | 
6 | 6 | 
 
  | 
7 |  | -import java.lang.reflect.Constructor;  | 
8 |  | -import java.lang.reflect.InvocationTargetException;  | 
9 |  | -import java.util.Locale;  | 
10 |  | - | 
11 |  | -import org.hibernate.HibernateException;  | 
12 |  | -import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;  | 
 | 7 | +import jakarta.enterprise.inject.spi.BeanManager;  | 
 | 8 | +import org.hibernate.AssertionFailure;  | 
 | 9 | +import org.hibernate.cfg.AvailableSettings;  | 
13 | 10 | import org.hibernate.engine.config.spi.ConfigurationService;  | 
14 | 11 | import org.hibernate.engine.config.spi.StandardConverters;  | 
15 |  | -import org.hibernate.internal.util.ReflectHelper;  | 
16 |  | -import org.hibernate.cfg.AvailableSettings;  | 
17 | 12 | import org.hibernate.resource.beans.container.spi.BeanContainer;  | 
18 |  | -import org.hibernate.resource.beans.spi.ManagedBeanRegistryInitiator;  | 
 | 13 | +import org.hibernate.resource.beans.container.spi.ExtendedBeanManager;  | 
19 | 14 | import org.hibernate.service.ServiceRegistry;  | 
20 | 15 | 
 
  | 
21 | 16 | /**  | 
22 |  | - * Helper class for helping deal with the reflection calls relating to CDI  | 
23 |  | - * in terms of building CDI-based {@link BeanContainer}  | 
24 |  | - * instance  | 
25 |  | - *  | 
26 |  | - * We need to avoid statically linking CDI classed into the ClassLoader which  | 
27 |  | - * would lead to errors if CDI is not available on the classpath.  | 
 | 17 | + * Helper class for building a CDI-based {@link BeanContainer}.  | 
28 | 18 |  *  | 
29 | 19 |  * @author Steve Ebersole  | 
30 | 20 |  */  | 
31 | 21 | public class CdiBeanContainerBuilder {  | 
32 |  | -	private static final String CONTAINER_FQN_IMMEDIATE = "org.hibernate.resource.beans.container.internal.CdiBeanContainerImmediateAccessImpl";  | 
33 |  | -	private static final String CONTAINER_FQN_DELAYED = "org.hibernate.resource.beans.container.internal.CdiBeanContainerDelayedAccessImpl";  | 
34 |  | -	private static final String CONTAINER_FQN_EXTENDED = "org.hibernate.resource.beans.container.internal.CdiBeanContainerExtendedAccessImpl";  | 
35 |  | - | 
36 |  | -	private static final String BEAN_MANAGER_EXTENSION_FQN = "org.hibernate.resource.beans.container.spi.ExtendedBeanManager";  | 
37 |  | - | 
38 |  | -	public static BeanContainer fromBeanManagerReference(  | 
39 |  | -			Object beanManagerRef,  | 
40 |  | -			ServiceRegistry serviceRegistry) {  | 
41 |  | -		final ClassLoaderService classLoaderService = serviceRegistry.requireService( ClassLoaderService.class );  | 
42 |  | -		final Class<?> beanManagerClass = ManagedBeanRegistryInitiator.cdiBeanManagerClass( classLoaderService );  | 
43 |  | -		final Class<?> extendedBeanManagerClass = getHibernateClass( BEAN_MANAGER_EXTENSION_FQN );  | 
44 |  | - | 
45 |  | -		final Class<? extends BeanContainer> containerClass;  | 
46 |  | -		final Class<?> ctorArgType;  | 
47 | 22 | 
 
  | 
48 |  | -		if ( extendedBeanManagerClass.isInstance( beanManagerRef ) ) {  | 
49 |  | -			containerClass = getHibernateClass( CONTAINER_FQN_EXTENDED );  | 
50 |  | -			ctorArgType = extendedBeanManagerClass;  | 
 | 23 | +	public static BeanContainer fromBeanManagerReference(Object beanManager, ServiceRegistry serviceRegistry) {  | 
 | 24 | +		if ( beanManager instanceof ExtendedBeanManager extendedBeanManager ) {  | 
 | 25 | +			return new CdiBeanContainerExtendedAccessImpl( extendedBeanManager );  | 
51 | 26 | 		}  | 
52 |  | -		else {  | 
53 |  | -			ctorArgType = beanManagerClass;  | 
54 |  | - | 
55 |  | -			final ConfigurationService cfgService = serviceRegistry.requireService( ConfigurationService.class );  | 
56 |  | -			final boolean delayAccessToCdi = cfgService.getSetting( AvailableSettings.DELAY_CDI_ACCESS, StandardConverters.BOOLEAN, false );  | 
57 |  | -			if ( delayAccessToCdi ) {  | 
58 |  | -				containerClass = getHibernateClass( CONTAINER_FQN_DELAYED );  | 
59 |  | -			}  | 
60 |  | -			else {  | 
61 |  | -				containerClass = getHibernateClass( CONTAINER_FQN_IMMEDIATE );  | 
62 |  | -			}  | 
63 |  | -		}  | 
64 |  | - | 
65 |  | -		try {  | 
66 |  | -			final Constructor<? extends BeanContainer> ctor = containerClass.getDeclaredConstructor( ctorArgType );  | 
67 |  | -			try {  | 
68 |  | -				ReflectHelper.ensureAccessibility( ctor );  | 
69 |  | -				return ctor.newInstance( ctorArgType.cast( beanManagerRef ) );  | 
70 |  | -			}  | 
71 |  | -			catch (InvocationTargetException e) {  | 
72 |  | -				throw new HibernateException( "Problem building " + containerClass.getName(), e.getCause() );  | 
73 |  | -			}  | 
74 |  | -			catch (Exception e) {  | 
75 |  | -				throw new HibernateException( "Problem building " + containerClass.getName(), e );  | 
76 |  | -			}  | 
 | 27 | +		else if ( beanManager instanceof BeanManager cdiBeanManager ) {  | 
 | 28 | +			return delayCdiAccess( serviceRegistry )  | 
 | 29 | +					? new CdiBeanContainerDelayedAccessImpl( cdiBeanManager )  | 
 | 30 | +					: new CdiBeanContainerImmediateAccessImpl( cdiBeanManager );  | 
77 | 31 | 		}  | 
78 |  | -		catch (NoSuchMethodException e) {  | 
79 |  | -			throw new HibernateException(  | 
80 |  | -					String.format(  | 
81 |  | -							Locale.ENGLISH,  | 
82 |  | -							"Could not locate proper %s constructor",  | 
83 |  | -							containerClass.getName()  | 
84 |  | -					),  | 
85 |  | -					e  | 
86 |  | -			);  | 
 | 32 | +		else {  | 
 | 33 | +			throw new AssertionFailure( "Unsupported bean manager: " + beanManager );  | 
87 | 34 | 		}  | 
88 | 35 | 	}  | 
89 | 36 | 
 
  | 
90 |  | -	@SuppressWarnings("unchecked")  | 
91 |  | -	private static <T> Class<T> getHibernateClass(String fqn) {  | 
92 |  | -		// we use this Class's ClassLoader...  | 
93 |  | -		try {  | 
94 |  | -			return  (Class<T>) Class.forName(  | 
95 |  | -					fqn,  | 
96 |  | -					true,  | 
97 |  | -					CdiBeanContainerBuilder.class.getClassLoader()  | 
98 |  | -			);  | 
99 |  | -		}  | 
100 |  | -		catch (ClassNotFoundException e) {  | 
101 |  | -			throw new HibernateException( "Unable to locate Hibernate class by name via reflection : " + fqn, e );  | 
102 |  | -		}  | 
 | 37 | +	private static boolean delayCdiAccess(ServiceRegistry serviceRegistry) {  | 
 | 38 | +		return serviceRegistry.requireService( ConfigurationService.class )  | 
 | 39 | +				.getSetting( AvailableSettings.DELAY_CDI_ACCESS, StandardConverters.BOOLEAN, false );  | 
103 | 40 | 	}  | 
104 | 41 | }  | 
0 commit comments