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

svn commit: r1005784 - in /cxf/trunk/rt/ws/addr/src: main/java/org/apache/cxf/ws/addressing/soap/ test/java/org/apache/cxf/ws/addressing/soap/

Author: sergeyb
Date: Fri Oct  8 11:31:30 2010
New Revision: 1005784

URL: http://svn.apache.org/viewvc?rev=1005784&view=rev
Log:
[CXF-3052] : Optional support for decoupled faults in case of oneway requests

Added:
    cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/OneWayDecoupledFaultHandler.java   (with props)
    cxf/trunk/rt/ws/addr/src/test/java/org/apache/cxf/ws/addressing/soap/OneWayDecoupledFaultHandlerTest.java   (with props)
Modified:
    cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java

Modified: cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java?rev=1005784&r1=1005783&r2=1005784&view=diff
==============================================================================
--- cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java (original)
+++ cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java Fri Oct  8 11:31:30 2010
@@ -75,7 +75,9 @@ public class MAPCodec extends AbstractSo
 
     private static final Logger LOG = LogUtils.getL7dLogger(MAPCodec.class);
     private static final String IS_REFERENCE_PARAM_ATTR_NAME = "IsReferenceParameter";
-
+    private static final String ONE_WAY_DECOUPLED_FAULT_SUPPORT = 
+        "org.apache.cxf.ws.addressing.oneway.decoupled_fault_support";
+    
     /**
      * REVISIT: map usage that the *same* interceptor instance 
      * is used in all chains.
@@ -121,8 +123,8 @@ public class MAPCodec extends AbstractSo
      * @param message the messsage message
      */
     public void handleFault(SoapMessage message) {
-        AddressingProperties maps = ContextUtils.retrieveMAPs(message, false, true, false);
         if (!message.getExchange().isOneWay()) {
+            AddressingProperties maps = ContextUtils.retrieveMAPs(message, false, true, false);
             if (ContextUtils.isRequestor(message)
                 && maps != null) {
                 //fault occurred trying to send the message, remove it
@@ -147,6 +149,10 @@ public class MAPCodec extends AbstractSo
                     }
                 }
             }
+        } else if (MessageUtils.getContextualBoolean(message, 
+                                                     ONE_WAY_DECOUPLED_FAULT_SUPPORT, 
+                                                     false)) {
+            new OneWayDecoupledFaultHandler().handleFault(message);
         }
     }
 

Added: cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/OneWayDecoupledFaultHandler.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/OneWayDecoupledFaultHandler.java?rev=1005784&view=auto
==============================================================================
--- cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/OneWayDecoupledFaultHandler.java (added)
+++ cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/OneWayDecoupledFaultHandler.java Fri Oct  8 11:31:30 2010
@@ -0,0 +1,78 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.ws.addressing.soap;
+
+import org.apache.cxf.binding.soap.SoapMessage;
+import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
+import org.apache.cxf.message.Exchange;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.transport.Destination;
+import org.apache.cxf.ws.addressing.AddressingPropertiesImpl;
+import org.apache.cxf.ws.addressing.ContextUtils;
+import org.apache.cxf.ws.addressing.EndpointReferenceType;
+
+/**
+ * Utility interceptor for dealing with faults occurred during processing 
+ * the one way requests with WSA FaultTo EPR pointing to a decoupled destination.
+ * 
+ * Note that this interceptor is not currently installed by default. 
+ * It can be installed using @InInterceptors and @OutInterceptors
+ * annotations or explicitly added to the list of interceptors. 
+ */
+public class OneWayDecoupledFaultHandler extends AbstractSoapInterceptor {
+
+    public OneWayDecoupledFaultHandler() {
+        super(Phase.PRE_PROTOCOL);
+        addBefore(MAPCodec.class.getName());
+    } 
+
+    public void handleMessage(SoapMessage message) {
+        // complete
+    }
+
+    // Ideally, this code will instead be executed as part of the Fault chain
+    // but at the moment PhaseInterceptorChain needs to be tricked that this is
+    // a two way request for a fault chain be invoked
+    public void handleFault(SoapMessage message) {
+        if (message.getExchange().isOneWay()
+            && !ContextUtils.isRequestor(message)) {
+            
+            Exchange exchange = message.getExchange();
+            Message inMessage = exchange.getInMessage();
+            final AddressingPropertiesImpl maps = 
+                ContextUtils.retrieveMAPs(inMessage, false, false, true);
+            
+            if (maps != null && !ContextUtils.isGenericAddress(maps.getFaultTo())) {
+                exchange.setOneWay(false);
+                exchange.setOutMessage(message);
+                
+                Destination destination = createDecoupledDestination(
+                                               exchange, maps.getFaultTo());
+                exchange.setDestination(destination);
+            }
+            
+        }
+    }
+    
+    protected Destination createDecoupledDestination(Exchange exchange, EndpointReferenceType epr) {
+        return ContextUtils.createDecoupledDestination(exchange, epr);
+    }
+}

