JDK-8198355 : ClassCastException in internal API class StAXEvent2SAX
  • Type: Bug
  • Component: xml
  • Sub-Component: org.xml.sax
  • Affected Version: 8,9
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: linux_ubuntu
  • CPU: x86_64
  • Submitted: 2018-02-16
  • Updated: 2018-05-02
  • Resolved: 2018-05-02
Related Reports
Duplicate :  
Description
FULL PRODUCT VERSION :
every JDK version 6,7,8,9,10

A DESCRIPTION OF THE PROBLEM :
Inside com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.handleEndElement(EndElement event)

The iterator from event.getNamespaces() returns `Namespace` objects, like in the function under it, except that the code tries to cast them to String.

The valid example is in the `handleStartElement` function below.


STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
The default implementation never has namespaces on the events, so you'll have to use org.codehaus.woodstox:woodstox-core-asl:4.3.0 to detect it


ERROR MESSAGES/STACK TRACES THAT OCCUR :
ERROR:  'org.codehaus.stax2.ri.evt.NamespaceEventImpl cannot be cast to java.lang.String'
javax.xml.transform.TransformerException: java.lang.ClassCastException: org.codehaus.stax2.ri.evt.NamespaceEventImpl cannot be cast to java.lang.String
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:746)
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:351)
	at javabugapplication.JavaBugApplication.main(JavaBugApplication.java:45)
Caused by: java.lang.ClassCastException: org.codehaus.stax2.ri.evt.NamespaceEventImpl cannot be cast to java.lang.String
	at com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.handleEndElement(StAXEvent2SAX.java:341)
	at com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.bridge(StAXEvent2SAX.java:198)
	at com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.parse(StAXEvent2SAX.java:115)
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:682)
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:737)
	... 2 more
---------
java.lang.ClassCastException: org.codehaus.stax2.ri.evt.NamespaceEventImpl cannot be cast to java.lang.String
	at com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.handleEndElement(StAXEvent2SAX.java:341)
	at com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.bridge(StAXEvent2SAX.java:198)
	at com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.parse(StAXEvent2SAX.java:115)
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:682)
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:737)
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:351)
	at javabugapplication.JavaBugApplication.main(JavaBugApplication.java:45)

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
package javabugapplication;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.stax.StAXSource;

import org.w3c.dom.Document;

public class JavaBugApplication {

	static String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<root xmlns:h=\"http://www.w3.org/TR/html4/\" xmlns:f=\"https://www.w3schools.com/furniture\">\n" +
" <h:table>\n" +
"  <h:tr>\n" +
"    <h:td>Apples</h:td>\n" +
"    <h:td>Bananas</h:td>\n" +
"  </h:tr>\n" +
"</h:table>\n" +
"\n" +
"<f:table>\n" +
"  <f:name>African Coffee Table</f:name>\n" +
"  <f:width>80</f:width>\n" +
"  <f:length>120</f:length>\n" +
"</f:table>" +
"</root>";
	public static void main(String[] args) {
		Document theDoc = null;
		try (InputStream stream = new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8))) {
			XMLInputFactory xif = XMLInputFactory.newInstance();
			XMLEventReader eventReader = xif.createXMLEventReader( stream );
			TransformerFactory tf = TransformerFactory.newInstance();
			StAXSource src = new StAXSource(eventReader);
			Transformer transformer = tf.newTransformer();
			DOMResult result = new DOMResult();
			transformer.transform(src, result);
			theDoc = (Document) result.getNode();
		}
		catch (Throwable t) {
			t.printStackTrace();
		}
		assert(theDoc != null);
	}
	
}

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

CUSTOMER SUBMITTED WORKAROUND :
Using different implementation of either factory


Comments
The issue was fixed by JDK-8181150 in JDK10 b28 and JDK11.
02-05-2018

To reproduce the issue, run the attached test case with the two attached jars in classpath. JDK 8u161- Fail JDk 9.0.4 +11 - Fail JDK 10-ea+39 - Pass Following is the output on failed versions: >D:\jdk9.0.4\bin\java -cp .;D:\woodstox-core-asl-4.3.0.jar;D:\stax2-api-3.0.1.jar -ea JI9052687 ERROR: 'org.codehaus.stax2.ri.evt.NamespaceEventImpl cannot be cast to java.base/java.lang.String' javax.xml.transform.TransformerException: java.lang.ClassCastException: org.codehaus.stax2.ri.evt.NamespaceEventImpl cannot be cast to java.base/java.lang.String at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:781) at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:368) at JI9052687.main(JI9052687.java:38) Caused by: java.lang.ClassCastException: org.codehaus.stax2.ri.evt.NamespaceEventImpl cannot be cast to java.base/java.lang.String at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.handleEndElement(StAXEvent2SAX.java:341) at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.bridge(StAXEvent2SAX.java:198) at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.parse(StAXEvent2SAX.java:115) at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:699) at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:772) ... 2 more --------- java.lang.ClassCastException: org.codehaus.stax2.ri.evt.NamespaceEventImpl cannot be cast to java.base/java.lang.String at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.handleEndElement(StAXEvent2SAX.java:341) at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.bridge(StAXEvent2SAX.java:198) at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.parse(StAXEvent2SAX.java:115) at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:699) at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:772) at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:368) at JI9052687.main(JI9052687.java:38) Exception in thread "main" java.lang.AssertionError at JI9052687.main(JI9052687.java:44)
19-02-2018