From 5431450bcd63946e2b7c53cfdfda5e447fcbb72d Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Tue, 16 Dec 2008 21:37:19 +0000 Subject: [PATCH] SWS-464 --- .../org/springframework/ws/soap/SoapElement.java | 9 +++++++++ .../version/AbstractAddressingVersion.java | 11 +++++++---- .../ws/soap/axiom/AxiomSoapElement.java | 15 +++++++++++++++ .../ws/soap/saaj/Saaj11Implementation.java | 4 ++++ .../ws/soap/saaj/Saaj12Implementation.java | 4 ++++ .../ws/soap/saaj/Saaj13Implementation.java | 4 ++++ .../ws/soap/saaj/SaajImplementation.java | 4 +++- .../ws/soap/saaj/SaajSoapElement.java | 11 ++++++++++- .../ws/soap/AbstractSoapElementTestCase.java | 11 +++++++++++ 9 files changed, 67 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/springframework/ws/soap/SoapElement.java b/core/src/main/java/org/springframework/ws/soap/SoapElement.java index a12a390f..616b5da5 100644 --- a/core/src/main/java/org/springframework/ws/soap/SoapElement.java +++ b/core/src/main/java/org/springframework/ws/soap/SoapElement.java @@ -74,4 +74,13 @@ public interface SoapElement { */ Iterator getAllAttributes(); + /** + * Adds a namespace declaration with the specified prefix and URI to this element. + * + * @param prefix the namespace prefix. Can be empty or null to declare the default namespace + * @param namespaceUri the namespace uri + * @throws SoapElementException in case of errors + */ + void addNamespaceDeclaration(String prefix, String namespaceUri); + } diff --git a/core/src/main/java/org/springframework/ws/soap/addressing/version/AbstractAddressingVersion.java b/core/src/main/java/org/springframework/ws/soap/addressing/version/AbstractAddressingVersion.java index b93f8149..cfdaeae5 100644 --- a/core/src/main/java/org/springframework/ws/soap/addressing/version/AbstractAddressingVersion.java +++ b/core/src/main/java/org/springframework/ws/soap/addressing/version/AbstractAddressingVersion.java @@ -178,15 +178,18 @@ public abstract class AbstractAddressingVersion extends TransformerObjectSupport if (address == null) { return null; } - List referenceProperties = referencePropertiesExpression != null ? - referencePropertiesExpression.evaluateAsNodeList(node) : Collections.EMPTY_LIST; - List referenceParameters = referenceParametersExpression != null ? - referenceParametersExpression.evaluateAsNodeList(node) : Collections.EMPTY_LIST; + List referenceProperties = + referencePropertiesExpression != null ? referencePropertiesExpression.evaluateAsNodeList(node) : + Collections.EMPTY_LIST; + List referenceParameters = + referenceParametersExpression != null ? referenceParametersExpression.evaluateAsNodeList(node) : + Collections.EMPTY_LIST; return new EndpointReference(address, referenceProperties, referenceParameters); } public void addAddressingHeaders(SoapMessage message, MessageAddressingProperties map) { SoapHeader header = message.getSoapHeader(); + header.addNamespaceDeclaration(getNamespacePrefix(), getNamespaceUri()); // To if (map.getTo() != null) { SoapHeaderElement to = header.addHeaderElement(getToName()); diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapElement.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapElement.java index a4e70356..2376c383 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapElement.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapElement.java @@ -29,6 +29,7 @@ import org.apache.axiom.om.OMNamespace; import org.apache.axiom.soap.SOAPFactory; import org.springframework.util.Assert; +import org.springframework.util.StringUtils; import org.springframework.ws.soap.SoapElement; import org.springframework.xml.transform.StaxSource; @@ -116,6 +117,20 @@ class AxiomSoapElement implements SoapElement { } } + public void addNamespaceDeclaration(String prefix, String namespaceUri) { + try { + if (StringUtils.hasLength(prefix)) { + getAxiomElement().declareNamespace(namespaceUri, prefix); + } + else { + getAxiomElement().declareDefaultNamespace(namespaceUri); + } + } + catch (OMException ex) { + throw new AxiomSoapElementException(ex); + } + } + protected final OMElement getAxiomElement() { return axiomElement; } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java index 6de04673..744a4470 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj11Implementation.java @@ -283,6 +283,10 @@ class Saaj11Implementation extends SaajImplementation { return element.getChildElements(elementName); } + void addNamespaceDeclaration(SOAPElement element, String prefix, String namespaceUri) throws SOAPException { + element.addNamespaceDeclaration(prefix, namespaceUri); + } + public void writeTo(SOAPMessage message, OutputStream outputStream) throws SOAPException, IOException { if (message.saveRequired()) { message.saveChanges(); diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java index 6a42f24c..5b403adb 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj12Implementation.java @@ -233,6 +233,10 @@ class Saaj12Implementation extends SaajImplementation { return element.getChildElements(elementName); } + void addNamespaceDeclaration(SOAPElement element, String prefix, String namespaceUri) throws SOAPException { + element.addNamespaceDeclaration(prefix, namespaceUri); + } + public void writeTo(SOAPMessage message, OutputStream outputStream) throws SOAPException, IOException { if (message.saveRequired()) { message.saveChanges(); diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java index 17c156ac..2a7cb773 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/Saaj13Implementation.java @@ -259,6 +259,10 @@ class Saaj13Implementation extends SaajImplementation { return element.getChildElements(name); } + void addNamespaceDeclaration(SOAPElement element, String prefix, String namespaceUri) throws SOAPException { + element.addNamespaceDeclaration(prefix, namespaceUri); + } + public void writeTo(SOAPMessage message, OutputStream outputStream) throws SOAPException, IOException { if (message.saveRequired()) { message.saveChanges(); diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java index 4f79693c..fab64f46 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajImplementation.java @@ -82,6 +82,9 @@ abstract class SaajImplementation { /** Returns an iterator over all the child elements with the specified name. */ abstract Iterator getChildElements(SOAPElement element, QName name) throws SOAPException; + /** Declares a namespace. */ + abstract void addNamespaceDeclaration(SOAPElement element, String prefix, String namespaceUri) throws SOAPException; + /* * SOAPMessage */ @@ -231,5 +234,4 @@ abstract class SaajImplementation { /** Adds a text node to the given detail entry. */ abstract void addTextNode(DetailEntry detailEntry, String text) throws SOAPException; - } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElement.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElement.java index a07d1d7c..bb23168f 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElement.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapElement.java @@ -36,7 +36,7 @@ class SaajSoapElement implements SoapElement { private final SOAPElement element; - public SaajSoapElement(SOAPElement element) { + SaajSoapElement(SOAPElement element) { Assert.notNull(element, "element must not be null"); this.element = element; } @@ -80,6 +80,15 @@ class SaajSoapElement implements SoapElement { return getImplementation().getAllAttibutes(element); } + public void addNamespaceDeclaration(String prefix, String namespaceUri) { + try { + getImplementation().addNamespaceDeclaration(element, prefix, namespaceUri); + } + catch (SOAPException ex) { + throw new SaajSoapElementException(ex); + } + } + protected final SOAPElement getSaajElement() { return element; } diff --git a/core/src/test/java/org/springframework/ws/soap/AbstractSoapElementTestCase.java b/core/src/test/java/org/springframework/ws/soap/AbstractSoapElementTestCase.java index 9884e66c..0b423b2c 100644 --- a/core/src/test/java/org/springframework/ws/soap/AbstractSoapElementTestCase.java +++ b/core/src/test/java/org/springframework/ws/soap/AbstractSoapElementTestCase.java @@ -44,7 +44,18 @@ public abstract class AbstractSoapElementTestCase extends XMLTestCase { assertEquals("Invalid attribute value", value, soapElement.getAttributeValue(name)); Iterator allAttributes = soapElement.getAllAttributes(); assertTrue("Iterator is empty", allAttributes.hasNext()); + } + public void testAddNamespaceDeclaration() throws Exception { + String prefix = "p"; + String namespace = "http://springframework.org/spring-ws"; + soapElement.addNamespaceDeclaration(prefix, namespace); + } + + public void testAddDefaultNamespaceDeclaration() throws Exception { + String prefix = ""; + String namespace = "http://springframework.org/spring-ws"; + soapElement.addNamespaceDeclaration(prefix, namespace); }