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/02/02 07:05:37 UTC

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

Author: jliu
Date: Thu Feb  1 22:05:36 2007
New Revision: 502515

URL: http://svn.apache.org/viewvc?view=rev&rev=502515
Log:
CXF-333 patch from Unreal

Removed:
    incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/StreamHandler.java
    incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/StreamHandlerInterceptor.java
    incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/StreamMessageContext.java
    incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/StreamMessageContextImpl.java
Modified:
    incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java
    incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/HandlerChainInvokerTest.java
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerInvocationTest.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=502515&r1=502514&r2=502515
==============================================================================
--- 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 Thu Feb  1 22:05:36 2007
@@ -46,54 +46,47 @@
 
     private static final Logger LOG = LogUtils.getL7dLogger(HandlerChainInvoker.class);
 
-    private final List<Handler> protocolHandlers = new ArrayList<Handler>(); 
-    private List<LogicalHandler> logicalHandlers  = new ArrayList<LogicalHandler>(); 
-    private final List<StreamHandler> streamHandlers  = new ArrayList<StreamHandler>(); 
-    private final List<Handler> invokedHandlers  = new ArrayList<Handler>(); 
-    private final List<Handler> closeHandlers  = new ArrayList<Handler>(); 
+    private final List<Handler> protocolHandlers = new ArrayList<Handler>();
+    private List<LogicalHandler> logicalHandlers  = new ArrayList<LogicalHandler>();
+    private final List<Handler> invokedHandlers  = new ArrayList<Handler>();
+    private final List<Handler> closeHandlers  = new ArrayList<Handler>();
 
-    private boolean outbound; 
-    private boolean responseExpected = true; 
+    private boolean outbound;
+    private boolean responseExpected = true;
     private boolean faultExpected;
-    private boolean handlerProcessingAborted; 
-    private boolean closed;  
+    private boolean handlerProcessingAborted;
+    private boolean closed;
     private Exception fault;
     private MessageContext logicalMessageContext;
     private MessageContext protocolMessageContext;
