1
2
3
4
5
6
7
8
9
10
11 package org.mule.routing.outbound;
12
13 import org.mule.DefaultMuleMessage;
14 import org.mule.api.MuleEvent;
15 import org.mule.api.MuleException;
16 import org.mule.api.MuleMessage;
17 import org.mule.api.processor.MessageProcessor;
18 import org.mule.api.routing.CouldNotRouteOutboundMessageException;
19 import org.mule.api.routing.RoutingException;
20 import org.mule.routing.CorrelationMode;
21
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.List;
25 import java.util.Map;
26
27
28
29
30
31
32
33 public abstract class AbstractMessageSplitter extends FilteringOutboundRouter
34 {
35 @Override
36 public MuleEvent route(MuleEvent event) throws RoutingException
37 {
38 MuleMessage message = event.getMessage();
39
40 String correlationId = event.getFlowConstruct().getMessageInfoMapping().getCorrelationId(message);
41
42 List<MuleEvent> results = new ArrayList<MuleEvent>();
43 int correlationSequence = 1;
44 SplitMessage splitMessage = getMessageParts(message, getRoutes());
45
46
47
48 Map<String, Object> props = new HashMap<String, Object>();
49 for (String propertyKey : message.getOutboundPropertyNames())
50 {
51 Object value = message.getOutboundProperty(propertyKey);
52 if (value != null)
53 {
54 props.put(propertyKey, value);
55 }
56 }
57
58 for (int i = 0; i < splitMessage.size(); i++)
59 {
60 SplitMessage.MessagePart part = splitMessage.getPart(i);
61
62 MuleMessage sendMessage;
63 if (part.getPart() instanceof MuleMessage)
64 {
65 sendMessage = (MuleMessage) part.getPart();
66 }
67 else
68 {
69 sendMessage = new DefaultMuleMessage(part.getPart(), props, muleContext);
70 }
71 sendMessage.propagateRootId(message);
72 try
73 {
74 if (enableCorrelation != CorrelationMode.NEVER)
75 {
76 boolean correlationSet = message.getCorrelationId() != null;
77 if (!correlationSet && (enableCorrelation == CorrelationMode.IF_NOT_SET))
78 {
79 sendMessage.setCorrelationId(correlationId);
80 }
81
82
83
84 sendMessage.setCorrelationGroupSize(splitMessage.size());
85 sendMessage.setCorrelationSequence(correlationSequence++);
86 }
87
88 if (part.getEndpoint().getExchangePattern().hasResponse())
89 {
90 results.add(sendRequest(event, sendMessage, part.getEndpoint(), true));
91 }
92 else
93 {
94 sendRequest(event, sendMessage, part.getEndpoint(), false);
95 }
96 }
97 catch (MuleException e)
98 {
99 throw new CouldNotRouteOutboundMessageException(event, part.getEndpoint(), e);
100 }
101 }
102
103 return resultsHandler.aggregateResults(results, event, muleContext);
104 }
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123 protected abstract SplitMessage getMessageParts(MuleMessage message, List <MessageProcessor> endpoints);
124 }