You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2011/01/04 04:39:57 UTC

svn commit: r1054882 - /cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java

Author: dkulp
Date: Tue Jan  4 03:39:56 2011
New Revision: 1054882

URL: http://svn.apache.org/viewvc?rev=1054882&view=rev
Log:
[CXF-3047] Take W3CDOMStreamReader into account when searching for
namespaces.
Patch from Marc Giger applied.

Modified:
    cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java

Modified: cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java?rev=1054882&r1=1054881&r2=1054882&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java (original)
+++ cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java Tue Jan  4 03:39:56 2011
@@ -63,7 +63,10 @@ import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
 import javax.xml.stream.util.StreamReaderDelegate;
 import javax.xml.transform.stream.StreamResult;
+
+import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 
 import org.apache.cxf.common.i18n.Message;
@@ -77,6 +80,7 @@ import org.apache.cxf.service.model.Sche
 import org.apache.cxf.staxutils.DepthXMLStreamReader;
 import org.apache.cxf.staxutils.StaxUtils;
 import org.apache.cxf.staxutils.W3CDOMStreamWriter;
+import org.apache.cxf.staxutils.W3CNamespaceContext;
 import org.apache.ws.commons.schema.XmlSchemaElement;
 import org.apache.ws.commons.schema.XmlSchemaSimpleType;
 import org.apache.ws.commons.schema.XmlSchemaSimpleTypeList;
@@ -813,18 +817,33 @@ public final class JAXBEncoderDecoder {
         NamespaceContext c = source.getNamespaceContext();
         final Map<String, String> nsMap = new TreeMap<String, String>();
         try {
-            try {
-                //Woodstox version
-                c = (NamespaceContext)c.getClass().getMethod("createNonTransientNsContext", Location.class)
-                    .invoke(c, new Object[1]);
-            } catch (Throwable t) {
-                //ignore
-            }
-            Field f = c.getClass().getDeclaredField("mNamespaces");
-            f.setAccessible(true);
-            String ns[] = (String[])f.get(c);
-            for (int x = 0; x < ns.length; x += 2) {
-                nsMap.put(ns[x], ns[x + 1]);
+            if (c instanceof W3CNamespaceContext) {                                
+                Element element = ((W3CNamespaceContext)c).getElement();
+                while (element != null) {
+                    NamedNodeMap namedNodeMap = element.getAttributes();
+                    for (int i = 0; i < namedNodeMap.getLength(); i++) {
+                        Attr attr = (Attr)namedNodeMap.item(i);
+                        if (attr.getPrefix() != null && attr.getPrefix().equals("xmlns")) {
+                            nsMap.put(attr.getLocalName(), attr.getValue());
+                        }
+                    }
+                    element = (Element)element.getParentNode();
+                }
+            } else {
+                try {
+                    //Woodstox version
+                    c = (NamespaceContext)c.getClass().getMethod("createNonTransientNsContext", 
+                                                                 Location.class)
+                        .invoke(c, new Object[1]);
+                } catch (Throwable t) {
+                    //ignore
+                }
+                Field f = c.getClass().getDeclaredField("mNamespaces");
+                f.setAccessible(true);
+                String ns[] = (String[])f.get(c);
+                for (int x = 0; x < ns.length; x += 2) {
+                    nsMap.put(ns[x], ns[x + 1]);
+                }
             }
         } catch (Throwable t) {
             //internal JDK/xerces version