Java Mailing List Archive

http://www.junlu.com/

Home » Home (12/2007) » JDOM User »

[jdom-interest] Bug in ListIterator.add() method

Christian Gruber

2005-04-22


Hello!

I think I have found two bugs in the ListIterator implementation of
Jdom 1.0. To be precise, it is the add() method implementation. I have
checked whether they are still there in the nightly build, and I still
found them there, too.

I have attached an example where I compare the behaviour of the Jdom
ListIterator implementation with the standard Java 1.4 ListIterator
implementation:



import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;

public class TestJdom {

  public static void main(String[] args) {
    try {
       // Do something with java.util.ListIterator
       List l = new LinkedList();
       l.add("one");
       l.add("two");
       l.add("three");
       ListIterator i;
       for (i = l.listIterator(); i.hasNext();) {
          String s = (String) i.next();
          i.add(s + "_x");
          i.add(s + "_y");
       }
       i.add("xxx");
       System.out.println(l);

       // Do the same with the Jdom ListIterator
       Document d =
         new Document().setRootElement(new Element("root"));
       Element r = d.getRootElement();
       r.addContent(new Element("element").setText("1"));
       r.addContent(new Element("element").setText("2"));
       r.addContent(new Element("element").setText("3"));
       XMLOutputter o = new XMLOutputter();
       for (i = r.getChildren("element").listIterator();
          i.hasNext();) {
          Element e = (Element) i.next();
          i.add(new Element("element").setText(e.getText() +
              "_x"));
          //i.add(new Element("element").setText(e.getText() +
          //   "_y")); // bug1
       }
       //i.add(new Element("element").setText("xxx")); // bug2
       o.output(d, System.out);
    } catch (Exception e) {
       e.printStackTrace();
    }
  }
}



When the comment is removed from the line marked with "bug1", after a
few seconds a java.lang.OutOfMemoryError is thrown.

When the comment is removed from the line marked with "bug2" instead,
the following exception is thrown:
java.lang.IndexOutOfBoundsException: Index: 7 Size: 6
  at org.jdom.ContentList.add (ContentList.java:237)
  at org.jdom.ContentList.add (ContentList.java:140)
  at org.jdom.ContentList$FilterListIterator.add(ContentList.java:897)
  at TestJdom.main(TestJdom.java:38)


I suppose that this is not the desired behaviour, since doing the same
thing with the ListIterator of java.util.LinkedList behaves as
expected.

As I suppose, Jdoms ListIterator.add() implementation has a problem
when it is called more than once and when it is called at the end of
the list.

Greetings,
Christian Gruber
_______________________________________________
To control your jdom-interest membership:
http://www.jdom.org/mailman/options/jdom-interest/youraddr@(protected)
©2008 junlu.com - Jax Systems, LLC, U.S.A.