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