Java Mailing List Archive

http://www.junlu.com/

Home » Home (12/2007) » JDOM User »

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

Mattias Jiderhamn

2005-11-21

Replies:

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
@@(protected) @@
           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@(protected)
©2008 junlu.com - Jax Systems, LLC, U.S.A.