CAMEL-8313 CxfPayload AddNamespace should not override the element's namespace


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/ff82f386
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/ff82f386
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/ff82f386

Branch: refs/heads/camel-2.13.x
Commit: ff82f38695f4823de7e201d3aa4c2baddab79693
Parents: 785cbc8
Author: Willem Jiang <willem.ji...@gmail.com>
Authored: Wed Feb 4 20:57:02 2015 +0800
Committer: Willem Jiang <willem.ji...@gmail.com>
Committed: Wed Feb 4 21:06:22 2015 +0800

----------------------------------------------------------------------
 .../apache/camel/component/cxf/CxfPayload.java  | 10 ++++-
 .../camel/component/cxf/DefaultCxfBinding.java  |  9 +++-
 .../component/cxf/DefaultCxfBindingTest.java    | 45 +++++++++++++++++---
 3 files changed, 53 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/ff82f386/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfPayload.java
----------------------------------------------------------------------
diff --git 
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfPayload.java
 
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfPayload.java
index 1330b0f..abdf682 100644
--- 
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfPayload.java
+++ 
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfPayload.java
@@ -29,6 +29,7 @@ import javax.xml.transform.dom.DOMSource;
 import org.w3c.dom.Element;
 
 import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.cxf.staxutils.StaxUtils;
 
 
