Repository: cxf
Updated Branches:
  refs/heads/3.0.x-fixes f01d17173 -> 727e403f7


[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/93c84a17
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/93c84a17
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/93c84a17

Branch: refs/heads/3.0.x-fixes
Commit: 93c84a176cb94d0491971a7a394f61fad945d6fe
Parents: f01d171
Author: Alessio Soldano <asold...@redhat.com>
Authored: Wed Apr 13 23:02:56 2016 +0200
Committer: Alessio Soldano <asold...@redhat.com>
Committed: Thu Apr 14 11:49:13 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/93c84a17/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 88709a1..7b18d1c 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;
 
         public 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/93c84a17/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 1f12f8f..37b88c5 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/93c84a17/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/93c84a17/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;
+    }
 }

Reply via email to