You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by bo...@apache.org on 2006/10/17 20:18:33 UTC

svn commit: r464987 - /incubator/ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/OMUtils.java

Author: boisvert
Date: Tue Oct 17 11:18:32 2006
New Revision: 464987

URL: http://svn.apache.org/viewvc?view=rev&rev=464987
Log:
toDOM() now copies namespaces from parent elements in case namespaces are declared on SOAP envelope or body

Modified:
    incubator/ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/OMUtils.java

Modified: incubator/ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/OMUtils.java
URL: http://svn.apache.org/viewvc/incubator/ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/OMUtils.java?view=diff&rev=464987&r1=464986&r2=464987
==============================================================================
--- incubator/ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/OMUtils.java (original)
+++ incubator/ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/OMUtils.java Tue Oct 17 11:18:32 2006
@@ -19,24 +19,29 @@
 
 package org.apache.ode.axis2.util;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.impl.builder.StAXOMBuilder;
 import org.apache.axis2.AxisFault;
 import org.apache.ode.utils.DOMUtils;
 import org.w3c.dom.Element;
 
-import javax.xml.namespace.QName;
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.stream.XMLStreamReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-
 /**
  * Utility methods to convert from/to AxiOM and DOM.
  */
 public class OMUtils {
 
     public static Element toDOM(OMElement element) throws AxisFault {
+        copyParentNamespaces(element);
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         try {
             element.serialize(baos);
@@ -79,4 +84,36 @@
         return qname;
     }
 
+    /**
+     * Copy namespaces found on parent elements on the element itself.
+     * This is useful when detaching an element from its parent to maintain
+     * namespace context.
+     */
+    public static void copyParentNamespaces(OMElement target) {
+        if (target.getParent() instanceof OMElement) {
+            HashSet<String> declaredNS = new HashSet<String>();
+            Iterator iter = target.getAllDeclaredNamespaces();
+            while (iter.hasNext()) {
+                OMNamespace ns = (OMNamespace) iter.next();
+                declaredNS.add(ns.getPrefix());
+            }
+            copyParentNamespaces(target, (OMElement) target.getParent(), declaredNS);
+        }
+    }
+    
+    private static void copyParentNamespaces(OMElement target, OMElement parent, HashSet<String> declaredNS) {
+        Iterator iter = parent.getAllDeclaredNamespaces();
+        while (iter.hasNext()) {
+            OMNamespace ns = (OMNamespace) iter.next();
+            // do not override local namespace mappings
+            if (!ns.getPrefix().equals("") && !declaredNS.contains(ns.getPrefix())) {
+                target.declareNamespace(ns.getName(), ns.getPrefix());
+                declaredNS.add(ns.getPrefix());
+            }
+        }
+        // recurse
+        if (parent.getParent() instanceof OMElement) {
+            copyParentNamespaces(target, (OMElement) parent.getParent(), declaredNS);
+        }
+    }        
 }