View Javadoc

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