1
2
3
4
5
6
7
8
9
10
11 package org.mule.routing;
12
13 import org.mule.DefaultMuleMessage;
14 import org.mule.api.MuleEvent;
15 import org.mule.api.MuleMessage;
16 import org.mule.api.routing.RoutingException;
17 import org.mule.config.i18n.CoreMessages;
18
19 import java.util.ArrayList;
20 import java.util.List;
21
22
23
24
25
26
27
28
29
30 public class MessageChunkSplitter extends AbstractSplitter
31 {
32
33 protected int messageSize = 0;
34
35 public int getMessageSize()
36 {
37 return messageSize;
38 }
39
40 public void setMessageSize(int messageSize)
41 {
42 this.messageSize = messageSize;
43 }
44
45 @Override
46 protected boolean isSplitRequired(MuleEvent event)
47 {
48 return messageSize != 0;
49 }
50
51 protected List<MuleMessage> splitMessage(MuleEvent event) throws RoutingException
52 {
53 MuleMessage message = event.getMessage();
54 List<MuleMessage> messageParts = new ArrayList<MuleMessage>();
55 byte[] data;
56 try
57 {
58 data = message.getPayloadAsBytes();
59 }
60 catch (Exception e)
61 {
62 throw new RoutingException(CoreMessages.failedToReadPayload(), event, next, e);
63 }
64
65 int parts = data.length / messageSize;
66 if ((parts * messageSize) < data.length)
67 {
68 parts++;
69 }
70 int len = messageSize;
71 int count = 0;
72 int pos = 0;
73 byte[] buffer;
74 for (; count < parts; count++)
75 {
76 if ((pos + len) > data.length)
77 {
78 len = data.length - pos;
79 }
80 buffer = new byte[len];
81 System.arraycopy(data, pos, buffer, 0, buffer.length);
82 pos += len;
83 MuleMessage part = new DefaultMuleMessage(buffer, message, muleContext);
84 part.setCorrelationId(message.getUniqueId());
85 part.setCorrelationGroupSize(parts);
86 part.setCorrelationSequence(count);
87 messageParts.add(part);
88 }
89 return messageParts;
90 }
91
92 }