1
2
3
4
5
6
7
8
9
10
11 package org.mule;
12
13 import org.mule.api.MuleMessage;
14 import org.mule.api.transformer.TransformerException;
15 import org.mule.tck.AbstractMuleTestCase;
16 import org.mule.transformer.simple.ObjectToByteArray;
17 import org.mule.transformer.types.DataTypeFactory;
18 import org.mule.transformer.types.SimpleDataType;
19 import org.mule.util.StringDataSource;
20 import org.mule.util.store.DeserializationPostInitialisable;
21
22 import java.io.ByteArrayInputStream;
23 import java.io.InputStream;
24
25 import javax.activation.DataHandler;
26
27 import edu.emory.mathcs.backport.java.util.Arrays;
28
29 import org.apache.commons.lang.SerializationUtils;
30
31 public class DefaultMuleMessageSerializationTestCase extends AbstractMuleTestCase
32 {
33 private static final String INNER_TEST_MESSAGE = "TestTestTestHello";
34
35 public void testSerializablePayload() throws Exception
36 {
37 MuleMessage message = new DefaultMuleMessage(TEST_MESSAGE, muleContext);
38 message.setOutboundProperty("foo", "bar");
39
40 MuleMessage deserializedMessage = serializationRoundtrip(message);
41
42 assertEquals(TEST_MESSAGE, deserializedMessage.getPayload());
43 assertEquals("bar", deserializedMessage.getOutboundProperty("foo"));
44 }
45
46 public void testNonSerializablePayload() throws Exception
47 {
48
49
50 muleContext.getRegistry().registerTransformer(new NonSerializableToByteArray());
51
52 MuleMessage message = new DefaultMuleMessage(new NonSerializable(), muleContext);
53 message.setOutboundProperty("foo", "bar");
54
55 MuleMessage deserializedMessage = serializationRoundtrip(message);
56
57 assertTrue(deserializedMessage.getPayload() instanceof byte[]);
58 assertEquals(INNER_TEST_MESSAGE, deserializedMessage.getPayloadAsString());
59 }
60
61 public void testStreamPayloadSerialization() throws Exception
62 {
63 InputStream stream = new ByteArrayInputStream(TEST_MESSAGE.getBytes());
64 MuleMessage message = new DefaultMuleMessage(stream, muleContext);
65 message.setOutboundProperty("foo", "bar");
66
67 MuleMessage deserializedMessage = serializationRoundtrip(message);
68
69 assertEquals(byte[].class, deserializedMessage.getPayload().getClass());
70 byte[] payload = (byte[]) deserializedMessage.getPayload();
71 assertTrue(Arrays.equals(TEST_MESSAGE.getBytes(), payload));
72 }
73
74
75 public void _testAttachments() throws Exception
76 {
77 String attachmentName = "the-attachment";
78
79 MuleMessage message = new DefaultMuleMessage(TEST_MESSAGE, muleContext);
80 DataHandler dataHandler = new DataHandler(new StringDataSource("attachment content"));
81 message.addAttachment(attachmentName, dataHandler);
82
83 MuleMessage deserializedMessage = serializationRoundtrip(message);
84
85 assertEquals(1, deserializedMessage.getAttachmentNames().size());
86 assertTrue(deserializedMessage.getAttachmentNames().contains(attachmentName));
87 }
88
89 private MuleMessage serializationRoundtrip(MuleMessage message) throws Exception
90 {
91 byte[] serialized = SerializationUtils.serialize(message);
92 MuleMessage deserializedMessage = (MuleMessage) SerializationUtils.deserialize(serialized);
93 DeserializationPostInitialisable.Implementation.init(deserializedMessage, muleContext);
94 return deserializedMessage;
95 }
96
97 static class NonSerializable
98 {
99 private String content = INNER_TEST_MESSAGE;
100
101 String getContent()
102 {
103 return content;
104 }
105 }
106
107 static class NonSerializableToByteArray extends ObjectToByteArray
108 {
109 public NonSerializableToByteArray()
110 {
111 super();
112 registerSourceType(new SimpleDataType<NonSerializable>(NonSerializable.class));
113 setReturnDataType(DataTypeFactory.BYTE_ARRAY);
114 }
115
116 @Override
117 public Object doTransform(Object src, String encoding) throws TransformerException
118 {
119 String content = ((NonSerializable) src).getContent();
120 return content.getBytes();
121 }
122 }
123 }