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.transformers.simple;
8   
9   import static org.junit.Assert.assertEquals;
10  import static org.junit.Assert.assertNotNull;
11  
12  import org.mule.api.lifecycle.Disposable;
13  import org.mule.api.lifecycle.InitialisationException;
14  import org.mule.api.transformer.TransformerException;
15  import org.mule.construct.SimpleFlowConstruct;
16  import org.mule.tck.junit4.FunctionalTestCase;
17  import org.mule.transformer.AbstractTransformer;
18  
19  import java.util.ArrayList;
20  import java.util.List;
21  
22  import edu.emory.mathcs.backport.java.util.Collections;
23  
24  import org.junit.Test;
25  
26  /**
27   * Highlights the issue: MULE-4599 where dispose cannot be called on a transformer
28   * since it is a prototype in Spring, so spring does not manage the object.
29   */
30  public class RegistryTransformerLifecycleTestCase extends FunctionalTestCase
31  {
32      @Override
33      protected String getConfigResources()
34      {
35          return "simple-transformer-config.xml";
36      }
37  
38      @Test
39      public void testLifecycleInSpring() throws Exception
40      {
41          TransformerLifecycleTracker transformer = (TransformerLifecycleTracker) muleContext.getRegistry()
42              .lookupTransformer("lifecycle");
43          assertNotNull(transformer);
44          muleContext.dispose();
45          assertNoLifecycle(transformer);
46      }
47  
48      @Test
49      public void testLifecycleInFlowInSpring() throws Exception
50      {
51          SimpleFlowConstruct flow = (SimpleFlowConstruct) muleContext.getRegistry()
52              .lookupFlowConstruct("flow");
53          TransformerLifecycleTracker transformer = (TransformerLifecycleTracker) flow.getMessageProcessors()
54              .get(0);
55          assertNotNull(transformer);
56  
57          muleContext.dispose();
58          assertLifecycle(transformer);
59      }
60  
61      @Test
62      public void testLifecycleInTransientRegistry() throws Exception
63      {
64          TransformerLifecycleTracker transformer = new TransformerLifecycleTracker();
65          transformer.setProperty("foo");
66          muleContext.getRegistry().registerTransformer(transformer);
67          muleContext.dispose();
68          // MULE-5829 Artifacts excluded from lifecycle in MuleContextLifecyclePhases
69          // gets lifecycle when an object is registered.
70          // assertNoLifecycle(transformer);
71      }
72  
73      @Test
74      public void testLifecycleInFlowTransientRegistry() throws Exception
75      {
76          SimpleFlowConstruct flow = new SimpleFlowConstruct("flow", muleContext);
77          TransformerLifecycleTracker transformer = new TransformerLifecycleTracker();
78          transformer.setProperty("foo");
79          flow.setMessageProcessors(Collections.singletonList(transformer));
80          muleContext.getRegistry().registerFlowConstruct(flow);
81          muleContext.dispose();
82          assertLifecycle(transformer);
83      }
84  
85      private void assertLifecycle(TransformerLifecycleTracker transformer)
86      {
87          assertEquals("[setProperty, initialise, dispose]", transformer.getTracker().toString());
88      }
89  
90      private void assertNoLifecycle(TransformerLifecycleTracker transformer)
91      {
92          assertEquals("[setProperty]", transformer.getTracker().toString());
93      }
94  
95      public static class TransformerLifecycleTracker extends AbstractTransformer implements Disposable
96      {
97          private final List<String> tracker = new ArrayList<String>();
98  
99          private String property;
100 
101         @Override
102         protected Object doTransform(Object src, String encoding) throws TransformerException
103         {
104             tracker.add("doTransform");
105             return null;
106         }
107 
108         public String getProperty()
109         {
110             return property;
111         }
112 
113         public void setProperty(String property)
114         {
115             tracker.add("setProperty");
116         }
117 
118         public List<String> getTracker()
119         {
120             return tracker;
121         }
122 
123         @Override
124         public void initialise() throws InitialisationException
125         {
126             tracker.add("initialise");
127         }
128 
129         @Override
130         public void dispose()
131         {
132             tracker.add("dispose");
133         }
134     }
135 }