Another cloning bug in 1.0.3:  attributes added to a cloned element
will report a null getOwnerElement().  And other problems, but this is
what first cropped up for me.

The cause is ElementImpl doesn't correctly clone its "attributes"
NamedNodeMapImpl.  In particular, NamedNodeMapImpl.cloneMap() always
calls the NamedNodeMapImpl(Document, NamedNodeMapImpl) constructor,
when it should use the NamedNodeMapImpl(ElementImpl, NamedNodeMapImpl)
constructor in this case.

Diffs to fix this are attached.

-- Adam Winer
[EMAIL PROTECTED]
Oracle Corp.
--- ElementImpl.java    Thu Mar 09 18:35:57 2000
+++ //d/cabo/apache/xerces-1_0_3/src/org/apache/xerces/dom/ElementImpl.java     
Wed Mar 08 15:25:53 2000
@@ -173,8 +173,7 @@
 
        ElementImpl newnode = (ElementImpl) super.cloneNode(deep);
        // Replicate NamedNodeMap rather than sharing it.
-        newnode.attributes = attributes.cloneMap(newnode);
-
+       newnode.attributes = attributes.cloneMap();
        return newnode;
 
     } // cloneNode(boolean):Node
--- NamedNodeMapImpl.java       Thu Mar 09 18:36:55 2000
+++ 
//d/cabo/apache/xerces-1_0_3/src/org/apache/xerces/dom/NamedNodeMapImpl.java    
    Wed Mar 08 15:25:53 2000
@@ -566,43 +566,22 @@
      // Should the new docType object (if any) be a parameter, rather
      // than being set manually later on?
      // We _do_ clone the defaults reference, if any.
-    public NamedNodeMapImpl cloneMap(ElementImpl newElement) {
+    public NamedNodeMapImpl cloneMap() {
 
        boolean deep = true;
-       NamedNodeMapImpl newmap;
-        if (element != null)
-          newmap = new NamedNodeMapImpl(newElement, defaults);
-        else
-          newmap = new NamedNodeMapImpl(ownerDocument, defaults);
-
+       NamedNodeMapImpl newmap = new NamedNodeMapImpl(ownerDocument, defaults);
        if (nodes != null) {
                newmap.nodes = new Vector(nodes.size());
                for (int i = 0; i < nodes.size(); ++i) {
                 NodeImpl clone = 
(NodeImpl)((Node)nodes.elementAt(i)).cloneNode(deep);
-                if (newElement != null)
-                  clone.parentNode = newElement;
-                else
-                  clone.parentNode = element;
-                newmap.nodes.addElement(clone);
+                clone.parentNode = element;
+                       newmap.nodes.addElement(clone);
             }
         }
        newmap.defaults = defaults;
         newmap.lastDefaultsChanges = lastDefaultsChanges;
        return newmap;
 
-    } // cloneMap():NamedNodeMapImpl
-
-    /**
-     * Cloning a NamedNodeMap is a DEEP OPERATION; it always clones
-     * all the nodes contained in the map.
-     */
-     
-     // REVIST: Currently, this does _not_ clone the docType reference.
-     // Should the new docType object (if any) be a parameter, rather
-     // than being set manually later on?
-     // We _do_ clone the defaults reference, if any.
-    public NamedNodeMapImpl cloneMap() {
-      return cloneMap(null);
     } // cloneMap():NamedNodeMapImpl
 
     //

Reply via email to