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