Skip to content

Commit a324556

Browse files
committed
HHH-19188 Unify ContainedBeanImplementor implementations
1 parent e45e1cf commit a324556

File tree

1 file changed

+108
-112
lines changed

1 file changed

+108
-112
lines changed

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

Lines changed: 108 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,10 @@
99
import jakarta.enterprise.inject.spi.Bean;
1010
import jakarta.enterprise.inject.spi.BeanManager;
1111
import jakarta.enterprise.inject.spi.InjectionTarget;
12-
1312
import org.hibernate.resource.beans.container.spi.BeanContainer;
1413
import org.hibernate.resource.beans.container.spi.BeanLifecycleStrategy;
1514
import org.hibernate.resource.beans.container.spi.ContainedBeanImplementor;
1615
import org.hibernate.resource.beans.spi.BeanInstanceProducer;
17-
1816
import org.jboss.logging.Logger;
1917

2018
import java.util.Set;
@@ -48,7 +46,7 @@ public <B> ContainedBeanImplementor<B> createBean(
4846
return new BeanImpl<>(
4947
beanClass,
5048
fallbackProducer,
51-
( (CdiBasedBeanContainer) beanContainer ).getUsableBeanManager()
49+
((CdiBasedBeanContainer) beanContainer).getUsableBeanManager()
5250
);
5351
}
5452

@@ -62,64 +60,21 @@ public <B> ContainedBeanImplementor<B> createBean(
6260
beanName,
6361
beanClass,
6462
fallbackProducer,
65-
( (CdiBasedBeanContainer) beanContainer ).getUsableBeanManager()
63+
((CdiBasedBeanContainer) beanContainer).getUsableBeanManager()
6664
);
6765
}
6866

6967

