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.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   * A router that breaks up the current message onto smaller parts and sends them to
20   * the same destination. The Destination service needs to have a
21   * MessageChunkingAggregator inbound router in order to rebuild the message at the
22   * other end.
23   * <p>
24   * <b>EIP Reference:</b> <a href="http://www.eaipatterns.com/Sequencer.html">http://www.eaipatterns.com/Sequencer.html</a>
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  }