Skip to content

Commit 86baf21

Browse files
authored
Merge pull request #203 from yasserzamani/init_test_scopes
add tests for initializable to cover more scopes
2 parents c3b85ae + bba17b6 commit 86baf21

File tree

1 file changed

+127
-2
lines changed

1 file changed

+127
-2
lines changed

core/src/test/java/com/opensymphony/xwork2/inject/ContainerImplTest.java

Lines changed: 127 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import junit.framework.TestCase;
2222

2323
import java.security.Permission;
24+
import java.util.concurrent.Callable;
2425

2526
/**
2627
* ContainerImpl Tester.
@@ -45,7 +46,12 @@ protected void setUp() throws Exception {
4546
cb.factory(Initializable.class, InitializableBean.class, Scope.SINGLETON);
4647
cb.factory(EarlyInitializable.class, "prototypeEarlyInitializable", EarlyInitializableBean.class, Scope.PROTOTYPE);
4748
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);
4853
c = cb.create(false);
54+
c.setScopeStrategy(new TestScopeStrategy());
4955

5056
Class.forName(FieldCheck.class.getName());
5157
Class.forName(ContainerImpl.FieldInjector.class.getName());
@@ -125,8 +131,14 @@ public void testEarlyInitializable() throws Exception {
125131

126132
EarlyInitializableCheck earlyInitializableCheck2 = new EarlyInitializableCheck();
127133
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());
129136
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());
130142
}
131143

132144
public void testInitializable() throws Exception {
@@ -140,8 +152,51 @@ public void testInitializable() throws Exception {
140152

141153
InitializableCheck initializableCheck2 = new InitializableCheck();
142154
c.inject(initializableCheck2);
143-
assertEquals("initialized", ((InitializableBean) initializableCheck2.getInitializable()).getMessage());
155+
assertEquals("singletons should not being initialized twice", "initialized",
156+
((InitializableBean) initializableCheck2.getInitializable()).getMessage());
144157
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());
145200
}
146201

147202
public static class FieldCheck {
@@ -173,6 +228,10 @@ class InitializableCheck {
173228

174229
private Initializable initializable;
175230
private Initializable prototypeInitializable;
231+
private Initializable requestInitializable;
232+
private Initializable sessionInitializable;
233+
private Initializable threadInitializable;
234+
private Initializable wizardInitializable;
176235

177236
@Inject
178237
public void setInitializable(Initializable initializable) {
@@ -184,6 +243,42 @@ public void setPrototypeInitializable(Initializable prototypeInitializable) {
184243
this.prototypeInitializable = prototypeInitializable;
185244
}
186245

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+
187282
public Initializable getInitializable() {
188283
return initializable;
189284
}
@@ -226,4 +321,34 @@ public void checkPermission(Permission perm) {
226321
}
227322
}
228323
}
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+
}
229354
}

0 commit comments

Comments
 (0)