View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule;
8   
9   import org.mule.api.MuleMessage;
10  import org.mule.api.transformer.TransformerException;
11  import org.mule.tck.junit4.AbstractMuleContextTestCase;
12  import org.mule.transformer.simple.ObjectToByteArray;
13  import org.mule.transformer.types.DataTypeFactory;
14  import org.mule.transformer.types.SimpleDataType;
15  import org.mule.util.StringDataSource;
16  import org.mule.util.store.DeserializationPostInitialisable;
17  
18  import java.io.ByteArrayInputStream;
19  import java.io.InputStream;
20  
21  import javax.activation.DataHandler;
22  
23  import edu.emory.mathcs.backport.java.util.Arrays;
24  import org.apache.commons.lang.SerializationUtils;
25  import org.junit.Ignore;
26  import org.junit.Test;
27  
28  import static org.junit.Assert.assertEquals;
29  import static org.junit.Assert.assertTrue;
30  
31  public class DefaultMuleMessageSerializationTestCase extends AbstractMuleContextTestCase
32  {
33      private static final String INNER_TEST_MESSAGE = "TestTestTestHello";
34      
35      @Test
36      public void testSerializablePayload() throws Exception
37      {
38          MuleMessage message = new DefaultMuleMessage(TEST_MESSAGE, muleContext);
39          message.setOutboundProperty("foo", "bar");
40          
41          MuleMessage deserializedMessage = serializationRoundtrip(message);
42          
43          assertEquals(TEST_MESSAGE, deserializedMessage.getPayload());
44          assertEquals("bar", deserializedMessage.getOutboundProperty("foo"));
45      }
46      
47      @Test
48      public void testNonSerializablePayload() throws Exception
49      {
50          // add a transformer to the registry that can convert a NonSerializable to byte[]. This
51          // will be used during Serialization
52          muleContext.getRegistry().registerTransformer(new NonSerializableToByteArray());
53          
54          MuleMessage message = new DefaultMuleMessage(new NonSerializable(), muleContext);
55          message.setOutboundProperty("foo", "bar");
56          
57          MuleMessage deserializedMessage = serializationRoundtrip(message);
58  
59          assertTrue(deserializedMessage.getPayload() instanceof byte[]);
60          assertEquals(INNER_TEST_MESSAGE, deserializedMessage.getPayloadAsString());
61      }
62      
63      @Test
64      public void testStreamPayloadSerialization() throws Exception
65      {
66          InputStream stream = new ByteArrayInputStream(TEST_MESSAGE.getBytes());
67          MuleMessage message = new DefaultMuleMessage(stream, muleContext);
68          message.setOutboundProperty("foo", "bar");
69          
70          MuleMessage deserializedMessage = serializationRoundtrip(message);
71          
72          assertEquals(byte[].class, deserializedMessage.getPayload().getClass());
73          byte[] payload = (byte[]) deserializedMessage.getPayload();
74          assertTrue(Arrays.equals(TEST_MESSAGE.getBytes(), payload));
75      }
76  
77      @Test
78      @Ignore("see MULE-2964")
79      public void testAttachments() throws Exception
80      {
81          String attachmentName = "the-attachment";
82          
83          MuleMessage message = new DefaultMuleMessage(TEST_MESSAGE, muleContext);
84          DataHandler dataHandler = new DataHandler(new StringDataSource("attachment content"));
85          message.addAttachment(attachmentName, dataHandler);
86          
87          MuleMessage deserializedMessage = serializationRoundtrip(message);
88          
89          assertEquals(1, deserializedMessage.getAttachmentNames().size());
90          assertTrue(deserializedMessage.getAttachmentNames().contains(attachmentName));
91      }
92  
93      private MuleMessage serializationRoundtrip(MuleMessage message) throws Exception
94      {
95          byte[] serialized = SerializationUtils.serialize(message);
96          MuleMessage deserializedMessage = (MuleMessage) SerializationUtils.deserialize(serialized);
97          DeserializationPostInitialisable.Implementation.init(deserializedMessage, muleContext);
98          return deserializedMessage;
99      }
100 
101     static class NonSerializable
102     {
103         private String content = INNER_TEST_MESSAGE;
104     
105         String getContent()
106         {
107             return content;
108         }
109     }
110     
111     static class NonSerializableToByteArray extends ObjectToByteArray
112     {
113         public NonSerializableToByteArray()
114         {
115             super();
116             registerSourceType(new SimpleDataType<NonSerializable>(NonSerializable.class));
117             setReturnDataType(DataTypeFactory.BYTE_ARRAY);
118         }
119         
120         @Override
121         public Object doTransform(Object src, String encoding) throws TransformerException
122         {
123             String content = ((NonSerializable) src).getContent();
124             return content.getBytes();
125         }
126     }
127 }