diff --git a/core/src/main/java/org/springframework/ws/soap/SoapHeader.java b/core/src/main/java/org/springframework/ws/soap/SoapHeader.java index 1ff102de..cb37982c 100644 --- a/core/src/main/java/org/springframework/ws/soap/SoapHeader.java +++ b/core/src/main/java/org/springframework/ws/soap/SoapHeader.java @@ -68,4 +68,14 @@ public interface SoapHeader extends SoapElement { * @see SoapHeaderElement */ Iterator examineAllHeaderElements() throws SoapHeaderException; + + /** + * Returns an Iterator over all the SoapHeaderElements with the specified header. + * + * @param name the qualified name of header elements to look for + * @return an iterator over all the header elements + * @throws SoapHeaderException if the header cannot be returned + * @see SoapHeaderElement + */ + Iterator examineHeaderElements(QName name) throws SoapHeaderException; } diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapHeader.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapHeader.java index c1dd983d..d6e088b7 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapHeader.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapHeader.java @@ -28,6 +28,7 @@ import org.apache.axiom.soap.SOAPHeader; import org.apache.axiom.soap.SOAPHeaderBlock; import org.springframework.ws.soap.SoapHeader; import org.springframework.ws.soap.SoapHeaderElement; +import org.springframework.ws.soap.SoapHeaderException; import org.springframework.xml.namespace.QNameUtils; /** @@ -73,7 +74,15 @@ class AxiomSoapHeader extends AxiomSoapElement implements SoapHeader { catch (OMException ex) { throw new AxiomSoapHeaderException(ex); } + } + public Iterator examineHeaderElements(QName name) throws SoapHeaderException { + try { + return new AxiomSoapHeaderElementIterator(getAxiomHeader().getChildrenWithName(name)); + } + catch (OMException ex) { + throw new AxiomSoapHeaderException(ex); + } } protected SOAPHeader getAxiomHeader() { 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 9200870c..06b3c04e 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 @@ -100,6 +100,11 @@ public class Saaj11Implementation implements SaajImplementation { return results.iterator(); } + public Iterator getChildElements(SOAPElement element, QName name) throws SOAPException { + Name childName = SaajUtils.toName(name, element); + return element.getChildElements(childName); + } + public QName getFaultCode(SOAPFault fault) { String code = fault.getFaultCode(); int idx = code.indexOf(':'); 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 f72a6e9d..a1f09f3e 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 @@ -123,6 +123,11 @@ public class Saaj12Implementation implements SaajImplementation { return results.iterator(); } + public Iterator getChildElements(SOAPElement element, QName name) throws SOAPException { + Name childName = SaajUtils.toName(name, element); + return element.getChildElements(childName); + } + public SOAPEnvelope getEnvelope(SOAPMessage message) throws SOAPException { return message.getSOAPPart().getEnvelope(); } 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 35f4d9f8..07f08c71 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 @@ -151,6 +151,10 @@ public class Saaj13Implementation implements SaajImplementation { return element.getAllAttributesAsQNames(); } + public Iterator getChildElements(SOAPElement element, QName name) throws SOAPException { + return element.getChildElements(name); + } + public SOAPEnvelope getEnvelope(SOAPMessage message) throws SOAPException { return message.getSOAPPart().getEnvelope(); } 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 15e9d1d9..e13f3975 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 @@ -62,6 +62,9 @@ public interface SaajImplementation { /** Returns all attributes as an iterator of QNames. * */ Iterator getAllAttibutes(SOAPElement element); + /** Returns an iterator over the child elements with the given name. */ + Iterator getChildElements(SOAPElement element, QName name) throws SOAPException; + /** Returns the envelope of the given message. */ SOAPEnvelope getEnvelope(SOAPMessage message) throws SOAPException; diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeader.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeader.java index 620358f1..77c31e9a 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeader.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapHeader.java @@ -44,6 +44,16 @@ class SaajSoapHeader extends SaajSoapElement implements SoapHeader { return new SaajSoapHeaderElementIterator(iterator); } + public Iterator examineHeaderElements(QName name) throws SoapHeaderException { + try { + Iterator iterator = getImplementation().getChildElements(getSaajHeader(), name); + return new SaajSoapHeaderElementIterator(iterator); + } + catch (SOAPException ex) { + throw new SaajSoapHeaderException(ex); + } + } + public Iterator examineMustUnderstandHeaderElements(String actorOrRole) throws SoapHeaderException { Iterator iterator = getImplementation().examineMustUnderstandHeaderElements(getSaajHeader(), actorOrRole); return new SaajSoapHeaderElementIterator(iterator); diff --git a/core/src/test/java/org/springframework/ws/soap/AbstractSoapHeaderTestCase.java b/core/src/test/java/org/springframework/ws/soap/AbstractSoapHeaderTestCase.java index 568bcc07..b884ddce 100644 --- a/core/src/test/java/org/springframework/ws/soap/AbstractSoapHeaderTestCase.java +++ b/core/src/test/java/org/springframework/ws/soap/AbstractSoapHeaderTestCase.java @@ -36,8 +36,8 @@ public abstract class AbstractSoapHeaderTestCase extends AbstractSoapElementTest public void testAddHeaderElement() throws Exception { QName qName = new QName("http://www.springframework.org", "localName", "spring"); SoapHeaderElement headerElement = soapHeader.addHeaderElement(qName); - assertEquals("Invalid qName for element", qName, headerElement.getName()); assertNotNull("No SoapHeaderElement returned", headerElement); + assertEquals("Invalid qName for element", qName, headerElement.getName()); String payload = ""; transformer.transform(new StringSource(payload), headerElement.getResult()); assertHeaderElementEqual(headerElement, @@ -94,10 +94,22 @@ public abstract class AbstractSoapHeaderTestCase extends AbstractSoapElementTest assertHeaderElementEqual(headerElement, content); } + public void testExamineHeaderElements() throws Exception { + QName qName = new QName("http://www.springframework.org", "localName", "spring"); + soapHeader.addHeaderElement(qName); + Iterator iterator = soapHeader.examineHeaderElements(qName); + assertNotNull("No Iterator returned", iterator); + assertTrue("header element iterator has no elements", iterator.hasNext()); + SoapHeaderElement headerElement = (SoapHeaderElement) iterator.next(); + assertNotNull("No SoapHeaderElement returned", headerElement); + assertEquals("Invalid qName for element", qName, headerElement.getName()); + } + protected void assertHeaderElementEqual(SoapHeaderElement headerElement, String expected) throws Exception { StringResult result = new StringResult(); transformer.transform(headerElement.getSource(), result); assertXMLEqual("Invalid contents of header element", expected, result.toString()); } + }