From 950f94f8e559b533732a79826644521cc14aed4a Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Mon, 2 Oct 2006 14:59:57 +0000 Subject: [PATCH] Fixed #SWS-57: Expose the Result of the SoapFaultDetail --- .../ws/soap/SoapFaultDetail.java | 11 +++++++- .../ws/soap/axiom/AxiomSoapFaultDetail.java | 5 ++++ .../ws/soap/saaj/Saaj12SoapFaultDetail.java | 6 +++++ .../ws/soap/saaj/Saaj13SoapFaultDetail.java | 4 +++ .../ws/soap/axiom/AxiomSoap11BodyTest.java | 4 +++ .../soap11/AbstractSoap11BodyTestCase.java | 26 ++++++++++++------- .../soap12/AbstractSoap12BodyTestCase.java | 16 ++++++++++++ 7 files changed, 62 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/org/springframework/ws/soap/SoapFaultDetail.java b/core/src/main/java/org/springframework/ws/soap/SoapFaultDetail.java index 526c6f86..4fb077dd 100644 --- a/core/src/main/java/org/springframework/ws/soap/SoapFaultDetail.java +++ b/core/src/main/java/org/springframework/ws/soap/SoapFaultDetail.java @@ -17,8 +17,8 @@ package org.springframework.ws.soap; import java.util.Iterator; - import javax.xml.namespace.QName; +import javax.xml.transform.Result; /** * Represents the detail element in a SOAP fault. A detail contains SoapFaultDetailElements, @@ -37,6 +37,15 @@ public interface SoapFaultDetail extends SoapElement { */ SoapFaultDetailElement addFaultDetailElement(QName name); + /** + * Returns the Source of this element. This result does not include the element itself. + *

