99import jakarta .enterprise .inject .spi .Bean ;
1010import jakarta .enterprise .inject .spi .BeanManager ;
1111import jakarta .enterprise .inject .spi .InjectionTarget ;
12-
1312import org .hibernate .resource .beans .container .spi .BeanContainer ;
1413import org .hibernate .resource .beans .container .spi .BeanLifecycleStrategy ;
1514import org .hibernate .resource .beans .container .spi .ContainedBeanImplementor ;
1615import org .hibernate .resource .beans .spi .BeanInstanceProducer ;
17-
1816import org .jboss .logging .Logger ;
1917
2018import 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