View Javadoc

1   /*
2    * $Id: MuleResponseTransformInterceptor.java 19500 2010-09-09 17:29:17Z dzapata $
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.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   * An interceptor used to process the {@link org.ibeans.annotation.Return} annotation.  This interceptor also
31   * performs automatic transformation
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          //Special handling for Mock ibean methods, need to find a better way of doing this
56          if(method.getName().startsWith("ibean"))
57          {
58              invocationContext.setResult(result.getPayload());
59              return;
60          }
61          DataType requiredType = DataTypeConverter.convertIBeansToMule(invocationContext.getReturnType()); // DataTypeFactory.createFromReturnType(method);
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 }