1
2
3
4
5
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
27
28
29
30
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
71 evaluator = (String) anno.annotationType().getMethod("eval").invoke(anno);
72 }
73
74
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 }