Source code: org/mule/umo/impl/MuleEvent.java
1 /*
2 * $Header: /cvsroot/mule/mule/src/java/org/mule/umo/impl/MuleEvent.java,v 1.10 2003/10/20 21:44:38 rossmason Exp $
3 * $Revision: 1.10 $
4 * $Date: 2003/10/20 21:44:38 $
5 * ------------------------------------------------------------------------------------------------------
6 *
7 * Copyright (c) Cubis Limited. All rights reserved.
8 * http://www.cubis.co.uk
9 *
10 * The software in this package is published under the terms of the BSD
11 * style license a copy of which has been included with this distribution in
12 * the LICENSE.txt file.
13 *
14 */
15 package org.mule.umo.impl;
16
17 import java.io.IOException;
18 import java.util.EventObject;
19 import java.util.HashMap;
20 import java.util.Iterator;
21
22 import org.apache.commons.lang.builder.ToStringBuilder;
23 import org.apache.commons.logging.Log;
24 import org.apache.commons.logging.LogFactory;
25 import org.mule.MuleException;
26 import org.mule.umo.UMOEvent;
27 import org.mule.umo.UMOProviderDescriptor;
28 import org.mule.umo.provider.UMOConnector;
29 import org.mule.umo.provider.UMOMessageAdapter;
30 import org.mule.umo.transformer.TransformerException;
31 import org.mule.umo.transformer.UMOTransformer;
32 import org.mule.util.UUID;
33 import org.mule.util.Utility;
34
35 /**
36 * <p><code>MuleEvent</code> represents any data event occuring in the Mule environment. All data
37 * sent or received within the mule environment will be passed between components as an UMOEvent.
38 * </p>
39 * <p>The UMOEvent holds some data and provides helper methods for obtaining the data in a format that the receiving
40 * Mule UMO understands. The event can also maintain any number of properties that can be set and retrieved by Mule UMO
41 * components.</p>
42 *
43 * @author <a href="mailto:ross.mason@cubis.co.uk">Ross Mason</a>
44 * @version $Revision: 1.10 $
45 */
46
47 public class MuleEvent extends EventObject implements UMOEvent
48 {
49 /** The logger for this class */
50 private static final transient Log log = LogFactory.getLog(MuleEvent.class);
51
52 /** The provider associated with the event */
53 private transient UMOProviderDescriptor provider = null;
54
55 /** the Universally Unique ID for the event */
56 private UUID id = null;
57
58 /** The previous event to this event */
59 private transient UMOEvent previous = null;
60
61 /** The message adapter used to read the message payload of the event */
62 private transient UMOMessageAdapter adapter = null;
63
64 /**
65 * Contructor.
66 * @param message the event message
67 * @param provider the provider to associate with the event
68 * @param previousEvent the previous event if any
69 * @throws MuleException If a Message Adapter for the supplied message cannot be created
70 * @see UMOMessageAdapter
71 */
72 public MuleEvent(Object message, UMOProviderDescriptor provider, UMOEvent previousEvent) throws MuleException
73 {
74 super(message);
75 this.provider = provider;
76 previous = previousEvent;
77
78 id = new UUID();
79 UMOConnector connector = provider.getConnector();
80
81 try
82 {
83 adapter = connector.getMessageAdapter(message);
84 //Transfer previous event properties
85 if (previous != null)
86 {
87 Object key = null;
88 for (Iterator i = previous.getPropertyNames(); i.hasNext();)
89 {
90 key = i.next();
91 if (adapter.getProperty(key) != null)
92 {
93 if (log.isDebugEnabled())
94 log.debug("Adding property to message: " + key);
95 adapter.setProperty(key, previous.getProperty(key.toString()));
96 }
97 else
98 {
99 if (log.isDebugEnabled())
100 log.debug("Message already has property: " + key);
101 }
102 }
103
104 }
105 }
106 catch (Exception e)
107 {
108 throw new MuleException("Failed to create Adapter for message: " + e.getMessage(), e);
109 }
110 }
111
112 /* (non-Javadoc)
113 * @see org.mule.umo.UMOEvent#getMessage()
114 */
115 public Object getMessage()
116 {
117 return adapter.getMessage();
118 }
119
120 /* (non-Javadoc)
121 * @see org.mule.umo.UMOEvent#getMessageAsBytes()
122 */
123 public byte[] getMessageAsBytes() throws MuleException
124 {
125 try
126 {
127 return adapter.getMessageAsBytes();
128 }
129 catch (Exception e)
130 {
131 throw new MuleException(
132 "Failed while retrieving the current message. Message is of type "
133 + adapter.getMessage().getClass().getName(),
134 e);
135 }
136 }
137
138 /* (non-Javadoc)
139 * @see org.mule.umo.UMOEvent#getTransformedMessage()
140 */
141 public Object getTransformedMessage() throws TransformerException
142 {
143 UMOTransformer tran = provider.getTransformer();
144 Object transMessage = null;
145 if (tran != null)
146 {
147 if(tran.getReturnClass().isAssignableFrom(adapter.getMessage().getClass())) {
148 return adapter.getMessage();
149 } else {
150 transMessage = tran.sessionTransform(adapter.getMessage());
151 }
152 }
153 else
154 {
155 transMessage = adapter.getMessage();
156 }
157 return transMessage;
158 }
159
160 /**
161 * When a transform is performed on an event payload is is done within a transformer session.
162 * this method allows the rollback of a transformation
163 * @return the message as it was before the transform
164 * @throws TransformerException if there is no session in progress of the transformation cannot be rolled back
165 */
166 public Object rollbackTransform() throws TransformerException
167 {
168 UMOTransformer tran = provider.getTransformer();
169 Object rollbackMessage = null;
170 if (tran != null)
171 {
172 rollbackMessage = tran.rollbackSession();
173 }
174 else
175 {
176 rollbackMessage = adapter.getMessage();
177 }
178 return rollbackMessage;
179
180 }
181
182 /* (non-Javadoc)
183 * @see org.mule.umo.UMOEvent#getTransformedMessageAsBytes()
184 */
185 public byte[] getTransformedMessageAsBytes() throws TransformerException
186 {
187 try
188 {
189 Object msg = provider.doTransformation(adapter.getMessage());
190 return Utility.objectToByteArray(msg);
191 }
192 catch (IOException e)
193 {
194 throw new TransformerException("Failed to convert transformed message to byte[]: " + e, e);
195 }
196 }
197
198 /* (non-Javadoc)
199 * @see org.mule.umo.UMOEvent#getMessageAsString()
200 */
201 public String getMessageAsString() throws MuleException
202 {
203 try
204 {
205 return adapter.getMessageAsString();
206
207 }
208 catch (Exception e)
209 {
210 throw new MuleException(
211 "Failed while retrieving the current message. Message is of type "
212 + adapter.getMessage().getClass().getName(),
213 e);
214 }
215 }
216
217 /* (non-Javadoc)
218 * @see org.mule.umo.UMOEvent#getId()
219 */
220 public UUID getId()
221 {
222 return id;
223 }
224
225 /* (non-Javadoc)
226 * @see org.mule.umo.UMOEvent#getPreviousEvent()
227 */
228 public UMOEvent getPreviousEvent()
229 {
230 return previous;
231 }
232
233 /* (non-Javadoc)
234 * @see org.mule.umo.UMOEvent#getProperty(java.lang.String)
235 */
236 public Object getProperty(String name)
237 {
238 return adapter.getProperty(name);
239 }
240
241 /* (non-Javadoc)
242 * @see org.mule.umo.UMOEvent#getProperty(java.lang.String, java.lang.Object)
243 */
244 public Object getProperty(String name, Object defaultValue)
245 {
246 Object obj = null;
247 obj = adapter.getProperty(name);
248
249 if (obj == null)
250 obj = defaultValue;
251 return obj;
252 }
253
254 /* (non-Javadoc)
255 * @see org.mule.umo.UMOEvent#setProperty(java.lang.String, java.lang.Object)
256 */
257 public void setProperty(String name, Object value)
258 {
259 adapter.setProperty(name, value);
260 }
261
262 /* (non-Javadoc)
263 * @see org.mule.umo.UMOEvent#getPropertyNames()
264 */
265 public Iterator getPropertyNames()
266 {
267 return adapter.getPropertyNames();
268 }
269
270 /* (non-Javadoc)
271 * @see org.mule.umo.UMOEvent#getProperties()
272 */
273 public HashMap getProperties()
274 {
275 HashMap clone = new HashMap();
276 Object key;
277 for (Iterator i = adapter.getPropertyNames(); i.hasNext();)
278 {
279 key = i.next();
280 clone.put(key, adapter.getProperty(key));
281 }
282 return clone;
283 }
284
285 /* (non-Javadoc)
286 * @see org.mule.umo.UMOEvent#getTimeout()
287 */
288 public long getTimeout()
289 {
290 //@TODO implement timeout
291 return 0;
292 }
293
294 /* (non-Javadoc)
295 * @see org.mule.umo.UMOEvent#getProvider()
296 */
297 public UMOProviderDescriptor getProvider()
298 {
299 return provider;
300 }
301
302 /* (non-Javadoc)
303 * @see java.lang.Object#toString()
304 */
305 public String toString()
306 {
307 return ToStringBuilder.reflectionToString(this);
308 }
309 }