1
2
3
4
5
6
7
8
9
10
11 package org.mule.transformer;
12
13 import org.mule.DefaultMuleMessage;
14 import org.mule.api.MuleEvent;
15 import org.mule.api.MuleMessage;
16 import org.mule.api.transformer.DataType;
17 import org.mule.api.transformer.MessageTransformer;
18 import org.mule.api.transformer.TransformerException;
19 import org.mule.api.transformer.TransformerMessagingException;
20 import org.mule.config.i18n.CoreMessages;
21 import org.mule.config.i18n.Message;
22 import org.mule.transformer.types.DataTypeFactory;
23 import org.mule.transport.NullPayload;
24 import org.mule.util.ClassUtils;
25 import org.mule.util.StringMessageUtils;
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 public abstract class AbstractMessageTransformer extends AbstractTransformer implements MessageTransformer
41 {
42
43
44
45
46
47
48 @Override
49 public boolean isSourceDataTypeSupported(DataType<?> dataType, boolean exactMatch)
50 {
51
52
53 return (super.isSourceDataTypeSupported(dataType, exactMatch) || MuleMessage.class.isAssignableFrom(dataType.getType()));
54 }
55
56
57
58
59 @Override
60 public final Object doTransform(Object src, String enc) throws TransformerException
61 {
62 throw new UnsupportedOperationException();
63 }
64
65
66
67
68 @Override
69 public final Object transform(Object src, String enc) throws TransformerException
70 {
71 try
72 {
73 return transform(src, enc, null);
74 }
75 catch (TransformerMessagingException e)
76 {
77
78 Throwable cause = e.getCause();
79 if (cause instanceof TransformerException)
80 {
81 TransformerException te = (TransformerException) cause;
82 if (te.getTransformer() == this)
83 {
84 throw te;
85 }
86 }
87 throw new TransformerException(e.getI18nMessage(), this, e);
88 }
89 }
90
91
92
93
94
95
96
97
98 public Object transform(Object src, MuleEvent event) throws TransformerMessagingException
99 {
100 return transform(src, getEncoding(src), event);
101 }
102
103
104
105
106
107
108
109
110
111 public final Object transform(Object src, String enc, MuleEvent event) throws TransformerMessagingException
112 {
113 DataType<?> sourceType = DataTypeFactory.create(src.getClass());
114 if (!isSourceDataTypeSupported(sourceType))
115 {
116 if (isIgnoreBadInput())
117 {
118 logger.debug("Source type is incompatible with this transformer and property 'ignoreBadInput' is set to true, so the transformer chain will continue.");
119 return src;
120 }
121 else
122 {
123 Message msg = CoreMessages.transformOnObjectUnsupportedTypeOfEndpoint(getName(),
124 src.getClass(), endpoint);
125
126 throw new TransformerMessagingException(msg, event, this);
127 }
128 }
129 if (logger.isDebugEnabled())
130 {
131 logger.debug(String.format("Applying transformer %s (%s)", getName(), getClass().getName()));
132 logger.debug(String.format("Object before transform: %s", StringMessageUtils.toString(src)));
133 }
134
135 MuleMessage message;
136 if (src instanceof MuleMessage)
137 {
138 message = (MuleMessage) src;
139 }
140 else if (muleContext.getConfiguration().isAutoWrapMessageAwareTransform())
141 {
142 message = new DefaultMuleMessage(src, muleContext);
143 }
144 else
145 {
146 if (event == null)
147 {
148 throw new TransformerMessagingException(CoreMessages.noCurrentEventForTransformer(), event, this);
149 }
150 message = event.getMessage();
151 if (!message.getPayload().equals(src))
152 {
153 throw new IllegalStateException("Transform payload does not match current event");
154 }
155 }
156
157 Object result;
158 try
159 {
160 result = transformMessage(message, enc);
161 }
162 catch (TransformerException e)
163 {
164 throw new TransformerMessagingException(e.getI18nMessage(), event, this, e);
165 }
166
167 if (result == null)
168 {
169 result = NullPayload.getInstance();
170 }
171
172 if (logger.isDebugEnabled())
173 {
174 logger.debug(String.format("Object after transform: %s", StringMessageUtils.toString(result)));
175 }
176
177 result = checkReturnClass(result, event);
178 return result;
179 }
180
181
182
183
184
185
186
187
188 protected Object checkReturnClass(Object object, MuleEvent event) throws TransformerMessagingException
189 {
190
191
192 if(object==null || object instanceof NullPayload && isAllowNullReturn())
193 {
194 return object;
195 }
196
197 if (returnType != null)
198 {
199 DataType<?> dt = DataTypeFactory.create(object.getClass());
200 if (!returnType.isCompatibleWith(dt))
201 {
202 throw new TransformerMessagingException(
203 CoreMessages.transformUnexpectedType(dt, returnType),
204 event, this);
205 }
206 }
207
208 if (logger.isDebugEnabled())
209 {
210 logger.debug("The transformed object is of expected type. Type is: " +
211 ClassUtils.getSimpleName(object.getClass()));
212 }
213
214 return object;
215 }
216
217
218
219
220
221
222
223
224 public abstract Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException;
225 }