001: /*
002: * $Id: AbstractMessageBuilder.java 10961 2008-02-22 19:01:02Z dfeist $
003: * --------------------------------------------------------------------------------------
004: * Copyright (c) MuleSource, Inc. All rights reserved. http://www.mulesource.com
005: *
006: * The software in this package is published under the terms of the CPAL v1.0
007: * license, a copy of which has been included with this distribution in the
008: * LICENSE.txt file.
009: */
010:
011: package org.mule.component.builder;
012:
013: import org.mule.DefaultMuleMessage;
014: import org.mule.api.MuleEventContext;
015: import org.mule.api.MuleMessage;
016: import org.mule.api.component.builder.MessageBuilder;
017: import org.mule.api.config.ConfigurationException;
018: import org.mule.api.config.MuleProperties;
019: import org.mule.api.endpoint.OutboundEndpoint;
020: import org.mule.api.lifecycle.Callable;
021: import org.mule.api.routing.OutboundRouter;
022: import org.mule.api.service.Service;
023: import org.mule.api.service.ServiceAware;
024: import org.mule.util.StringMessageUtils;
025:
026: import java.util.ArrayList;
027: import java.util.Iterator;
028: import java.util.List;
029:
030: import org.apache.commons.logging.Log;
031: import org.apache.commons.logging.LogFactory;
032:
033: /**
034: * A service that will invoke all outbound endpoints configured on the service
035: * allow the result of each endpoint invocation to be aggregated to a single message.
036: */
037: public abstract class AbstractMessageBuilder implements ServiceAware,
038: Callable, MessageBuilder {
039:
040: /**
041: * logger used by this class
042: */
043: protected transient Log logger = LogFactory.getLog(getClass());
044:
045: protected Service service;
046:
047: public void setService(Service service)
048: throws ConfigurationException {
049: this .service = service;
050: }
051:
052: public Object onCall(MuleEventContext eventContext)
053: throws Exception {
054:
055: MuleMessage requestMessage = new DefaultMuleMessage(
056: eventContext.transformMessage(), eventContext
057: .getMessage());
058:
059: MuleMessage responseMessage = null;
060: Object builtMessage;
061:
062: if (service.getOutboundRouter().hasEndpoints()) {
063: List endpoints = new ArrayList();
064: for (Iterator iterator = service.getOutboundRouter()
065: .getRouters().iterator(); iterator.hasNext();) {
066: OutboundRouter router = (OutboundRouter) iterator
067: .next();
068: endpoints.addAll(router.getEndpoints());
069: }
070:
071: for (Iterator iterator = endpoints.iterator(); iterator
072: .hasNext();) {
073: OutboundEndpoint endpoint = (OutboundEndpoint) iterator
074: .next();
075: Object request = requestMessage.getPayload();
076:
077: boolean rsync = eventContext
078: .getMessage()
079: .getBooleanProperty(
080: MuleProperties.MULE_REMOTE_SYNC_PROPERTY,
081: endpoint.isRemoteSync());
082: if (!rsync) {
083: logger
084: .info("Endpoint: "
085: + endpoint
086: + " is not remoteSync enabled. Message builder finishing");
087: if (eventContext.isSynchronous()) {
088: responseMessage = eventContext.sendEvent(
089: requestMessage, endpoint);
090: } else {
091: eventContext.dispatchEvent(requestMessage,
092: endpoint);
093: responseMessage = null;
094: }
095: break;
096: } else {
097: responseMessage = eventContext.sendEvent(
098: requestMessage, endpoint);
099: if (logger.isDebugEnabled()) {
100: logger.debug("Response Message Received from: "
101: + endpoint.getEndpointURI());
102: }
103: if (logger.isTraceEnabled()) {
104: try {
105: logger
106: .trace("Message Payload: \n"
107: + StringMessageUtils
108: .truncate(
109: StringMessageUtils
110: .toString(responseMessage
111: .getPayload()),
112: 200, false));
113: } catch (Exception e) {
114: // ignore
115: }
116: }
117: builtMessage = buildMessage(new DefaultMuleMessage(
118: request, requestMessage), responseMessage);
119: responseMessage = new DefaultMuleMessage(
120: builtMessage, responseMessage);
121: requestMessage = new DefaultMuleMessage(
122: responseMessage.getPayload(),
123: responseMessage);
124: }
125: }
126: } else {
127: logger
128: .info("There are currently no endpoints configured on service: "
129: + service.getName());
130: }
131: eventContext.setStopFurtherProcessing(true);
132: return responseMessage;
133: }
134: }
|