You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by bu...@apache.org on 2004/07/03 00:41:11 UTC
DO NOT REPLY [Bug 29893] New: -
DTMManagerDefault.getDTM() incorrectly returns null
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=29893>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
http://issues.apache.org/bugzilla/show_bug.cgi?id=29893
DTMManagerDefault.getDTM() incorrectly returns null
Summary: DTMManagerDefault.getDTM() incorrectly returns null
Product: XalanJ2
Version: 2.6
Platform: All
OS/Version: Other
Status: NEW
Severity: Normal
Priority: Other
Component: org.apache.xml.dtm
AssignedTo: xalan-dev@xml.apache.org
ReportedBy: johnjbarton@johnjbarton.com
The following suggested fix for
org.apache.xml.dtm.ref.XTMManagerDefault.getDTM()
relates to Bug 22217
NullPointerException in TransformerImpl.run() when reusing XMLFilter object
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=22217
=======================================================================
In the interface file we read:
/*
* $Id: DTMManager.java,v 1.18 2004/02/23 10:29:36 aruny Exp $
*/
package org.apache.xml.dtm;
....
/**
* Get the instance of DTM that "owns" a node handle.
*
* @param nodeHandle the nodeHandle.
*
* @return a non-null DTM reference.
*/
public abstract DTM getDTM(int nodeHandle);
======================================================================
Note in particular that the return is *non-null*.
In the implementation we read:
======================================================================
/*
* $Id: DTMManagerDefault.java,v 1.51 2004/02/16 23:06:11 minchau Exp $
*/
package org.apache.xml.dtm.ref;
....
/**
* Return the DTM object containing a representation of this node.
*
* @param nodeHandle DTM Handle indicating which node to retrieve
*
* @return a reference to the DTM object containing this node.
*/
synchronized public DTM getDTM(int nodeHandle)
{
try
{
// Performance critical function.
return m_dtms[nodeHandle >>> IDENT_DTM_NODE_BITS];
}
catch(java.lang.ArrayIndexOutOfBoundsException e)
{
if(nodeHandle==DTM.NULL)
return null; // Accept as a special
case.
else
throw e; // Programming error;
want to know about it.
}
}
====================================================================
In addition to the "special case", the array m_dtms can have "null"
values that are returned, contrary to the interface documentation.
Callers of getDTM() use the return value without checking for null,
for example
=======================================================================
/*
* $Id: TransformerImpl.java,v 1.158 2004/02/23 21:33:14 igorh Exp $
*/
package org.apache.xalan.transformer;
...
public boolean applyTemplateToNode(ElemTemplateElement xslInstruction, //
xsl:apply-templates or xsl:for-each
ElemTemplate template, int child)
throws TransformerException
{
DTM dtm = m_xcontext.getDTM(child);
short nodeType = dtm.getNodeType(child); <<<<<<<<<<<< NPE!!
boolean isDefaultTextRule = false;
boolean isApplyImports = false;
...
=================================================================
In my opinion getDTM() should be thus:
==================================================================
/**
* Return the DTM object containing a representation of this node.
*
* @param nodeHandle DTM Handle indicating which node to retrieve
*
* @return a reference to the DTM object containing this node.
*/
synchronized public DTM getDTM(int nodeHandle)
{
// Performance critical function.
DTM dtm = m_dtms[nodeHandle >>> IDENT_DTM_NODE_BITS];
if (dtm != null) {
return dtm;
} else {
throw new TransformerException(this.getClass().getName()
+" Document Table contains null pointer for nodeHandle="+nodeHandle);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-dev-help@xml.apache.org