Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6586466

XMLEventReaderImpl.nextTag() does not update fLastEvent

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P4 P4
    • 1.4.0
    • 6
    • xml
    • 1.4
    • x86
    • linux
    • Verified

        FULL PRODUCT VERSION :
        java version "1.6.0_02"
        Java(TM) SE Runtime Environment (build 1.6.0_02-b05)
        Java HotSpot(TM) Client VM (build 1.6.0_02-b05, mixed mode, sharing)

        The error is also present in
        https://openjdk.dev.java.net/source/browse/openjdk/jdk/trunk/j2se/src/share/classes/com/sun/xml/internal/stream/XMLEventReaderImpl.java?rev=238&view=log


        A DESCRIPTION OF THE PROBLEM :
        XMLEventReader.getElementText() reports errorneous XMLStreamException
        after XMLEventReader.nextTag().

        XMLEventReader is implemented in
          com.sun.xml.internal.stream.events.XMLEventReaderImpl.java

        Function getElementText() checks the current event (stored in fLastEvent) whether
        it is StartElement. However, nextTag() does not update fLastEvent in all cases:
        * without previous peek()
        * with peek() without events that needs skipping (white space, comments, pi).
        Only if peek() is called and events are skipped, is fLastEvent is updated because
        of nextEvent().

        STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
        Store the source code below as Test.java.
        Then compile (java(c) >= 1.6):
            javac Test.java
        and run it
            java Test


        EXPECTED VERSUS ACTUAL BEHAVIOR :
        EXPECTED -
        class com.sun.xml.internal.stream.events.StartDocumentEvent
        class com.sun.xml.internal.stream.events.StartElementEvent
        Hello

        ACTUAL -
        class com.sun.xml.internal.stream.events.StartDocumentEvent
        class com.sun.xml.internal.stream.events.StartElementEvent
        Exception in thread "main" javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,28]
        Message: parser must be on START_ELEMENT to read next text
                at com.sun.xml.internal.stream.XMLEventReaderImpl.getElementText(XMLEventReaderImpl.java:114)
                at Test.main(Test.java:25)


        ERROR MESSAGES/STACK TRACES THAT OCCUR :
        Exception in thread "main" javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,28]
        Message: parser must be on START_ELEMENT to read next text
                at com.sun.xml.internal.stream.XMLEventReaderImpl.getElementText(XMLEventReaderImpl.java:114)
                at Test.main(Test.java:25)


        REPRODUCIBILITY :
        This bug can be reproduced always.

        ---------- BEGIN SOURCE ----------
        import java.io.ByteArrayInputStream;
        import javax.xml.stream.XMLEventReader;
        import javax.xml.stream.XMLInputFactory;
        import javax.xml.stream.XMLStreamException;
        import javax.xml.stream.events.XMLEvent;

        public class Test {

            public static void main(String[] argv) throws XMLStreamException {

                String xmlData = "<?xml version=\"1.0\"?><Test>Hello</Test>";
                XMLEventReader xmlReader =
                        XMLInputFactory.newInstance().createXMLEventReader(
                                new ByteArrayInputStream(xmlData.getBytes()));

                XMLEvent event = xmlReader.nextEvent();
                System.out.println(event.getClass());

                // xmlReader.peek(); // error in both cases with/without peek()
                event = xmlReader.nextTag(); // nextEvent() would work fine
                // nextTag() forgets to set fLastEvent
                System.out.println(event.getClass());

                String text = xmlReader.getElementText();
                System.out.println(text);
            }
        }

        ---------- END SOURCE ----------

        CUSTOMER SUBMITTED WORKAROUND :
        Workaround: don't use XMLEventReader.nextTag().

          Suggested fix (untested):
        (diff output with broken lines because of limited line length)

        *** XMLEventReaderImpl.java.org 2007-07-23 17:06:40.000000000 +0200
        --- XMLEventReaderImpl.java 2007-07-23 18:24:24.000000000 +0200
        ***************
        *** 231,242 ****
                      if (eventType != XMLStreamConstants.START_ELEMENT && eventType != XMLS
        treamConstants.END_ELEMENT) {
                          throw new XMLStreamException("expected start or end tag", event.ge
        tLocation());
                      }
        ! return event;
                  }
                  
                  //if there is no peeked event -- delegate the work of getting next event t
        o fXMLReader
                  fXMLReader.nextTag();
        ! return fXMLEventAllocator.allocate(fXMLReader);
              }
              
              public Object next() {
        --- 231,242 ----
                      if (eventType != XMLStreamConstants.START_ELEMENT && eventType != XMLS
        treamConstants.END_ELEMENT) {
                          throw new XMLStreamException("expected start or end tag", event.ge
        tLocation());
                      }
        ! return fLastEvent = event;
                  }
                  
                  //if there is no peeked event -- delegate the work of getting next event t
        o fXMLReader
                  fXMLReader.nextTag();
        ! return fLastEvent = fXMLEventAllocator.allocate(fXMLReader);
              }
              
              public Object next() {

              joehw Joe Wang
              ryeung Roger Yeung (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

                Created:
                Updated:
                Resolved:
                Imported:
                Indexed: