-
Bug
-
Resolution: Fixed
-
P4
-
6
-
1.4
-
x86
-
linux
-
Verified
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-2185507 | 7 | Joe Wang | P3 | Closed | Fixed | m05 |
JDK-2182522 | 6u18 | Joe Wang | P4 | Resolved | Fixed | b02 |
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() {
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() {
- backported by
-
JDK-2182522 XMLEventReaderImpl.nextTag() does not update fLastEvent
-
- Resolved
-
-
JDK-2185507 XMLEventReaderImpl.nextTag() does not update fLastEvent
-
- Closed
-