Propchange: cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/OneWayDecoupledFaultHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/OneWayDecoupledFaultHandler.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/rt/ws/addr/src/test/java/org/apache/cxf/ws/addressing/soap/OneWayDecoupledFaultHandlerTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/ws/addr/src/test/java/org/apache/cxf/ws/addressing/soap/OneWayDecoupledFaultHandlerTest.java?rev=1005784&view=auto
==============================================================================
--- cxf/trunk/rt/ws/addr/src/test/java/org/apache/cxf/ws/addressing/soap/OneWayDecoupledFaultHandlerTest.java (added)
+++ cxf/trunk/rt/ws/addr/src/test/java/org/apache/cxf/ws/addressing/soap/OneWayDecoupledFaultHandlerTest.java Fri Oct  8 11:31:30 2010
@@ -0,0 +1,70 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.ws.addressing.soap;
+
+import org.apache.cxf.binding.soap.SoapMessage;
+import org.apache.cxf.message.Exchange;
+import org.apache.cxf.message.ExchangeImpl;
+import org.apache.cxf.message.MessageImpl;
+import org.apache.cxf.transport.Destination;
+import org.apache.cxf.ws.addressing.AddressingProperties;
+import org.apache.cxf.ws.addressing.AddressingPropertiesImpl;
+import org.apache.cxf.ws.addressing.AttributedURIType;
+import org.apache.cxf.ws.addressing.ContextUtils;
+import org.apache.cxf.ws.addressing.EndpointReferenceType;
+import org.easymock.EasyMock;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class OneWayDecoupledFaultHandlerTest extends Assert {
+
+    @Test
+    public void testOnewayFault() {
+        OneWayDecoupledFaultHandler handler = new OneWayDecoupledFaultHandler() {
+            protected Destination createDecoupledDestination(Exchange exchange, EndpointReferenceType epr) {
+                assertEquals("http://bar", epr.getAddress().getValue());
+                return EasyMock.createMock(Destination.class);
+            }    
+        };
+        
+        SoapMessage message = new SoapMessage(new MessageImpl());
+        
+        AddressingProperties maps = new AddressingPropertiesImpl();
+        
+        EndpointReferenceType faultTo = new EndpointReferenceType();
+        faultTo.setAddress(new AttributedURIType());
+        faultTo.getAddress().setValue("http://bar");
+        maps.setFaultTo(faultTo);
+        message.put(ContextUtils.getMAPProperty(false, false, false), 
+                    maps);
+        
+        Exchange exchange = new ExchangeImpl();
+        message.setExchange(exchange);
+        exchange.setInMessage(message);
+        exchange.setOneWay(true);
+        
+        handler.handleFault(message);
+        
+        assertFalse(exchange.isOneWay());
+        assertSame(message, exchange.getOutMessage());
+        assertNotNull(exchange.getDestination());
+    }
+    
+}

Propchange: cxf/trunk/rt/ws/addr/src/test/java/org/apache/cxf/ws/addressing/soap/OneWayDecoupledFaultHandlerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/ws/addr/src/test/java/org/apache/cxf/ws/addressing/soap/OneWayDecoupledFaultHandlerTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date