1
2
3
4
5
6
7 package org.mule.lifecycle;
8
9 import static org.junit.Assert.assertEquals;
10 import static org.junit.Assert.fail;
11
12 import org.mule.api.MuleException;
13 import org.mule.api.lifecycle.Disposable;
14 import org.mule.api.lifecycle.Initialisable;
15 import org.mule.api.lifecycle.InitialisationException;
16 import org.mule.api.lifecycle.Lifecycle;
17 import org.mule.api.lifecycle.LifecycleCallback;
18 import org.mule.api.lifecycle.LifecycleException;
19 import org.mule.api.lifecycle.LifecycleManager;
20 import org.mule.api.lifecycle.Startable;
21 import org.mule.api.lifecycle.Stoppable;
22 import org.mule.lifecycle.phases.NotInLifecyclePhase;
23
24 import org.junit.Test;
25
26 public class LifecycleTransitionTestCase
27 {
28 @Test
29 public void testTransitions() throws MuleException
30 {
31 ObjectWithLifecycle o = new ObjectWithLifecycle();
32 int transitions = 0;
33 assertEquals(transitions, o.numTransitions());
34
35 o.initialise();
36 transitions++;
37 assertEquals(transitions, o.numTransitions());
38 assertEquals(ObjectWithLifecycle.INIT, o.lastTransition());
39 o.start();
40 transitions++;
41 assertEquals(transitions, o.numTransitions());
42 assertEquals(ObjectWithLifecycle.START, o.lastTransition());
43 try
44 {
45
46 o.start();
47 fail();
48 }
49 catch (Exception ex)
50 {
51 ;
52 }
53 for (int i = 0; i < 5; i++)
54 {
55 o.stop();
56 transitions++;
57 assertEquals(transitions, o.numTransitions());
58 assertEquals(ObjectWithLifecycle.STOP, o.lastTransition());
59 o.start();
60 transitions++;
61 assertEquals(transitions, o.numTransitions());
62 assertEquals(ObjectWithLifecycle.START, o.lastTransition());
63 }
64 o.stop();
65 transitions++;
66 assertEquals(transitions, o.numTransitions());
67 assertEquals(ObjectWithLifecycle.STOP, o.lastTransition());
68 try
69 {
70
71 o.stop();
72 fail();
73 }
74 catch (Exception ex)
75 {
76 ;
77 }
78 o.dispose();
79 transitions++;
80 assertEquals(transitions, o.numTransitions());
81 assertEquals(ObjectWithLifecycle.DISPOSE, o.lastTransition());
82 }
83
84 public static class MyLifecycleManager extends AbstractLifecycleManager
85 {
86
87 public MyLifecycleManager(String id, Object object)
88 {
89 super(id, object);
90 }
91
92 @Override
93 protected void registerTransitions()
94 {
95
96 addDirectTransition(NotInLifecyclePhase.PHASE_NAME, Initialisable.PHASE_NAME);
97 addDirectTransition(NotInLifecyclePhase.PHASE_NAME, Disposable.PHASE_NAME);
98 addDirectTransition(Initialisable.PHASE_NAME, Startable.PHASE_NAME);
99 addDirectTransition(Initialisable.PHASE_NAME, Disposable.PHASE_NAME);
100
101
102 addDirectTransition(Startable.PHASE_NAME, Stoppable.PHASE_NAME);
103 addDirectTransition(Stoppable.PHASE_NAME, Startable.PHASE_NAME);
104 addDirectTransition(Stoppable.PHASE_NAME, Disposable.PHASE_NAME);
105
106
107 registerLifecycleCallback(Initialisable.PHASE_NAME, new LifecycleCallback<ObjectWithLifecycle>()
108 {
109 public void onTransition(String phaseName, ObjectWithLifecycle object)
110 {
111 object.doInit();
112 }
113 });
114 registerLifecycleCallback(Disposable.PHASE_NAME, new LifecycleCallback<ObjectWithLifecycle>()
115 {
116 public void onTransition(String phaseName, ObjectWithLifecycle object)
117 {
118 object.doDispose();
119 }
120 });
121 registerLifecycleCallback(Startable.PHASE_NAME, new LifecycleCallback<ObjectWithLifecycle>()
122 {
123 public void onTransition(String phaseName, ObjectWithLifecycle object)
124 {
125 object.doStart();
126 }
127 });
128 registerLifecycleCallback(Stoppable.PHASE_NAME, new LifecycleCallback<ObjectWithLifecycle>()
129 {
130 public void onTransition(String phaseName, ObjectWithLifecycle object)
131 {
132 object.doStop();
133 }
134 });
135 }
136 }
137
138 public static class ObjectWithLifecycle implements Lifecycle
139 {
140 public static final char INIT = 'i';
141 public static final char DISPOSE = 'd';
142 public static final char START = 'a';
143 public static final char STOP = 'o';
144
145 private LifecycleManager manager = new MyLifecycleManager("this", this);
146 private String transitionHistory = "";
147
148 public void dispose()
149 {
150 try
151 {
152 manager.fireLifecycle(Disposable.PHASE_NAME);
153 }
154 catch (LifecycleException e)
155 {
156 throw new RuntimeException(e);
157 }
158 }
159
160 private void doDispose()
161 {
162 transitionHistory += DISPOSE;
163 }
164
165 public void initialise() throws InitialisationException
166 {
167 try
168 {
169 manager.fireLifecycle(Initialisable.PHASE_NAME);
170 }
171 catch (LifecycleException e)
172 {
173 throw new RuntimeException(e);
174 }
175 }
176
177 private void doInit()
178 {
179 transitionHistory += INIT;
180 }
181
182 public void start() throws MuleException
183 {
184 manager.fireLifecycle(Startable.PHASE_NAME);
185 }
186
187 private void doStart()
188 {
189 transitionHistory += START;
190 }
191
192 public void stop() throws MuleException
193 {
194 manager.fireLifecycle(Stoppable.PHASE_NAME);
195 }
196
197 private void doStop()
198 {
199 transitionHistory += STOP;
200 }
201
202
203 public String getTransitionHistory()
204 {
205 return transitionHistory;
206 }
207
208 public int numTransitions()
209 {
210 return transitionHistory.length();
211 }
212
213 public char lastTransition()
214 {
215 return transitionHistory.length() == 0 ? 0 : transitionHistory.charAt(transitionHistory.length() - 1);
216 }
217
218 }
219 }