You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-users@xerces.apache.org by Mike Spreitzer <ms...@us.ibm.com> on 2003/03/21 18:39:24 UTC

java.lang.ClassCastException: org.apache.xerces.impl.dv.xs.ListDV$ListData from Xerces 2.3.0

I have an application that explicitly manages ClassLoaders and is intended 
to work with a wide range of versions of Xerces (including even some 
versions 1.*, which is why I'm still using the old API).  I have a class 
named LocatedElementImpl; its one method that uses Xerces has the 
following outline:

(1) 
Thread.currentThread().setContextClassLoader(LocatedElementImpl.class.getClassLoader());

(2) create a new org.apache.xerces.parsers.DOMParser();

(3) set the error handler, some features, and some properties; and

(4) call parser.parse, inside a try-catch that handles a RuntimeException 
by (a) printing the exception and (b) fetching and printing the 
now-current context class loader.

 When using Xerces 2.*, LocatedElementImpl's ClassLoader (which is a 
URLClassLoader) also loads from xercesImpl.jar (among other things), while 
its parent (which is the application ClassLoader) loads from 
xmlParserAPIs.jar (among other things); when using Xerces 1.*, xerces.jar 
is available to both ClassLoaders (which means the application 
ClassLoader, to which LocatedElementImpl's ClassLoader delegates first, 
will load all Xerces classes).

This code has been successfully compiled and tested with Xerces versions 
1.4.4, 2.0.1, 2.0.2, 2.1.0, and 2.2.1 (2.2.0 is a known bad guy for (at 
least) other reasons).  However, when compiled and run with Xerces 2.3.0, 
the call on parse throws a ClassCastException.  Below is the output from 
my catch phrase:

java.lang.ClassCastException: org.apache.xerces.impl.dv.xs.ListDV$ListData
        at 
org.apache.xerces.impl.xs.XMLSchemaLoader.processExternalHints(Unknown 
Source)
        at org.apache.xerces.impl.xs.XMLSchemaValidator.reset(Unknown 
Source)
        at 
org.apache.xerces.parsers.BasicParserConfiguration.reset(Unknown Source)
        at org.apache.xerces.parsers.DTDConfiguration.reset(Unknown 
Source)
        at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown 
Source)
        at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown 
Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
        at 
com.ibm.wsst.common.LocatedElementImpl.readXml(LocatedElementImpl.java:539)
        at 
com.ibm.wsst.common.LocatedElementImpl.<clinit>(LocatedElementImpl.java:68)
        at com.ibm.wsst.engine.Engine.run(Engine.java:537)
        at java.lang.Thread.run(Thread.java:512)
No linked exception.

ContextClassLoader is:
ClassLoader java.net.URLClassLoader@5f3715e5: has 4 URLS:
        file:/C:/mspreitz/build/wsst/lib/wsst.jar
        file:/c:/xml-axis-10/lib/log4j-1.2.4.jar
        file:/c:/xerces-2_3_0/xerces.jar
        file:/c:/xerces-2_3_0/xercesImpl.jar

Has parent:
ClassLoader sun.misc.Launcher$AppClassLoader@5f48d5e5: has 4 URLS:
        file:/C:/mspreitz/build/wsst/
        file:/C:/mspreitz/build/wsst/lib/boot.jar
        file:/C:/xerces-2_3_0/xerces.jar
        file:/C:/xerces-2_3_0/xmlParserAPIs.jar

Has parent:
ClassLoader sun.misc.Launcher$ExtClassLoader@5f4d95e5: has 13 URLS:
        file:/C:/Program%20Files/IBM/Java131/jre/lib/ext/comm.jar
 file:/C:/Program%20Files/IBM/Java131/jre/lib/ext/ibmjcaprovider.jar
        file:/C:/Program%20Files/IBM/Java131/jre/lib/ext/ibmjcefw.jar
 file:/C:/Program%20Files/IBM/Java131/jre/lib/ext/ibmjceprovider.jar
        file:/C:/Program%20Files/IBM/Java131/jre/lib/ext/ibmpkcs.jar
        file:/C:/Program%20Files/IBM/Java131/jre/lib/ext/ibmpkcs11.jar
        file:/C:/Program%20Files/IBM/Java131/jre/lib/ext/indicim.jar
        file:/C:/Program%20Files/IBM/Java131/jre/lib/ext/jaas.jar
        file:/C:/Program%20Files/IBM/Java131/jre/lib/ext/jaas_activelm.jar
        file:/C:/Program%20Files/IBM/Java131/jre/lib/ext/jaas_lm.jar
        file:/C:/Program%20Files/IBM/Java131/jre/lib/ext/JawBridge.jar
        file:/C:/Program%20Files/IBM/Java131/jre/lib/ext/local_policy.jar
 file:/C:/Program%20Files/IBM/Java131/jre/lib/ext/US_export_policy.jar
No parent.

(No, there is no file named "c:/xerces-2_3_0/xerces.jar" --- but that's 
OK, the needed classes are found in the JARs that DO exist; these URL sets 
are computed by stupid scripts that are intended to work with both Xerces 
1 and Xerces 2.)

What's going wrong here, and what can be done about it?

Thanks,
Mike

Re: java.lang.ClassCastException: org.apache.xerces.impl.dv.xs.ListDV$ListData from Xerces 2.3.0

Posted by Mike Spreitzer <ms...@us.ibm.com>.
I just realized my original message did not actually nail one detail, so I 
added some code to my catch phrase to test whether the then-current 
context class loader is the very same object as the class loader that 
loaded class LocatedElementImpl.  Testing (with Xerces 2.3.0) shows it is 
the very same object.

Still looking for answers,
Mike