cxf-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From j...@apache.org
Subject svn commit: r538504 - in /incubator/cxf/trunk: rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/ rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/ systests/src/test/java/org/apache/cxf/systest/handlers/
Date Wed, 16 May 2007 09:47:29 GMT
Author: jliu
Date: Wed May 16 02:47:21 2007
New Revision: 538504

URL: http://svn.apache.org/viewvc?view=rev&rev=538504
Log:
Support SOAPHandlers handleFault() throws RuntimeException/ProtocolException on server side
outbound

Modified:
    incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java
    incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerFaultOutInterceptor.java
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerInvocationTest.java
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/TestSOAPHandler.java

Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java?view=diff&rev=538504&r1=538503&r2=538504
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java
(original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java
Wed May 16 02:47:21 2007
@@ -349,7 +349,7 @@
         } catch (RuntimeException e) {
             LOG.log(Level.WARNING, "HANDLER_RAISED_RUNTIME_EXCEPTION", e);
             continueProcessing = false;
-            closed = true;
+            throw e;
         }
         return continueProcessing;
     }
@@ -527,6 +527,7 @@
         int index = invokedHandlers.size() - 1;
         while (index >= 0) {
             Handler handler = invokedHandlers.get(index);
+            //System.out.println("===========invokeReversedClose " + invokeReversedClose.toString());
             if (handler instanceof LogicalHandler) {
                 handler.close(logicalMessageContext);
             } else {

Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerFaultOutInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerFaultOutInterceptor.java?view=diff&rev=538504&r1=538503&r2=538504
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerFaultOutInterceptor.java
(original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerFaultOutInterceptor.java
Wed May 16 02:47:21 2007
@@ -24,13 +24,20 @@
 import java.util.Set;
 
 import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPFault;
 import javax.xml.soap.SOAPMessage;
 import javax.xml.ws.Binding;
 import javax.xml.ws.ProtocolException;
 import javax.xml.ws.handler.Handler;
 import javax.xml.ws.handler.MessageContext;
 import javax.xml.ws.handler.soap.SOAPHandler;
+import javax.xml.ws.soap.SOAPFaultException;
 
+import org.w3c.dom.Node;
+
+import org.apache.cxf.binding.soap.SoapFault;
 import org.apache.cxf.binding.soap.SoapMessage;
 import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
 import org.apache.cxf.binding.soap.interceptor.MustUnderstandInterceptor;
@@ -115,9 +122,47 @@
 
         Throwable cause = f.getCause();
         if (cause instanceof ProtocolException) {
+            try {
 
-            if (!invoker.invokeProtocolHandlersHandleFault(isRequestor(message), context))
{
-                // handleAbort(message, context);
+                if (!invoker.invokeProtocolHandlersHandleFault(isRequestor(message), context))
{
+                    // handleAbort(message, context);
+                }
+            } catch (RuntimeException exception) {
+                //Replace SOAPFault with the exception thrown from HandleFault
+                
+                try {
+                    SOAPMessage msgFromHandleFault = message.getContent(SOAPMessage.class);
+
+                    SOAPBody body = msgFromHandleFault.getSOAPBody();
+                    
+                    body.removeContents();
+
+                    SOAPFault soapFault = body.addFault();
+
+                    if (exception instanceof SOAPFaultException) {
+                        SOAPFaultException sf = (SOAPFaultException)exception;
+                        soapFault.setFaultString(sf.getFault().getFaultString());
+                        soapFault.setFaultCode(sf.getFault().getFaultCode());
+                        soapFault.setFaultActor(sf.getFault().getFaultActor());
+                        Node nd = msgFromHandleFault.getSOAPPart().importNode(
+                                                                              sf.getFault().getDetail()
+                                                                                  .getFirstChild(),
true);
+                        soapFault.addDetail().appendChild(nd);
+                    } else if (exception instanceof Fault) {
+                        SoapFault sf = SoapFault.createFault((Fault)exception, ((SoapMessage)message)
+                            .getVersion());
+                        soapFault.setFaultString(sf.getReason());
+                        soapFault.setFaultCode(sf.getFaultCode());
+                        Node nd = msgFromHandleFault.getSOAPPart().importNode(sf.getOrCreateDetail(),
true);
+                        soapFault.addDetail().appendChild(nd);
+                    } else {
+                        soapFault.setFaultString(exception.getMessage());
+                        soapFault.setFaultCode(new QName("http://cxf.apache.org/faultcode",
"HandleFault"));
+                    }
+                } catch (SOAPException e) {
+                    //do nothing
+                    e.printStackTrace();
+                } 
             }
         } else {
             // do nothing

Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerInvocationTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerInvocationTest.java?view=diff&rev=538504&r1=538503&r2=538504
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerInvocationTest.java
(original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerInvocationTest.java
Wed May 16 02:47:21 2007
@@ -724,7 +724,7 @@
             PrintStream ps = new PrintStream(baos, true);
             e.printStackTrace(ps);
             assertTrue("Did not get expected exception message",  baos.toString()
-                .indexOf("HandleMessage throws RuntimeException exception") > -1);
+                .indexOf("HandleMessage throws exception") > -1);
             assertTrue("Did not get expected javax.xml.ws.soap.SOAPFaultException", baos.toString()
                 .indexOf("javax.xml.ws.soap.SOAPFaultException") > -1);*/
         }        
@@ -741,7 +741,7 @@
             PrintStream ps = new PrintStream(baos, true);
             e.printStackTrace(ps);
             assertTrue("Did not get expected exception message",  baos.toString()
-                .indexOf("HandleMessage throws RuntimeException exception") > -1);
+                .indexOf("HandleMessage throws exception") > -1);
             assertTrue("Did not get expected javax.xml.ws.soap.SOAPFaultException", baos.toString()
                 .indexOf("javax.xml.ws.soap.SOAPFaultException") > -1);*/
         }        
@@ -758,12 +758,41 @@
             PrintStream ps = new PrintStream(baos, true);
             e.printStackTrace(ps);
             assertTrue("Did not get expected exception message",  baos.toString()
-                .indexOf("HandleMessage throws ProtocolException exception") > -1);
+                .indexOf("HandleMessage throws exception") > -1);
             assertTrue("Did not get expected javax.xml.ws.soap.SOAPFaultException", baos.toString()
                 .indexOf("javax.xml.ws.soap.SOAPFaultException") > -1);*/
         }        
     }