68+
private static class BeanImpl<B> extends AbstractBean<B> {
7069

71-
private static class BeanImpl<B> implements ContainedBeanImplementor<B> {
72-
private final Class<B> beanType;
73-
74-
private final BeanInstanceProducer fallbackProducer;
75-
76-
private BeanManager beanManager;
7770
private InjectionTarget<B> injectionTarget;
78-
private CreationalContext<B> creationalContext;
79-
80-
private B beanInstance;
8171

8272
public BeanImpl(Class<B> beanType, BeanInstanceProducer fallbackProducer, BeanManager beanManager) {
83-
this.beanType = beanType;
84-
this.fallbackProducer = fallbackProducer;
85-
this.beanManager = beanManager;
86-
}
87-
88-
@Override
89-
public Class<B> getBeanClass() {
90-
return beanType;
73+
super( beanType, fallbackProducer, beanManager );
9174
}
9275

9376
@Override
94-
public B getBeanInstance() {
95-
if ( beanInstance == null ) {
96-
initialize();
97-
}
98-
99-
return beanInstance;
100-
}
101-
102-
@Override
103-
public void initialize() {
104-
if ( beanInstance != null ) {
105-
return;
106-
}
107-
108-
if ( beanManager == null ) {
109-
try {
110-
beanInstance = fallbackProducer.produceBeanInstance( beanType );
111-
return;
112-
}
113-
catch (Exception e) {
114-
// the CDI BeanManager is not know to be ready for use and the
115-
// fallback-producer was unable to create the bean...
116-
throw new IllegalStateException(
117-
"CDI BeanManager is not known to be ready for use and the fallback-producer was unable to create the bean",
118-
new NotYetReadyException( e )
119-
);
120-
}
121-
}
122-
77+
protected B beanInstance() {
12378
final AnnotatedType<B> annotatedType;
12479
try {
12580
annotatedType = beanManager.createAnnotatedType( beanType );
@@ -128,106 +83,149 @@ public void initialize() {
12883
throw new IllegalStateException( new NotYetReadyException( e ) );
12984
}
13085

131-
try {
132-
injectionTarget = beanManager.getInjectionTargetFactory( annotatedType ).createInjectionTarget( null );
133-
creationalContext = beanManager.createCreationalContext( null );
86+
injectionTarget = beanManager.getInjectionTargetFactory( annotatedType ).createInjectionTarget( null );
13487

135-
beanInstance = injectionTarget.produce( creationalContext );
136-
injectionTarget.inject( beanInstance, creationalContext );
88+
B beanInstance = injectionTarget.produce( creationalContext );
89+
injectionTarget.inject( beanInstance, creationalContext );
13790

138-
injectionTarget.postConstruct( beanInstance );
139-
}
140-
catch (NotYetReadyException e) {
141-
throw e;
142-
}
143-
catch (Exception e) {
144-
log.debugf( "Error resolving CDI bean [%s] - using fallback", beanType.getName() );
145-
beanInstance = fallbackProducer.produceBeanInstance( beanType );
91+
injectionTarget.postConstruct( beanInstance );
14692

147-
try {
148-
if ( creationalContext != null ) {
149-
creationalContext.release();
150-
}
151-
}
152-
catch (Exception ignore) {
153-
}
93+
beanManager = null;
15494

155-
creationalContext = null;
156-
injectionTarget = null;
157-
}
95+
return beanInstance;
96+
}
15897

159-
beanManager = null;
98+
@Override
99+
protected B beanInstanceFallback() {
100+
injectionTarget = null;
101+
return fallbackProducer.produceBeanInstance( beanType );
160102
}
161103

162104
@Override
163-
public void release() {
164-
if ( beanInstance == null ) {
165-
return;
166-
}
105+
protected String getBeanName() {
106+
return beanType.getName();
107+
}
167108

109+
@Override
110+
protected void doRelease() {
168111
try {
169112
if ( injectionTarget == null ) {
170113
// todo : BeanInstanceProducer#release?
171114
return;
172115
}
173116
injectionTarget.preDestroy( beanInstance );
174117
injectionTarget.dispose( beanInstance );
175-
creationalContext.release();
176-
}
177-
catch (Exception ignore) {
178-
179118
}
180119
finally {
181-
beanInstance = null;
182120
creationalContext = null;
183121
injectionTarget = null;
184122
}
185123
}
186124
}
187125

188126

189-
private static class NamedBeanImpl<B> implements ContainedBeanImplementor<B> {
190-
private final Class<B> beanType;
127+
private static class NamedBeanImpl<B> extends AbstractBean<B> {
191128
private final String beanName;
192-
193-
private final BeanInstanceProducer fallbackProducer;
194-
195-
private BeanManager beanManager;
196129
private Bean<B> bean;
197-
private CreationalContext<B> creationalContext;
198-
199-
private B beanInstance;
200130

201131
private NamedBeanImpl(
202132
String beanName,
203133
Class<B> beanType,
204134
BeanInstanceProducer fallbackProducer,
205135
BeanManager beanManager) {
136+
super( beanType, fallbackProducer, beanManager );
206137
this.beanName = beanName;
138+
}
139+
140+
@Override
141+
protected B beanInstance() {
142+
bean = resolveBean();
143+
return bean.create( creationalContext );
144+
}
145+
146+
@SuppressWarnings("unchecked")
147+
private Bean<B> resolveBean() {
148+
final Set<Bean<?>> beans = beanManager.getBeans( beanType, new NamedBeanQualifier( beanName ) );
149+
return (Bean<B>) beanManager.resolve( beans );
150+
}
151+
152+
@Override
153+
protected B beanInstanceFallback() {
154+
bean = null;
155+
return fallbackProducer.produceBeanInstance( beanName, beanType );
156+
}
157+
158+
@Override
159+
protected String getBeanName() {
160+
return beanName;
161+
}
162+
163+
@Override
164+
protected void doRelease() {
165+
try {
166+
if ( bean == null ) {
167+
// todo : BeanInstanceProducer#release?
168+
return;
169+
}
170+
bean.destroy( beanInstance, creationalContext );
171+
}
172+
finally {
173+
bean = null;
174+
}
175+
}
176+
}
177+
178+
private static abstract class AbstractBean<B> implements ContainedBeanImplementor<B> {
179+
protected final Class<B> beanType;
180+
protected final BeanInstanceProducer fallbackProducer;
181+
protected BeanManager beanManager;
182+
protected CreationalContext<B> creationalContext;
183+
184+
protected B beanInstance;
185+
186+
private AbstractBean(
187+
Class<B> beanType,
188+
BeanInstanceProducer fallbackProducer,
189+
BeanManager beanManager) {
207190
this.beanType = beanType;
208191
this.fallbackProducer = fallbackProducer;
209192
this.beanManager = beanManager;
210193
}
211194

212195
@Override
213-
public Class<B> getBeanClass() {
196+
public final Class<B> getBeanClass() {
214197
return beanType;
215198
}
216199

217200
@Override
218-
public B getBeanInstance() {
201+
public final B getBeanInstance() {
219202
if ( beanInstance == null ) {
220203
initialize();
221204
}
222205
return beanInstance;
223206
}
224207

225208
@Override
226-
public void initialize() {
209+
public final void initialize() {
227210
if ( beanInstance != null ) {
228211
return;
229212
}
230213

214+
if ( beanManager == null ) {
215+
try {
216+
beanInstance = fallbackProducer.produceBeanInstance( beanType );
217+
return;
218+
}
219+
catch (Exception e) {
220+
// the CDI BeanManager is not know to be ready for use and the
221+
// fallback-producer was unable to create the bean...
222+
throw new IllegalStateException(
223+
"CDI BeanManager is not known to be ready for use and the fallback-producer was unable to create the bean",
224+
new NotYetReadyException( e )
225+
);
226+
}
227+
}
228+
231229
try {
232230
creationalContext = beanManager.createCreationalContext( null );
233231
}
@@ -236,12 +234,14 @@ public void initialize() {
236234
}
237235

238236
try {
239-
bean = resolveBean();
240-
beanInstance = bean.create( creationalContext );
237+
beanInstance = beanInstance();
238+
}
239+
catch (IllegalStateException | NotYetReadyException e) {
240+
throw e;
241241
}
242242
catch (Exception e) {
243-
log.debugf( "Error resolving CDI bean [%s] - using fallback", beanName );
244-
beanInstance = fallbackProducer.produceBeanInstance( beanName, beanType );
243+
log.debugf( "Error resolving CDI bean [%s] - using fallback", getBeanName() );
244+
beanInstance = beanInstanceFallback();
245245

246246
try {
247247
if ( creationalContext != null ) {
@@ -252,28 +252,24 @@ public void initialize() {
252252
}
253253

254254
creationalContext = null;
255-
bean = null;
256255
}
257256
}
258257

259-
@SuppressWarnings("unchecked")
260-
private Bean<B> resolveBean() {
261-
final Set<Bean<?>> beans = beanManager.getBeans( beanType, new NamedBeanQualifier( beanName ) );
262-
return (Bean<B>) beanManager.resolve( beans );
263-
}
258+
protected abstract B beanInstance();
259+
260+
protected abstract B beanInstanceFallback();
261+
262+
protected abstract String getBeanName();
263+
264264

265265
@Override
266-
public void release() {
266+
public final void release() {
267267
if ( beanInstance == null ) {
268268
return;
269269
}
270270

271271
try {
272-
if ( bean == null ) {
273-
// todo : BeanInstanceProducer#release?
274-
return;
275-
}
276-
bean.destroy( beanInstance, creationalContext );
272+
doRelease();
277273
}
278274
catch (Exception ignore) {
279275
}
@@ -288,10 +284,10 @@ public void release() {
288284

289285
beanInstance = null;
290286
creationalContext = null;
291-
bean = null;
292287
beanManager = null;
293288
}
294289
}
295290

291+
protected abstract void doRelease();
296292
}
297293
}

0 commit comments

Comments
 (0)