Skip to content

Commit 9a04065

Browse files
committed
HHH-18982 make BeanManager instead loadable as a Java service
also remove unnecessary use of reflection for creation of the CDI BeanContainer
1 parent 067341a commit 9a04065

File tree

7 files changed

+115
-183
lines changed

7 files changed

+115
-183
lines changed

hibernate-core/src/main/java/org/hibernate/resource/beans/container/internal/CdiBeanContainerBuilder.java

Lines changed: 17 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -4,101 +4,38 @@
44
*/
55
package org.hibernate.resource.beans.container.internal;
66

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;
1310
import org.hibernate.engine.config.spi.ConfigurationService;
1411
import org.hibernate.engine.config.spi.StandardConverters;
15-
import org.hibernate.internal.util.ReflectHelper;
16-
import org.hibernate.cfg.AvailableSettings;
1712
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;
1914
import org.hibernate.service.ServiceRegistry;
2015

2116
/**
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}.
2818
*
2919
* @author Steve Ebersole
3020
*/
3121
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;
4722

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 );
5126
}
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 );
7731
}
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 );
8734
}
8835
}
8936

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 );
10340
}
10441
}

hibernate-core/src/main/java/org/hibernate/resource/beans/container/internal/CdiBeanContainerDelayedAccessImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,10 @@
1414
/**
1515
* @author Steve Ebersole
1616
*/
17-
@SuppressWarnings("unused")
1817
public class CdiBeanContainerDelayedAccessImpl extends AbstractCdiBeanContainer {
1918
private final BeanManager beanManager;
2019

21-
private CdiBeanContainerDelayedAccessImpl(BeanManager beanManager) {
20+
CdiBeanContainerDelayedAccessImpl(BeanManager beanManager) {
2221
this.beanManager = beanManager;
2322
}
2423

hibernate-core/src/main/java/org/hibernate/resource/beans/container/internal/CdiBeanContainerExtendedAccessImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
/**
2020
* @author Steve Ebersole
2121
*/
22-
@SuppressWarnings("unused")
2322
public class CdiBeanContainerExtendedAccessImpl
2423
extends AbstractCdiBeanContainer
2524
implements ExtendedBeanManager.LifecycleListener {
@@ -30,7 +29,7 @@ public class CdiBeanContainerExtendedAccessImpl
3029

3130
private BeanManager usableBeanManager;
3231

33-
private CdiBeanContainerExtendedAccessImpl(ExtendedBeanManager beanManager) {
32+
CdiBeanContainerExtendedAccessImpl(ExtendedBeanManager beanManager) {
3433
beanManager.registerLifecycleListener( this );
3534
log.debugf( "Extended access requested to CDI BeanManager : %s", beanManager );
3635
}

hibernate-core/src/main/java/org/hibernate/resource/beans/container/internal/CdiBeanContainerImmediateAccessImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@
1616
/**
1717
* @author Steve Ebersole
1818
*/
19-
@SuppressWarnings("unused")
2019
public class CdiBeanContainerImmediateAccessImpl extends AbstractCdiBeanContainer {
2120
private static final Logger log = Logger.getLogger( CdiBeanContainerImmediateAccessImpl.class );
2221

2322
private final BeanManager beanManager;
2423

25-
private CdiBeanContainerImmediateAccessImpl(BeanManager beanManager) {
24+
CdiBeanContainerImmediateAccessImpl(BeanManager beanManager) {
2625
log.debugf( "Standard access requested to CDI BeanManager : %s", beanManager );
2726
this.beanManager = beanManager;
2827
}

hibernate-core/src/main/java/org/hibernate/resource/beans/container/spi/BeanContainer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package org.hibernate.resource.beans.container.spi;
66

77
import org.hibernate.resource.beans.spi.BeanInstanceProducer;
8+
import org.hibernate.service.JavaServiceLoadable;
89
import org.hibernate.service.spi.Stoppable;
910

1011
/**
@@ -19,6 +20,7 @@
1920
*
2021
* @author Steve Ebersole
2122
*/
23+
@JavaServiceLoadable
2224
public interface BeanContainer extends Stoppable {
2325
interface LifecycleOptions {
2426
boolean canUseCachedReferences();

hibernate-core/src/main/java/org/hibernate/resource/beans/internal/ManagedBeanRegistryImpl.java

Lines changed: 32 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -56,30 +56,11 @@ public <T> ManagedBean<T> getBean(Class<T> beanClass, BeanInstanceProducer fallb
5656
//noinspection unchecked
5757
return (ManagedBean<T>) existing;
5858
}
59-
60-
final ManagedBean<T> bean;
61-
if ( beanContainer == null ) {
62-
bean = new FallbackContainedBean<>( beanClass, fallbackBeanInstanceProducer );
63-
}
6459
else {
65-
final ContainedBean<T> containedBean = beanContainer.getBean(
66-
beanClass,
67-
this,
68-
fallbackBeanInstanceProducer
69-
);
70-
71-
if ( containedBean instanceof ManagedBean ) {
72-
//noinspection unchecked
73-
bean = (ManagedBean<T>) containedBean;
74-
}
75-
else {
76-
bean = new ContainedBeanManagedBeanAdapter<>( beanClass, containedBean );
77-
}
60+
final ManagedBean<T> bean = createBean( beanClass, fallbackBeanInstanceProducer );
61+
registrations.put( beanClass.getName(), bean );
62+
return bean;
7863
}
79-
80-
registrations.put( beanClass.getName(), bean );
81-
82-
return bean;
8364
}
8465

8566
@Override
@@ -93,37 +74,51 @@ public <T> ManagedBean<T> getBean(
9374
Class<T> beanContract,
9475
BeanInstanceProducer fallbackBeanInstanceProducer) {
9576
final String key = beanContract.getName() + ':' + beanName;
96-
9777
final ManagedBean<?> existing = registrations.get( key );
9878
if ( existing != null ) {
9979
//noinspection unchecked
10080
return (ManagedBean<T>) existing;
10181
}
82+
else {
83+
final ManagedBean<T> bean = createBean( beanName, beanContract, fallbackBeanInstanceProducer );
84+
registrations.put( key, bean );
85+
return bean;
86+
}
87+
}
10288

103-
final ManagedBean<T> bean;
89+
private <T> ManagedBean<T> createBean(Class<T> beanClass, BeanInstanceProducer fallbackBeanInstanceProducer) {
10490
if ( beanContainer == null ) {
105-
bean = new FallbackContainedBean<>( beanName, beanContract, fallbackBeanInstanceProducer );
91+
return new FallbackContainedBean<>( beanClass, fallbackBeanInstanceProducer );
10692
}
10793
else {
108-
final ContainedBean<T> containedBean = beanContainer.getBean(
109-
beanName,
110-
beanContract,
111-
this,
112-
fallbackBeanInstanceProducer
113-
);
114-
94+
final ContainedBean<T> containedBean =
95+
beanContainer.getBean( beanClass, this, fallbackBeanInstanceProducer );
11596
if ( containedBean instanceof ManagedBean ) {
11697
//noinspection unchecked
117-
bean = (ManagedBean<T>) containedBean;
98+
return (ManagedBean<T>) containedBean;
11899
}
119100
else {
120-
bean = new ContainedBeanManagedBeanAdapter<>( beanContract, containedBean );
101+
return new ContainedBeanManagedBeanAdapter<>( beanClass, containedBean );
121102
}
122103
}
104+
}
123105

124-
registrations.put( key, bean );
125-
126-
return bean;
106+
private <T> ManagedBean<T> createBean(
107+
String beanName, Class<T> beanContract, BeanInstanceProducer fallbackBeanInstanceProducer) {
108+
if ( beanContainer == null ) {
109+
return new FallbackContainedBean<>( beanName, beanContract, fallbackBeanInstanceProducer );
110+
}
111+
else {
112+
final ContainedBean<T> containedBean =
113+
beanContainer.getBean( beanName, beanContract, this, fallbackBeanInstanceProducer );
114+
if ( containedBean instanceof ManagedBean ) {
115+
//noinspection unchecked
116+
return (ManagedBean<T>) containedBean;
117+
}
118+
else {
119+
return new ContainedBeanManagedBeanAdapter<>( beanContract, containedBean );
120+
}
121+
}
127122
}
128123

129124
@Override

0 commit comments

Comments
 (0)