View Javadoc

1   /*
2    * $Id: AbstractMessageBuilder.java 7963 2007-08-21 08:53:15Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.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.components.builder;
12  
13  import org.mule.config.ConfigurationException;
14  import org.mule.config.MuleProperties;
15  import org.mule.impl.MuleMessage;
16  import org.mule.impl.UMODescriptorAware;
17  import org.mule.umo.UMODescriptor;
18  import org.mule.umo.UMOEventContext;
19  import org.mule.umo.UMOMessage;
20  import org.mule.umo.endpoint.UMOEndpoint;
21  import org.mule.umo.lifecycle.Callable;
22  import org.mule.umo.routing.UMOOutboundRouter;
23  import org.mule.util.StringMessageUtils;
24  
25  import java.util.ArrayList;
26  import java.util.Iterator;
27  import java.util.List;
28  
29  import org.apache.commons.logging.Log;
30  import org.apache.commons.logging.LogFactory;
31  
32  /**
33   * A component that will invoke all outbound endpoints configured on the component
34   * allow the result of each endpoint invocation to be aggregated to a single message.
35   */
36  public abstract class AbstractMessageBuilder implements UMODescriptorAware, Callable, MessageBuilder
37  {
38  
39      /**
40       * logger used by this class
41       */
42      protected transient Log logger = LogFactory.getLog(getClass());
43  
44      protected UMODescriptor descriptor;
45  
46      public void setDescriptor(UMODescriptor descriptor) throws ConfigurationException
47      {
48          this.descriptor = descriptor;
49      }
50  
51      public Object onCall(UMOEventContext eventContext) throws Exception
52      {
53  
54          UMOMessage requestMessage = new MuleMessage(eventContext.getTransformedMessage(),
55              eventContext.getMessage());
56  
57          UMOMessage responseMessage = requestMessage;
58          Object builtMessage;
59  
60          if (descriptor.getOutboundRouter().hasEndpoints())
61          {
62              List endpoints = new ArrayList();
63              for (Iterator iterator = descriptor.getOutboundRouter().getRouters().iterator(); iterator.hasNext();)
64              {
65                  UMOOutboundRouter router = (UMOOutboundRouter) iterator.next();
66                  endpoints.addAll(router.getEndpoints());
67              }
68              for (Iterator iterator = endpoints.iterator(); iterator.hasNext();)
69              {
70                  UMOEndpoint endpoint = (UMOEndpoint) iterator.next();
71                  boolean rsync = eventContext.getMessage().getBooleanProperty(
72                      MuleProperties.MULE_REMOTE_SYNC_PROPERTY, endpoint.isRemoteSync());
73                  if (!rsync)
74                  {
75                      logger.info("Endpoint: " + endpoint
76                                  + " is not remoteSync enabled. Message builder finishing");
77                      if (eventContext.isSynchronous())
78                      {
79                          responseMessage = eventContext.sendEvent(requestMessage, endpoint);
80                      }
81                      else
82                      {
83                          eventContext.dispatchEvent(requestMessage, endpoint);
84                          responseMessage = null;
85                      }
86                      break;
87                  }
88                  else
89                  {
90                      responseMessage = eventContext.sendEvent(requestMessage, endpoint);
91                      if (logger.isDebugEnabled())
92                      {
93                          logger.debug("Response Message Received from: " + endpoint.getEndpointURI());
94                      }
95                      if (logger.isTraceEnabled())
96                      {
97                          try
98                          {
99                              logger.trace("Message Payload: \n"
100                                          + StringMessageUtils.truncate(
101                                              StringMessageUtils.toString(responseMessage.getPayload()), 200,
102                                              false));
103                         }
104                         catch (Exception e)
105                         {
106                             // ignore
107                         }
108                     }
109                     builtMessage = buildMessage(requestMessage, responseMessage);
110                     responseMessage = new MuleMessage(builtMessage, responseMessage);
111                     requestMessage = responseMessage;
112                 }
113             }
114         }
115         else
116         {
117             logger.info("There are currently no endpoints configured on component: " + descriptor.getName());
118         }
119         eventContext.setStopFurtherProcessing(true);
120         return responseMessage;
121     }
122 }