View Javadoc

1   /*
2    * $Id: MuleMsgProvider.java 7963 2007-08-21 08:53:15Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.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  
11  package org.mule.providers.soap.axis.extensions;
12  
13  import org.mule.impl.RequestContext;
14  import org.mule.impl.model.ModelHelper;
15  import org.mule.providers.soap.ServiceProxy;
16  import org.mule.providers.soap.axis.AxisConnector;
17  import org.mule.providers.soap.axis.AxisMessageReceiver;
18  import org.mule.providers.soap.axis.AxisServiceProxy;
19  import org.mule.umo.UMOComponent;
20  
21  import java.lang.reflect.Proxy;
22  
23  import org.apache.axis.AxisFault;
24  import org.apache.axis.Constants;
25  import org.apache.axis.MessageContext;
26  import org.apache.axis.description.OperationDesc;
27  import org.apache.axis.handlers.soap.SOAPService;
28  import org.apache.axis.providers.java.MsgProvider;
29  import org.apache.commons.logging.Log;
30  import org.apache.commons.logging.LogFactory;
31  
32  /**
33   * <code>MuleMsgProvider</code> is an Axis service endpoint that builds services
34   * from Mule managed components.
35   */
36  public class MuleMsgProvider extends MsgProvider
37  {
38      /**
39       * Serial version
40       */
41      private static final long serialVersionUID = -4399291846942449361L;
42  
43      private AxisConnector connector;
44  
45      private static Log logger = LogFactory.getLog(MuleMsgProvider.class);
46  
47      private String METHOD_BODYARRAY = "soapbodyelement";
48      private String METHOD_ELEMENTARRAY = "element";
49      private String METHOD_DOCUMENT = "document";
50  
51      public MuleMsgProvider(AxisConnector connector)
52      {
53          this.connector = connector;
54      }
55  
56      protected Object makeNewServiceObject(MessageContext messageContext, String s) throws Exception
57      {
58          String transUrl = (String)messageContext.getProperty("transport.url");
59          int i = transUrl.indexOf('?');
60          if (i > -1)
61          {
62              transUrl = transUrl.substring(0, i);
63          }
64          AxisMessageReceiver receiver = (AxisMessageReceiver)connector.lookupReceiver(transUrl);
65          if (receiver == null)
66          {
67              receiver = (AxisMessageReceiver)connector.lookupReceiver(messageContext.getTargetService());
68          }
69          if (receiver == null)
70          {
71              throw new AxisFault("Could not find Mule registered service: " + s);
72          }
73          Class[] classes = ServiceProxy.getInterfacesForComponent(receiver.getComponent());
74          return AxisServiceProxy.createProxy(receiver, true, classes);
75      }
76  
77      protected Class getServiceClass(String s, SOAPService soapService, MessageContext messageContext)
78          throws AxisFault
79      {
80          UMOComponent component = ModelHelper.getComponent(soapService.getName());
81          try
82          {
83              Class[] classes = ServiceProxy.getInterfacesForComponent(component);
84              return Proxy.getProxyClass(Thread.currentThread().getContextClassLoader(), classes);
85          }
86          catch (Exception e)
87          {
88              throw new AxisFault("Failed to implementation class for component: " + e.getMessage(), e);
89          }
90      }
91  
92      /**
93       * @param msgContext
94       * @deprecated I dont think this is necessary, but leaving it here for a while
95       */
96      protected void setOperationStyle(MessageContext msgContext)
97      {
98          /*
99           * Axis requires that the OperationDesc.operationStyle be set to match the
100          * method signature This does not appear to be an automated process so
101          * determine from the 4 allowed forms public Element [] method(Element []
102          * bodies); public SOAPBodyElement [] method (SOAPBodyElement [] bodies);
103          * public Document method(Document body); public void method(SOAPEnvelope
104          * req, SOAPEnvelope resp);
105          */
106         int methodType = msgContext.getOperation().getMessageOperationStyle();
107         if (methodType > -1)
108         {
109             // Already set, nothing more to do
110             return;
111         }
112         OperationDesc operation = msgContext.getOperation();
113         String methodSignature = operation.getMethod().toString().toLowerCase();
114         if (methodSignature.indexOf(METHOD_BODYARRAY) != -1)
115         {
116             methodType = OperationDesc.MSG_METHOD_BODYARRAY;
117         }
118         else if (methodSignature.indexOf(METHOD_ELEMENTARRAY) != -1)
119         {
120             methodType = OperationDesc.MSG_METHOD_ELEMENTARRAY;
121         }
122         else if (methodSignature.indexOf(METHOD_DOCUMENT) != -1)
123         {
124             methodType = OperationDesc.MSG_METHOD_DOCUMENT;
125         }
126         else
127         {
128             methodType = OperationDesc.MSG_METHOD_SOAPENVELOPE;
129         }
130         operation.setMessageOperationStyle(methodType);
131         logger.debug("Now Invoking service (Method Format) " + operation.getMethod().toString());
132         logger.debug("Now Invoking service (MethodType) "
133                      + String.valueOf(operation.getMessageOperationStyle()));
134     }
135 
136     public void invoke(MessageContext msgContext) throws AxisFault
137     {
138         // Make sure that the method style is correctly set (This does not appear to
139         // be handled by default)
140         // setOperationStyle(msgContext);
141         super.invoke(msgContext);
142         if (RequestContext.getExceptionPayload() != null)
143         {
144             Throwable t = RequestContext.getExceptionPayload().getException();
145             if (t instanceof Exception)
146             {
147                 AxisFault fault = AxisFault.makeFault((Exception)t);
148                 if (t instanceof RuntimeException)
149                 {
150                     fault.addFaultDetail(Constants.QNAME_FAULTDETAIL_RUNTIMEEXCEPTION, "true");
151                 }
152                 throw fault;
153             }
154             else
155             {
156                 throw (Error)t;
157             }
158         }
159     }
160 
161 }