|
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