You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by mr...@apache.org on 2009/12/14 20:49:45 UTC

svn commit: r890458 - in /xerces/java/branches/xml-schema-1.1-dev/src/org/apache: html/dom/HTMLDocumentImpl.java wml/dom/WMLDocumentImpl.java xerces/dom/CoreDocumentImpl.java xerces/dom/ElementImpl.java

Author: mrglavas
Date: Mon Dec 14 19:49:34 2009
New Revision: 890458

URL: http://svn.apache.org/viewvc?rev=890458&view=rev
Log:
Fixing JIRA Issue #1407: http://issues.apache.org/jira/browse/XERCESJ-1407. In several cases Document.renameNode() was creating the wrong Node implementations for the PSVI, HTML and WML DOMs. Patch thanks to Ludger Bünger.

Modified:
    xerces/java/branches/xml-schema-1.1-dev/src/org/apache/html/dom/HTMLDocumentImpl.java
    xerces/java/branches/xml-schema-1.1-dev/src/org/apache/wml/dom/WMLDocumentImpl.java
    xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java
    xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/ElementImpl.java

Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/html/dom/HTMLDocumentImpl.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/html/dom/HTMLDocumentImpl.java?rev=890458&r1=890457&r2=890458&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/html/dom/HTMLDocumentImpl.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/html/dom/HTMLDocumentImpl.java Mon Dec 14 19:49:34 2009
@@ -23,6 +23,7 @@
 import java.util.Locale;
 
 import org.apache.xerces.dom.DocumentImpl;
+import org.apache.xerces.dom.ElementImpl;
 import org.w3c.dom.Attr;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Element;
@@ -514,7 +515,7 @@
         return super.createAttribute( name.toLowerCase(Locale.ENGLISH) );
     }
 
-
+    
     public String getReferrer()
     {
         // Information not available on server side.
@@ -636,8 +637,25 @@
         cloneNode(newdoc, deep);
         return newdoc;
     }
+    
+    
+    /* (non-Javadoc)
+     * @see CoreDocumentImpl#canRenameElements()
+     */
+    protected boolean canRenameElements(String newNamespaceURI, String newNodeName, ElementImpl el) {
+        if (el.getNamespaceURI() != null) {
+            // element is not HTML:
+            // can be renamed if not changed to HTML
+            return newNamespaceURI != null;
+        }
+        
+        // check whether a class change is required
+        Class newClass = (Class) _elementTypesHTML.get(newNodeName.toUpperCase(Locale.ENGLISH));
+        Class oldClass = (Class) _elementTypesHTML.get(el.getTagName());
+        return newClass == oldClass;
+    }
 
-
+    
     /**
      * Recursive method retreives an element by its <code>id</code> attribute.
      * Called by {@link #getElementById(String)}.

Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/wml/dom/WMLDocumentImpl.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/wml/dom/WMLDocumentImpl.java?rev=890458&r1=890457&r2=890458&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/wml/dom/WMLDocumentImpl.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/wml/dom/WMLDocumentImpl.java Mon Dec 14 19:49:34 2009
@@ -21,6 +21,7 @@
 
 import org.apache.wml.WMLDocument;
 import org.apache.xerces.dom.DocumentImpl;
+import org.apache.xerces.dom.ElementImpl;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.DocumentType;
 import org.w3c.dom.Element;
@@ -65,6 +66,14 @@
         return new WMLElementImpl( this, tagName );
     }
     
+    /* (non-Javadoc)
+     * @see CoreDocumentImpl#canRenameElements()
+     */
+    protected boolean canRenameElements(String newNamespaceURI, String newNodeName, ElementImpl el) {
+        // check whether a class change is required
+        return _elementTypesWML.get(newNodeName) == _elementTypesWML.get(el.getTagName());
+    }
+    
     static {
         _elementTypesWML = new Hashtable();
         _elementTypesWML.put("b", WMLBElementImpl.class);

Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java?rev=890458&r1=890457&r2=890458&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java Mon Dec 14 19:49:34 2009
@@ -959,6 +959,19 @@
     }
 
 