-    
+
     public HandlerChainInvoker(List<Handler> hc) {
         this(hc, true);
-    }    
+    }
 
     public HandlerChainInvoker(List<Handler> hc, boolean isOutbound) {
         if (LOG.isLoggable(Level.FINE)) {
             LOG.log(Level.FINE, "invoker for chain size: " + (hc != null ? hc.size() : 0));
         }
-        
-        if (hc != null) { 
-            for (Handler h : hc) { 
-                if (h instanceof LogicalHandler) {                    
+
+        if (hc != null) {
+            for (Handler h : hc) {
+                if (h instanceof LogicalHandler) {
                     logicalHandlers.add((LogicalHandler)h);
-                } else if (h instanceof StreamHandler) {
-                    streamHandlers.add((StreamHandler)h); 
-                } else { 
+                } else {
                     protocolHandlers.add(h);
                 }
             }
         }
         outbound = isOutbound;
     }
-    
-    public List<LogicalHandler> getLogicalHandlers() { 
-        return logicalHandlers;
-    } 
 
-    public List<Handler> getProtocolHandlers() { 
-        return protocolHandlers;
+    public List<LogicalHandler> getLogicalHandlers() {
+        return logicalHandlers;
     }
 
-    public List<StreamHandler> getStreamHandlers() { 
-        return streamHandlers;
+    public List<Handler> getProtocolHandlers() {
+        return protocolHandlers;
     }
 
     public MessageContext getLogicalMessageContext() {
@@ -102,35 +95,31 @@
     public void setLogicalMessageContext(MessageContext mc) {
         logicalMessageContext = mc;
     }
-    
+
     public MessageContext getProtocolMessageContext() {
         return protocolMessageContext;
     }
     public void setProtocolMessageContext(MessageContext mc) {
         protocolMessageContext = mc;
     }
-    
-    public boolean invokeLogicalHandlers(boolean requestor, LogicalMessageContext context) { 
+
+    public boolean invokeLogicalHandlers(boolean requestor, LogicalMessageContext context) {
         // objectCtx.setRequestorRole(requestor);
-        context.put(MessageContext.MESSAGE_OUTBOUND_PROPERTY, isOutbound()); 
-        return invokeHandlerChain(logicalHandlers, context); 
+        context.put(MessageContext.MESSAGE_OUTBOUND_PROPERTY, isOutbound());
+        return invokeHandlerChain(logicalHandlers, context);
 
     }
-        
+
     public boolean invokeProtocolHandlers(boolean requestor, MessageContext context) {
         // WrappedMessageContext context = new WrappedMessageContext(message);
         // bindingContext.put(ObjectMessageContext.REQUESTOR_ROLE_PROPERTY, requestor);
-        context.put(MessageContext.MESSAGE_OUTBOUND_PROPERTY, isOutbound()); 
+        context.put(MessageContext.MESSAGE_OUTBOUND_PROPERTY, isOutbound());
 
         return invokeHandlerChain(protocolHandlers, context);
-    }    
-       
-    public void closeHandlers() {
-        //nothing to do
     }
-    
+
     public void setResponseExpected(boolean expected) {
-        responseExpected = expected; 
+        responseExpected = expected;
     }
 
     public boolean isResponseExpected() {
@@ -139,12 +128,12 @@
 
     public boolean isOutbound() {
         return outbound;
-    }    
-    
-    public boolean isInbound() { 
+    }
+
+    public boolean isInbound() {
         return !outbound;
     }
-    
+
     public void setInbound() {
         outbound = false;
     }
@@ -155,14 +144,14 @@
 
 
     public boolean faultRaised() {
-        return null != fault  || faultExpected; 
+        return null != fault  || faultExpected;
     }
-    
+
     public Exception getFault() {
         return fault;
     }
 
-    public void setFault(boolean fe) { 
+    public void setFault(boolean fe) {
         faultExpected = fe;
     }
 
@@ -190,13 +179,13 @@
      *
      */
     public boolean isClosed() {
-        return closed; 
+        return closed;
     }
-    
+
     /**
      * Allows an the logical handler chain for one invoker to be used
      * as an alternate chain for another.
-     * 
+     *
      * @param invoker the invoker encalsulting the alternate logical handler
      * chain
      */
@@ -204,12 +193,12 @@
         logicalHandlers = invoker.getLogicalHandlers();
     }
 
-    List getInvokedHandlers() { 
+    List getInvokedHandlers() {
         return Collections.unmodifiableList(invokedHandlers);
     }
-    
+
     private <T extends Handler> void invokeClose(List<T> handlers, MessageContext context) {
-        handlers = reverseHandlerChain(handlers); 
+        handlers = reverseHandlerChain(handlers);
         for (Handler h : handlers) {
             if (closeHandlers.contains(h)) {
                 h.close(context);
@@ -217,9 +206,9 @@
         }
     }
 
-    private boolean invokeHandlerChain(List<? extends Handler> handlerChain, MessageContext ctx) { 
+    private boolean invokeHandlerChain(List<? extends Handler> handlerChain, MessageContext ctx) {
         if (handlerChain.isEmpty()) {
-            LOG.log(Level.FINEST, "no handlers registered");        
+            LOG.log(Level.FINEST, "no handlers registered");
             return true;
         }
 
@@ -228,17 +217,17 @@
         }
 
         if (LOG.isLoggable(Level.FINE)) {
-            LOG.log(Level.FINE, "invoking handlers, direction: " + (outbound ? "outbound" : "inbound"));  
+            LOG.log(Level.FINE, "invoking handlers, direction: " + (outbound ? "outbound" : "inbound"));
         }
         setMessageOutboundProperty(ctx);
 
         if (!outbound) {
             handlerChain = reverseHandlerChain(handlerChain);
         }
-        
-        boolean continueProcessing = true; 
-        
-        WebServiceContextImpl.setMessageContext(ctx); 
+
+        boolean continueProcessing = true;
+
+        WebServiceContextImpl.setMessageContext(ctx);
 
         if (!faultRaised()) {
             continueProcessing = invokeHandleMessage(handlerChain, ctx);
@@ -252,79 +241,112 @@
             // the next set on handlers and they will be processing in
             // the correct direction.  It would be good refactor it
             // and control all of the processing here.
-            changeMessageDirection(ctx); 
+            changeMessageDirection(ctx);
             handlerProcessingAborted = true;
-            
-            //TODO: reverse chain, call handlerMessage or close            
+
+            //TODO: reverse chain, call handlerMessage or close
         }
-        return continueProcessing;        
-    }    
+        return continueProcessing;
+    }
 
     @SuppressWarnings("unchecked")
     private boolean invokeHandleFault(List<? extends Handler> handlerChain, MessageContext ctx) {
-        
-        boolean continueProcessing = true; 
+
+        boolean continueProcessing = true;
 
         try {
             for (Handler h : handlerChain) {
                 if (invokeThisHandler(h)) {
                     closeHandlers.add(h);
+                    markHandlerInvoked(h);
                     continueProcessing = h.handleFault(ctx);
                 }
                 if (!continueProcessing) {
                     break;
                 }
-                markHandlerInvoked(h); 
+
             }
         } catch (RuntimeException e) {
             LOG.log(Level.WARNING, "HANDLER_RAISED_RUNTIME_EXCEPTION", e);
-            continueProcessing = false; 
+            continueProcessing = false;
             closed = true;
         }
         return continueProcessing;
-    } 
+    }
 
 
     @SuppressWarnings("unchecked")
-    private boolean invokeHandleMessage(List<? extends Handler> handlerChain, MessageContext ctx) { 
+    private boolean invokeHandleMessage(List<? extends Handler> handlerChain, MessageContext ctx) {
 
-        boolean continueProcessing = true; 
+        boolean continueProcessing = true;
         try {
             for (Handler h : handlerChain) {
                 if (invokeThisHandler(h)) {
                     closeHandlers.add(h);
+                    markHandlerInvoked(h);
                     continueProcessing = h.handleMessage(ctx);
                 }
                 if (!continueProcessing) {
                     callReversedHandlers(ctx);
                     break;
                 }
-                markHandlerInvoked(h); 
             }
         } catch (ProtocolException e) {
             LOG.log(Level.FINE, "handleMessage raised exception", e);
+            if (responseExpected) {
+                if (logicalMessageContext != null) {
+                    logicalMessageContext.put(MessageContext.MESSAGE_OUTBOUND_PROPERTY, !isOutbound());
+                }
+                if (protocolMessageContext != null) {
+                    protocolMessageContext.put(MessageContext.MESSAGE_OUTBOUND_PROPERTY, !isOutbound());
+                }
+                callReversedHandlesFault();
+            }
             continueProcessing = false;
+            closeHandlers();
             setFault(e);
+            throw e;
         } catch (RuntimeException e) {
             LOG.log(Level.WARNING, "HANDLER_RAISED_RUNTIME_EXCEPTION", e);
-            continueProcessing = false; 
-            closed = true;
+            continueProcessing = false;
+            closeHandlers();
+
+            throw e;
         }
         return continueProcessing;
-    } 
+    }
+
+    // REVISIT
+    // handleFault() return true\false, throw Exception.
+    private boolean callReversedHandlesFault() {
+        int index = invokedHandlers.size() - 2;
+        while (index >= 0) {
+            Handler handler = invokedHandlers.get(index);
+            if (handler instanceof LogicalHandler) {
+                if (Boolean.FALSE.equals(handler.
+                                         handleFault(logicalMessageContext))) {
+                    return false;
+                }
+            } else {
+                if (Boolean.FALSE.equals(handler.
+                                         handleFault(protocolMessageContext))) {
+                    return false;
+                }
+            }
+            index--;
+        }
+        return true;
+    }
 
     @SuppressWarnings("unchecked")
     private boolean callReversedHandlers(MessageContext ctx) {
-        int index = invokedHandlers.size() - 1;
+        int index = invokedHandlers.size() - 2;
         if (responseExpected) {
             while (index >= 0) {
-//                if (Boolean.FALSE.equals(invokedHandlers.get(index).handleMessage(ctx))) {
-//                    return false;
-//                }
                 Handler handler = invokedHandlers.get(index);
                 if (handler instanceof LogicalHandler) {
                     if (Boolean.FALSE.equals(handler.
-                                             handleMessage(logicalMessageContext))) { 
+                                             handleMessage(logicalMessageContext))) {
                         return false;
                     }
                 } else {
@@ -336,11 +358,10 @@
                 index--;
             }
         }
-        closeHandlers(ctx);
         return true;
     }
 
-    private void closeHandlers(MessageContext ctx) {
+    private void closeHandlers() {
         int index = invokedHandlers.size() - 1;
         while (index >= 0) {
             Handler handler = invokedHandlers.get(index);
@@ -349,10 +370,12 @@
             } else {
                 handler.close(protocolMessageContext);
             }
+            invokedHandlers.remove(index);
             index--;
         }
+        closed = true;
     }
-    
+
     private boolean invokeThisHandler(Handler h) {
         boolean ret = true;
         // when handler processing has been aborted, only invoked on
@@ -364,34 +387,34 @@
         if (ret && LOG.isLoggable(Level.FINE)) {
             LOG.log(Level.FINE, "invoking handler of type " + h.getClass().getName());
         }
-        return ret; 
+        return ret;
     }
 
 
     private void markHandlerInvoked(Handler h) {
-        if (!invokedHandlers.contains(h)) { 
+        if (!invokedHandlers.contains(h)) {
             invokedHandlers.add(h);
         }
     }
 
-    private void changeMessageDirection(MessageContext context) { 
+    private void changeMessageDirection(MessageContext context) {
         outbound = !outbound;
         setMessageOutboundProperty(context);
-        // context.put(ObjectMessageContext.MESSAGE_INPUT, Boolean.TRUE);   
+        // context.put(ObjectMessageContext.MESSAGE_INPUT, Boolean.TRUE);
     }
-    
+
     private void setMessageOutboundProperty(MessageContext context) {
         context.put(MessageContext.MESSAGE_OUTBOUND_PROPERTY, this.outbound);
     }
-    
+
     private <T extends Handler> List<T> reverseHandlerChain(List<T> handlerChain) {
         List<T> reversedHandlerChain = new ArrayList<T>();
         reversedHandlerChain.addAll(handlerChain);
         Collections.reverse(reversedHandlerChain);
         return reversedHandlerChain;
     }
-    
-    protected final void setFault(Exception ex) { 
+
+    protected final void setFault(Exception ex) {
         /*
         context.put(ObjectMessageContext.METHOD_FAULT, ex);
         context.setScope(ObjectMessageContext.METHOD_FAULT, MessageContext.Scope.HANDLER);

Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/HandlerChainInvokerTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/HandlerChainInvokerTest.java?view=diff&rev=502515&r1=502514&r2=502515
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/HandlerChainInvokerTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/HandlerChainInvokerTest.java Thu Feb  1 22:05:36 2007
@@ -46,7 +46,6 @@
     Message message = new MessageImpl();
     LogicalMessageContext lmc = new LogicalMessageContextImpl(message);
     MessageContext pmc = new WrappedMessageContext(message);
-    StreamMessageContext smc = new StreamMessageContextImpl(message);
 
     TestLogicalHandler[] logicalHandlers = new TestLogicalHandler[HANDLER_COUNT];
     TestProtocolHandler[] protocolHandlers = new TestProtocolHandler[HANDLER_COUNT];
@@ -151,7 +150,7 @@
         ret = invoker.invokeLogicalHandlers(false, lmc);
         assertTrue(ret);
         assertFalse(invoker.isClosed());
-        assertEquals(1, logicalHandlers[0].getHandleMessageCount());
+        assertEquals(2, logicalHandlers[0].getHandleMessageCount());
         assertEquals(0, logicalHandlers[1].getHandleMessageCount());
         assertTrue(invoker.isInbound());
     }
@@ -181,16 +180,23 @@
         ProtocolException pe = new ProtocolException("banzai");
         logicalHandlers[1].setException(pe);
 
-        boolean continueProcessing = invoker.invokeLogicalHandlers(false, lmc);
-        assertFalse(continueProcessing);
+        boolean continueProcessing = true;
+        try {
+            continueProcessing = invoker.invokeLogicalHandlers(false, lmc);
+            fail("did not get expected exception");
+        } catch (ProtocolException e) {
+            assertEquals("banzai", e.getMessage());
+        }
         assertTrue(invoker.faultRaised());
 
         assertEquals(1, logicalHandlers[0].getHandleMessageCount());
         assertEquals(1, logicalHandlers[1].getHandleMessageCount());
+
         continueProcessing = invoker.invokeLogicalHandlers(false, lmc);
-        assertTrue(continueProcessing);
+
+        assertFalse(continueProcessing);
         assertTrue(invoker.faultRaised());
-        assertFalse(invoker.isClosed());
+        assertTrue(invoker.isClosed());
         assertSame(pe, invoker.getFault());
 
         assertEquals(1, logicalHandlers[0].getHandleMessageCount());
@@ -210,8 +216,13 @@
         RuntimeException re = new RuntimeException("banzai");
         logicalHandlers[1].setException(re);
 
-        boolean continueProcessing = invoker.invokeLogicalHandlers(false, lmc);
-        assertFalse(continueProcessing);
+        boolean continueProcessing = true;
+        try {
+            continueProcessing = invoker.invokeLogicalHandlers(false, lmc);
+            fail("did not get expected exception");
+        } catch (RuntimeException e) {
+            assertEquals("banzai", e.getMessage());
+        }
         assertFalse(invoker.faultRaised());
         assertTrue(invoker.isClosed());
 
@@ -322,8 +333,8 @@
         doInvokeProtocolHandlers(true);
         invoker.invokeLogicalHandlers(true, lmc);
 
-        assertEquals(2, invoker.getInvokedHandlers().size());
-        assertTrue(!invoker.getInvokedHandlers().contains(logicalHandlers[1]));
+        assertEquals(3, invoker.getInvokedHandlers().size());
+//        assertTrue(!invoker.getInvokedHandlers().contains(logicalHandlers[1]));
         assertTrue(invoker.getInvokedHandlers().contains(protocolHandlers[0]));
         assertTrue(invoker.getInvokedHandlers().contains(protocolHandlers[1]));
         assertEquals(0, logicalHandlers[0].getHandleMessageCount());
@@ -335,10 +346,10 @@
         // now, invoke handlers on outbound leg
         invoker.invokeLogicalHandlers(true, lmc);
 
-        assertEquals(1, logicalHandlers[1].getHandleMessageCount());
+        assertEquals(2, logicalHandlers[1].getHandleMessageCount());
         assertEquals(0, logicalHandlers[0].getHandleMessageCount());
-        assertEquals(2, protocolHandlers[0].getHandleMessageCount());
-        assertEquals(2, protocolHandlers[1].getHandleMessageCount());
+        assertEquals(3, protocolHandlers[0].getHandleMessageCount());
+        assertEquals(3, protocolHandlers[1].getHandleMessageCount());
 
     }
 

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=502515&r1=502514&r2=502515
==============================================================================
--- 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 Thu Feb  1 22:05:36 2007
@@ -198,7 +198,7 @@
     }
 
     //TODO: commented out due to CXF-333
-    public void xtestLogicalHandlerThrowsProtocolExceptionClientSide() throws Exception {
+    public void testLogicalHandlerThrowsProtocolExceptionClientSide() throws Exception {
 
         final String clientHandlerMessage = "handler1 client side";
 
@@ -219,6 +219,7 @@
             assertEquals(clientHandlerMessage, e.getMessage());
         }
         assertTrue(!handler2.isHandleFaultInvoked());
+        
         assertTrue(handler1.isCloseInvoked());
         assertTrue(!handler2.isCloseInvoked());
     }