You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by ka...@apache.org on 2009/02/19 04:04:53 UTC

svn commit: r745715 - in /ode/branches/APACHE_ODE_1.X: Rakefile utils/src/main/java/org/apache/ode/utils/DOMUtils.java

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);
+					}
+				}
+			}
+		}
+    }
 }