You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-dev@xerces.apache.org by bu...@apache.org on 2004/02/02 20:42:27 UTC

DO NOT REPLY [Bug 26613] New: - AbstractDOMParser setDocumentClassName ClassLoader problem

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=26613>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=26613

AbstractDOMParser setDocumentClassName ClassLoader problem

           Summary: AbstractDOMParser setDocumentClassName ClassLoader
                    problem
           Product: Xerces2-J
           Version: 2.6.1
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: Major
          Priority: Other
         Component: DOM
        AssignedTo: xerces-j-dev@xml.apache.org
        ReportedBy: mister_farkas@yahoo.com


We are using Websphere 5.0.2, and have deployed a prior version of Xerces (to 
support other 3rd party jars we use)

The problem is manifested as an IllegalArgumentException
with message :
 PAR002 Class, "org.apache.xerces.dom.DocumentImpl", is not of type 
org.w3c.dom.Document.
org.apache.xerces.dom.DocumentImpl

this is thrown from:
org.apache.xerces.parsers.AbstractDOMParser.setDocumentClassName(String)

AbstractDOMParser was loaded by the System ClassLoader

Our investigation reveals that the expression:
Document.class.isAssignableFrom (_class):
evaluates to false because _class represents the 
class 'org.apache.xerces.dom.DocumentImpl' loaded from the context class 
loader, while Document.class is from the same class loader as this.getClass()

this is because a few lines above:
ObjectFactory.findClassLoader()
returns the context class loader


We have a proposed fix (see below) for the immediately obvious problem, which 
will make the code consistent with code in public void startDocument(...) { }, 
but the question of alternate document implementations, and inheritance across 
class loaders has not been addressed.
We would suggest some improvements to the exception handling and messages, so 
that related problems may be more easily diagnosed.

Please feel free to e-mail us at yoni_livshits@wgcusa.com (or 
mister_farkas@yahoo.com) to discuss further.

--  --  --  --

    protected void setDocumentClassName (String documentClassName) {
        
        // normalize class name
        if (documentClassName == null) {
            documentClassName = DEFAULT_DOCUMENT_CLASS_NAME;
        }
        
        if (!documentClassName.equals(DEFAULT_DOCUMENT_CLASS_NAME)) {
			// verify that this class exists and is of the right 
type
			try {
				Class _class = ObjectFactory.findProviderClass 
(documentClassName,
				ObjectFactory.findClassLoader (), true);
				//if (!_class.isAssignableFrom(Document.class)) 
{
				if (!Document.class.isAssignableFrom (_class)) {
					// REVISIT: message
					throw new IllegalArgumentException 
("PAR002 Class, \"" +
					documentClassName +
					"\", is not of type 
org.w3c.dom.Document.\n" +
					documentClassName);
				}
			}
			catch (ClassNotFoundException e) {
				// REVISIT: message
				throw new IllegalArgumentException ("PAR003 
Class, \"" +
				documentClassName +
				"\", not found.\n" +
				documentClassName);
			}
		}
	
        // set document class name
        fDocumentClassName = documentClassName;
        if (!documentClassName.equals (DEFAULT_DOCUMENT_CLASS_NAME)) {
            fDeferNodeExpansion = false;
        }
        
    } // setDocumentClassName(String)

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-j-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-j-dev-help@xml.apache.org