View Javadoc

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