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