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