Author: heiko.braun(a)jboss.com
Date: 2009-11-05 05:31:44 -0500 (Thu, 05 Nov 2009)
New Revision: 229
Modified:
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/SOAPMessageAdapter.java
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/WebServiceClient.java
Log:
Fix RIFTSAW-90: Parse SOAP Fault on response
Modified:
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/SOAPMessageAdapter.java
===================================================================
---
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/SOAPMessageAdapter.java 2009-11-05
10:13:45 UTC (rev 228)
+++
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/SOAPMessageAdapter.java 2009-11-05
10:31:44 UTC (rev 229)
@@ -35,10 +35,10 @@
import javax.wsdl.extensions.ElementExtensible;
import javax.wsdl.extensions.soap.SOAPBinding;
import javax.xml.namespace.QName;
-import javax.xml.soap.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.soap.*;
import java.util.*;
/**
@@ -223,7 +223,7 @@
}
public void parseSoapResponse(org.apache.ode.bpel.iapi.Message odeMessage,
- SOAPMessage soapMessage, Operation odeOperation) {
+ SOAPMessage soapMessage, javax.wsdl.Operation
odeOperation) {
BindingOperation bop = binding.getBindingOperation(odeOperation.getName(), null,
null);
if (bop == null)
throw new RuntimeException("Operation "+odeOperation.getName()+"not
found on "+serviceName+"/"+portName);
@@ -339,4 +339,49 @@
return CollectionsX.filter(new ArrayList<SOAPHeader>(),
(Collection<Object>) eee.getExtensibilityElements(),
SOAPHeader.class);
}
+
+ public Fault parseSoapFault(
+ Element odeMessage,
+ SOAPMessage soapMessage,
+ javax.wsdl.Operation operation)
+ {
+ Fault fdef = null;
+ try
+ {
+ SOAPFault flt = soapMessage.getSOAPBody().getFault();
+ Detail detail = flt.getDetail();
+ fdef = inferFault(operation, flt);
+ if(fdef!=null)
+ {
+ Part pdef = (Part)fdef.getMessage().getParts().values().iterator().next();
+ Element partel =
odeMessage.getOwnerDocument().createElementNS(null,pdef.getName());
+ odeMessage.appendChild(partel);
+
+ Element childByName = DOMUtils.findChildByName(detail, pdef.getElementName());
+ if (childByName != null)
+ {
+ partel.appendChild(odeMessage.getOwnerDocument().importNode(childByName,
true));
+ }
+ else
+ {
+ partel.appendChild(odeMessage.getOwnerDocument().importNode(detail,true));
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("Failed to parse SOAP Fault",e);
+ }
+
+ return fdef;
+ }
+
+ private Fault inferFault(Operation operation, SOAPFault flt) {
+ if (!flt.hasDetail())
+ return null;
+ // The detail is a dummy <detail> node containing the interesting fault
element
+ Element element = DOMUtils.getFirstChildElement(flt.getDetail());
+ QName elName = new QName(element.getNamespaceURI(), element.getLocalName());
+ return WsdlUtils.inferFault(operation, elName);
+ }
}
Modified:
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/WebServiceClient.java
===================================================================
---
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/WebServiceClient.java 2009-11-05
10:13:45 UTC (rev 228)
+++
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/WebServiceClient.java 2009-11-05
10:31:44 UTC (rev 229)
@@ -27,21 +27,25 @@
import org.apache.ode.bpel.iapi.MessageExchange;
import org.apache.ode.bpel.iapi.PartnerRoleMessageExchange;
import org.apache.ode.bpel.iapi.Scheduler;
+import org.apache.ode.utils.DOMUtils;
import org.jboss.soa.bpel.runtime.engine.BPELFault;
import org.jboss.soa.bpel.runtime.engine.EndpointReference;
import org.jboss.soa.bpel.runtime.engine.PartnerChannel;
import org.jboss.soa.bpel.runtime.engine.ode.ExecutionEnvironment;
+import org.w3c.dom.Document;
import org.w3c.dom.Element;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.transaction.UserTransaction;
import javax.wsdl.Definition;
+import javax.wsdl.Fault;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
+import javax.xml.soap.SOAPFault;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-import javax.transaction.UserTransaction;
import java.net.URL;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
@@ -136,13 +140,49 @@
// Create ODE response
Message odeResponse =
mex.createMessage(mex.getOperation().getOutput().getMessage().getQName());
-
messageAdapter.parseSoapResponse(odeResponse,soapResponseMessage,mex.getOperation());
+ if(soapResponseMessage.getSOAPBody().hasFault())
+ {
+ // fault handling
+ Document odeMsg = DOMUtils.newDocument();
+ Element odeMsgEl = odeMsg.createElementNS(null,
"message");
+ odeMsg.appendChild(odeMsgEl);
+
+ Fault fault = messageAdapter.parseSoapFault(
+ odeMsgEl, soapResponseMessage, mex.getOperation()
+ );
+ if (fault != null)
+ {
+ if (log.isWarnEnabled())
+ log.warn("Fault response: faultName="
+ + fault.getName() + " faultType=" +
fault.getMessage().getQName()
+ + "\n" + DOMWriter.printNode(odeMsgEl, true));
+
+ QName faultType = fault.getMessage().getQName();
+ QName faultName = new QName(wsdlDefintion.getTargetNamespace(),
fault.getName());
+ Message response = mex.createMessage(faultType);
+ response.setMessage(odeMsgEl);
+
+ mex.replyWithFault(faultName, response);
+ }
+ else
+ {
+ if (log.isWarnEnabled())
+ log.warn("Fault response: faultType=(unknown)");
+
+ SOAPFault f = soapResponseMessage.getSOAPBody().getFault();
+ mex.replyWithFailure(MessageExchange.FailureType.OTHER,
"Unspecified", f.getDetail());
+ }
+ }
+ else
+ {
+
messageAdapter.parseSoapResponse(odeResponse,soapResponseMessage,mex.getOperation());
+ mex.reply(odeResponse);
+ }
+
if(log.isDebugEnabled())
log.debug( "ODE inbound message: \n"
+DOMWriter.printNode(odeResponse.getMessage(), true) );
- mex.reply(odeResponse);
-
tx.commit();
}
catch (Throwable e)
Show replies by date