1
2
3
4
5
6
7
8
9
10
11 package org.mule.routing;
12
13 import org.mule.DefaultMuleEvent;
14 import org.mule.DefaultMuleMessage;
15 import org.mule.api.MuleContext;
16 import org.mule.api.MuleEvent;
17 import org.mule.api.MuleException;
18 import org.mule.api.MuleMessage;
19 import org.mule.api.context.MuleContextAware;
20 import org.mule.api.routing.MessageInfoMapping;
21 import org.mule.api.routing.RouterResultsHandler;
22 import org.mule.processor.AbstractInterceptingMessageProcessor;
23
24 import java.util.ArrayList;
25 import java.util.List;
26
27
28
29
30
31
32
33
34
35
36 public abstract class AbstractSplitter extends
37 AbstractInterceptingMessageProcessor implements MuleContextAware
38 {
39
40 protected MuleContext muleContext;
41 protected RouterResultsHandler resultsHandler = new DefaultRouterResultsHandler();
42 protected CorrelationMode enableCorrelation = CorrelationMode.IF_NOT_SET;
43 protected MessageInfoMapping messageInfoMapping;
44
45 public MuleEvent process(MuleEvent event) throws MuleException
46 {
47 if (isSplitRequired(event))
48 {
49 List<MuleMessage> parts = splitMessage(event);
50 if (parts.size() > 0)
51 {
52 if (parts.size() <= 1)
53 {
54 logger.warn("Splitter only returned a single result. If this is not expected, please check your split expression");
55 }
56 return resultsHandler.aggregateResults(processParts(parts, event), event, muleContext);
57 }
58 else
59 {
60 logger.warn("Splitter returned no results. If this is not expected, please check your split expression");
61 return null;
62 }
63 }
64 else
65 {
66 return processNext(event);
67 }
68 }
69
70 protected boolean isSplitRequired(MuleEvent event)
71 {
72 return true;
73 }
74
75 protected abstract List<MuleMessage> splitMessage(MuleEvent event) throws MuleException;
76
77 protected List<MuleEvent> processParts(List parts, MuleEvent event) throws MuleException
78 {
79 if (messageInfoMapping == null)
80 {
81 messageInfoMapping = event.getFlowConstruct().getMessageInfoMapping();
82 }
83 String correlationId = messageInfoMapping.getCorrelationId(
84 event.getMessage());
85 List<MuleEvent> resultEvents = new ArrayList<MuleEvent>();
86 int correlationSequence = 1;
87
88 for (Object part : parts)
89 {
90 MuleMessage message;
91 if (part instanceof MuleMessage)
92 {
93 message = (MuleMessage) part;
94 }
95 else
96 {
97 message = new DefaultMuleMessage(part, muleContext);
98 }
99
100 if (enableCorrelation != CorrelationMode.NEVER)
101 {
102 boolean correlationSet = message.getCorrelationId() != null;
103 if ((!correlationSet && (enableCorrelation == CorrelationMode.IF_NOT_SET))
104 || (enableCorrelation == CorrelationMode.ALWAYS))
105 {
106 message.setCorrelationId(correlationId);
107 }
108
109
110
111
112 message.setCorrelationGroupSize(parts.size());
113 message.setCorrelationSequence(correlationSequence++);
114 }
115 resultEvents.add(processNext(new DefaultMuleEvent(message, event)));
116 }
117 return resultEvents;
118 }
119
120 public void setEnableCorrelation(CorrelationMode enableCorrelation)
121 {
122 this.enableCorrelation = enableCorrelation;
123 }
124
125 public void setMuleContext(MuleContext context)
126 {
127 this.muleContext = context;
128 }
129
130 public void setMessageInfoMapping(MessageInfoMapping messageInfoMapping)
131 {
132 this.messageInfoMapping = messageInfoMapping;
133 }
134
135 }