-
+    
+    /*-------------------------------------------------------
+    * This is the expected order
+    *-------------------------------------------------------
+    * soapHandler3.handleMessage().doInbound()
+    * soapHandler4.handleMessage().doInbound()
+    * soapHandler4 Throwing an inbound ProtocolException
+    * soapHandler3.handleFault()
+    * soapHandler3 Throwing an outbound RuntimeException
+    * soapHandler4.close()
+    * soapHandler3.close()
+    */
+    @Test
+    public void testSOAPHandlerHandleFaultThrowsRuntimeExceptionServerOutbound() throws PingException
{
+        try {
+            handlerTest.pingWithArgs("soapHandler3 inbound throw ProtocolException "
+                                     + "soapHandler4HandleFaultThrowsRunException");
+            fail("did not get expected WebServiceException");
+        } catch (WebServiceException e) {
+            //e.printStackTrace();
+/*            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            PrintStream ps = new PrintStream(baos, true);
+            e.printStackTrace(ps);
+            assertTrue("Did not get expected exception message",  baos.toString()
+                .indexOf("soapHandler4 HandleFault throws RuntimeException") > -1);
+            assertTrue("Did not get expected javax.xml.ws.soap.SOAPFaultException", baos.toString()
+                .indexOf("javax.xml.ws.soap.SOAPFaultException") > -1);*/
+        }        
+    }
+    
     @Test
     public void testSOAPHandlerHandleMessageThrowsProtocolExceptionServerOutbound() throws
PingException {
         try {

Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/TestSOAPHandler.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/TestSOAPHandler.java?view=diff&rev=538504&r1=538503&r2=538504
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/TestSOAPHandler.java
(original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/TestSOAPHandler.java
Wed May 16 02:47:21 2007
@@ -119,6 +119,20 @@
     public final boolean handleFault(T ctx) {
         methodCalled("handleFault"); 
         printHandlerInfo("handleFault", isOutbound(ctx));
+
+        if (!"soapHandler4".equals(getHandlerId())) {
+            return true;
+        } 
+        
+        try {
+            SOAPMessage msg = ctx.getMessage();
+            if ("soapHandler4HandleFaultThrowsRunException".equals(msg.getSOAPBody().getFault()
+                .getFaultString())) {
+                throw new RuntimeException("soapHandler4 HandleFault throws RuntimeException");
+            }
+        } catch (SOAPException e) {
+            // do nothing
+        }
         return true;
     }
 
@@ -191,20 +205,24 @@
                 }
             } else if ("throw".equals(command)) {
                 String exceptionType = null;
+                String exceptionText = "HandleMessage throws exception";
                 if (strtok.hasMoreTokens()) {
                     exceptionType = strtok.nextToken();
                 }
+                if (strtok.hasMoreTokens()) {
+                    exceptionText = strtok.nextToken();
+                }
                 if (exceptionType != null && !outbound && "inbound".equals(direction))
{
                     if ("RuntimeException".equals(exceptionType)) {
-                        throw new RuntimeException("HandleMessage throws RuntimeException
exception");
+                        throw new RuntimeException(exceptionText);
                     } else if ("ProtocolException".equals(exceptionType)) {
-                        throw new ProtocolException("HandleMessage throws ProtocolException
exception");
+                        throw new ProtocolException(exceptionText);
                     }
                 } else if (exceptionType != null && outbound && "outbound".equals(direction))
{
                     if ("RuntimeException".equals(exceptionType)) {
-                        throw new RuntimeException("HandleMessage throws RuntimeException
exception");
+                        throw new RuntimeException(exceptionText);
                     } else if ("ProtocolException".equals(exceptionType)) {
-                        throw new ProtocolException("HandleMessage throws ProtocolException
exception");
+                        throw new ProtocolException(exceptionText);
                     }
                 }
              



Mime
View raw message