diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/CachingPayload.java b/core/src/main/java/org/springframework/ws/soap/axiom/CachingPayload.java index e3f8e0bc..4914be9a 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/CachingPayload.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/CachingPayload.java @@ -24,6 +24,8 @@ import org.apache.axiom.soap.SOAPBody; import org.apache.axiom.soap.SOAPFactory; /** + * Caching payload in Axiom. + * * @author Arjen Poutsma * @since 1.5.2 */ diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/NonCachingPayload.java b/core/src/main/java/org/springframework/ws/soap/axiom/NonCachingPayload.java index 17b8cdae..89b7a813 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/NonCachingPayload.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/NonCachingPayload.java @@ -35,6 +35,8 @@ import org.apache.axiom.soap.SOAPFactory; import org.springframework.xml.transform.StaxResult; /** + * Non-caching payload in Axiom. + * * @author Jim Cummings * @author Arjen Poutsma * @since 1.5.2 @@ -63,7 +65,9 @@ class NonCachingPayload extends Payload { private QName name; - private String encoding; + private String encoding = "UTF-8"; + + private int elementDepth = 0; private DelegatingStreamWriter() { try { @@ -75,11 +79,11 @@ class NonCachingPayload extends Payload { } public void writeStartDocument() throws XMLStreamException { - this.encoding = "UTF-8"; + // ignored } public void writeStartDocument(String version) throws XMLStreamException { - this.encoding = "UTF-8"; + // ignored } public void writeStartDocument(String encoding, String version) throws XMLStreamException { @@ -87,7 +91,42 @@ class NonCachingPayload extends Payload { } public void writeEndDocument() throws XMLStreamException { - delegate.writeEndDocument(); + // ignored + } + + public void writeStartElement(String localName) throws XMLStreamException { + if (name == null) { + name = new QName(localName); + } + elementDepth++; + delegate.writeStartElement(localName); + } + + public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException { + if (name == null) { + name = new QName(namespaceURI, localName); + } + elementDepth++; + delegate.writeStartElement(namespaceURI, localName); + } + + public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException { + if (name == null) { + name = new QName(namespaceURI, localName, prefix); + } + elementDepth++; + delegate.writeStartElement(prefix, localName, namespaceURI); + } + + public void writeEndElement() throws XMLStreamException { + elementDepth--; + delegate.writeEndElement(); + if (elementDepth <= 0) { + addPayload(); + } + } + + private void addPayload() throws XMLStreamException { delegate.flush(); if (baos.size() > 0) { byte[] buf = baos.toByteArray(); @@ -99,27 +138,6 @@ class NonCachingPayload extends Payload { } } - public void writeStartElement(String localName) throws XMLStreamException { - if (name == null) { - name = new QName(localName); - } - delegate.writeStartElement(localName); - } - - public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException { - if (name == null) { - name = new QName(namespaceURI, localName); - } - delegate.writeStartElement(namespaceURI, localName); - } - - public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException { - if (name == null) { - name = new QName(namespaceURI, localName, prefix); - } - delegate.writeStartElement(prefix, localName, namespaceURI); - } - public void writeEmptyElement(String localName) throws XMLStreamException { if (name == null) { name = new QName(localName); @@ -212,10 +230,6 @@ class NonCachingPayload extends Payload { delegate.writeDTD(dtd); } - public void writeEndElement() throws XMLStreamException { - delegate.writeEndElement(); - } - public void writeEntityRef(String name) throws XMLStreamException { delegate.writeEntityRef(name); } diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/Payload.java b/core/src/main/java/org/springframework/ws/soap/axiom/Payload.java index 9cdbbf2e..bd18b552 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/Payload.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/Payload.java @@ -30,6 +30,9 @@ import org.springframework.ws.soap.axiom.support.AxiomUtils; import org.springframework.xml.transform.StaxSource; /** + * Abstract base class for payloads in Axiom. Comes in two flavors: {@link CachingPayload} and {@link + * NonCachingPayload}. + * * @author Arjen Poutsma * @since 1.5.2 */