-
Bug
-
Resolution: Fixed
-
P3
-
6
-
b39
-
x86
-
linux
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8083925 | emb-9 | Joe Wang | P3 | Resolved | Fixed | team |
FULL PRODUCT VERSION :
#java -version
java version "1.6.0_10-rc"
Java(TM) SE Runtime Environment (build 1.6.0_10-rc-b28)
Java HotSpot(TM) Server VM (build 11.0-b15, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Linux danbev-laptop 2.6.24-19-generic #1 SMP Wed Aug 20 22:56:21 UTC 2008 i686 GNU/Linux
A DESCRIPTION OF THE PROBLEM :
When using Java1.5 the following string, "<element> & some more text</element>" would generate the following callback order:
startDocument
startElement 'element'
characters ' ';
startEntity 'amp'
characters '&'
endEntity 'amp'
characters ' some more text'
endElement 'element'
endDocument
But when the same application is run with Java1.6 order is the following:
startDocument
startElement 'element'
characters ' ';
startEntity 'amp'
endEntity 'amp'
characters '&'
characters ' some more text'
endElement 'element'
endDocument
Notice how the startEntity and endEntity are not interleaved with the characters callback.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Please run the test class pasted in the "Source code for an executable test case:" field.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Expected callback order:
startDocument
startElement 'element'
characters ' ';
startEntity 'amp'
characters '&'
endEntity 'amp'
characters ' some more text'
endElement 'element'
endDocument
ACTUAL -
Actual callback order:
startDocument
startElement 'element'
characters ' ';
startEntity 'amp'
endEntity 'amp'
characters '&'
characters ' some more text'
endElement 'element'
endDocument
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.ext.DefaultHandler2;
import org.xml.sax.helpers.XMLReaderFactory;
/**
* Simple test to demonstrate differences between Java versions with regard to SAX
* callback ordering.
* <p/>
*
* @author <a href="mailto:###@###.###">Daniel Bevenius</a>
*
*/
public class XmlParserTest
{
@Test
public void entityCallbackOrderJava() throws SAXException, IOException
{
final String input = "<element> & some more text</element>";
final MockContentHandler handler = new MockContentHandler();
final XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.setContentHandler(handler);
xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
xmlReader.parse(new InputSource(new StringReader(input)));
final List<String> events = handler.getEvents();
//assertJava5CallbackOrder(events);
assertJava6CallbackOrder(events);
}
private void assertJava6CallbackOrder(final List<String> events)
{
assertEquals("startDocument", events.get(0));
assertEquals("startElement 'element'", events.get(1));
assertEquals("characters ' '", events.get(2));
assertEquals("startEntity 'amp'", events.get(3));
assertEquals("endEntity 'amp'", events.get(4));
assertEquals("characters '&'", events.get(5));
assertEquals("characters ' some more text'", events.get(6));
assertEquals("endElement 'element'", events.get(7));
assertEquals("endDocument", events.get(8));
}
private void assertJava5CallbackOrder(final List<String> events)
{
assertEquals("startDocument", events.get(0));
assertEquals("startElement 'element'", events.get(1));
assertEquals("characters ' '", events.get(2));
assertEquals("startEntity 'amp'", events.get(3));
assertEquals("characters '&'", events.get(4));
assertEquals("endEntity 'amp'", events.get(5));
assertEquals("characters ' some more text'", events.get(6));
assertEquals("endElement 'element'", events.get(7));
assertEquals("endDocument", events.get(8));
}
private class MockContentHandler extends DefaultHandler2
{
private List<String> events;
public List<String> getEvents()
{
return events;
}
@Override
public void startDocument() throws SAXException
{
events = new ArrayList<String>();
events.add("startDocument");
}
@Override
public void characters( char[] ch, int start, int length ) throws SAXException
{
events.add("characters '" + new String(ch, start, length) + "'");
}
@Override
public void startElement( String uri, String localName, String name, Attributes atts ) throws SAXException
{
events.add("startElement '" + name + "'");
}
@Override
public void endElement( String uri, String localName, String name ) throws SAXException
{
events.add("endElement '" + name +"'");
}
@Override
public void endDocument() throws SAXException
{
events.add("endDocument");
}
@Override
public void startEntity( String name ) throws SAXException
{
events.add("startEntity '" + name + "'");
}
@Override
public void endEntity( String name ) throws SAXException
{
events.add("endEntity '" + name + "'");
}
}
}
---------- END SOURCE ----------
Release Regression From : 5.0
The above release value was the last known release where this
bug was not reproducible. Since then there has been a regression.
#java -version
java version "1.6.0_10-rc"
Java(TM) SE Runtime Environment (build 1.6.0_10-rc-b28)
Java HotSpot(TM) Server VM (build 11.0-b15, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Linux danbev-laptop 2.6.24-19-generic #1 SMP Wed Aug 20 22:56:21 UTC 2008 i686 GNU/Linux
A DESCRIPTION OF THE PROBLEM :
When using Java1.5 the following string, "<element> & some more text</element>" would generate the following callback order:
startDocument
startElement 'element'
characters ' ';
startEntity 'amp'
characters '&'
endEntity 'amp'
characters ' some more text'
endElement 'element'
endDocument
But when the same application is run with Java1.6 order is the following:
startDocument
startElement 'element'
characters ' ';
startEntity 'amp'
endEntity 'amp'
characters '&'
characters ' some more text'
endElement 'element'
endDocument
Notice how the startEntity and endEntity are not interleaved with the characters callback.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Please run the test class pasted in the "Source code for an executable test case:" field.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Expected callback order:
startDocument
startElement 'element'
characters ' ';
startEntity 'amp'
characters '&'
endEntity 'amp'
characters ' some more text'
endElement 'element'
endDocument
ACTUAL -
Actual callback order:
startDocument
startElement 'element'
characters ' ';
startEntity 'amp'
endEntity 'amp'
characters '&'
characters ' some more text'
endElement 'element'
endDocument
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.ext.DefaultHandler2;
import org.xml.sax.helpers.XMLReaderFactory;
/**
* Simple test to demonstrate differences between Java versions with regard to SAX
* callback ordering.
* <p/>
*
* @author <a href="mailto:###@###.###">Daniel Bevenius</a>
*
*/
public class XmlParserTest
{
@Test
public void entityCallbackOrderJava() throws SAXException, IOException
{
final String input = "<element> & some more text</element>";
final MockContentHandler handler = new MockContentHandler();
final XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.setContentHandler(handler);
xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
xmlReader.parse(new InputSource(new StringReader(input)));
final List<String> events = handler.getEvents();
//assertJava5CallbackOrder(events);
assertJava6CallbackOrder(events);
}
private void assertJava6CallbackOrder(final List<String> events)
{
assertEquals("startDocument", events.get(0));
assertEquals("startElement 'element'", events.get(1));
assertEquals("characters ' '", events.get(2));
assertEquals("startEntity 'amp'", events.get(3));
assertEquals("endEntity 'amp'", events.get(4));
assertEquals("characters '&'", events.get(5));
assertEquals("characters ' some more text'", events.get(6));
assertEquals("endElement 'element'", events.get(7));
assertEquals("endDocument", events.get(8));
}
private void assertJava5CallbackOrder(final List<String> events)
{
assertEquals("startDocument", events.get(0));
assertEquals("startElement 'element'", events.get(1));
assertEquals("characters ' '", events.get(2));
assertEquals("startEntity 'amp'", events.get(3));
assertEquals("characters '&'", events.get(4));
assertEquals("endEntity 'amp'", events.get(5));
assertEquals("characters ' some more text'", events.get(6));
assertEquals("endElement 'element'", events.get(7));
assertEquals("endDocument", events.get(8));
}
private class MockContentHandler extends DefaultHandler2
{
private List<String> events;
public List<String> getEvents()
{
return events;
}
@Override
public void startDocument() throws SAXException
{
events = new ArrayList<String>();
events.add("startDocument");
}
@Override
public void characters( char[] ch, int start, int length ) throws SAXException
{
events.add("characters '" + new String(ch, start, length) + "'");
}
@Override
public void startElement( String uri, String localName, String name, Attributes atts ) throws SAXException
{
events.add("startElement '" + name + "'");
}
@Override
public void endElement( String uri, String localName, String name ) throws SAXException
{
events.add("endElement '" + name +"'");
}
@Override
public void endDocument() throws SAXException
{
events.add("endDocument");
}
@Override
public void startEntity( String name ) throws SAXException
{
events.add("startEntity '" + name + "'");
}
@Override
public void endEntity( String name ) throws SAXException
{
events.add("endEntity '" + name + "'");
}
}
}
---------- END SOURCE ----------
Release Regression From : 5.0
The above release value was the last known release where this
bug was not reproducible. Since then there has been a regression.
- backported by
-
JDK-8083925 Entity callback order differs between Java1.5 and Java1.6
-
- Resolved
-
- relates to
-
JDK-8331888 XML entity callback order differs
-
- Open
-