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

Mattias Jiderhamn mattias.jiderhamn at expertsystem.se
Mon Nov 21 04:43:48 PST 2005


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);
>     }
>   }
>}



More information about the jdom-interest mailing list