Author: karthick
Date: Thu Feb 19 03:04:53 2009
New Revision: 745715

URL: http://svn.apache.org/viewvc?rev=745715&view=rev
Log:
ODE-519 When cloning elements, make sure to copy all direct and indirect 
references to prefixes.

Modified:
    ode/branches/APACHE_ODE_1.X/Rakefile
    
ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/DOMUtils.java

Modified: ode/branches/APACHE_ODE_1.X/Rakefile
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/Rakefile?rev=745715&r1=745714&r2=745715&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/Rakefile (original)
+++ ode/branches/APACHE_ODE_1.X/Rakefile Thu Feb 19 03:04:53 2009
@@ -504,7 +504,7 @@
 
   desc "ODE Utils"
   define "utils" do
-    compile.with AXIOM, AXIS2_ALL, COMMONS.collections, COMMONS.logging, 
COMMONS.pool, COMMONS.httpclient, COMMONS.codec, LOG4J, XERCES, JAVAX.stream, 
WSDL4J
+    compile.with AXIOM, AXIS2_ALL, COMMONS.collections, COMMONS.logging, 
COMMONS.pool, COMMONS.httpclient, COMMONS.codec, LOG4J, XERCES, JAVAX.stream, 
WSDL4J, SAXON
     test.exclude "*TestResources"
     package :jar
   end

Modified: 
ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/DOMUtils.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/DOMUtils.java?rev=745715&r1=745714&r2=745715&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/DOMUtils.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/DOMUtils.java
 Thu Feb 19 03:04:53 2009
@@ -47,6 +47,8 @@
 import javax.xml.transform.sax.SAXSource;
 import javax.xml.transform.stream.StreamSource;
 
+import net.sf.saxon.om.Name11Checker;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.ode.utils.sax.LoggingErrorHandler;
@@ -67,6 +69,7 @@
 import org.w3c.dom.NodeList;
 import org.w3c.dom.ProcessingInstruction;
 import org.w3c.dom.Text;
+import org.w3c.dom.TypeInfo;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
@@ -1070,13 +1073,17 @@
     public static Node cloneNode(Document document, Node node) {
        Node clone = null;
        String namespaceURI = node.getNamespaceURI();
-       String localName = node.getLocalName();
+       String nodeName = node.getLocalName();
        switch (node.getNodeType()) {
        case Node.ATTRIBUTE_NODE:
                if (namespaceURI == null) {
-                       clone = document.createAttribute(localName);
+                       clone = document.createAttribute(nodeName);
                } else {
-                       clone = document.createAttributeNS(namespaceURI, 
localName);
+                       String prefix = ((Attr) 
node).lookupPrefix(namespaceURI);
+                       if (prefix != null && !"".equals(prefix)) {
+                               nodeName = prefix + ":" + nodeName;
+                       }
+                       clone = document.createAttributeNS(namespaceURI, 
nodeName);
                }
                        break;
        case Node.CDATA_SECTION_NODE:
@@ -1093,23 +1100,27 @@
                        break;
        case Node.ELEMENT_NODE:
                if (namespaceURI == null) {
-                       clone = document.createElement(localName);
+                       clone = document.createElement(nodeName);
                } else {
-                       clone = document.createElementNS(namespaceURI, 
localName);
+                       String prefix = ((Element) 
node).lookupPrefix(namespaceURI);
+                       if (prefix != null && !"".equals(prefix)) {
+                               nodeName = prefix + ":" + nodeName;
+                       }
+                       clone = document.createElementNS(namespaceURI, 
nodeName);
                }
                        break;
        case Node.ENTITY_NODE:
                // TODO
                        break;
        case Node.ENTITY_REFERENCE_NODE:
-               clone = document.createEntityReference(localName);
+               clone = document.createEntityReference(nodeName);
                // TODO
                        break;
        case Node.NOTATION_NODE:
                // TODO
                        break;
        case Node.PROCESSING_INSTRUCTION_NODE:
-               clone = 
document.createProcessingInstruction(((ProcessingInstruction) node).getData(), 
localName);
+               clone = 
document.createProcessingInstruction(((ProcessingInstruction) node).getData(), 
nodeName);
                        break;
        case Node.TEXT_NODE:
                clone = document.createTextNode(((Text) node ).getData());
@@ -1117,14 +1128,40 @@
                default:
                        break;
        }
-
+                       
        NodeList children = node.getChildNodes();
        if (children != null) {
                for (int i = 0; i < children.getLength(); i++) {
-                       clone.appendChild(cloneNode(document, 
children.item(i)));
+                       Node child = children.item(i);
+                       Node cloneChild = cloneNode(document, child);
+                       clone.appendChild(cloneChild);
+                       if (cloneChild.getNodeType() == Node.TEXT_NODE || 
+                                       cloneChild.getNodeType() == 
Node.CDATA_SECTION_NODE) {
+                               parseEmbeddedPrefixes(node, (Element) clone, 
((Text) cloneChild).getNodeValue());                               
+                       }
                }
        }
-                       
        return clone;
     }
+    
+    private static void parseEmbeddedPrefixes(Node node, Element element, 
String text) {
+               if (text != null && text.indexOf(":") > 0) {
+                       Name11Checker nameChecker = Name11Checker.getInstance();
+                       for (int colonIndex = text.indexOf(":"); colonIndex != 
-1 && colonIndex < text.length(); colonIndex = text.indexOf(":", colonIndex +  
1)) {
+                               StringBuffer prefixString = new StringBuffer();
+                               for (int prefixIndex = colonIndex - 1; 
+                                               prefixIndex >= 0 && 
nameChecker.isNCNameChar(text.charAt(prefixIndex)); 
+                                               prefixIndex--) {
+                                       
prefixString.append(text.charAt(prefixIndex));
+                               }
+                               prefixString.reverse();
+                               if (prefixString.length() > 0) {
+                                       String uri = 
node.lookupNamespaceURI(prefixString.toString());
+                                       if (uri != null) {
+                                               
element.setAttributeNS(NS_URI_XMLNS, "xmlns:" + prefixString, uri);
+                                       }
+                               }
+                       }
+               }
+    }
 }


Reply via email to