1
2
3
4
5
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
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 }