1
2
3
4
5
6
7
8
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
35
36
37 public abstract class AbstractMessageBuilder implements ServiceAware, Callable, MessageBuilder
38 {
39
40
41
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
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 }