View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
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              // Can't start again
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              // Can't stop again
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              //init dispose
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             //start stop
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 }