Author: jason.greene(a)jboss.com
Date: 2006-11-03 10:35:22 -0500 (Fri, 03 Nov 2006)
New Revision: 1360
Modified:
branches/JEE5_TCK/src/main/java/org/jboss/ws/common/CommonSOAPBinding.java
branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxrpc/SOAP11BindingJAXRPC.java
branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxrpc/SOAP12BindingJAXRPC.java
branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxws/client/ClientImpl.java
branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxws/core/SOAP11BindingJAXWS.java
branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxws/core/SOAP12BindingJAXWS.java
branches/JEE5_TCK/src/test/java/org/jboss/test/ws/jaxws/exception/ExceptionEndpoint.java
branches/JEE5_TCK/src/test/java/org/jboss/test/ws/jaxws/exception/ExceptionEndpointImpl.java
branches/JEE5_TCK/src/test/java/org/jboss/test/ws/jaxws/exception/ExceptionTestCase.java
Log:
Fix client side fault handling of JBWS-1312.
Expand test case to cover endpoints that throw SOAPFaultException
Modified: branches/JEE5_TCK/src/main/java/org/jboss/ws/common/CommonSOAPBinding.java
===================================================================
--- branches/JEE5_TCK/src/main/java/org/jboss/ws/common/CommonSOAPBinding.java 2006-11-03
15:02:46 UTC (rev 1359)
+++ branches/JEE5_TCK/src/main/java/org/jboss/ws/common/CommonSOAPBinding.java 2006-11-03
15:35:22 UTC (rev 1360)
@@ -225,7 +225,7 @@
}
}
- // Set the SOAPAction
+ // Set the SOAPAction
setSOAPActionHeader(opMetaData, reqMessage);
return reqMessage;
@@ -537,11 +537,7 @@
// Translate the SOAPFault to an exception and throw it
if (soapBodyElement instanceof SOAPFaultImpl)
- {
- SOAPFaultImpl soapFault = (SOAPFaultImpl)soapBodyElement;
- SOAPFaultException faultEx =
SOAPFaultExceptionHelper.getSOAPFaultException(soapFault);
- throw faultEx;
- }
+ throwFaultException((SOAPFaultImpl)soapBodyElement);
// Extract unbound OUT headers
if (unboundHeaders != null)
@@ -772,7 +768,7 @@
// When a potential xop parameter is detected and MTOM is enabled
// we flag the SOAP message as a XOP package
- if (paramMetaData.isXOP() && XOPContext.isMTOMEnabled())
+ if (paramMetaData.isXOP() && XOPContext.isMTOMEnabled())
{
log.trace("Add parameter as XOP");
CommonMessageContext msgContext =
MessageContextAssociation.peekMessageContext();
@@ -879,6 +875,8 @@
return soapContentElement;
}
+ abstract protected void throwFaultException(SOAPFaultImpl fault) throws Exception;
+
private void handleException(Exception ex) throws BindingException
{
if (ex instanceof RuntimeException)
Modified: branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxrpc/SOAP11BindingJAXRPC.java
===================================================================
---
branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxrpc/SOAP11BindingJAXRPC.java 2006-11-03
15:02:46 UTC (rev 1359)
+++
branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxrpc/SOAP11BindingJAXRPC.java 2006-11-03
15:35:22 UTC (rev 1360)
@@ -23,14 +23,16 @@
//$Id:SOAP11BindingJAXRPC.java 1054 2006-09-26 10:33:43Z thomas.diesler(a)jboss.com $
+import javax.xml.rpc.soap.SOAPFaultException;
import javax.xml.soap.SOAPMessage;
import org.jboss.ws.common.CommonSOAP11Binding;
import org.jboss.ws.metadata.OperationMetaData;
+import org.jboss.ws.soap.SOAPFaultImpl;
/**
- * The JAXRPC SOAP11Binding
- *
+ * The JAXRPC SOAP11Binding
+ *
* @author Thomas.Diesler(a)jboss.com
* @since 20-Sep-2006
*/
@@ -43,4 +45,10 @@
{
delegate.setSOAPActionHeader(opMetaData, reqMessage);
}
+
+ @Override
+ protected void throwFaultException(SOAPFaultImpl fault) throws Exception
+ {
+ throw SOAPFaultExceptionHelper.getSOAPFaultException(fault);
+ }
}
Modified: branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxrpc/SOAP12BindingJAXRPC.java
===================================================================
---
branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxrpc/SOAP12BindingJAXRPC.java 2006-11-03
15:02:46 UTC (rev 1359)
+++
branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxrpc/SOAP12BindingJAXRPC.java 2006-11-03
15:35:22 UTC (rev 1360)
@@ -27,10 +27,11 @@
import org.jboss.ws.common.CommonSOAP12Binding;
import org.jboss.ws.metadata.OperationMetaData;
+import org.jboss.ws.soap.SOAPFaultImpl;
/**
- * The JAXRPC SOAP12Binding
- *
+ * The JAXRPC SOAP12Binding
+ *
* @author Thomas.Diesler(a)jboss.com
* @since 20-Sep-2006
*/
@@ -43,4 +44,10 @@
{
delegate.setSOAPActionHeader(opMetaData, reqMessage);
}
+
+ @Override
+ protected void throwFaultException(SOAPFaultImpl fault) throws Exception
+ {
+ throw SOAPFaultExceptionHelper.getSOAPFaultException(fault);
+ }
}
Modified: branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxws/client/ClientImpl.java
===================================================================
--- branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxws/client/ClientImpl.java 2006-11-03
15:02:46 UTC (rev 1359)
+++ branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxws/client/ClientImpl.java 2006-11-03
15:35:22 UTC (rev 1360)
@@ -54,7 +54,7 @@
import org.jboss.ws.metadata.HandlerMetaData.HandlerType;
import org.jboss.ws.soap.MessageContextAssociation;
-/**
+/**
* Provides support for the dynamic invocation of a service endpoint.
*
* @author Thomas.Diesler(a)jboss.org
@@ -64,7 +64,7 @@
{
// provide logging
private static Logger log = Logger.getLogger(ClientImpl.class);
-
+
public ClientImpl(EndpointMetaData epMetaData, HandlerResolver handlerResolver)
{
super(epMetaData);
@@ -120,14 +120,14 @@
CommonMessageContext msgContext = MessageContextAssociation.peekMessageContext();
msgContext.setProperty(MessageContextJAXWS.MESSAGE_OUTBOUND_PROPERTY, new
Boolean(true));
}
-
+
// Invoked by the proxy invokation handler
public Object invoke(QName opName, Object[] args, Map<String, Object>
resContext) throws RemoteException
{
// Associate a message context with the current thread
SOAPMessageContextJAXWS msgContext = new SOAPMessageContextJAXWS();
MessageContextAssociation.pushMessageContext(msgContext);
-
+
// The contents of the request context are used to initialize the message context
(see section 9.4.1)
// prior to invoking any handlers (see chapter 9) for the outbound message. Each
property within the
// request context is copied to the message context with a scope of HANDLER.
@@ -176,26 +176,26 @@
}
/**
- * 4.13 Conformance (Remote Exceptions): If an error occurs during a remote operation
invocation, an implemention
+ * 4.13 Conformance (Remote Exceptions): If an error occurs during a remote operation
invocation, an implemention
* MUST throw a service specific exception if possible. If the error cannot be mapped
to a service
* specific exception, an implementation MUST throw a ProtocolException or one of its
subclasses, as
* appropriate for the binding in use. See section 6.4.1 for more details.
*/
private void handleRemoteException(OperationMetaData opMetaData, Exception ex)
{
- String bindingId = opMetaData.getEndpointMetaData().getBindingId();
- if (SOAPBinding.SOAP11HTTP_BINDING.equals(bindingId) ||
SOAPBinding.SOAP12HTTP_BINDING.equals(bindingId))
+ // FIXME: JBWS-1297
+
+ // We rely on the binding layer to generate the appropriate exception,
+ // otherwise we pass it through as a WebServiceException
+ if (ex instanceof WebServiceException)
{
- throw new SOAPFaultException(null);
+ throw (WebServiceException)ex;
}
- else if (HTTPBinding.HTTP_BINDING.equals(bindingId))
- {
- // FIXME: provide actual status code
- throw new HTTPException(-1);
- }
else
{
- throw new WebServiceException("Unsuported binding: " + bindingId);
+ WebServiceException w = new WebServiceException(ex.getMessage(), ex);
+ w.setStackTrace(ex.getStackTrace());
+ throw w;
}
}
@@ -220,7 +220,7 @@
}
return bindingProvider;
}
-
+
public Map<String, Object> getRequestContext()
{
return getBindingProvider().getRequestContext();
Modified: branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxws/core/SOAP11BindingJAXWS.java
===================================================================
---
branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxws/core/SOAP11BindingJAXWS.java 2006-11-03
15:02:46 UTC (rev 1359)
+++
branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxws/core/SOAP11BindingJAXWS.java 2006-11-03
15:35:22 UTC (rev 1360)
@@ -31,15 +31,17 @@
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.Handler;
import javax.xml.ws.soap.SOAPBinding;
+import javax.xml.ws.soap.SOAPFaultException;
import org.jboss.ws.Constants;
import org.jboss.ws.common.CommonSOAP11Binding;
import org.jboss.ws.metadata.OperationMetaData;
import org.jboss.ws.metadata.HandlerMetaData.HandlerType;
+import org.jboss.ws.soap.SOAPFaultImpl;
/**
- * The JAXWS SOAP11Binding
- *
+ * The JAXWS SOAP11Binding
+ *
* @author Thomas.Diesler(a)jboss.com
* @since 04-Jul-2006
*/
@@ -86,4 +88,10 @@
{
delegate.setHandlerChain(handlerChain);
}
+
+ @Override
+ protected void throwFaultException(SOAPFaultImpl fault) throws Exception
+ {
+ throw new SOAPFaultException(fault);
+ }
}
Modified: branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxws/core/SOAP12BindingJAXWS.java
===================================================================
---
branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxws/core/SOAP12BindingJAXWS.java 2006-11-03
15:02:46 UTC (rev 1359)
+++
branches/JEE5_TCK/src/main/java/org/jboss/ws/jaxws/core/SOAP12BindingJAXWS.java 2006-11-03
15:35:22 UTC (rev 1360)
@@ -32,15 +32,17 @@
import javax.xml.ws.WebServiceException;
import javax.xml.ws.handler.Handler;
import javax.xml.ws.soap.SOAPBinding;
+import javax.xml.ws.soap.SOAPFaultException;
import org.jboss.ws.Constants;
import org.jboss.ws.common.CommonSOAP12Binding;
import org.jboss.ws.metadata.OperationMetaData;
import org.jboss.ws.metadata.HandlerMetaData.HandlerType;
+import org.jboss.ws.soap.SOAPFaultImpl;
/**
- * The SOAP11Binding
- *
+ * The SOAP11Binding
+ *
* @author Thomas.Diesler(a)jboss.com
* @since 04-Jul-2006
*/
@@ -94,4 +96,10 @@
{
delegate.setHandlerChain(handlerChain);
}
+
+ @Override
+ protected void throwFaultException(SOAPFaultImpl fault) throws Exception
+ {
+ throw new SOAPFaultException(fault);
+ }
}
Modified:
branches/JEE5_TCK/src/test/java/org/jboss/test/ws/jaxws/exception/ExceptionEndpoint.java
===================================================================
---
branches/JEE5_TCK/src/test/java/org/jboss/test/ws/jaxws/exception/ExceptionEndpoint.java 2006-11-03
15:02:46 UTC (rev 1359)
+++
branches/JEE5_TCK/src/test/java/org/jboss/test/ws/jaxws/exception/ExceptionEndpoint.java 2006-11-03
15:35:22 UTC (rev 1360)
@@ -26,5 +26,6 @@
public interface ExceptionEndpoint
{
public void throwRuntimeException();
+ public void throwSoapFaultException();
public void throwApplicationException() throws UserException;
}
\ No newline at end of file
Modified:
branches/JEE5_TCK/src/test/java/org/jboss/test/ws/jaxws/exception/ExceptionEndpointImpl.java
===================================================================
---
branches/JEE5_TCK/src/test/java/org/jboss/test/ws/jaxws/exception/ExceptionEndpointImpl.java 2006-11-03
15:02:46 UTC (rev 1359)
+++
branches/JEE5_TCK/src/test/java/org/jboss/test/ws/jaxws/exception/ExceptionEndpointImpl.java 2006-11-03
15:35:22 UTC (rev 1360)
@@ -22,7 +22,14 @@
package org.jboss.test.ws.jaxws.exception;
import javax.jws.WebService;
+import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPFault;
+import javax.xml.ws.soap.SOAPFaultException;
+import org.jboss.ws.soap.NameImpl;
+import org.jboss.ws.soap.SOAPFaultImpl;
+
@WebService(endpointInterface="org.jboss.test.ws.jaxws.exception.ExceptionEndpoint")
public class ExceptionEndpointImpl implements ExceptionEndpoint
{
@@ -31,6 +38,25 @@
throw new RuntimeException("oh no, a runtime exception occured.");
}
+ public void throwSoapFaultException()
+ {
+ // This should be thrown as-is
+
+ try
+ {
+ SOAPFault fault = new SOAPFaultImpl("http://foo");
+ fault.setFaultCode(new NameImpl(new QName("http://foo",
"FooCode")));
+ fault.setFaultString("this is a fault string!");
+ fault.setFaultActor("mr.actor");
+ fault.addDetail().addChildElement("test");
+ throw new SOAPFaultException(fault);
+ }
+ catch (SOAPException s)
+ {
+ throw new RuntimeException(s);
+ }
+ }
+
public void throwApplicationException() throws UserException
{
throw new UserException("validation", 123, "Some validation
error");
Modified:
branches/JEE5_TCK/src/test/java/org/jboss/test/ws/jaxws/exception/ExceptionTestCase.java
===================================================================
---
branches/JEE5_TCK/src/test/java/org/jboss/test/ws/jaxws/exception/ExceptionTestCase.java 2006-11-03
15:02:46 UTC (rev 1359)
+++
branches/JEE5_TCK/src/test/java/org/jboss/test/ws/jaxws/exception/ExceptionTestCase.java 2006-11-03
15:35:22 UTC (rev 1360)
@@ -31,6 +31,7 @@
import org.jboss.test.ws.JBossWSTest;
import org.jboss.test.ws.JBossWSTestSetup;
+import org.w3c.dom.Element;
/**
* Test JAX-WS exception handling
@@ -60,12 +61,28 @@
proxy = (ExceptionEndpoint) service.getPort(ExceptionEndpoint.class);
}
-
+ /*
+ * 10.2.2.3
+ *
+ * faultcode (Subcode in SOAP 1.2, Code set to env:Receiver)
+ * 1. SOAPFaultException.getFault().getFaultCodeAsQName()
+ * 2. env:Server (Subcode omitted for SOAP 1.2).
+ * faultstring (Reason/Text)
+ * 1. SOAPFaultException.getFault().getFaultString()
+ * 2. Exception.getMessage()
+ * 3. Exception.toString()
+ * faultactor (Role in SOAP 1.2)
+ * 1. SOAPFaultException.getFault().getFaultActor()
+ * 2. Empty
+ * detail (Detail in SOAP 1.2)
+ * 1. Serialized service specific exception (see WrapperException.getFaultInfo() in
section 2.5)
+ * 2. SOAPFaultException.getFault().getDetail()
+ */
public void testRuntimeException() throws Exception
{
if (true)
{
- System.out.println("FIXME: JBWS-1321");
+ System.out.println("FIXME: JBWS-1312");
return;
}
@@ -83,6 +100,34 @@
assertTrue("Expected SOAPFaultException", false);
}
+ public void testSoapFaultException() throws Exception
+ {
+ if (true)
+ {
+ System.out.println("FIXME: JBWS-1312");
+ return;
+ }
+
+ try
+ {
+ proxy.throwSoapFaultException();
+ }
+ catch (SOAPFaultException e)
+ {
+ assertEquals("this is a fault string", e.getMessage());
+ assertEquals("this is a fault string",
e.getFault().getFaultString());
+ assertEquals("mr.actor", e.getFault().getFaultActor());
+ assertEquals("FooCode",
e.getFault().getFaultCodeAsName().getLocalName());
+ assertEquals("http://foo",
e.getFault().getFaultCodeAsName().getURI());
+ assertEquals("test",
((Element)e.getFault().getDetail().getChildElements().next()).getLocalName());
+
+ return;
+ }
+
+ assertTrue("Expected SOAPFaultException", false);
+ }
+
+
public void testApplicationException() throws Exception
{
if (true)