You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by jl...@apache.org on 2007/05/09 13:30:08 UTC

svn commit: r536490 - in /incubator/cxf/trunk: rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/ systests/src/test/java/org/apache/cxf/systest/handlers/

Author: jliu
Date: Wed May  9 04:30:07 2007
New Revision: 536490

URL: http://svn.apache.org/viewvc?view=rev&rev=536490
Log:
Support for soap handler handleMessage returns false on server side outbound and client side inbound. In this case, normal handler message processing stops (i.e next handler is not getting called), but the interceptor chain still continues, the message is dispatched.

Modified:
    incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.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/HandlerTestImpl.java
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/TestHandler.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/soap/SOAPHandlerInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java?view=diff&rev=536490&r1=536489&r2=536490
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java Wed May  9 04:30:07 2007
@@ -126,41 +126,71 @@
         invoker.setProtocolMessageContext(context);
 
         if (!invoker.invokeProtocolHandlers(isRequestor(message), context)) {
-            message.getInterceptorChain().abort();
-            Endpoint e = message.getExchange().get(Endpoint.class);
-            Message responseMsg = e.getBinding().createMessage();            
- 
-            MessageObserver observer = (MessageObserver)message.getExchange().get(MessageObserver.class);
-            if (observer != null) {
-                //client side outbound, the request message becomes the response message
-                message.getExchange().setInMessage(responseMsg);
-                SOAPMessage soapMessage = ((SOAPMessageContext)context).getMessage();
+            handleAbort(message, context);
+        }
+  
+        onCompletion(message);
+    }
+    
+    private void handleAbort(SoapMessage message, MessageContext context) {
+        if (isRequestor(message)) {
+            // client side outbound
+            if (getInvoker(message).isOutbound()) {
+                message.getInterceptorChain().abort();
+                Endpoint e = message.getExchange().get(Endpoint.class);
+                Message responseMsg = e.getBinding().createMessage();
+
+                MessageObserver observer = (MessageObserver)message.getExchange().get(MessageObserver.class);
+                if (observer != null) {
+                    // the request message becomes the response message
+                    message.getExchange().setInMessage(responseMsg);
+                    SOAPMessage soapMessage = ((SOAPMessageContext)context).getMessage();
+
+                    if (soapMessage != null) {
+                        responseMsg.setContent(SOAPMessage.class, soapMessage);
+                        XMLStreamReader xmlReader = createXMLStreamReaderFromSOAPMessage(soapMessage);
+                        responseMsg.setContent(XMLStreamReader.class, xmlReader);
+                    }
+                    responseMsg.put(PhaseInterceptorChain.STARTING_AFTER_INTERCEPTOR_ID,
+                                    SOAPHandlerInterceptor.class.getName());
+                    observer.onMessage(responseMsg);
+                }
+            } else {
+                // client side inbound - Normal handler message processing
+                // stops,, but still continue the outbound interceptor chain, dispatch the message
+                System.out.println("SOAP Handler handleMessage returns false on client inbound, aborting");
+            }
+        } else {
+            if (!getInvoker(message).isOutbound()) {
+
+                // server side outbound
+                message.getInterceptorChain().abort();
+                Endpoint e = message.getExchange().get(Endpoint.class);
+                Message responseMsg = e.getBinding().createMessage();
+                if (!message.getExchange().isOneWay()) {
+                    // server side inbound
+                    message.getExchange().setOutMessage(responseMsg);
+                    SOAPMessage soapMessage = ((SOAPMessageContext)context).getMessage();
 
-                if (soapMessage != null) {
                     responseMsg.setContent(SOAPMessage.class, soapMessage);
-                    XMLStreamReader xmlReader = createXMLStreamReaderFromSOAPMessage(soapMessage);
-                    responseMsg.setContent(XMLStreamReader.class, xmlReader);
+
+                    InterceptorChain chain = OutgoingChainInterceptor.getOutInterceptorChain(message
+                        .getExchange());
+                    responseMsg.setInterceptorChain(chain);
+                    // so the idea of starting interceptor chain from any
+                    // specified point does not work
+                    // well for outbound case, as many outbound interceptors
+                    // have their ending interceptors.
+                    // For example, we can not skip MessageSenderInterceptor.
+                    chain.doInterceptStartingAfter(responseMsg, SoapActionInterceptor.class.getName());
                 }
-                responseMsg.put(PhaseInterceptorChain.STARTING_AFTER_INTERCEPTOR_ID,
-                                SOAPHandlerInterceptor.class.getName());
-                observer.onMessage(responseMsg);
-            }  else if (!message.getExchange().isOneWay()) {
-                //server side inbound
-                message.getExchange().setOutMessage(responseMsg);
-                SOAPMessage soapMessage = ((SOAPMessageContext)context).getMessage();
-
-                responseMsg.setContent(SOAPMessage.class, soapMessage);
-                
-                InterceptorChain chain = OutgoingChainInterceptor.getOutInterceptorChain(message
-                    .getExchange());
-                responseMsg.setInterceptorChain(chain);
-                //so the idea of starting interceptor chain from any specified point does not work
-                //well for outbound case, as many outbound interceptors have their ending interceptors.
-                //For example, we can not skip MessageSenderInterceptor.               
-                chain.doInterceptStartingAfter(responseMsg, SoapActionInterceptor.class.getName());
-            } 
-        }  
-        onCompletion(message);
+
+            } else {
+                // server side inbound - Normal handler message processing
+                // stops, but still continue the inbound interceptor chain, dispatch the message
+                System.out.println("SOAP Handler handleMessage returns false on server inbound, aborting");
+            }
+        }
     }
     
     @Override

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=536490&r1=536489&r2=536490
==============================================================================
--- 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  9 04:30:07 2007
@@ -206,11 +206,11 @@
 
     
     @Test
