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.transformer;
8   
9   import org.mule.api.MuleContext;
10  import org.mule.api.MuleMessage;
11  import org.mule.api.endpoint.ImmutableEndpoint;
12  import org.mule.api.lifecycle.InitialisationException;
13  import org.mule.api.transformer.DataType;
14  import org.mule.api.transformer.Transformer;
15  import org.mule.api.transformer.TransformerException;
16  import org.mule.util.StringUtils;
17  
18  import java.util.Arrays;
19  import java.util.Iterator;
20  import java.util.LinkedList;
21  import java.util.List;
22  
23  /**
24   * A referencable chain of transformers that can be used as a single transformer
25   */
26  public class TransformerChain extends AbstractMessageTransformer
27  {
28      private List<Transformer> transformers;
29  
30      public TransformerChain(List<Transformer> transformers)
31      {
32          super();
33          if (transformers.size() < 1)
34          {
35              throw new IllegalArgumentException("You must set at least one transformer");
36          }
37          this.transformers = new LinkedList<Transformer>(transformers);
38      }
39  
40      public TransformerChain(Transformer... transformers)
41      {
42          this(Arrays.asList(transformers));
43          this.name = generateTransformerName();
44      }
45  
46      public TransformerChain(String name, List<Transformer> transformers)
47      {
48          this(transformers);
49          this.name = name;
50      }
51  
52      public TransformerChain(String name, Transformer... transformers)
53      {
54          this(name, Arrays.asList(transformers));
55      }
56  
57      @Override
58      public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException
59      {
60          MuleMessage result = message;
61          Object temp = message;
62          Transformer lastTransformer = null;
63          for (Iterator iterator = transformers.iterator(); iterator.hasNext();)
64          {
65              lastTransformer = (Transformer) iterator.next();
66              temp = lastTransformer.transform(temp);
67              if (temp instanceof MuleMessage)
68              {
69                  result = (MuleMessage) temp;
70              }
71              else
72              {
73                  result.setPayload(temp);
74              }
75          }
76          if (lastTransformer != null && lastTransformer.getReturnClass().equals(MuleMessage.class))
77          {
78              return result;
79          }
80          else
81          {
82              return result.getPayload();
83          }
84      }
85  
86      @Override
87      public void initialise() throws InitialisationException
88      {
89          for (Transformer transformer : transformers)
90          {
91              transformer.initialise();
92          }
93      }
94  
95      @Override
96      public void setMuleContext(MuleContext muleContext)
97      {
98          super.setMuleContext(muleContext);
99          for (Transformer transformer : transformers)
100         {
101             transformer.setMuleContext(muleContext);
102         }
103     }
104 
105     @Override
106     public void setEndpoint(ImmutableEndpoint endpoint)
107     {
108         super.setEndpoint(endpoint);
109         for (Transformer transformer : transformers)
110         {
111             transformer.setEndpoint(endpoint);
112         }
113     }
114 
115     @Override
116     protected String generateTransformerName()
117     {
118         String name = transformers.get(0).getClass().getSimpleName();
119         int i = name.indexOf("To");
120         DataType dt = transformers.get(transformers.size() -1).getReturnDataType();
121         if (i > 0 && dt != null)
122         {
123             String target = dt.getType().getSimpleName();
124             if (target.equals("byte[]"))
125             {
126                 target = "byteArray";
127             }
128             name = name.substring(0, i + 2) + StringUtils.capitalize(target);
129         }
130         return name;
131     }
132 
133 }