+    /* NON-DOM
+     * Used by DOM Level 3 WD remameNode.
+     * 
+     * Some DOM implementations do not allow nodes to be renamed and require 
+     * creating new elements.
+     * In this case this method should be overwritten.
+     * 
+     * @return true if the given element can be renamed, false, if it must be replaced.
+     */
+    protected boolean canRenameElements(String newNamespaceURI, String newNodeName, ElementImpl el) {
+        return true;
+    }
+    
     /**
      * DOM Level 3 WD - Experimental.
      * Renaming node
@@ -975,76 +988,23 @@
             case ELEMENT_NODE: {
                 ElementImpl el = (ElementImpl) n;
                 if (el instanceof ElementNSImpl) {
-                    ((ElementNSImpl) el).rename(namespaceURI, name);
-                    
-                    // fire user data NODE_RENAMED event
-                    callUserDataHandlers(el, null, UserDataHandler.NODE_RENAMED);
+                    if (canRenameElements(namespaceURI, name, el)) {
+                        ((ElementNSImpl) el).rename(namespaceURI, name);
+                        // fire user data NODE_RENAMED event
+                        callUserDataHandlers(el, null, UserDataHandler.NODE_RENAMED);
+                    } 
+                    else {
+                        el = replaceRenameElement(el, namespaceURI, name);
+                    }
                 }
                 else {
-                    if (namespaceURI == null) {
-                        if (errorChecking) {
-                            int colon1 = name.indexOf(':');
-                            if(colon1 != -1){
-                                String msg =
-                                    DOMMessageFormatter.formatMessage(
-                                            DOMMessageFormatter.DOM_DOMAIN,
-                                            "NAMESPACE_ERR",
-                                            null);
-                                throw new DOMException(DOMException.NAMESPACE_ERR, msg);
-                            }
-                            if (!isXMLName(name,xml11Version)) {
-                                String msg = DOMMessageFormatter.formatMessage(
-                                        DOMMessageFormatter.DOM_DOMAIN,
-                                        "INVALID_CHARACTER_ERR", null);
-                                throw new DOMException(DOMException.INVALID_CHARACTER_ERR,
-                                        msg);
-                            }
-                        }
+                    if (namespaceURI == null && canRenameElements(null, name, el)) {
                         el.rename(name);
-                        
                         // fire user data NODE_RENAMED event
-                        callUserDataHandlers(el, null,
-                                UserDataHandler.NODE_RENAMED);
+                        callUserDataHandlers(el, null, UserDataHandler.NODE_RENAMED);
                     }
                     else {
-                        // we need to create a new object
-                        ElementNSImpl nel =
-                            new ElementNSImpl(this, namespaceURI, name);
-                        
-                        // register event listeners on new node
-                        copyEventListeners(el, nel);
-                        
-                        // remove user data from old node
-                        Hashtable data = removeUserDataTable(el);
-                        
-                        // remove old node from parent if any
-                        Node parent = el.getParentNode();
-                        Node nextSib = el.getNextSibling();
-                        if (parent != null) {
-                            parent.removeChild(el);
-                        }
-                        // move children to new node
-                        Node child = el.getFirstChild();
-                        while (child != null) {
-                            el.removeChild(child);
-                            nel.appendChild(child);
-                            child = el.getFirstChild();
-                        }
-                        // move specified attributes to new node
-                        nel.moveSpecifiedAttributes(el);
-                        
-                        // attach user data to new node
-                        setUserDataTable(nel, data);
-                        
-                        // and fire user data NODE_RENAMED event
-                        callUserDataHandlers(el, nel,
-                                UserDataHandler.NODE_RENAMED);
-                        
-                        // insert new node where old one was
-                        if (parent != null) {
-                            parent.insertBefore(nel, nextSib);
-                        }
-                        el = nel;
+                        el = replaceRenameElement(el, namespaceURI, name);
                     }
                 }
                 // fire ElementNameChanged event
@@ -1054,7 +1014,7 @@
             case ATTRIBUTE_NODE: {
                 AttrImpl at = (AttrImpl) n;
                 
-                // dettach attr from element
+                // detach attr from element
                 Element el = at.getOwnerElement();
                 if (el != null) {
                     el.removeAttributeNode(at);
@@ -1082,7 +1042,7 @@
                     }
                     else {
                         // we need to create a new object
-                        AttrNSImpl nat = new AttrNSImpl(this, namespaceURI, name);
+                        AttrNSImpl nat = (AttrNSImpl) createAttributeNS(namespaceURI, name);
                         
                         // register event listeners on new node
                         copyEventListeners(at, nat);
@@ -1123,6 +1083,47 @@
         }
         
     }
+    
+    private ElementImpl replaceRenameElement(ElementImpl el, String namespaceURI, String name) {
+        
+        // we need to create a new object
+        ElementNSImpl nel = (ElementNSImpl)createElementNS(namespaceURI, name);
+        
+        // register event listeners on new node
+        copyEventListeners(el, nel);
+        
+        // remove user data from old node
+        Hashtable data = removeUserDataTable(el);
+        
+        // remove old node from parent if any
+        Node parent = el.getParentNode();
+        Node nextSib = el.getNextSibling();
+        if (parent != null) {
+            parent.removeChild(el);
+        }
+        // move children to new node
+        Node child = el.getFirstChild();
+        while (child != null) {
+            el.removeChild(child);
+            nel.appendChild(child);
+            child = el.getFirstChild();
+        }
+        // move specified attributes to new node
+        nel.moveSpecifiedAttributes(el);
+        
+        // attach user data to new node
+        setUserDataTable(nel, data);
+        
+        // and fire user data NODE_RENAMED event
+        callUserDataHandlers(el, nel,
+                UserDataHandler.NODE_RENAMED);
+        
+        // insert new node where old one was
+        if (parent != null) {
+            parent.insertBefore(nel, nextSib);
+        }
+        return nel;
+    }
 
 
     /**

Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/ElementImpl.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/ElementImpl.java?rev=890458&r1=890457&r2=890458&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/ElementImpl.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/ElementImpl.java Mon Dec 14 19:49:34 2009
@@ -97,7 +97,25 @@
         if (needsSyncData()) {
             synchronizeData();
         }
-	    this.name = name;
+        if (ownerDocument.errorChecking) {
+            int colon1 = name.indexOf(':');
+            if(colon1 != -1){
+                String msg =
+                    DOMMessageFormatter.formatMessage(
+                            DOMMessageFormatter.DOM_DOMAIN,
+                            "NAMESPACE_ERR",
+                            null);
+                throw new DOMException(DOMException.NAMESPACE_ERR, msg);
+            }
+            if (!CoreDocumentImpl.isXMLName(name, ownerDocument.isXML11Version())) {
+                String msg = DOMMessageFormatter.formatMessage(
+                        DOMMessageFormatter.DOM_DOMAIN,
+                        "INVALID_CHARACTER_ERR", null);
+                throw new DOMException(DOMException.INVALID_CHARACTER_ERR,
+                        msg);
+            }
+        }
+        this.name = name;
         reconcileDefaultAttributes();
     }
 
@@ -689,7 +707,7 @@
                 // This case is not defined by the DOM spec, we choose
                 // to create a new attribute in this case and remove an old one from the tree
                 // note this might cause events to be propagated or user data to be lost 
-                newAttr = new AttrNSImpl((CoreDocumentImpl)getOwnerDocument(), namespaceURI, qualifiedName, localName);
+                newAttr = ((CoreDocumentImpl)getOwnerDocument()).createAttributeNS(namespaceURI, qualifiedName, localName);
                 attributes.setNamedItemNS(newAttr);
             }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org