View Javadoc

1   /*
2    * $Id: SelectiveConsumer.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.routing.inbound;
12  
13  import org.mule.config.i18n.CoreMessages;
14  import org.mule.impl.MuleMessage;
15  import org.mule.routing.AbstractRouter;
16  import org.mule.umo.MessagingException;
17  import org.mule.umo.UMOEvent;
18  import org.mule.umo.UMOFilter;
19  import org.mule.umo.UMOMessage;
20  import org.mule.umo.routing.RoutingException;
21  import org.mule.umo.routing.UMOInboundRouter;
22  import org.mule.umo.transformer.TransformerException;
23  
24  import org.apache.commons.logging.Log;
25  import org.apache.commons.logging.LogFactory;
26  
27  /**
28   * <code>SelectiveConsumer</code> is an inbound router used to filter out unwanted
29   * events. The filtering is performed by a <code>UMOFilter</code> that can be set
30   * on the router.
31   * 
32   * @see UMOInboundRouter
33   * @see org.mule.umo.routing.UMOInboundRouterCollection
34   * @see org.mule.umo.routing.UMORouterCollection
35   */
36  
37  public class SelectiveConsumer extends AbstractRouter implements UMOInboundRouter
38  {
39      protected final Log logger = LogFactory.getLog(getClass());
40  
41      private volatile UMOFilter filter;
42      private volatile boolean transformFirst = true;
43  
44      public boolean isMatch(UMOEvent event) throws MessagingException
45      {
46          if (logger.isDebugEnabled())
47          {
48              logger.debug("Attempting to route event: " + event.getId());
49          }
50  
51          if (filter == null)
52          {
53              return true;
54          }
55  
56          UMOMessage message = event.getMessage();
57  
58          if (transformFirst)
59          {
60              try
61              {
62                  Object payload = event.getTransformedMessage();
63                  message = new MuleMessage(payload, message);
64              }
65              catch (TransformerException e)
66              {
67                  throw new RoutingException(
68                      CoreMessages.transformFailedBeforeFilter(), event.getMessage(), 
69                      event.getEndpoint(), e);
70              }
71          }
72  
73          boolean result = filter.accept(message);
74  
75          if (logger.isDebugEnabled())
76          {
77              logger.debug("Event " + event.getId() + (result ? " passed filter " : " did not pass filter ")
78                              + filter.getClass().getName());
79          }
80  
81          return result;
82      }
83  
84      public UMOEvent[] process(UMOEvent event) throws MessagingException
85      {
86          if (this.isMatch(event))
87          {
88              return new UMOEvent[]{event};
89          }
90          else
91          {
92              return null;
93          }
94      }
95  
96      public UMOFilter getFilter()
97      {
98          return filter;
99      }
100 
101     public void setFilter(UMOFilter filter)
102     {
103         this.filter = filter;
104     }
105 
106     public boolean isTransformFirst()
107     {
108         return transformFirst;
109     }
110 
111     public void setTransformFirst(boolean transformFirst)
112     {
113         this.transformFirst = transformFirst;
114     }
115 }