-    public void testLogicalHandlerHandleMessageReturnsFalseServerSide() throws PingException {
+    public void testLogicalHandlerHandleMessageReturnsFalseInboundServerSide() throws PingException {
         String[] expectedHandlers = {"soapHandler4", "soapHandler3", "handler2", 
                                      "handler2", "soapHandler3", "soapHandler4"};
 
-        List<String> resp = handlerTest.pingWithArgs("handler2 inbound stop");
+        List<String> resp = handlerTest.pingWithArgs("handler2 inbound stop");     
 
         assertEquals(expectedHandlers.length, resp.size());
 
@@ -221,7 +221,7 @@
     }
     
     @Test
-    public void testSOAPHandlerHandleMessageReturnsFalseServerSide() throws PingException {
+    public void testSOAPHandlerHandleMessageReturnsFalseInboundServerSide() throws PingException {
         String[] expectedHandlers = {"soapHandler4", "soapHandler3",
                                      "soapHandler3", "soapHandler4"};
         List<String> resp = handlerTest.pingWithArgs("soapHandler3 inbound stop");
@@ -232,6 +232,20 @@
         }
     }
 
+    
+    @Test
+    public void testSOAPHandlerHandleMessageReturnsFalseOutboundServerSide() throws PingException {
+        String[] expectedHandlers = {"soapHandler3 outbound stop", "soapHandler4", "soapHandler3", "handler2",
+                                     "handler1", "handler1", "handler2", "soapHandler3"};
+        List<String> resp = handlerTest.pingWithArgs("soapHandler3 outbound stop");
+
+        assertEquals(expectedHandlers.length, resp.size());
+        int i = 0;
+        for (String expected : expectedHandlers) {
+            assertEquals(expected, resp.get(i++));
+        }
+    }
+    
     @Test
     public void testLogicalHandlerHandleMessageThrowsProtocolExceptionClientSide() throws Exception {
 
@@ -302,7 +316,7 @@
     }
 
     @Test
-    public void testSOAPHandlerHandleMessageReturnFalseClientSide() throws Exception {
+    public void testSOAPHandlerHandleMessageReturnFalseOutboundClientSide() throws Exception {
         final String clientHandlerMessage = "client side";
         TestHandler<LogicalMessageContext> handler1 = new TestHandler<LogicalMessageContext>(false);
         TestHandler<LogicalMessageContext> handler2 = new TestHandler<LogicalMessageContext>(false) {

Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerTestImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerTestImpl.java?view=diff&rev=536490&r1=536489&r2=536490
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerTestImpl.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerTestImpl.java Wed May  9 04:30:07 2007
@@ -66,7 +66,7 @@
 
         List<String> ret = new ArrayList<String>();
         ret.add(handlerCommand);
-        //ret.addAll(getHandlersInfo(context.getMessageContext()));
+        ret.addAll(getHandlersInfo(context.getMessageContext()));
 
         if (handlerCommand.contains("throw exception")) {
             PingFaultDetails details = new PingFaultDetails();

Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/TestHandler.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/TestHandler.java?view=diff&rev=536490&r1=536489&r2=536490
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/TestHandler.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/TestHandler.java Wed May  9 04:30:07 2007
@@ -116,7 +116,6 @@
                 
                 if ("stop".equals(command)) {
                     PingResponse resp = new PingResponse();
-                    getHandlerInfoList(ctx).add(getHandlerId()); 
                     resp.getHandlersInfo().addAll(getHandlerInfoList(ctx));
                     msg.setPayload(resp, jaxbCtx);
                     ret = false;
@@ -151,7 +150,7 @@
             newResp.getHandlersInfo().addAll(origResp.getHandlersInfo());
             newResp.getHandlersInfo().add(getHandlerId());
             msg.setPayload(newResp, jaxbCtx);
-        } else if (obj instanceof Ping) {
+        } else if (obj instanceof Ping || obj instanceof PingWithArgs) {
             getHandlerInfoList(ctx).add(getHandlerId());
         }
     } 

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=536490&r1=536489&r2=536490
==============================================================================
--- 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  9 04:30:07 2007
@@ -78,7 +78,7 @@
             
             if (isServerSideHandler()) {
                 if (outbound) {
-                    continueProcessing = true;
+                    continueProcessing = getReturnValue(outbound, ctx); 
                 } else {
                     continueProcessing = getReturnValue(outbound, ctx); 
                     if (!continueProcessing) {
@@ -134,11 +134,6 @@
     }
 
     private boolean getReturnValue(boolean outbound, T ctx) { 
-
-        if (outbound) {
-            return true; 
-        } 
-
         boolean ret = true;
         try {
             SOAPMessage msg  = ctx.getMessage(); 
@@ -153,15 +148,18 @@
             String namespace = body.getFirstChild().getFirstChild().getNamespaceURI(); 
             
             StringTokenizer strtok = new StringTokenizer(arg, " ");
-            String hid = strtok.nextToken();
-            String direction = strtok.nextToken();
-            String command = strtok.nextToken();
+            String hid = "";
+            String direction = "";
+            String command = "";
+            if (strtok.countTokens() == 3) {
+                hid = strtok.nextToken();
+                direction = strtok.nextToken();
+                command = strtok.nextToken();
+            }
             
-            if (getHandlerId().equals(hid)
-                && "inbound".equals(direction)) {
-                if ("stop".equals(command)) {
-
-                    // remove the incoming request body.
+            if (getHandlerId().equals(hid) && "stop".equals(command)) {
+                if (!outbound && "inbound".equals(direction)) {
+                     // remove the incoming request body.
                     Document doc = body.getOwnerDocument(); 
                     // build the SOAP response for this message 
                     //
@@ -182,10 +180,10 @@
                         }
                     }
                     ret = false;
-                } else if ("throw".equals(command)) {
-                    //throwException(strtok.nextToken());
+                } else if (outbound && "outbound".equals(direction)) {
+                    ret = false;
                 }
-            }
+            } 
 
         } catch (Exception e) {
             e.printStackTrace();