From ebc15af29ff98a6ba60a3863ccc1e65415a51ca0 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Tue, 18 Mar 2008 11:12:29 +0000 Subject: [PATCH] SWS-308 --- .../ws/client/core/WebServiceTemplate.java | 24 ++++---- .../WebServiceTemplateIntegrationTest.java | 56 ++++++++++++++----- 2 files changed, 53 insertions(+), 27 deletions(-) diff --git a/core/src/main/java/org/springframework/ws/client/core/WebServiceTemplate.java b/core/src/main/java/org/springframework/ws/client/core/WebServiceTemplate.java index 42270857..07639c1c 100644 --- a/core/src/main/java/org/springframework/ws/client/core/WebServiceTemplate.java +++ b/core/src/main/java/org/springframework/ws/client/core/WebServiceTemplate.java @@ -530,17 +530,16 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService * @throws IOException in case of I/O errors */ protected boolean hasError(WebServiceConnection connection, WebServiceMessage request) throws IOException { - if (connection.hasError()) { - // this could be a fault rather than an error - if (connection instanceof FaultAwareWebServiceConnection) { - FaultAwareWebServiceConnection faultConnection = (FaultAwareWebServiceConnection) connection; - if (faultConnection.hasFault() && request instanceof FaultAwareWebServiceMessage) { - return false; - } - } - return true; + if (!connection.hasError()) { + return false; + } + if (checkConnectionForFault && connection instanceof FaultAwareWebServiceConnection) { + FaultAwareWebServiceConnection faultConnection = (FaultAwareWebServiceConnection) connection; + return !(faultConnection.hasFault() && request instanceof FaultAwareWebServiceMessage); + } + else { + return checkConnectionForFault; } - return false; } /** @@ -673,7 +672,7 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService private final WebServiceMessageCallback callback; - public WebServiceMessageCallbackMessageExtractor(WebServiceMessageCallback callback) { + private WebServiceMessageCallbackMessageExtractor(WebServiceMessageCallback callback) { this.callback = callback; } @@ -688,7 +687,7 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService private final SourceExtractor sourceExtractor; - public SourceExtractorMessageExtractor(SourceExtractor sourceExtractor) { + private SourceExtractorMessageExtractor(SourceExtractor sourceExtractor) { this.sourceExtractor = sourceExtractor; } @@ -697,5 +696,4 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService } } - } diff --git a/core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateIntegrationTest.java b/core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateIntegrationTest.java index dbbb36e4..77c14def 100644 --- a/core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateIntegrationTest.java +++ b/core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateIntegrationTest.java @@ -44,6 +44,9 @@ import org.custommonkey.xmlunit.XMLTestCase; import org.mortbay.jetty.Server; import org.mortbay.jetty.servlet.Context; import org.mortbay.jetty.servlet.ServletHolder; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + import org.springframework.util.StringUtils; import org.springframework.ws.client.WebServiceTransportException; import org.springframework.ws.pox.dom.DomPoxMessageFactory; @@ -54,8 +57,6 @@ import org.springframework.ws.soap.saaj.SaajSoapMessageFactory; import org.springframework.ws.transport.http.CommonsHttpMessageSender; import org.springframework.xml.transform.StringResult; import org.springframework.xml.transform.StringSource; -import org.w3c.dom.Document; -import org.xml.sax.SAXException; public class WebServiceTemplateIntegrationTest extends XMLTestCase { @@ -68,6 +69,9 @@ public class WebServiceTemplateIntegrationTest extends XMLTestCase { Context jettyContext = new Context(jettyServer, "/"); jettyContext.addServlet(new ServletHolder(new EchoSoapServlet()), "/soap/echo"); jettyContext.addServlet(new ServletHolder(new SoapFaultServlet()), "/soap/fault"); + SoapFaultServlet badRequestFault = new SoapFaultServlet(); + badRequestFault.setSc(400); + jettyContext.addServlet(new ServletHolder(badRequestFault), "/soap/badRequestFault"); jettyContext.addServlet(new ServletHolder(new NoResponseSoapServlet()), "/soap/noResponse"); jettyContext.addServlet(new ServletHolder(new PoxServlet()), "/pox"); jettyContext.addServlet(new ServletHolder(new ErrorServlet(404)), "/errors/notfound"); @@ -83,6 +87,10 @@ public class WebServiceTemplateIntegrationTest extends XMLTestCase { testSoap(new AxiomSoapMessageFactory()); } + public void testWithSaaj() throws Exception { + testSoap(new SaajSoapMessageFactory(MessageFactory.newInstance())); + } + public void testPox() throws Exception { template = new WebServiceTemplate(new DomPoxMessageFactory()); template.setMessageSender(new CommonsHttpMessageSender()); @@ -99,7 +107,8 @@ public class WebServiceTemplateIntegrationTest extends XMLTestCase { //expected } try { - template.sendSourceAndReceiveToResult("http://localhost:8888/errors/server", new StringSource(content), result); + template.sendSourceAndReceiveToResult("http://localhost:8888/errors/server", new StringSource(content), + result); fail("WebServiceTransportException expected"); } catch (WebServiceTransportException ex) { @@ -107,10 +116,6 @@ public class WebServiceTemplateIntegrationTest extends XMLTestCase { } } - public void testWithSaaj() throws Exception { - testSoap(new SaajSoapMessageFactory(MessageFactory.newInstance())); - } - private void testSoap(SoapMessageFactory messageFactory) throws SAXException, IOException, ParserConfigurationException { template = new WebServiceTemplate(messageFactory); @@ -119,8 +124,8 @@ public class WebServiceTemplateIntegrationTest extends XMLTestCase { StringResult result = new StringResult(); template.sendSourceAndReceiveToResult("http://localhost:8888/soap/echo", new StringSource(content), result); assertXMLEqual(content, result.toString()); - boolean b = template.sendSourceAndReceiveToResult("http://localhost:8888/soap/noResponse", new StringSource(content), - new StringResult()); + boolean b = template.sendSourceAndReceiveToResult("http://localhost:8888/soap/noResponse", + new StringSource(content), new StringResult()); assertFalse("Invalid result", b); try { template.sendSourceAndReceiveToResult("http://localhost:8888/errors/notfound", new StringSource(content), @@ -131,12 +136,23 @@ public class WebServiceTemplateIntegrationTest extends XMLTestCase { //expected } try { - template.sendSourceAndReceiveToResult("http://localhost:8888/soap/fault", new StringSource(content), result); + template.sendSourceAndReceiveToResult("http://localhost:8888/soap/fault", new StringSource(content), + result); fail("SoapFaultClientException expected"); } catch (SoapFaultClientException ex) { //expected } + template.setCheckConnectionForFault(false); + try { + template.sendSourceAndReceiveToResult("http://localhost:8888/soap/badRequestFault", + new StringSource(content), result); + fail("SoapFaultClientException expected"); + } + catch (SoapFaultClientException ex) { + //expected + } + template.setCheckConnectionForFault(true); } /** Servlet that returns and error message for a given status code. */ @@ -144,7 +160,7 @@ public class WebServiceTemplateIntegrationTest extends XMLTestCase { private int sc; - public ErrorServlet(int sc) { + private ErrorServlet(int sc) { this.sc = sc; } @@ -185,6 +201,12 @@ public class WebServiceTemplateIntegrationTest extends XMLTestCase { protected MessageFactory msgFactory = null; + private int sc = -1; + + public void setSc(int sc) { + this.sc = sc; + } + public void init(ServletConfig servletConfig) throws ServletException { super.init(servletConfig); try { @@ -200,16 +222,21 @@ public class WebServiceTemplateIntegrationTest extends XMLTestCase { MimeHeaders headers = getHeaders(req); SOAPMessage request = msgFactory.createMessage(headers, req.getInputStream()); SOAPMessage reply = onMessage(request); + if (sc != -1) { + resp.setStatus(sc); + } if (reply != null) { if (reply.saveRequired()) { reply.saveChanges(); } - resp.setStatus(!reply.getSOAPBody().hasFault() ? HttpServletResponse.SC_OK : - HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + if (sc == -1) { + resp.setStatus(!reply.getSOAPBody().hasFault() ? HttpServletResponse.SC_OK : + HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } putHeaders(reply.getMimeHeaders(), resp); reply.writeTo(resp.getOutputStream()); } - else { + else if (sc == -1) { resp.setStatus(HttpServletResponse.SC_ACCEPTED); } } @@ -267,4 +294,5 @@ public class WebServiceTemplateIntegrationTest extends XMLTestCase { return response; } } + }