[jdom-interest] [Patch] Bug regarding attributes local name using JDOMResult

Jason Hunter jhunter at xquery.com
Mon Nov 21 09:48:25 PST 2005


Have you tested it w/ the various parsers?

-jh-

Mattias Jiderhamn wrote:

> Here is a patch (against the CVS head) that fixes the issue:
> 
> Index: src/java/org/jdom/input/SAXHandler.java
> ===================================================================
> RCS file: /home/cvspublic/jdom/src/java/org/jdom/input/SAXHandler.java,v
> retrieving revision 1.71
> diff -u -r1.71 SAXHandler.java
> --- src/java/org/jdom/input/SAXHandler.java     11 Dec 2004 02:18:55 
> -0000      1.71
> +++ src/java/org/jdom/input/SAXHandler.java     11 Nov 2005 08:04:54 -0000
> @@ -560,7 +560,11 @@
>                  continue;
>              }
> 
> -            if (!attQName.equals(attLocalName)) {
> +            if ("".equals(attLocalName)) { // "Namespace processing is 
> not being performed"
> +                attribute = factory.attribute(attQName, atts.getValue(i),
> +                                              attType);
> +                       }
> +            else if (!attQName.equals(attLocalName)) {
>                  String attPrefix = attQName.substring(0, 
> attQName.indexOf(":"));
>                  Namespace attNs = Namespace.getNamespace(attPrefix,
>                                                           atts.getURI(i));
> 
> 
> At 2005-11-10 10:53, you wrote:
> 
>> Hi list.
>> I am having trouble using the XSL transformer of Caucho Resin 3 ( 
>> http://www.caucho.com/resin-3.0) together with JDOM. The problem 
>> occurs when using attributes without namespace and outputting to a 
>> JDOMResult. On the one hand this worked fine with Resin 2, on the 
>> other hand Resin 3 seems to follow the specification more closely, so 
>> I'm not quite sure whether the problem lies with Resin or JDOM.
>>
>> The point of problem is in org.jdom.input.SAXHandler.startElement(). 
>> Here it is assumed that the local name of the attribute is equal to 
>> the QName, if no namespace/prefix is used. (Line numbers from 1.0 
>> release)
>>
>> 536:            if (!attQName.equals(attLocalName)) {
>> 537:                String attPrefix = attQName.substring(0, 
>> attQName.indexOf(":"));
>>
>> This works fine with Resin 2 and Xalan.
>>
>> Although the documentation for org.xml.sax.Attributes.getLocalName() 
>> (see 
>> http://java.sun.com/j2se/1.5.0/docs/api/org/xml/sax/Attributes.html#getLocalName(int 
>> )) says
>>
>>    Returns: The local name, or the empty string if Namespace 
>> processing is not being performed, or null if the index is out of range.
>>
>> So Resin 3 returns the emtpy string in this case, which causes 
>> "java.lang.StringIndexOutOfBoundsException: String index out of range: 
>> -1" on line 537 above. Below you will find a self contained example.
>>
>> So, does JDOM need to take into account that the local name can be 
>> blank? Or is this a bug with Resin 3?
>>
>>
>>
>> ----------------------------
>>
>> import org.jdom.transform.JDOMResult;
>> import org.jdom.transform.JDOMSource;
>> import org.jdom.Element;
>>
>> import javax.servlet.http.HttpServlet;
>> import javax.servlet.http.HttpServletRequest;
>> import javax.servlet.http.HttpServletResponse;
>> import javax.servlet.ServletException;
>> import javax.xml.transform.TransformerFactory;
>> import javax.xml.transform.Transformer;
>> import javax.xml.transform.stream.StreamSource;
>> import java.io.IOException;
>> import java.io.StringReader;
>>
>> public class XslProblemServlet extends HttpServlet {
>>   protected void service(HttpServletRequest request, 
>> HttpServletResponse response) throws ServletException, IOException {
>>     try {
>>       TransformerFactory transformerFactory = 
>> TransformerFactory.newInstance();
>>       StreamSource streamSource = new StreamSource(new StringReader(
>>           "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n" +
>>           "<xsl:stylesheet version=\"1.0\" 
>> xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n" +
>>           "  <xsl:template match=\"/\">\n" +
>>           "    <bar><child myAttribute=\"myValue\" /></bar>\n" +
>>           "  </xsl:template>\n" +
>>           "</xsl:stylesheet>"));
>>       Transformer transformer = 
>> transformerFactory.newTransformer(streamSource);
>>
>>       JDOMSource source = new JDOMSource(new org.jdom.Document(new 
>> Element("foo")));
>>       JDOMResult result = new JDOMResult();
>>       transformer.transform(source, result);
>>     }
>>     catch(Exception ex) {
>>       throw new ServletException(ex);
>>     }
>>   }
>> }
> 
> 
> _______________________________________________
> To control your jdom-interest membership:
> http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com
> 


More information about the jdom-interest mailing list