1
2
3
4
5
6
7
8
9
10
11 package org.mule.routing;
12
13 import org.mule.DefaultMuleEvent;
14 import org.mule.DefaultMuleMessage;
15 import org.mule.api.MuleContext;
16 import org.mule.api.MuleEvent;
17 import org.mule.api.MuleMessage;
18 import org.mule.routing.correlation.CollectionCorrelatorCallback;
19 import org.mule.routing.correlation.CorrelationSequenceComparator;
20 import org.mule.routing.correlation.EventCorrelatorCallback;
21 import org.mule.util.SerializationUtils;
22
23 import java.util.Arrays;
24 import java.util.Comparator;
25
26 import org.apache.commons.io.IOUtils;
27 import org.apache.commons.io.output.ByteArrayOutputStream;
28 import org.apache.commons.lang.SerializationException;
29
30 public class MessageChunkAggregator extends AbstractAggregator
31 {
32 public static final int DEFAULT_BUFFER_SIZE = 4096;
33
34 protected Comparator eventComparator;
35
36 public MessageChunkAggregator()
37 {
38 super();
39 eventComparator = new CorrelationSequenceComparator();
40 }
41
42 @Override
43 protected EventCorrelatorCallback getCorrelatorCallback(MuleContext muleContext)
44 {
45 return new CollectionCorrelatorCallback(muleContext)
46 {
47
48
49
50
51
52
53
54
55
56
57
58 @Override
59 public MuleEvent aggregateEvents(EventGroup events) throws AggregationException
60 {
61 MuleEvent[] collectedEvents = events.toArray();
62 MuleEvent firstEvent = collectedEvents[0];
63 Arrays.sort(collectedEvents, eventComparator);
64 ByteArrayOutputStream baos = new ByteArrayOutputStream(DEFAULT_BUFFER_SIZE);
65
66 try
67 {
68 for (MuleEvent event : collectedEvents)
69 {
70 baos.write(event.getMessageAsBytes());
71 }
72
73 MuleMessage message;
74
75
76
77 try
78 {
79
80 final Object deserialized = SerializationUtils.deserialize(baos.toByteArray(), muleContext.getExecutionClassLoader());
81 message = new DefaultMuleMessage(deserialized, firstEvent.getMessage(), muleContext);
82
83 }
84 catch (SerializationException e)
85 {
86 message = new DefaultMuleMessage(baos.toByteArray(), firstEvent.getMessage(), muleContext);
87 }
88
89 message.setCorrelationGroupSize(-1);
90 message.setCorrelationSequence(-1);
91
92 return new DefaultMuleEvent(message, firstEvent);
93 }
94 catch (Exception e)
95 {
96 throw new AggregationException(events,MessageChunkAggregator.this, e);
97 }
98 finally
99 {
100 IOUtils.closeQuietly(baos);
101 }
102 }
103 };
104 }
105
106 }