View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.routing;
8   
9   import org.mule.DefaultMessageCollection;
10  import org.mule.DefaultMuleEvent;
11  import org.mule.DefaultMuleMessage;
12  import org.mule.api.MuleContext;
13  import org.mule.api.MuleEvent;
14  import org.mule.api.MuleMessageCollection;
15  import org.mule.api.routing.RouterResultsHandler;
16  import org.mule.util.CollectionUtils;
17  
18  import java.util.List;
19  
20  import org.apache.commons.collections.Predicate;
21  
22  /**
23   * The default results handler for all outbound endpoint. Depending on the number of
24   * messages passed it the returning message will be different. If the 'results' param
25   * is null or empty, null is returned. If the 'results' param contains a single
26   * {@link org.mule.api.MuleMessage}, than that message is returned. If the 'results'
27   * param contains more than one message a {@link org.mule.api.MuleMessageCollection}
28   * instance is returned.
29   * <p/>
30   * Note that right now (as of Mule 2.0.1) this SPI is not pluggable and this
31   * implementation is the default and only implementation.
32   * 
33   * @see org.mule.api.MuleMessageCollection
34   * @see org.mule.api.MuleMessage
35   * @see org.mule.DefaultMessageCollection
36   */
37  public class DefaultRouterResultsHandler implements RouterResultsHandler
38  {
39      @SuppressWarnings(value = {"unchecked"})
40      public MuleEvent aggregateResults(final List<MuleEvent> results,
41                                        final MuleEvent previous,
42                                        MuleContext muleContext)
43      {
44          if (results == null)
45          {
46              return null;
47          }
48          else
49          {
50              List<MuleEvent> nonNullResults = (List<MuleEvent>) CollectionUtils.select(results,
51                  new Predicate()
52                  {
53                      public boolean evaluate(Object object)
54                      {
55                          return object != null && ((MuleEvent) object).getMessage() != null;
56                      }
57                  });
58  
59              if (nonNullResults.size() == 0)
60              {
61                  return null;
62              }
63              else if (nonNullResults.size() == 1)
64              {
65                  return nonNullResults.get(0);
66              }
67              else
68              {
69                  return createMessageCollection(nonNullResults, previous, muleContext);
70              }
71          }
72      }
73  
74      @SuppressWarnings("deprecation")
75      private MuleEvent createMessageCollection(final List<MuleEvent> nonNullResults,
76                                                final MuleEvent previous,
77                                                MuleContext muleContext)
78      {
79          MuleMessageCollection coll = new DefaultMessageCollection(muleContext);
80          for (MuleEvent event : nonNullResults)
81          {
82              coll.addMessage(event.getMessage());
83          }
84          ((DefaultMuleMessage) coll).copyInvocationProperties(previous.getMessage());
85          return new DefaultMuleEvent(coll, previous);
86      }
87  }