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