Created testcase for #SWS-74: Namespace not being applied correctly to soap fault detail elements. Cannot reproduce.
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.springframework.ws.endpoint.interceptor;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.util.Locale;
|
||||
import javax.xml.XMLConstants;
|
||||
@@ -26,7 +27,9 @@ import javax.xml.transform.Transformer;
|
||||
import javax.xml.transform.TransformerFactory;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.apache.axiom.soap.SOAPFactory;
|
||||
import org.apache.axiom.soap.impl.llom.soap11.SOAP11Factory;
|
||||
import org.custommonkey.xmlunit.XMLTestCase;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.ws.MockWebServiceMessage;
|
||||
@@ -35,13 +38,16 @@ import org.springframework.ws.context.DefaultMessageContext;
|
||||
import org.springframework.ws.context.MessageContext;
|
||||
import org.springframework.ws.soap.SoapMessage;
|
||||
import org.springframework.ws.soap.SoapVersion;
|
||||
import org.springframework.ws.soap.axiom.AxiomSoapMessage;
|
||||
import org.springframework.ws.soap.saaj.SaajSoapMessage;
|
||||
import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
|
||||
import org.springframework.ws.soap.saaj.support.SaajUtils;
|
||||
import org.springframework.ws.soap.soap11.Soap11Fault;
|
||||
import org.springframework.ws.soap.soap12.Soap12Fault;
|
||||
import org.xml.sax.SAXParseException;
|
||||
import org.xml.sax.helpers.LocatorImpl;
|
||||
|
||||
public class PayloadValidatingInterceptorTest extends TestCase {
|
||||
public class PayloadValidatingInterceptorTest extends XMLTestCase {
|
||||
|
||||
private PayloadValidatingInterceptor interceptor;
|
||||
|
||||
@@ -248,4 +254,25 @@ public class PayloadValidatingInterceptorTest extends TestCase {
|
||||
boolean result = interceptor.handleResponse(context, null);
|
||||
assertTrue("Invalid response from interceptor", result);
|
||||
}
|
||||
|
||||
public void testCreateRequestValidationFaultAxiom() throws Exception {
|
||||
SOAPFactory soapFactory = new SOAP11Factory();
|
||||
AxiomSoapMessage message = new AxiomSoapMessage(soapFactory);
|
||||
LocatorImpl locator = new LocatorImpl();
|
||||
locator.setLineNumber(0);
|
||||
locator.setColumnNumber(0);
|
||||
SAXParseException[] exceptions = new SAXParseException[]{new SAXParseException("Message 1", locator),
|
||||
new SAXParseException("Message 2", locator),};
|
||||
interceptor.createRequestValidationFault(message, exceptions);
|
||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||
message.writeTo(os);
|
||||
assertXMLEqual("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
|
||||
"<soapenv:Header />" + "<soapenv:Body>" + "<soapenv:Fault>" + "<faultcode>soapenv:Client</faultcode>" +
|
||||
"<faultstring>Validation error</faultstring>" + "<detail>" +
|
||||
"<spring-ws:ValidationError xmlns:spring-ws=\"http://springframework.org/spring-ws\">Message 1</spring-ws:ValidationError>" +
|
||||
"<spring-ws:ValidationError xmlns:spring-ws=\"http://springframework.org/spring-ws\">Message 2</spring-ws:ValidationError>" +
|
||||
"</detail>" + "</soapenv:Fault>" + "</soapenv:Body>" + "</soapenv:Envelope>", os.toString());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,39 +1,73 @@
|
||||
package org.springframework.ws.soap.axiom;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import javax.xml.namespace.QName;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.transform.Result;
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
|
||||
import org.apache.axiom.om.OMAbstractFactory;
|
||||
import org.apache.axiom.soap.SOAPFactory;
|
||||
import org.springframework.ws.soap.SoapBody;
|
||||
import org.springframework.ws.soap.SoapVersion;
|
||||
import org.springframework.ws.soap.soap11.AbstractSoap11BodyTestCase;
|
||||
import org.springframework.ws.soap.soap11.Soap11Body;
|
||||
import org.springframework.ws.soap.soap11.Soap11Fault;
|
||||
import org.springframework.xml.transform.StringResult;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
public class AxiomSoap11BodyTest extends AbstractSoap11BodyTestCase {
|
||||
|
||||
private AxiomSoapMessage axiomSoapMessage;
|
||||
|
||||
private DocumentBuilder documentBuilder;
|
||||
|
||||
protected SoapBody createSoapBody() throws Exception {
|
||||
SOAPFactory axiomFactory = OMAbstractFactory.getSOAP11Factory();
|
||||
AxiomSoapMessage axiomSoapMessage = new AxiomSoapMessage(axiomFactory);
|
||||
axiomSoapMessage = new AxiomSoapMessage(axiomFactory);
|
||||
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
||||
documentBuilderFactory.setNamespaceAware(true);
|
||||
documentBuilder = documentBuilderFactory.newDocumentBuilder();
|
||||
return axiomSoapMessage.getSoapBody();
|
||||
}
|
||||
|
||||
public void testAddMustUnderstandFault() throws Exception {
|
||||
// Overriden because of http://issues.apache.org/jira/browse/WSCOMMONS-38
|
||||
}
|
||||
|
||||
public void testAddClientFault() throws Exception {
|
||||
// Overriden because of http://issues.apache.org/jira/browse/WSCOMMONS-38
|
||||
}
|
||||
|
||||
public void testAddServerFault() throws Exception {
|
||||
// Overriden because of http://issues.apache.org/jira/browse/WSCOMMONS-38
|
||||
}
|
||||
|
||||
public void testAddFault() throws Exception {
|
||||
// Overriden because of http://issues.apache.org/jira/browse/WSCOMMONS-38
|
||||
QName faultCode = new QName("http://www.springframework.org", "fault", "spring");
|
||||
String faultString = "faultString";
|
||||
Soap11Fault fault = ((Soap11Body) soapBody).addFault(faultCode, faultString, null);
|
||||
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());
|
||||
assertEquals("Invalid fault string", faultString, fault.getFaultString());
|
||||
String actor = "http://www.springframework.org/actor";
|
||||
fault.setFaultActorOrRole(actor);
|
||||
assertEquals("Invalid fault actor", actor, fault.getFaultActorOrRole());
|
||||
assertPayloadEqual("<SOAP-ENV:Fault xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' " +
|
||||
"xmlns:spring='http://www.springframework.org'>" + "<faultcode>spring:fault</faultcode>" +
|
||||
"<faultstring>" + faultString + "</faultstring>" + "<faultactor>" + actor + "</faultactor>" +
|
||||
"</SOAP-ENV:Fault>");
|
||||
}
|
||||
|
||||
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
|
||||
/**
|
||||
* Overriden because of http://issues.apache.org/jira/browse/WSCOMMONS-38. Axiom does not return valid xml
|
||||
*/
|
||||
protected void assertPayloadEqual(String expectedPayload) throws Exception {
|
||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||
axiomSoapMessage.writeTo(os);
|
||||
Document document = documentBuilder.parse(new ByteArrayInputStream(os.toByteArray()));
|
||||
NodeList nodes = document.getElementsByTagNameNS(SoapVersion.SOAP_11.getEnvelopeNamespaceUri(), "Body");
|
||||
assertEquals("No Body found", 1, nodes.getLength());
|
||||
assertEquals("No Body found", Node.ELEMENT_NODE, nodes.item(0).getNodeType());
|
||||
Element bodyElement = (Element) nodes.item(0);
|
||||
Element firstChild = (Element) bodyElement.getFirstChild();
|
||||
Result result = new StringResult();
|
||||
transformer.transform(new DOMSource(firstChild), result);
|
||||
assertXMLEqual("Invalid payload contents", expectedPayload, result.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ public abstract class AbstractSoap11BodyTestCase extends AbstractSoapBodyTestCas
|
||||
assertEquals("Invalid fault code", new QName("http://schemas.xmlsoap.org/soap/envelope/", "MustUnderstand"),
|
||||
fault.getFaultCode());
|
||||
assertPayloadEqual("<SOAP-ENV:Fault xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>" +
|
||||
"<faultcode>SOAP-ENV:MustUnderstand</faultcode>" +
|
||||
"<faultcode>" + soapBody.getName().getPrefix() + ":MustUnderstand</faultcode>" +
|
||||
"<faultstring>SOAP Must Understand Error</faultstring></SOAP-ENV:Fault>");
|
||||
}
|
||||
|
||||
@@ -54,8 +54,8 @@ public abstract class AbstractSoap11BodyTestCase extends AbstractSoapBodyTestCas
|
||||
assertEquals("Invalid fault code", new QName("http://schemas.xmlsoap.org/soap/envelope/", "Client"),
|
||||
fault.getFaultCode());
|
||||
assertPayloadEqual("<SOAP-ENV:Fault xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>" +
|
||||
"<faultcode>SOAP-ENV:Client</faultcode>" + "<faultstring>faultString</faultstring>" +
|
||||
"</SOAP-ENV:Fault>");
|
||||
"<faultcode>" + soapBody.getName().getPrefix() + ":Client</faultcode>" +
|
||||
"<faultstring>faultString</faultstring>" + "</SOAP-ENV:Fault>");
|
||||
}
|
||||
|
||||
public void testAddServerFault() throws Exception {
|
||||
@@ -63,18 +63,18 @@ public abstract class AbstractSoap11BodyTestCase extends AbstractSoapBodyTestCas
|
||||
assertEquals("Invalid fault code", new QName("http://schemas.xmlsoap.org/soap/envelope/", "Server"),
|
||||
fault.getFaultCode());
|
||||
assertPayloadEqual("<SOAP-ENV:Fault xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>" +
|
||||
"<faultcode>SOAP-ENV:Server</faultcode>" + "<faultstring>faultString</faultstring>" +
|
||||
"</SOAP-ENV:Fault>");
|
||||
"<faultcode>" + soapBody.getName().getPrefix() + ":Server</faultcode>" +
|
||||
"<faultstring>faultString</faultstring>" + "</SOAP-ENV:Fault>");
|
||||
}
|
||||
|
||||
public void testAddFault() throws Exception {
|
||||
QName faultCode = new QName("http://www.springframework.org", "fault", "spring");
|
||||
Soap11Fault fault = ((Soap11Body) soapBody).addFault(faultCode, "faultString", Locale.ENGLISH);
|
||||
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";
|
||||
@@ -87,18 +87,25 @@ public abstract class AbstractSoap11BodyTestCase extends AbstractSoapBodyTestCas
|
||||
}
|
||||
|
||||
public void testAddFaultWithDetail() throws Exception {
|
||||
SoapFault fault = ((Soap11Body) soapBody)
|
||||
.addFault(new QName("namespace", "localPart", "prefix"), "Fault", null);
|
||||
QName faultCode = new QName("http://www.springframework.org", "fault", "spring");
|
||||
String faultString = "faultString";
|
||||
SoapFault fault = ((Soap11Body) soapBody).addFault(faultCode, faultString, null);
|
||||
SoapFaultDetail detail = fault.addFaultDetail();
|
||||
SoapFaultDetailElement detailElement =
|
||||
detail.addFaultDetailElement(new QName("namespace", "localPart", "prefix"));
|
||||
QName detailName = new QName("http://www.springframework.org", "detailEntry", "spring");
|
||||
SoapFaultDetailElement detailElement1 = detail.addFaultDetailElement(detailName);
|
||||
StringSource detailContents = new StringSource("<detailContents xmlns='namespace'/>");
|
||||
transformer.transform(detailContents, detailElement.getResult());
|
||||
assertPayloadEqual("<SOAP-ENV:Fault xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>" +
|
||||
"<faultcode xmlns:prefix='namespace'>prefix:localPart</faultcode>" +
|
||||
"<faultstring>Fault</faultstring>" +
|
||||
"<detail><prefix:localPart xmlns:prefix='namespace'><detailContents xmlns='namespace'/>" +
|
||||
"</prefix:localPart></detail></SOAP-ENV:Fault>");
|
||||
transformer.transform(detailContents, detailElement1.getResult());
|
||||
SoapFaultDetailElement detailElement2 = detail.addFaultDetailElement(detailName);
|
||||
detailContents = new StringSource("<detailContents xmlns='namespace'/>");
|
||||
transformer.transform(detailContents, detailElement2.getResult());
|
||||
assertPayloadEqual(
|
||||
"<SOAP-ENV:Fault xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:spring='http://www.springframework.org'>" +
|
||||
"<faultcode>spring:fault</faultcode>" + "<faultstring>" + faultString + "</faultstring>" +
|
||||
"<detail>" +
|
||||
"<spring:detailEntry xmlns:spring='http://www.springframework.org'><detailContents xmlns='namespace'/></spring:detailEntry>" +
|
||||
"<spring:detailEntry xmlns:spring='http://www.springframework.org'><detailContents xmlns='namespace'/></spring:detailEntry>" +
|
||||
"</detail>" + "</SOAP-ENV:Fault>");
|
||||
|
||||
}
|
||||
|
||||
public void testAddFaultWithDetailResult() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user