|
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