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.api.MuleMessage;
14 import org.mule.api.transformer.DataType;
15 import org.mule.api.transformer.Transformer;
16 import org.mule.module.ibeans.spi.support.DataTypeConverter;
17 import org.mule.routing.filters.ExpressionFilter;
18 import org.mule.transformer.types.DataTypeFactory;
19 import org.mule.transport.NullPayload;
20
21 import java.lang.reflect.Method;
22
23 import org.ibeans.annotation.Return;
24 import org.ibeans.api.AbstractCallInterceptor;
25 import org.ibeans.api.InvocationContext;
26 import org.ibeans.api.Response;
27 import org.ibeans.spi.ExpressionParser;
28
29
30
31
32
33 public class MuleResponseTransformInterceptor extends AbstractCallInterceptor
34 {
35 private MuleContext muleContext;
36 private ExpressionParser parser;
37
38 public MuleResponseTransformInterceptor(MuleContext muleContext, ExpressionParser parser)
39 {
40 this.muleContext = muleContext;
41 this.parser = parser;
42 }
43
44 @Override
45 public void afterCall(InvocationContext invocationContext) throws Throwable
46 {
47 MuleResponseMessage result = (MuleResponseMessage)invocationContext.getResponse();
48 if (result == null || result.getPayload() == null || invocationContext.getMethod().getReturnType().equals(Void.TYPE))
49 {
50 return;
51 }
52
53 Object finalResult;
54 Method method = invocationContext.getMethod();
55
56 if(method.getName().startsWith("ibean"))
57 {
58 invocationContext.setResult(result.getPayload());
59 return;
60 }
61 DataType requiredType = DataTypeConverter.convertIBeansToMule(invocationContext.getReturnType());
62
63 if (method.getAnnotation(Return.class) != null)
64 {
65 String returnExpression = method.getAnnotation(Return.class).value();
66
67 finalResult = handleReturnAnnotation(returnExpression, result, invocationContext);
68
69 DataType finalType = DataTypeFactory.createFromObject(finalResult);
70 if (!requiredType.isCompatibleWith(finalType))
71 {
72 Transformer transformer = muleContext.getRegistry().lookupTransformer( finalType, requiredType);
73 finalResult = transformer.transform(finalResult);
74 }
75 }
76 else
77 {
78
79 if (requiredType.getType().equals(MuleMessage.class))
80 {
81 finalResult = result.getMessage();
82 }
83 else if (requiredType.getType().equals(Response.class))
84 {
85 finalResult = result;
86 }
87 else
88 {
89 DataType sourceType = DataTypeFactory.createFromObject(result.getMessage());
90 if(requiredType.isCompatibleWith(sourceType))
91 {
92 finalResult = result.getPayload();
93 }
94 else
95 {
96 Transformer transformer = muleContext.getRegistry().lookupTransformer(sourceType, requiredType);
97 finalResult = transformer.transform(result.getPayload());
98 }
99 }
100
101
102 }
103 if(finalResult instanceof NullPayload)
104 {
105 finalResult = null;
106 }
107 invocationContext.setResult(finalResult);
108 }
109
110 protected Object handleReturnAnnotation(String expr, Response message, InvocationContext ctx)
111 {
112 if (parser.hasUriTokens(expr))
113 {
114 expr = parser.parseUriTokens(ctx.getIBeanConfig().getUriParams(), expr);
115 expr = parser.parseUriTokens(ctx.getIBeanConfig().getHeaderParams(), expr);
116 expr = parser.parseUriTokens(ctx.getIBeanConfig().getPropertyParams(), expr);
117 }
118
119 if(ctx.getMethod().getReturnType().equals(Boolean.class))
120 {
121 return new ExpressionFilter(expr).accept(((MuleResponseMessage)message).getMessage());
122 }
123 return parser.evaluate(expr, message);
124 }
125 }