Author: fanningpj
Date: Sun Jun 21 12:12:13 2026
New Revision: 1935538

Log:
guard colonless value in lexQName error-collecting overload. Thanks to aizu-m. 
This closes #66

Modified:
   
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/util/XsTypeConverter.java
   xmlbeans/trunk/src/test/java/misc/checkin/XsTypeConverterTest.java

Modified: 
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/util/XsTypeConverter.java
==============================================================================
--- 
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/util/XsTypeConverter.java 
    Sun Jun 21 12:10:04 2026        (r1935537)
+++ 
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/util/XsTypeConverter.java 
    Sun Jun 21 12:12:13 2026        (r1935538)
@@ -533,7 +533,7 @@ public final class XsTypeConverter {
         } catch (InvalidLexicalValueException e) {
             errors.add(XmlError.forMessage(e.getMessage()));
             final int idx = xsd_qname.indexOf(NAMESPACE_SEP);
-            return new QName(null, xsd_qname.substring(idx));
+            return idx < 0 ? new QName(xsd_qname) : new QName(null, 
xsd_qname.substring(idx));
         }
     }
 

Modified: xmlbeans/trunk/src/test/java/misc/checkin/XsTypeConverterTest.java
==============================================================================
--- xmlbeans/trunk/src/test/java/misc/checkin/XsTypeConverterTest.java  Sun Jun 
21 12:10:04 2026        (r1935537)
+++ xmlbeans/trunk/src/test/java/misc/checkin/XsTypeConverterTest.java  Sun Jun 
21 12:12:13 2026        (r1935538)
@@ -281,4 +281,28 @@ public class XsTypeConverterTest {
         assertThrows(NumberFormatException.class, () -> 
XsTypeConverter.lexInteger("1E5"));
         assertThrows(NumberFormatException.class, () -> 
XsTypeConverter.lexInteger("1e5"));
     }
+
+    @Test
+    void lexQNameCollectsErrorForColonlessInvalidValue() {
+        // The error-collecting overload must record a lexical error and 
return a
+        // best-effort QName, never throw. A colon-less value that is not a 
valid
+        // NCName ("a b", "") has no ':' so the recovery indexOf returns -1.
+        javax.xml.namespace.NamespaceContext ctx = new 
javax.xml.namespace.NamespaceContext() {
+            public String getNamespaceURI(String prefix) { return ""; }
+            public String getPrefix(String uri) { return ""; }
+            public java.util.Iterator<String> getPrefixes(String uri) {
+                return java.util.Collections.<String>emptyList().iterator();
+            }
+        };
+
+        java.util.List<org.apache.xmlbeans.XmlError> errors = new 
java.util.ArrayList<>();
+        javax.xml.namespace.QName q = XsTypeConverter.lexQName("a b", errors, 
ctx);
+        assertEquals("a b", q.getLocalPart());
+        assertEquals(1, errors.size());
+
+        errors.clear();
+        javax.xml.namespace.QName empty = XsTypeConverter.lexQName("", errors, 
ctx);
+        assertEquals("", empty.getLocalPart());
+        assertEquals(1, errors.size());
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to