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.MessagingException;
15 import org.mule.api.MuleEvent;
16 import org.mule.api.MuleException;
17 import org.mule.api.MuleMessage;
18 import org.mule.api.endpoint.OutboundEndpoint;
19 import org.mule.api.processor.MessageProcessor;
20 import org.mule.api.routing.CouldNotRouteOutboundMessageException;
21 import org.mule.api.routing.RoutePathNotFoundException;
22 import org.mule.api.routing.RoutingException;
23 import org.mule.config.i18n.CoreMessages;
24 import org.mule.routing.CorrelationMode;
25
26 import java.util.ArrayList;
27 import java.util.List;
28
29
30
31
32
33
34
35
36 public abstract class AbstractSequenceRouter extends FilteringOutboundRouter
37 {
38
39 @Override
40 public MuleEvent route(MuleEvent event) throws RoutingException
41 {
42 MuleMessage message = event.getMessage();
43
44 if (routes == null || routes.size() == 0)
45 {
46 throw new RoutePathNotFoundException(CoreMessages.noEndpointsForRouter(), event, null);
47 }
48 if (enableCorrelation != CorrelationMode.NEVER)
49 {
50 boolean correlationSet = message.getCorrelationId() != null;
51 if (correlationSet && (enableCorrelation == CorrelationMode.IF_NOT_SET))
52 {
53 logger.debug("CorrelationId is already set, not setting Correlation group size");
54 }
55 else
56 {
57
58 message.setCorrelationGroupSize(routes.size());
59 }
60 }
61
62 List<MuleEvent> results = new ArrayList<MuleEvent>(routes.size());
63 try
64 {
65 for (int i = 0; i < routes.size(); i++)
66 {
67 MessageProcessor mp = routes.get(i);
68 OutboundEndpoint endpoint = mp instanceof OutboundEndpoint ? (OutboundEndpoint)mp : null;
69 if (endpoint == null || endpoint.getFilter() == null || (endpoint.getFilter() != null && endpoint.getFilter().accept(message)))
70 {
71 if (((DefaultMuleMessage) message).isConsumable())
72 {
73 throw new MessagingException(
74 CoreMessages.cannotCopyStreamPayload(message.getPayload().getClass().getName()),
75 event);
76 }
77
78 MuleMessage clonedMessage = cloneMessage(message);
79 MuleEvent result = sendRequest(event, clonedMessage, mp, true);
80 if (result != null)
81 {
82 results.add(result);
83 }
84
85 if (!continueRoutingMessageAfter(result))
86 {
87 break;
88 }
89 }
90 }
91 }
92 catch (MuleException e)
93 {
94 throw new CouldNotRouteOutboundMessageException(event, routes.get(0), e);
95 }
96 return resultsHandler.aggregateResults(results, event, muleContext);
97 }
98
99
100
101
102
103
104
105
106
107
108
109 protected abstract boolean continueRoutingMessageAfter(MuleEvent response) throws MuleException;
110 }