+ * The result can be used for marshalling. + * + * @return the Result of this element + */ + Result getResult(); + /** * Gets an iterator over all of the SoapFaultDetailElements in this detail. * diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFaultDetail.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFaultDetail.java index 47ab1f16..5718856c 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFaultDetail.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapFaultDetail.java @@ -18,7 +18,9 @@ package org.springframework.ws.soap.axiom; import java.util.Iterator; import javax.xml.namespace.QName; +import javax.xml.transform.Result; import javax.xml.transform.Source; +import javax.xml.transform.sax.SAXResult; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMException; @@ -73,7 +75,10 @@ class AxiomSoapFaultDetail implements SoapFaultDetail { catch (OMException ex) { throw new AxiomSoapFaultException(ex); } + } + public Result getResult() { + return new SAXResult(new AxiomContentHandler(axiomFaultDetail)); } private class AxiomSoapFaultDetailElementIterator implements Iterator { diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12SoapFaultDetail.java b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12SoapFaultDetail.java index 30523418..b08ede46 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12SoapFaultDetail.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12SoapFaultDetail.java @@ -23,7 +23,9 @@ import javax.xml.soap.DetailEntry; import javax.xml.soap.Name; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; +import javax.xml.transform.Result; import javax.xml.transform.Source; +import javax.xml.transform.dom.DOMResult; import javax.xml.transform.dom.DOMSource; import org.springframework.util.Assert; @@ -53,6 +55,10 @@ class Saaj12SoapFaultDetail implements SoapFaultDetail { return new DOMSource(saajDetail); } + public Result getResult() { + return new DOMResult(saajDetail); + } + public SoapFaultDetailElement addFaultDetailElement(QName name) { try { Name detailEntryName = SaajUtils.toName(name, saajDetail, getEnvelope()); diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13SoapFaultDetail.java b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13SoapFaultDetail.java index 20663941..6983beab 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13SoapFaultDetail.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13SoapFaultDetail.java @@ -50,6 +50,10 @@ class Saaj13SoapFaultDetail implements SoapFaultDetail { return new DOMSource(saajDetail); } + public Result getResult() { + return new DOMResult(saajDetail); + } + public SoapFaultDetailElement addFaultDetailElement(QName name) { try { DetailEntry saajDetailEntry = saajDetail.addDetailEntry(name); diff --git a/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11BodyTest.java b/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11BodyTest.java index cad003ef..c1f1a2da 100644 --- a/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11BodyTest.java +++ b/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11BodyTest.java @@ -32,4 +32,8 @@ public class AxiomSoap11BodyTest extends AbstractSoap11BodyTestCase { public void testAddFaultWithDetail() throws Exception { // Overriden because of http://issues.apache.org/jira/browse/WSCOMMONS-38 } + + public void testAddFaultWithDetailResult() throws Exception { + // Overriden because of http://issues.apache.org/jira/browse/WSCOMMONS-38 + } } diff --git a/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11BodyTestCase.java b/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11BodyTestCase.java index 4c6c9315..e047e6b3 100644 --- a/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11BodyTestCase.java +++ b/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11BodyTestCase.java @@ -36,15 +36,13 @@ public abstract class AbstractSoap11BodyTestCase extends AbstractSoapBodyTestCas public void testGetSource() throws Exception { StringResult result = new StringResult(); transformer.transform(soapBody.getSource(), result); - assertXMLEqual("Invalid contents of body", - "", + assertXMLEqual("Invalid contents of body", "", result.toString()); } public void testAddMustUnderstandFault() throws Exception { SoapFault fault = soapBody.addMustUnderstandFault("SOAP Must Understand Error", null); - assertEquals("Invalid fault code", - new QName("http://schemas.xmlsoap.org/soap/envelope/", "MustUnderstand"), + assertEquals("Invalid fault code", new QName("http://schemas.xmlsoap.org/soap/envelope/", "MustUnderstand"), fault.getFaultCode()); assertPayloadEqual("" + "SOAP-ENV:MustUnderstand" + @@ -53,8 +51,7 @@ public abstract class AbstractSoap11BodyTestCase extends AbstractSoapBodyTestCas public void testAddClientFault() throws Exception { SoapFault fault = soapBody.addClientOrSenderFault("faultString", null); - assertEquals("Invalid fault code", - new QName("http://schemas.xmlsoap.org/soap/envelope/", "Client"), + assertEquals("Invalid fault code", new QName("http://schemas.xmlsoap.org/soap/envelope/", "Client"), fault.getFaultCode()); assertPayloadEqual("" + "SOAP-ENV:Client" + "faultString" + @@ -63,8 +60,7 @@ public abstract class AbstractSoap11BodyTestCase extends AbstractSoapBodyTestCas public void testAddServerFault() throws Exception { SoapFault fault = soapBody.addServerOrReceiverFault("faultString", null); - assertEquals("Invalid fault code", - new QName("http://schemas.xmlsoap.org/soap/envelope/", "Server"), + assertEquals("Invalid fault code", new QName("http://schemas.xmlsoap.org/soap/envelope/", "Server"), fault.getFaultCode()); assertPayloadEqual("" + "SOAP-ENV:Server" + "faultString" + @@ -73,12 +69,12 @@ public abstract class AbstractSoap11BodyTestCase extends AbstractSoapBodyTestCas public void testAddFault() throws Exception { QName faultCode = new QName("http://www.springframework.org", "fault", "spring"); - String faultString = "faultString"; Soap11Fault fault = ((Soap11Body) soapBody).addFault(faultCode, "faultString", Locale.ENGLISH); assertNotNull("Null returned", fault); assertTrue("SoapBody has no fault", soapBody.hasFault()); assertNotNull("SoapBody has no fault", soapBody.getFault()); assertEquals("Invalid fault code", faultCode, fault.getFaultCode()); + String faultString = "faultString"; assertEquals("Invalid fault string", faultString, fault.getFaultString()); assertEquals("Invalid fault string locale", Locale.ENGLISH, fault.getFaultStringLocale()); String actor = "http://www.springframework.org/actor"; @@ -105,4 +101,16 @@ public abstract class AbstractSoap11BodyTestCase extends AbstractSoapBodyTestCas ""); } + public void testAddFaultWithDetailResult() throws Exception { + SoapFault fault = ((Soap11Body) soapBody) + .addFault(new QName("namespace", "localPart", "prefix"), "Fault", null); + SoapFaultDetail detail = fault.addFaultDetail(); + transformer.transform(new StringSource(""), detail.getResult()); + transformer.transform(new StringSource(""), detail.getResult()); + assertPayloadEqual("" + + "prefix:localPart" + + "Fault" + "" + "" + + "" + ""); + } + } diff --git a/core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12BodyTestCase.java b/core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12BodyTestCase.java index f2a96d15..d970a877 100644 --- a/core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12BodyTestCase.java +++ b/core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12BodyTestCase.java @@ -102,6 +102,22 @@ public abstract class AbstractSoap12BodyTestCase extends AbstractSoapBodyTestCas "", result.toString()); } + public void testAddFaultWithDetailResult() throws Exception { + SoapFault fault = soapBody.addServerOrReceiverFault("faultString", Locale.ENGLISH); + SoapFaultDetail detail = fault.addFaultDetail(); + transformer.transform(new StringSource(""), detail.getResult()); + transformer.transform(new StringSource(""), detail.getResult()); + StringResult result = new StringResult(); + transformer.transform(fault.getSource(), result); + assertXMLEqual("Invalid source for body", + "" + + "" + soapBody.getName().getPrefix() + ":Receiver" + + "" + + "faultString" + + "" + "" + + "" + "", result.toString()); + } + public void testAddFaultWithSubcode() throws Exception { Soap12Fault fault = (Soap12Fault) soapBody.addServerOrReceiverFault("faultString", Locale.ENGLISH); QName subcode1 = new QName("http://www.springframework.org", "Subcode1", "spring-ws");