Repository: cxf Updated Branches: refs/heads/2.7.x-fixes 523dbfde1 -> 401def618
[CXF-6319] Fix regression by storing namespace declarations from Body and Envelope element and later updating the SAAJ model with them Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/5b5e7428 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/5b5e7428 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/5b5e7428 Branch: refs/heads/2.7.x-fixes Commit: 5b5e74280b7d3b473d82490521c6bc1404611c05 Parents: 523dbfd Author: Alessio Soldano <asold...@redhat.com> Authored: Thu Mar 26 22:34:44 2015 +0100 Committer: Alessio Soldano <asold...@redhat.com> Committed: Mon Mar 30 08:40:25 2015 +0200 ---------------------------------------------------------------------- .../interceptor/ReadHeadersInterceptor.java | 47 +++++++++++++++++--- .../binding/soap/saaj/SAAJInInterceptor.java | 13 ++++++ 2 files changed, 55 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/5b5e7428/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java ---------------------------------------------------------------------- diff --git a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java index da79bf6..ee768d9 100644 --- a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java +++ b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java @@ -21,7 +21,10 @@ package org.apache.cxf.binding.soap.interceptor; import java.io.InputStream; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.logging.Logger; import javax.xml.namespace.QName; @@ -29,6 +32,7 @@ import javax.xml.stream.XMLEventFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.events.Namespace; import javax.xml.stream.events.XMLEvent; import org.w3c.dom.Attr; @@ -63,6 +67,8 @@ import org.apache.cxf.staxutils.W3CDOMStreamWriter; public class ReadHeadersInterceptor extends AbstractSoapInterceptor { + + public static final String ADDITIONAL_ENVELOPE_BODY_NS = "additional.env.body.ns"; /** * */ @@ -186,6 +192,8 @@ public class ReadHeadersInterceptor extends AbstractSoapInterceptor { doc = processor.process(filteredReader); if (doc != null) { message.setContent(Node.class, doc); + } else { + message.put(ADDITIONAL_ENVELOPE_BODY_NS, processor.getEnvelopeAndBodyNamespaces()); } } @@ -273,14 +281,22 @@ public class ReadHeadersInterceptor extends AbstractSoapInterceptor { */ private static class HeadersProcessor { private static final XMLEventFactory FACTORY = XMLEventFactory.newInstance(); - private final QName soapVersionHeader; + private final String ns; + private final String header; + private final String body; + private final String envelope; private final List<XMLEvent> events = new ArrayList<XMLEvent>(8); + private Map<String, String> namespaces; private StreamToDOMContext context; private Document doc; private Node parent; + private QName lastStartElementQName; public HeadersProcessor(SoapVersion version) { - this.soapVersionHeader = version.getHeader(); + this.header = version.getHeader().getLocalPart(); + this.ns = version.getEnvelope().getNamespaceURI(); + this.envelope = version.getEnvelope().getLocalPart(); + this.body = version.getBody().getLocalPart(); } public Document process(XMLStreamReader reader) throws XMLStreamException { @@ -343,9 +359,9 @@ public class ReadHeadersInterceptor extends AbstractSoapInterceptor { private void addEvent(XMLEvent event) { if (event.isStartElement()) { - QName qName = event.asStartElement().getName(); - if (soapVersionHeader.getLocalPart().equals(qName.getLocalPart()) - && soapVersionHeader.getNamespaceURI().equals(qName.getNamespaceURI())) { + lastStartElementQName = event.asStartElement().getName(); + if (header.equals(lastStartElementQName.getLocalPart()) + && ns.equals(lastStartElementQName.getNamespaceURI())) { // process all events recorded so far context = new StreamToDOMContext(true, false, false); doc = DOMUtils.createDocument(); @@ -361,8 +377,29 @@ public class ReadHeadersInterceptor extends AbstractSoapInterceptor { events.add(event); } } else { + if (event.isNamespace()) { + final String lastEl = lastStartElementQName.getLocalPart(); + if ((body.equals(lastEl) || envelope.equals(lastEl)) + && ns.equals(lastStartElementQName.getNamespaceURI())) { + if (namespaces == null) { + namespaces = new HashMap<String, String>(); + } + Namespace nsEvent = (Namespace)event; + //just put in the map, in case of duplicates in env and body, + //body one will always come afterwards, so we're fine + namespaces.put(nsEvent.getPrefix(), nsEvent.getNamespaceURI()); + } + } events.add(event); } } + + public Map<String, String> getEnvelopeAndBodyNamespaces() { + if (namespaces == null) { + return Collections.emptyMap(); + } else { + return Collections.unmodifiableMap(namespaces); + } + } } } http://git-wip-us.apache.org/repos/asf/cxf/blob/5b5e7428/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java ---------------------------------------------------------------------- diff --git a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java index 0cca461..17d22ed 100644 --- a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java +++ b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java @@ -25,11 +25,14 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import java.util.ResourceBundle; import javax.xml.namespace.QName; import javax.xml.soap.AttachmentPart; import javax.xml.soap.MessageFactory; +import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; @@ -184,6 +187,16 @@ public class SAAJInInterceptor extends AbstractSoapInterceptor { Document node = (Document) message.getContent(Node.class); if (node != part && node != null) { StaxUtils.copy(node, new SAAJStreamWriter(part)); + } else { + SOAPBody body = soapMessage.getSOAPBody(); + @SuppressWarnings("unchecked") + Map<String, String> additionalNsMap = (Map<String, String>)message + .get(ReadHeadersInterceptor.ADDITIONAL_ENVELOPE_BODY_NS); + if (additionalNsMap != null) { + for (Entry<String, String> e : additionalNsMap.entrySet()) { + body.addNamespaceDeclaration(e.getKey(), e.getValue()); + } + } } message.setContent(Node.class, soapMessage.getSOAPPart());