View Javadoc

1   /*
2    * $Id: ExpressionErrorFilterFactory.java 19026 2010-08-16 07:30:47Z dirk.olmes $
3    * -------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.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  package org.mule.module.ibeans.spi;
11  
12  import org.mule.api.MuleContext;
13  import org.mule.routing.filters.ExpressionFilter;
14  
15  import java.lang.annotation.Annotation;
16  import java.lang.reflect.Field;
17  
18  import org.ibeans.annotation.filter.AtomErrorFilter;
19  import org.ibeans.annotation.filter.ExpressionErrorFilter;
20  import org.ibeans.annotation.filter.JsonErrorFilter;
21  import org.ibeans.annotation.filter.RssErrorFilter;
22  import org.ibeans.annotation.filter.XmlErrorFilter;
23  import org.ibeans.api.IBeansException;
24  import org.ibeans.api.channel.MimeType;
25  import org.ibeans.spi.ErrorFilter;
26  import org.ibeans.spi.ErrorFilterFactory;
27  
28  /**
29   * An expression filter factory that can build filters for the following annotations {@link org.ibeans.annotation.filter.ExpressionErrorFilter},
30   * {@link org.ibeans.annotation.filter.XmlErrorFilter}, {@link org.ibeans.annotation.filter.AtomErrorFilter}, {@link org.ibeans.annotation.filter.RssErrorFilter}, and
31   * {@link org.ibeans.annotation.filter.JsonErrorFilter}
32   *
33   * @see org.ibeans.spi.ErrorFilter
34   */
35  public class ExpressionErrorFilterFactory implements ErrorFilterFactory
36  {
37      private MuleContext muleContext;
38  
39      public ExpressionErrorFilterFactory(MuleContext muleContext)
40      {
41          this.muleContext = muleContext;
42      }
43  
44      public boolean isSupported(Annotation annotation)
45      {
46          return (annotation instanceof ExpressionErrorFilter ||
47                  annotation instanceof XmlErrorFilter ||
48                  annotation instanceof AtomErrorFilter ||
49                  annotation instanceof RssErrorFilter ||
50                  annotation instanceof JsonErrorFilter);
51      }
52  
53      public ErrorFilterFactory.ErrorFilterHolder parse(Annotation anno) throws IBeansException
54      {
55          ErrorFilter errorFilter;
56          try
57          {
58              String expr = (String) anno.annotationType().getMethod("expr").invoke(anno);
59              String errorCode = (String) anno.annotationType().getMethod("errorCode").invoke(anno);
60              String tempMime = (String) anno.annotationType().getMethod("mimeType").invoke(anno);
61              MimeType mimeType = new MimeType(tempMime);
62  
63              Field f;
64              String evaluator;
65  
66              try
67              {
68                  f = anno.annotationType().getDeclaredField("eval");
69                  evaluator = (String) f.get(anno);
70              }
71              catch (NoSuchFieldException nsfe)
72              {
73                  //This is a custom ExpressionErrorFilter
74                  evaluator = (String) anno.annotationType().getMethod("eval").invoke(anno);
75              }
76  
77              //special handling for xpath queries
78              if (evaluator.equals("xpath2") &&! expr.startsWith("[boolean]"))
79              {
80                  expr = "[boolean]" + expr;
81              }
82              errorFilter = new ErrorExpressionFilter(evaluator, expr, errorCode);
83              ((ExpressionFilter)errorFilter).setMuleContext(muleContext);
84              return new ErrorFilterHolder(mimeType, errorFilter);
85          }
86          catch (Exception e)
87          {
88              throw new IBeansException("Failed to parse error filter from annotation: " + anno, e);
89          }
90      }
91  }