StringIndexOutOfBoundsException in SaxHandler

"S. Seide" <[email protected]>
Newsgroups gmane.comp.java.jdom.general
Message-ID <[email protected]>
Hello,

using jdom 1.1.1 on android 1.5 gives an
StringIndexOutOfBoundsException. Androids default XML-Parser ExPat
returns for Attributes without namespace an emtpy qname:

<?xml version="1.0" encoding="UTF-8"?>
<config version="2009-07-23" summary="main AVF configuration file">
</config>

atts.getLocalName(i) - "version"
atts.getQName(i) - ""

This seems to be the expected behavior, since
http://www.saxproject.org/apidoc/org/xml/sax/Attributes.html#getQName(int)
says getQName returns an empty string if no qualified name is available:

getQName
public java.lang.String getQName(int index)
Look up an attribute's XML qualified (prefixed) name by index.

Parameters:
index - The attribute index (zero-based).
Returns:
The XML qualified name, or the empty string if none is available, or
null if the index is out of range.

StackTrace:

> 07-28 14:54:10.354: ERROR/Global(725): java.lang.StringIndexOutOfBoundsException
> 07-28 14:54:10.354: ERROR/Global(725):     at java.lang.String.substring(String.java:1571)
> 07-28 14:54:10.354: ERROR/Global(725):     at org.jdom.input.SAXHandler.startElement(SAXHandler.java:568)
> 07-28 14:54:10.354: ERROR/Global(725):     at org.apache.harmony.xml.ExpatParser.startElement(ExpatParser.java:145)
> 07-28 14:54:10.354: ERROR/Global(725):     at org.apache.harmony.xml.ExpatParser.append(Native Method)
> 07-28 14:54:10.354: ERROR/Global(725):     at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:506)
> 07-28 14:54:10.354: ERROR/Global(725):     at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:467)
> 07-28 14:54:10.354: ERROR/Global(725):     at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:329)
> 07-28 14:54:10.354: ERROR/Global(725):     at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:286)
> 07-28 14:54:10.354: ERROR/Global(725):     at org.jdom.input.SAXBuilder.build(SAXBuilder.java:518)
> 07-28 14:54:10.354: ERROR/Global(725):     at org.jdom.input.SAXBuilder.build(SAXBuilder.java:865)
> 07-28 14:54:10.354: ERROR/Global(725):     at com.tlabs.avf.AVFGlobal.addInputStreams(AVFGlobal.java:538)
> 07-28 14:54:10.354: ERROR/Global(725):     at com.tlabs.avf.AVFGlobal.initialize(AVFGlobal.java:630)
> 07-28 14:54:10.354: ERROR/Global(725):     at com.tlabs.avf.AVFMain.init(AVFMain.java:122)
> 07-28 14:54:10.354: ERROR/Global(725):     at com.tlabs.avf.test.AVFMainTest.onCreate(AVFMainTest.java:78)
> 07-28 14:54:10.354: ERROR/Global(725):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
> 07-28 14:54:10.354: ERROR/Global(725):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
> 07-28 14:54:10.354: ERROR/Global(725):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284)
> 07-28 14:54:10.354: ERROR/Global(725):     at android.app.ActivityThread.access$1800(ActivityThread.java:112)
> 07-28 14:54:10.354: ERROR/Global(725):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
> 07-28 14:54:10.354: ERROR/Global(725):     at android.os.Handler.dispatchMessage(Handler.java:99)
> 07-28 14:54:10.354: ERROR/Global(725):     at android.os.Looper.loop(Looper.java:123)
> 07-28 14:54:10.354: ERROR/Global(725):     at android.app.ActivityThread.main(ActivityThread.java:3948)
> 07-28 14:54:10.354: ERROR/Global(725):     at java.lang.reflect.Method.invokeNative(Native Method)
> 07-28 14:54:10.354: ERROR/Global(725):     at java.lang.reflect.Method.invoke(Method.java:521)
> 07-28 14:54:10.354: ERROR/Global(725):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
> 07-28 14:54:10.354: ERROR/Global(725):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
> 07-28 14:54:10.354: ERROR/Global(725):     at dalvik.system.NativeStart.main(Native Method)

patch attached - adding this simple check my xml document is parsed
successfully on android 1.5.

regards,
S. Seide

_______________________________________________
To control your jdom-interest membership:
http://www.jdom.org/mailman/options/jdom-interest/[email protected]
expat_qname.patch (text/plain, 859 B)
diff -ur src/java/org/jdom/input/SAXHandler.java src_patch/java/org/jdom/input/SAXHandler.java
--- src/java/org/jdom/input/SAXHandler.java	2009-07-28 17:46:40.703125000 +0200
+++ src_patch/java/org/jdom/input/SAXHandler.java	2009-07-28 17:31:06.546875000 +0200
@@ -564,7 +564,7 @@
             // patch from Mattias Jiderhamn
             if ("".equals(attLocalName) && attQName.indexOf(":") == -1) {
                 attribute = factory.attribute(attQName, atts.getValue(i), attType);
-            } else if (!attQName.equals(attLocalName)) {
+            } else if (!attQName.equals(attLocalName) && attQName.length()>0) {
                 String attPrefix = attQName.substring(0, attQName.indexOf(":"));
                 Namespace attNs = Namespace.getNamespace(attPrefix,
                                                          atts.getURI(i));
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.