From ec8538e7c5db62ff475bb5ab9e517040e1a4655f Mon Sep 17 00:00:00 2001 From: Grzegorz Grzybek Date: Thu, 20 Mar 2014 14:52:05 +0100 Subject: [PATCH] [CXF-5629] Do not try to write twice to output stream in robust one-way --- .../OneWayProcessorInterceptor.java | 8 +---- .../cxf/phase/PhaseInterceptorChain.java | 3 ++ .../interceptor/InterceptorFaultTest.java | 34 +++++++++++++++++++ 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/org/apache/cxf/interceptor/OneWayProcessorInterceptor.java b/core/src/main/java/org/apache/cxf/interceptor/OneWayProcessorInterceptor.java index 355a7217f89..e63c76d0afc 100644 --- a/core/src/main/java/org/apache/cxf/interceptor/OneWayProcessorInterceptor.java +++ b/core/src/main/java/org/apache/cxf/interceptor/OneWayProcessorInterceptor.java @@ -36,7 +36,6 @@ import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.apache.cxf.transport.Conduit; -import org.apache.cxf.transport.MessageObserver; import org.apache.cxf.workqueue.WorkQueueManager; @@ -102,12 +101,7 @@ public void handleMessage(Message message) throws Fault { chain.pause(); chain.resume(); if (message.getContent(Exception.class) != null) { - // return the fault over the response fault channel - MessageObserver faultObserver = chain.getFaultObserver(); - if (faultObserver != null) { - message.getExchange().setOneWay(false); - faultObserver.onMessage(message); - } + // CXF-5629 fault has been delivered alread in resume() return; } } diff --git a/core/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java b/core/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java index 06d8eded512..8ad2dc8f585 100644 --- a/core/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java +++ b/core/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java @@ -365,6 +365,9 @@ public synchronized boolean doIntercept(Message message) { } if (faultObserver != null && !isOneWay) { + // CXF-5629. when exchange is one way and robust, it becomes req-resp in order to + // send the fault + message.getExchange().setOneWay(false); faultObserver.onMessage(message); } } diff --git a/systests/uncategorized/src/test/java/org/apache/cxf/systest/interceptor/InterceptorFaultTest.java b/systests/uncategorized/src/test/java/org/apache/cxf/systest/interceptor/InterceptorFaultTest.java index 3b1d10d9058..14545c8f924 100644 --- a/systests/uncategorized/src/test/java/org/apache/cxf/systest/interceptor/InterceptorFaultTest.java +++ b/systests/uncategorized/src/test/java/org/apache/cxf/systest/interceptor/InterceptorFaultTest.java @@ -19,6 +19,8 @@ package org.apache.cxf.systest.interceptor; +import java.io.PrintWriter; +import java.io.StringWriter; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Collections; @@ -44,6 +46,8 @@ import org.apache.cxf.greeter_control.GreeterService; import org.apache.cxf.greeter_control.PingMeFault; import org.apache.cxf.greeter_control.types.FaultLocation; +import org.apache.cxf.interceptor.LoggingInInterceptor; +import org.apache.cxf.message.Message; import org.apache.cxf.phase.Phase; import org.apache.cxf.phase.PhaseComparator; import org.apache.cxf.phase.PhaseManager; @@ -175,6 +179,36 @@ public void testRobustWithoutAddressing() throws Exception { testWithoutAddressing(true); } + @Test + public void testRobustFailWithoutAddressingInUserLogicalPhase() throws Exception { + + setupGreeter("org/apache/cxf/systest/interceptor/no-addr.xml", false); + + control.setRobustInOnlyMode(true); + + // behaviour is identicial for all phases + FaultLocation location = new org.apache.cxf.greeter_control.types.ObjectFactory() + .createFaultLocation(); + location.setPhase("user-logical"); + + control.setFaultLocation(location); + + try { + // writer to grab the content of soap fault. + // robust is not yet used at client's side, but I think it should + StringWriter writer = new StringWriter(); + ((Client)greeter).getInInterceptors().add(new LoggingInInterceptor()); + ((LoggingInInterceptor)greeterBus.getInInterceptors().get(0)).setPrintWriter(new PrintWriter(writer)); + // it should tell CXF to convert one-way robust out faults into real SoapFaultException + ((Client)greeter).getEndpoint().put(Message.ROBUST_ONEWAY, true); + greeter.greetMeOneWay("oneway"); + fail("Oneway operation unexpectedly succeded for phase " + location.getPhase()); + } catch (WebServiceException ex) { + // actually it should be instance of javax.xml.ws.soap.SOAPFaultException + assertEquals(FAULT_MESSAGE, ex.getMessage()); + } + } + private void testWithoutAddressing(boolean robust) throws Exception { setupGreeter("org/apache/cxf/systest/interceptor/no-addr.xml", false);