Details
-
Bug
-
Status: Resolved
-
Resolution: Fixed
-
2.2.x
-
None
-
None
-
Operating System: Other
Platform: Other
-
5496
Description
This problem with getValue has been looked at by Joe Kesselmann who wrote:
======Joe's mail=====================================================
Looking at getValue: It's miscoded. It assumes that the matching attribute
will be found and immediately tries to convert it to a string, rather than
stopping to check whether the match might have failed and returned null.
return ((Attr) m_attrs.getNamedItem(localName)).getValue();
Actually, that's badly miscoded; it also isn't using the namespace-aware
call, which is why the search failed in the first place. Changing it to
Node a=m_attrs.getNamedItemNS(uri,localName);
return (a==null) ? null : a.getNodeValue();
cures the problem. This also avoids the typecast overhead, which should
save us a cycle or two.
Definite bug, trivial fix. I'll check it in.
=======================end Joe's mail=======================
=======================how to reproduce both problems============
To reproduce the problem: run the main() function in the class JaxpTest2
passing as an argument the name of a file which contains the following text:
<?xml version="1.0" encoding="UTF-8"?>
<deleted xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:enc="http://www.w3.org/2001/06/soap-encoding"
xsi:type="B1">0</deleted>
The JaxpTest2 tries to access the attributes of the root via a small handler
called TestHandler. The call to getIndex() which expects to retrieve the local
name 'type' actually returns the attribute with local name 'enc'. The call to
getValue() causes a NullPointer exception:
java.lang.NullPointerException
java.lang.String org.apache.xml.utils.AttList.getValue
(java.lang.String, java.lang.String)
void jaxp.test.TestHandler.startElement(java.lang.String,
java.lang.String, java.lang.String, org.xml.sax.Attributes)
void org.apache.xalan.transformer.TransformerIdentityImpl.startElement
(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
void org.apache.xml.utils.TreeWalker.startNode(org.w3c.dom.Node)
void org.apache.xml.utils.TreeWalker.traverse(org.w3c.dom.Node)
void org.apache.xalan.transformer.TransformerIdentityImpl.transform
(javax.xml.transform.Source, javax.xml.transform.Result)
void jaxp.test.JaxpTest2.main(java.lang.String[])
================================JaxpTest2=====================
// Copyright (c) 2001 Brooks Automation
package jaxp.test;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.sax.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.xml.sax.helpers.*;
import org.xml.sax.*;
import org.w3c.dom.*;
import java.io.*;
/**
- A Class class.
- <P>
- @author Jan Hrabowski
*/
public class JaxpTest2 extends Object {
/**
- Constructor
*/
public JaxpTest2() {
}
/**
- main
- @param args
*/
public static void main(String[] args)
throws TransformerConfigurationException,
ParserConfigurationException,
FileNotFoundException,
IOException,
SAXException,
TransformerException,
UnsupportedEncodingException { DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance(); dfactory.setNamespaceAware(true); DocumentBuilder docBuilder = dfactory.newDocumentBuilder(); Node doc = docBuilder.parse(new InputSource(args[0])); TransformerFactory transformerfactory = TransformerFactory.newInstance(); Transformer transformer = transformerfactory.newTransformer(); DOMSource domSource = new DOMSource(doc); SAXResult saxResult = new SAXResult(new TestHandler()); transformer.transform(domSource, saxResult); }}
============================TestHandler===============================
// Copyright (c) 2001 Brooks Automation
package jaxp.test;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
- A Class class.
- <P>
- @author Jan Hrabowski
*/
public class TestHandler extends DefaultHandler {
/**
- Constructor
*/
public TestHandler() {
}
public void startElement(String namespaceURI,
String sName, // simple name (localName)
String qName, // qualified name
Attributes attrs)
throws SAXException
{
try
catch (Exception e)
{ e.printStackTrace(); } }
}