@@ -110,10 +111,15 @@ public class CxfPayload<T> {
     protected static void addNamespace(Element element, Map<String, String> 
nsMap) {
         if (nsMap != null) {
             for (String ns : nsMap.keySet()) {
+                // We should not override the namespace setting of the element
                 if (XMLConstants.XMLNS_ATTRIBUTE.equals(ns)) {
-                    element.setAttribute(ns, nsMap.get(ns));
+                    if 
(ObjectHelper.isEmpty(element.getAttribute(XMLConstants.XMLNS_ATTRIBUTE))) {
+                        element.setAttribute(ns, nsMap.get(ns));
+                    }
                 } else {
-                    element.setAttribute(XMLConstants.XMLNS_ATTRIBUTE + ":" + 
ns, nsMap.get(ns));
+                    if 
(ObjectHelper.isEmpty(element.getAttribute(XMLConstants.XMLNS_ATTRIBUTE + ":" + 
ns))) {
+                        element.setAttribute(XMLConstants.XMLNS_ATTRIBUTE + 
":" + ns, nsMap.get(ns));
+                    }
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/camel/blob/ff82f386/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
----------------------------------------------------------------------
diff --git 
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
 
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
index ef4c072..40d4290 100644
--- 
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
+++ 
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
@@ -731,10 +731,15 @@ public class DefaultCxfBinding implements CxfBinding, 
HeaderFilterStrategyAware
 
     protected static void addNamespace(Element element, Map<String, String> 
nsMap) {
         for (String ns : nsMap.keySet()) {
+            // We should not override the namespace setting of the element
             if (XMLConstants.XMLNS_ATTRIBUTE.equals(ns)) {
-                element.setAttribute(ns, nsMap.get(ns));
+                if 
(ObjectHelper.isEmpty(element.getAttribute(XMLConstants.XMLNS_ATTRIBUTE))) {
+                    element.setAttribute(ns, nsMap.get(ns));
+                }
             } else {
-                element.setAttribute(XMLConstants.XMLNS_ATTRIBUTE + ":" + ns, 
nsMap.get(ns));
+                if 
(ObjectHelper.isEmpty(element.getAttribute(XMLConstants.XMLNS_ATTRIBUTE + ":" + 
ns))) {
+                    element.setAttribute(XMLConstants.XMLNS_ATTRIBUTE + ":" + 
ns, nsMap.get(ns));
+                }
             }
         }
                      

http://git-wip-us.apache.org/repos/asf/camel/blob/ff82f386/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/DefaultCxfBindingTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/DefaultCxfBindingTest.java
 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/DefaultCxfBindingTest.java
index 2097f3e..c82050a 100644
--- 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/DefaultCxfBindingTest.java
+++ 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/DefaultCxfBindingTest.java
@@ -61,10 +61,16 @@ import org.junit.Test;
  */
 public class DefaultCxfBindingTest extends Assert {
     
-    private static final String SOAP_MESSAGE = "<soap:Envelope 
xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"";
+    private static final String SOAP_MESSAGE_1 = "<soap:Envelope 
xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"";
         + " xmlns=\"http://www.mycompany.com/test/\"; 
xmlns:ns1=\"http://www.mycompany.com/test/1/\";>"
         + " <soap:Body> <request> <ns1:identifier>TEST</ns1:identifier> 
</request>"
         + " </soap:Body> </soap:Envelope>";
+    
+    private static final String SOAP_MESSAGE_2 = "<soap:Envelope 
xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"";
+        + " xmlns=\"http://www.mycompany.com/test/\"; 
xmlns:ns1=\"http://www.mycompany.com/test/1/\";>"
+        + " <soap:Body> <ns1:identifier 
xmlns:ns1=\"http://www.mycompany.com/test/\"; 
xmlns=\"http://www.mycompany.com/test/1/\";>TEST</ns1:identifier>"
+        + " </soap:Body> </soap:Envelope>";
+    
     private DefaultCamelContext context = new DefaultCamelContext();
 
     @Test
@@ -76,22 +82,28 @@ public class DefaultCxfBindingTest extends Assert {
         assertSame("The header filter strategy is set", hfs, 
cxfBinding.getHeaderFilterStrategy());
     }
     
-    @Test
-    public void testPayloadBodyNamespace() throws Exception {
-        MessageImpl message = new MessageImpl();
+    private Document getDocument(String soapMessage) throws Exception {
+        
         DocumentBuilderFactory documentBuilderFactory = 
DocumentBuilderFactory.newInstance();
         documentBuilderFactory.setNamespaceAware(true);
         DocumentBuilder documentBuilder = 
documentBuilderFactory.newDocumentBuilder();
-        Document document = 
documentBuilder.parse(IOConverter.toInputStream(SOAP_MESSAGE, null));
+        Document document = 
documentBuilder.parse(IOConverter.toInputStream(soapMessage, null));
         document.getDocumentElement().normalize();
-        message.setContent(Node.class, document);
+       
+        return document;
+    }
+    
+    @Test
+    public void testPayloadBodyNamespace() throws Exception {
+        MessageImpl message = new MessageImpl();
         Map<String, String> nsMap = new HashMap<String, String>();
+        Document document = getDocument(SOAP_MESSAGE_1);
+        message.setContent(Node.class, document);
         DefaultCxfBinding.getPayloadBodyElements(message, nsMap);
         
         assertEquals(2, nsMap.size());
         assertEquals("http://www.mycompany.com/test/";, nsMap.get("xmlns"));
         
-        document = documentBuilder.newDocument();
         Element element = document.createElement("tag");
         DefaultCxfBinding.addNamespace(element, nsMap);
         assertEquals("http://www.mycompany.com/test/";, 
element.getAttribute("xmlns"));
@@ -99,6 +111,25 @@ public class DefaultCxfBindingTest extends Assert {
     }
     
     @Test
+    public void testOverridePayloadBodyNamespace() throws Exception {
+        MessageImpl message = new MessageImpl();
+        Map<String, String> nsMap = new HashMap<String, String>();
+        Document document = getDocument(SOAP_MESSAGE_2);
+        message.setContent(Node.class, document);
+        DefaultCxfBinding.getPayloadBodyElements(message, nsMap);
+        
+        assertEquals(2, nsMap.size());
+        assertEquals("http://www.mycompany.com/test/";, nsMap.get("xmlns"));
+        
+        Element element = 
(Element)document.getElementsByTagName("ns1:identifier").item(0);
+        assertNotNull("We should get the element", element);
+        DefaultCxfBinding.addNamespace(element, nsMap);
+        assertEquals("http://www.mycompany.com/test/1/";, 
element.getAttribute("xmlns"));
+        assertEquals("http://www.mycompany.com/test/";, 
element.getAttribute("xmlns:ns1"));
+    }
+
+    
+    @Test
     public void testSetCharsetWithContentType() {
         DefaultCxfBinding cxfBinding = new DefaultCxfBinding();
         cxfBinding.setHeaderFilterStrategy(new DefaultHeaderFilterStrategy());

Reply via email to