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.registry;
8   
9   import org.mule.api.MuleContext;
10  import org.mule.api.context.MuleContextAware;
11  import org.mule.api.lifecycle.Disposable;
12  import org.mule.api.lifecycle.Initialisable;
13  import org.mule.api.lifecycle.Startable;
14  import org.mule.api.lifecycle.Stoppable;
15  import org.mule.api.registry.MuleRegistry;
16  
17  import java.util.ArrayList;
18  import java.util.List;
19  
20  import javax.annotation.PostConstruct;
21  import javax.annotation.PreDestroy;
22  
23  import org.junit.Test;
24  
25  import static org.junit.Assert.assertEquals;
26  import static org.junit.Assert.fail;
27  
28  public class TransientRegistryLifecycleTestCase extends TransientRegistryTestCase
29  {
30      @Test
31      public void testObjectLifecycleWithTransientRegistryDirectly() throws Exception
32      {
33          TransientRegistry reg = new TransientRegistry(muleContext);
34          reg.initialise();
35          reg.fireLifecycle(Startable.PHASE_NAME);
36  
37          InterfaceBasedTracker tracker = new InterfaceBasedTracker();
38          reg.registerObject("test", tracker);
39  
40          reg.dispose();
41          assertEquals("[setMuleContext, initialise, start, stop, dispose]", tracker.getTracker().toString());
42      }
43  
44      @Test
45      public void testObjectBypassLifecycleWithTransientRegistryDirectly() throws Exception
46      {
47          TransientRegistry reg = new TransientRegistry(muleContext);
48          reg.initialise();
49          reg.fireLifecycle(Startable.PHASE_NAME);
50  
51          InterfaceBasedTracker tracker = new InterfaceBasedTracker();
52          reg.registerObject("test", tracker, MuleRegistry.LIFECYCLE_BYPASS_FLAG);
53          reg.dispose();
54          assertEquals("[setMuleContext, stop, dispose]", tracker.getTracker().toString());
55      }
56  
57      @Test
58      public void testObjectBypassInjectorsWithTransientRegistryDirectly() throws Exception
59      {
60          TransientRegistry reg = new TransientRegistry(muleContext);
61          reg.initialise();
62          reg.fireLifecycle(Startable.PHASE_NAME);
63  
64          InterfaceBasedTracker tracker = new InterfaceBasedTracker();
65          reg.registerObject("test", tracker, MuleRegistry.INJECT_PROCESSORS_BYPASS_FLAG);
66          reg.dispose();
67          assertEquals("[initialise, start, stop, dispose]", tracker.getTracker().toString());
68      }
69  
70      @Test
71      public void testObjectBypassLifecycleAndInjectorsWithTransientRegistryDirectly() throws Exception
72      {
73          TransientRegistry reg = new TransientRegistry(muleContext);
74          reg.initialise();
75          reg.fireLifecycle(Startable.PHASE_NAME);
76  
77          InterfaceBasedTracker tracker = new InterfaceBasedTracker();
78          reg.registerObject("test", tracker, MuleRegistry.LIFECYCLE_BYPASS_FLAG + MuleRegistry.INJECT_PROCESSORS_BYPASS_FLAG);
79          reg.dispose();
80          assertEquals("[stop, dispose]", tracker.getTracker().toString());
81      }
82  
83      @Test
84      public void testObjectLifecycleStatesWithTransientRegistryDirectly() throws Exception
85      {
86          TransientRegistry reg = new TransientRegistry(muleContext);
87          InterfaceBasedTracker tracker = new InterfaceBasedTracker();
88          reg.registerObject("test", tracker);
89          assertEquals("[setMuleContext]", tracker.getTracker().toString());
90          reg.initialise();
91          assertEquals("[setMuleContext, initialise]", tracker.getTracker().toString());
92  
93  
94          reg.fireLifecycle(Startable.PHASE_NAME);
95          assertEquals("[setMuleContext, initialise, start]", tracker.getTracker().toString());
96  
97          try
98          {
99              reg.fireLifecycle(Startable.PHASE_NAME);
100             fail("Registry is already started");
101         }
102         catch (Exception e)
103         {
104             //expected
105         }
106 
107         reg.fireLifecycle(Stoppable.PHASE_NAME);
108         assertEquals("[setMuleContext, initialise, start, stop]", tracker.getTracker().toString());
109 
110         try
111         {
112             reg.fireLifecycle(Stoppable.PHASE_NAME);
113             fail("Registry is already stopped");
114         }
115         catch (Exception e)
116         {
117             //expected
118         }
119 
120         reg.dispose();
121         assertEquals("[setMuleContext, initialise, start, stop, dispose]", tracker.getTracker().toString());
122 
123         try
124         {
125             reg.dispose();
126             fail("Registry is already disposed");
127         }
128         catch (Exception e)
129         {
130             //expected
131         }
132     }
133 
134     @Test
135     public void testLifecycleState() throws Exception
136     {
137         TransientRegistry reg = new TransientRegistry(muleContext);
138         reg.fireLifecycle(Initialisable.PHASE_NAME);
139         reg.fireLifecycle(Startable.PHASE_NAME);
140 
141         InterfaceBasedTracker tracker = new InterfaceBasedTracker();
142         reg.registerObject("test", tracker);
143         assertEquals("[setMuleContext, initialise, start]", tracker.getTracker().toString());
144 
145         reg.fireLifecycle(Disposable.PHASE_NAME);
146         assertEquals("[setMuleContext, initialise, start, stop, dispose]", tracker.getTracker().toString());
147     }
148 
149     @Test
150     public void testLifecycleStateOutOfSequenceStartFirstWithTransientRegistryDirectly() throws Exception
151     {
152         TransientRegistry reg = new TransientRegistry(muleContext);
153         try
154         {
155             //fire start directly
156             reg.fireLifecycle(Startable.PHASE_NAME);
157             fail("Cannot start without initialising first");
158         }
159         catch (IllegalStateException e)
160         {
161             //expected
162         }
163 
164         InterfaceBasedTracker tracker = new InterfaceBasedTracker();
165         reg.registerObject("test", tracker);
166 
167         reg.fireLifecycle(Initialisable.PHASE_NAME);
168         reg.fireLifecycle(Startable.PHASE_NAME);
169 
170         //Initialise called implicitly because you cannot start a component without initialising it first
171         assertEquals("[setMuleContext, initialise, start]", tracker.getTracker().toString());
172 
173         reg.fireLifecycle(Disposable.PHASE_NAME);
174         //Stop called implicitly because you cannot dispose component without stopping it first
175         assertEquals("[setMuleContext, initialise, start, stop, dispose]", tracker.getTracker().toString());
176     }
177 
178     @Test
179     public void testLifecycleStateOutOfSequenceStopFirstWithTransientRegistryDirectly() throws Exception
180     {
181         TransientRegistry reg = new TransientRegistry(muleContext);
182         try
183         {
184             //fire stop directly
185             reg.fireLifecycle(Stoppable.PHASE_NAME);
186             fail("Cannot stop without starting first");
187         }
188         catch (IllegalStateException e)
189         {
190             //expected
191         }
192 
193         InterfaceBasedTracker tracker = new InterfaceBasedTracker();
194         reg.registerObject("test", tracker);
195 
196         reg.fireLifecycle(Initialisable.PHASE_NAME);
197         reg.fireLifecycle(Startable.PHASE_NAME);
198         reg.fireLifecycle(Stoppable.PHASE_NAME);
199 
200         //Start is bypassed because the component was added when the registry was stopped, hence no need to start the component
201         //Stop isn't called either because start was not called
202         //Initialised is called because in order for a component to be stopped it needs to be initialised
203         assertEquals("[setMuleContext, initialise, start, stop]", tracker.getTracker().toString());
204 
205         reg.fireLifecycle(Disposable.PHASE_NAME);
206         assertEquals("[setMuleContext, initialise, start, stop, dispose]", tracker.getTracker().toString());
207     }
208 
209     public class InterfaceBasedTracker extends AbstractLifecycleTracker
210     {
211         // no custom methods
212     }
213 
214     public class JSR250ObjectLifecycleTracker implements MuleContextAware
215     {
216         private final List<String> tracker = new ArrayList<String>();
217 
218         public List<String> getTracker() {
219             return tracker;
220         }
221 
222         public void setMuleContext(MuleContext context)
223         {
224             tracker.add("setMuleContext");
225         }
226 
227         @PostConstruct
228         public void init()
229         {
230             tracker.add("initialise");
231         }
232 
233         @PreDestroy
234         public void dispose()
235         {
236             tracker.add("dispose");
237         }
238     }
239 }