View Javadoc

1   /*
2    * $Id: ForwardingConsumer.java 7976 2007-08-21 14:26:13Z 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.routing.inbound;
12  
13  import org.mule.impl.MuleEvent;
14  import org.mule.impl.MuleMessage;
15  import org.mule.umo.MessagingException;
16  import org.mule.umo.UMOEvent;
17  import org.mule.umo.UMOException;
18  import org.mule.umo.UMOMessage;
19  import org.mule.umo.routing.RoutingException;
20  import org.mule.umo.routing.UMOOutboundRouterCollection;
21  
22  /**
23   * <code>ForwardingConsumer</code> is used to forward an incoming event over
24   * another transport without invoking a component. This can be used to implement a
25   * bridge accross defferent transports.
26   */
27  public class ForwardingConsumer extends SelectiveConsumer
28  {
29  
30      public UMOEvent[] process(UMOEvent event) throws MessagingException
31      {
32          if (super.process(event) != null)
33          {
34              UMOOutboundRouterCollection router = event.getComponent().getDescriptor().getOutboundRouter();
35  
36              // Set the stopFurtherProcessing flag to true to inform the
37              // InboundRouterCollection not to route these events to the component
38              event.setStopFurtherProcessing(true);
39  
40              if (router == null)
41              {
42                  logger.debug("Descriptor has no outbound router configured to forward to, continuing with normal processing");
43                  return new UMOEvent[]{event};
44              }
45              else
46              {
47                  try
48                  {
49                      UMOMessage message = new MuleMessage(event.getTransformedMessage(), event.getMessage());
50  
51                      UMOMessage response = router.route(message, event.getSession(), event.isSynchronous());
52                      // TODO What's the correct behaviour for async endpoints?
53                      // maybe let router.route() return a Future for the returned msg?
54                      if (response != null)
55                      {
56                          return new UMOEvent[]{new MuleEvent(response, event)};
57                      }
58                      else
59                      {
60                          return null;
61                      }
62  
63                  }
64                  catch (UMOException e)
65                  {
66                      throw new RoutingException(event.getMessage(), event.getEndpoint(), e);
67                  }
68              }
69          }
70          return null;
71      }
72  }