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