Hi all,

is this a bug or a feature?

public void testParentAfterSetContent() throws Exception {
        Document doc = DocumentHelper.parseText("<root>" + "<a>a</a>"
            + "<b>b</b>" + "<x>x</x>" + "<d>d</d>" + "</root>");
        Node x = doc.selectSingleNode("/root/x");
        List content = doc.getRootElement().content();
        int position = content.indexOf(x);
        Element c = DocumentHelper.createElement("c");
        c.setText("c");
        content.add(position, c);
        assertNotNull(c.getParent());
        doc.getRootElement().setContent(content);
        assertNotNull(c.getParent());
    }

After setContent, the parent of c is null?!

If it is a bug, an easy patch in DefaultElement.setContent would be to
call contentRemoved() before all other stuff.

This doesn't seem to break other tests, but I am not familiar enough with the dom4j-sources to evaluate other possible side-effects.

Please take a look at the attached patch.

cheers
Pete
Index: src/java/org/dom4j/tree/DefaultElement.java
===================================================================
RCS file: /cvsroot/dom4j/dom4j/src/java/org/dom4j/tree/DefaultElement.java,v
retrieving revision 1.58
diff -c -2 -r1.58 DefaultElement.java
*** src/java/org/dom4j/tree/DefaultElement.java 29 Jan 2005 14:52:54 -0000      
1.58
--- src/java/org/dom4j/tree/DefaultElement.java 16 Mar 2005 10:04:46 -0000
***************
*** 598,601 ****
--- 598,604 ----
  
      public void setContent(List content) {
+         
+         contentRemoved();
+         
          if (content instanceof ContentListFacade) {
              content = ((ContentListFacade) content).getBackingList();
***************
*** 634,640 ****
                  }
              }
! 
!             contentRemoved();
! 
              this.content = newContent;
          }
--- 637,641 ----
                  }
              }
!             
              this.content = newContent;
          }
Index: src/test/org/dom4j/tree/DefaultElementTest.java
===================================================================
RCS file: /cvsroot/dom4j/dom4j/src/test/org/dom4j/tree/DefaultElementTest.java,v
retrieving revision 1.6
diff -c -2 -r1.6 DefaultElementTest.java
*** src/test/org/dom4j/tree/DefaultElementTest.java     17 Feb 2005 20:31:33 
-0000      1.6
--- src/test/org/dom4j/tree/DefaultElementTest.java     16 Mar 2005 10:04:46 
-0000
***************
*** 8,20 ****
  package org.dom4j.tree;
  
- import junit.textui.TestRunner;
- 
  import java.util.List;
  
! import org.dom4j.AbstractTestCase;
! import org.dom4j.Document;
! import org.dom4j.DocumentFactory;
! import org.dom4j.DocumentHelper;
! import org.dom4j.Element;
  
  /**
--- 8,16 ----
  package org.dom4j.tree;
  
  import java.util.List;
  
! import junit.textui.TestRunner;
! 
! import org.dom4j.*;
  
  /**
***************
*** 107,110 ****
--- 103,120 ----
          assertEquals(0, ns.size());
      }
+     
+     public void testParentAfterSetContent() throws Exception {
+         Document doc = DocumentHelper.parseText("<root>" + "<a>a</a>"
+             + "<b>b</b>" + "<x>x</x>" + "<d>d</d>" + "</root>");
+         Node x = doc.selectSingleNode("/root/x");
+         List content = doc.getRootElement().content();
+         int position = content.indexOf(x);
+         Element c = DocumentHelper.createElement("c");
+         c.setText("c");
+         content.add(position, c);
+         assertNotNull(c.getParent());
+         doc.getRootElement().setContent(content);
+         assertNotNull(c.getParent());
+     }
  }
  

Reply via email to