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