1
2
3
4
5
6
7
8
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
34
35
36 public class MuleMsgProvider extends MsgProvider
37 {
38
39
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
94
95
96 protected void setOperationStyle(MessageContext msgContext)
97 {
98
99
100
101
102
103
104
105
106 int methodType = msgContext.getOperation().getMessageOperationStyle();
107 if (methodType > -1)
108 {
109
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
139
140
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 }