21
21
import junit .framework .TestCase ;
22
22
23
23
import java .security .Permission ;
24
+ import java .util .concurrent .Callable ;
24
25
25
26
/**
26
27
* ContainerImpl Tester.
@@ -45,7 +46,12 @@ protected void setUp() throws Exception {
45
46
cb .factory (Initializable .class , InitializableBean .class , Scope .SINGLETON );
46
47
cb .factory (EarlyInitializable .class , "prototypeEarlyInitializable" , EarlyInitializableBean .class , Scope .PROTOTYPE );
47
48
cb .factory (Initializable .class , "prototypeInitializable" , InitializableBean .class , Scope .PROTOTYPE );
49
+ cb .factory (Initializable .class , "requestInitializable" , InitializableBean .class , Scope .REQUEST );
50
+ cb .factory (Initializable .class , "sessionInitializable" , InitializableBean .class , Scope .SESSION );
51
+ cb .factory (Initializable .class , "threadInitializable" , InitializableBean .class , Scope .THREAD );
52
+ cb .factory (Initializable .class , "wizardInitializable" , InitializableBean .class , Scope .WIZARD );
48
53
c = cb .create (false );
54
+ c .setScopeStrategy (new TestScopeStrategy ());
49
55
50
56
Class .forName (FieldCheck .class .getName ());
51
57
Class .forName (ContainerImpl .FieldInjector .class .getName ());
@@ -125,8 +131,14 @@ public void testEarlyInitializable() throws Exception {
125
131
126
132
EarlyInitializableCheck earlyInitializableCheck2 = new EarlyInitializableCheck ();
127
133
c .inject (earlyInitializableCheck2 );
128
- assertEquals ("initialized early" , ((EarlyInitializableBean ) earlyInitializableCheck2 .getEarlyInitializable ()).getMessage ());
134
+ assertEquals ("singletons should not being initialized twice" , "initialized early" ,
135
+ ((EarlyInitializableBean ) earlyInitializableCheck2 .getEarlyInitializable ()).getMessage ());
129
136
assertEquals ("initialized early" , ((EarlyInitializableBean ) earlyInitializableCheck2 .getPrototypeEarlyInitializable ()).getMessage ());
137
+
138
+ assertEquals ("singletons should being instantiated once" ,
139
+ earlyInitializableCheck .getEarlyInitializable (), earlyInitializableCheck2 .getEarlyInitializable ());
140
+ assertNotSame ("prototypes should being instantiated for each injection" ,
141
+ earlyInitializableCheck .getPrototypeEarlyInitializable (), earlyInitializableCheck2 .getPrototypeEarlyInitializable ());
130
142
}
131
143
132
144
public void testInitializable () throws Exception {
@@ -140,8 +152,51 @@ public void testInitializable() throws Exception {
140
152
141
153
InitializableCheck initializableCheck2 = new InitializableCheck ();
142
154
c .inject (initializableCheck2 );
143
- assertEquals ("initialized" , ((InitializableBean ) initializableCheck2 .getInitializable ()).getMessage ());
155
+ assertEquals ("singletons should not being initialized twice" , "initialized" ,
156
+ ((InitializableBean ) initializableCheck2 .getInitializable ()).getMessage ());
144
157
assertEquals ("initialized" , ((InitializableBean ) initializableCheck2 .getPrototypeInitializable ()).getMessage ());
158
+ assertEquals ("threads should not being initialized twice" , "initialized" ,
159
+ ((InitializableBean ) initializableCheck2 .getThreadInitializable ()).getMessage ());
160
+
161
+ assertEquals ("singletons should being instantiated once" ,
162
+ initializableCheck .getInitializable (), initializableCheck2 .getInitializable ());
163
+ assertNotSame ("prototypes should being instantiated for each injection" ,
164
+ initializableCheck .getPrototypeInitializable (), initializableCheck2 .getPrototypeInitializable ());
165
+ assertEquals ("threads should being instantiated once for each thread" ,
166
+ initializableCheck .getThreadInitializable (), initializableCheck2 .getThreadInitializable ());
167
+
168
+ final InitializableCheck initializableCheck3 = new InitializableCheck ();
169
+ final TestScopeStrategy testScopeStrategy = new TestScopeStrategy ();
170
+ Thread thread = new Thread (new Runnable () {
171
+ @ Override
172
+ public void run () {
173
+ ContainerBuilder cb2 = new ContainerBuilder ();
174
+ cb2 .factory (EarlyInitializable .class , EarlyInitializableBean .class , Scope .SINGLETON );
175
+ cb2 .factory (Initializable .class , InitializableBean .class , Scope .SINGLETON );
176
+ cb2 .factory (EarlyInitializable .class , "prototypeEarlyInitializable" , EarlyInitializableBean .class , Scope .PROTOTYPE );
177
+ cb2 .factory (Initializable .class , "prototypeInitializable" , InitializableBean .class , Scope .PROTOTYPE );
178
+ cb2 .factory (Initializable .class , "requestInitializable" , InitializableBean .class , Scope .REQUEST );
179
+ cb2 .factory (Initializable .class , "sessionInitializable" , InitializableBean .class , Scope .SESSION );
180
+ cb2 .factory (Initializable .class , "threadInitializable" , InitializableBean .class , Scope .THREAD );
181
+ cb2 .factory (Initializable .class , "wizardInitializable" , InitializableBean .class , Scope .WIZARD );
182
+ Container c2 = cb2 .create (false );
183
+ c2 .setScopeStrategy (testScopeStrategy );
184
+ c2 .inject (initializableCheck3 );
185
+ }
186
+ });
187
+ thread .run ();
188
+ thread .join ();
189
+ assertNotSame ("threads should being instantiated in new threads" ,
190
+ initializableCheck .getThreadInitializable (), initializableCheck3 .getThreadInitializable ());
191
+ assertEquals ("initialized" , ((InitializableBean ) initializableCheck3 .getThreadInitializable ()).getMessage ());
192
+
193
+ assertEquals ("initialized" , ((InitializableBean ) initializableCheck3 .getRequestInitializable ()).getMessage ());
194
+ assertEquals ("initialized" , ((InitializableBean ) initializableCheck3 .getSessionInitializable ()).getMessage ());
195
+ assertEquals ("initialized" , ((InitializableBean ) initializableCheck3 .getWizardInitializable ()).getMessage ());
196
+
197
+ assertEquals (testScopeStrategy .requestInitializable , initializableCheck3 .getRequestInitializable ());
198
+ assertEquals (testScopeStrategy .sessionInitializable , initializableCheck3 .getSessionInitializable ());
199
+ assertEquals (testScopeStrategy .wizardInitializable , initializableCheck3 .getWizardInitializable ());
145
200
}
146
201
147
202
public static class FieldCheck {
@@ -173,6 +228,10 @@ class InitializableCheck {
173
228
174
229
private Initializable initializable ;
175
230
private Initializable prototypeInitializable ;
231
+ private Initializable requestInitializable ;
232
+ private Initializable sessionInitializable ;
233
+ private Initializable threadInitializable ;
234
+ private Initializable wizardInitializable ;
176
235
177
236
@ Inject
178
237
public void setInitializable (Initializable initializable ) {
@@ -184,6 +243,42 @@ public void setPrototypeInitializable(Initializable prototypeInitializable) {
184
243
this .prototypeInitializable = prototypeInitializable ;
185
244
}
186
245
246
+ @ Inject ("requestInitializable" )
247
+ public void setRequestInitializable (Initializable requestInitializable ) {
248
+ this .requestInitializable = requestInitializable ;
249
+ }
250
+
251
+ @ Inject ("sessionInitializable" )
252
+ public void setSessionInitializable (Initializable sessionInitializable ) {
253
+ this .sessionInitializable = sessionInitializable ;
254
+ }
255
+
256
+ @ Inject ("threadInitializable" )
257
+ public void setThreadInitializable (Initializable threadInitializable ) {
258
+ this .threadInitializable = threadInitializable ;
259
+ }
260
+
261
+ @ Inject ("wizardInitializable" )
262
+ public void setWizardInitializable (Initializable wizardInitializable ) {
263
+ this .wizardInitializable = wizardInitializable ;
264
+ }
265
+
266
+ public Initializable getRequestInitializable () {
267
+ return requestInitializable ;
268
+ }
269
+
270
+ public Initializable getSessionInitializable () {
271
+ return sessionInitializable ;
272
+ }
273
+
274
+ public Initializable getThreadInitializable () {
275
+ return threadInitializable ;
276
+ }
277
+
278
+ public Initializable getWizardInitializable () {
279
+ return wizardInitializable ;
280
+ }
281
+
187
282
public Initializable getInitializable () {
188
283
return initializable ;
189
284
}
@@ -226,4 +321,34 @@ public void checkPermission(Permission perm) {
226
321
}
227
322
}
228
323
}
324
+
325
+ class TestScopeStrategy implements Scope .Strategy {
326
+ Initializable requestInitializable ;
327
+ Initializable sessionInitializable ;
328
+ Initializable wizardInitializable ;
329
+
330
+ @ Override
331
+ public <T > T findInRequest (Class <T > type , String name , Callable <? extends T > factory ) throws Exception {
332
+ if (requestInitializable == null ) {
333
+ requestInitializable = (Initializable ) factory .call ();
334
+ }
335
+ return (T ) requestInitializable ;
336
+ }
337
+
338
+ @ Override
339
+ public <T > T findInSession (Class <T > type , String name , Callable <? extends T > factory ) throws Exception {
340
+ if (sessionInitializable == null ) {
341
+ sessionInitializable = (Initializable ) factory .call ();
342
+ }
343
+ return (T ) sessionInitializable ;
344
+ }
345
+
346
+ @ Override
347
+ public <T > T findInWizard (Class <T > type , String name , Callable <? extends T > factory ) throws Exception {
348
+ if (wizardInitializable == null ) {
349
+ wizardInitializable = (Initializable ) factory .call ();
350
+ }
351
+ return (T ) wizardInitializable ;
352
+ }
353
+ }
229
354
}
0 commit comments