1
2
3
4
5
6
7
8
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
30
31
32
33
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
74 evaluator = (String) anno.annotationType().getMethod("eval").invoke(anno);
75 }
76
77
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 }