Repository: cxf Updated Branches: refs/heads/3.1.x-fixes 4a749e745 -> c7234f413
[CXF-6867] Ensure Envelope and Body element prefixes are not changed when processing messages without headers Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/bbc3ca28 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/bbc3ca28 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/bbc3ca28 Branch: refs/heads/3.1.x-fixes Commit: bbc3ca287cca8cf982b62fb85c6a2bbc5bb59754 Parents: 4a749e7 Author: Alessio Soldano <asold...@redhat.com> Authored: Wed Apr 13 23:02:56 2016 +0200 Committer: Alessio Soldano <asold...@redhat.com> Committed: Wed Apr 13 23:08:53 2016 +0200 ---------------------------------------------------------------------- .../interceptor/ReadHeadersInterceptor.java | 21 ++++++++++++++++++++ .../binding/soap/saaj/SAAJInInterceptor.java | 10 ++++++++++ .../cxf/binding/soap/saaj/SAAJStreamWriter.java | 17 ++-------------- .../apache/cxf/binding/soap/saaj/SAAJUtils.java | 17 ++++++++++++++++ 4 files changed, 50 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/bbc3ca28/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 269ef4d..6bfa3a3 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 @@ -70,6 +70,8 @@ public class ReadHeadersInterceptor extends AbstractSoapInterceptor { public static final String ENVELOPE_EVENTS = "envelope.events"; public static final String BODY_EVENTS = "body.events"; + public static final String ENVELOPE_PREFIX = "envelope.prefix"; + public static final String BODY_PREFIX = "body.prefix"; /** * */ @@ -205,6 +207,8 @@ public class ReadHeadersInterceptor extends AbstractSoapInterceptor { } else { message.put(ENVELOPE_EVENTS, processor.getEnvAttributeAndNamespaceEvents()); message.put(BODY_EVENTS, processor.getBodyAttributeAndNamespaceEvents()); + message.put(ENVELOPE_PREFIX, processor.getEnvelopePrefix()); + message.put(BODY_PREFIX, processor.getBodyPrefix()); } if (addNC) { // add the Body-level declarations @@ -326,6 +330,8 @@ public class ReadHeadersInterceptor extends AbstractSoapInterceptor { private Document doc; private Node parent; private QName lastStartElementQName; + private String envelopePrefix; + private String bodyPrefix; HeadersProcessor(SoapVersion version) { this.header = version.getHeader().getLocalPart(); @@ -409,6 +415,13 @@ public class ReadHeadersInterceptor extends AbstractSoapInterceptor { throw new Fault(e); } } else { + if (ns.equals(lastStartElementQName.getNamespaceURI())) { + if (body.equals(lastStartElementQName.getLocalPart())) { + bodyPrefix = lastStartElementQName.getPrefix(); + } else if (envelope.equals(lastStartElementQName.getLocalPart())) { + envelopePrefix = lastStartElementQName.getPrefix(); + } + } events.add(event); } } else { @@ -445,5 +458,13 @@ public class ReadHeadersInterceptor extends AbstractSoapInterceptor { return Collections.unmodifiableList(envEvents); } } + + public String getEnvelopePrefix() { + return envelopePrefix; + } + + public String getBodyPrefix() { + return bodyPrefix; + } } } http://git-wip-us.apache.org/repos/asf/cxf/blob/bbc3ca28/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 51afbf5..516bf89 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 @@ -193,6 +193,10 @@ public class SAAJInInterceptor extends AbstractSoapInterceptor { StaxUtils.copy(node, new SAAJStreamWriter(part)); } else { SOAPEnvelope env = soapMessage.getSOAPPart().getEnvelope(); + if (node == null) { + adjustPrefixes(env, (String)message.get(ReadHeadersInterceptor.ENVELOPE_PREFIX), + (String)message.get(ReadHeadersInterceptor.BODY_PREFIX)); + } List<XMLEvent> events = (List<XMLEvent>)message.get(ReadHeadersInterceptor.ENVELOPE_EVENTS); applyEvents(events, env); SOAPBody body = soapMessage.getSOAPBody(); @@ -258,6 +262,12 @@ public class SAAJInInterceptor extends AbstractSoapInterceptor { .getVersion().getSender()); } } + + private static void adjustPrefixes(SOAPEnvelope env, String envPrefix, String bodyPrefix) throws SOAPException { + SAAJUtils.adjustPrefix(env, envPrefix); + SAAJUtils.adjustPrefix(env.getBody(), bodyPrefix); + SAAJUtils.adjustPrefix(env.getHeader(), envPrefix); + } private static void applyEvents(List<XMLEvent> events, SOAPElement el) throws SOAPException { if (events != null) { http://git-wip-us.apache.org/repos/asf/cxf/blob/bbc3ca28/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJStreamWriter.java ---------------------------------------------------------------------- diff --git a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJStreamWriter.java b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJStreamWriter.java index f96a14d..14b5c2e 100644 --- a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJStreamWriter.java +++ b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJStreamWriter.java @@ -32,6 +32,8 @@ import org.w3c.dom.Node; import org.apache.cxf.common.util.StringUtils; import org.apache.cxf.staxutils.OverlayW3CDOMStreamWriter; +import static org.apache.cxf.binding.soap.saaj.SAAJUtils.adjustPrefix; + public final class SAAJStreamWriter extends OverlayW3CDOMStreamWriter { private final SOAPPart part; @@ -44,21 +46,6 @@ public final class SAAJStreamWriter extends OverlayW3CDOMStreamWriter { this.part = part; } - private SOAPElement adjustPrefix(SOAPElement e, String prefix) { - if (prefix == null) { - prefix = ""; - } - try { - String s = e.getPrefix(); - if (!prefix.equals(s)) { - e.setPrefix(prefix); - e.removeNamespaceDeclaration(s); - } - } catch (Throwable t) { - //likely old old version of SAAJ, we'll just try our best - } - return e; - } protected void adjustOverlaidNode(Node nd2, String pfx) { String namespace = nd2.getNamespaceURI(); try { http://git-wip-us.apache.org/repos/asf/cxf/blob/bbc3ca28/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJUtils.java ---------------------------------------------------------------------- diff --git a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJUtils.java b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJUtils.java index 78702a3..89cb7f7 100644 --- a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJUtils.java +++ b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJUtils.java @@ -21,6 +21,7 @@ package org.apache.cxf.binding.soap.saaj; import javax.xml.namespace.QName; import javax.xml.soap.SOAPBody; +import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPFault; import javax.xml.soap.SOAPHeader; @@ -66,4 +67,20 @@ public final class SAAJUtils { } } + + public static SOAPElement adjustPrefix(SOAPElement e, String prefix) { + if (prefix == null) { + prefix = ""; + } + try { + String s = e.getPrefix(); + if (!prefix.equals(s)) { + e.setPrefix(prefix); + e.removeNamespaceDeclaration(s); + } + } catch (Throwable t) { + //likely old old version of SAAJ, we'll just try our best + } + return e; + } }