View Javadoc

1   /*
2    * $Id: AbstractSplitter.java 20320 2010-11-24 15:03:31Z dfeist $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
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   * Splits a message invoking the next message processor one for each split part.
29   * Implementations must implement {@link #splitMessage(MuleEvent)} and determine how
30   * the message is split.
31   *
32   * <p>
33   * <b>EIP Reference:</b> <a href="http://www.eaipatterns.com/Sequencer.html">http://www.eaipatterns.com/Sequencer.html</a>
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                 // take correlation group size from the message properties, set by
110                 // concrete
111                 // message splitter implementations
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 }