This is an automated email from the ASF dual-hosted git repository.

coheigea pushed a commit to branch coheigea/wire
in repository https://gitbox.apache.org/repos/asf/ws-xmlschema.git

commit e16de038cefc5e6b745a41cd3a4840ad7dea3776
Author: Colm O hEigeartaigh <[email protected]>
AuthorDate: Thu Sep 24 15:06:18 2026 +0100

    Do not build a wire name for an element or attribute with no name
---
 .../schema/utils/XmlSchemaNamedWithFormImpl.java   |   6 +-
 .../src/test/java/tests/FormWithoutNameTest.java   | 101 +++++++++++++++++++++
 2 files changed, 106 insertions(+), 1 deletion(-)

diff --git 
a/xmlschema-core/src/main/java/org/apache/ws/commons/schema/utils/XmlSchemaNamedWithFormImpl.java
 
b/xmlschema-core/src/main/java/org/apache/ws/commons/schema/utils/XmlSchemaNamedWithFormImpl.java
index f0c083f2..de2a7529 100644
--- 
a/xmlschema-core/src/main/java/org/apache/ws/commons/schema/utils/XmlSchemaNamedWithFormImpl.java
+++ 
b/xmlschema-core/src/main/java/org/apache/ws/commons/schema/utils/XmlSchemaNamedWithFormImpl.java
@@ -111,7 +111,11 @@ public class XmlSchemaNamedWithFormImpl extends 
XmlSchemaNamedImpl implements Xm
     @Override
     public void setName(String name) {
         super.setName(name);
-        if (getForm() == XmlSchemaForm.QUALIFIED) {
+        if (getName() == null) {
+            // No name, as for a ref= declaration: no wire name either, 
whatever the form.
+            // setForm() calls this too, and new QName("", null) would throw.
+            wireName = null;
+        } else if (getForm() == XmlSchemaForm.QUALIFIED) {
             wireName = getQName();
         } else {
             wireName = new QName("", getName());
diff --git a/xmlschema-core/src/test/java/tests/FormWithoutNameTest.java 
b/xmlschema-core/src/test/java/tests/FormWithoutNameTest.java
new file mode 100644
index 00000000..386ec569
--- /dev/null
+++ b/xmlschema-core/src/test/java/tests/FormWithoutNameTest.java
@@ -0,0 +1,101 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package tests;
+
+import java.io.StringReader;
+
+import javax.xml.namespace.QName;
+
+import org.apache.ws.commons.schema.XmlSchema;
+import org.apache.ws.commons.schema.XmlSchemaCollection;
+import org.apache.ws.commons.schema.XmlSchemaComplexType;
+import org.apache.ws.commons.schema.XmlSchemaElement;
+import org.apache.ws.commons.schema.XmlSchemaException;
+import org.apache.ws.commons.schema.XmlSchemaSequence;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * A form attribute on an element or attribute declaration with no name, such 
as one using ref,
+ * used to throw IllegalArgumentException out of read() while computing a wire 
name from a null
+ * local name.
+ */
+public class FormWithoutNameTest extends Assert {
+
+    private static final String HEADER =
+        "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"; 
xmlns:t=\"urn:t\""
+        + " targetNamespace=\"urn:t\">";
+
+    /**
+     * The schemas below are not all valid, but read() must report a problem 
with one only
+     * through XmlSchemaException.
+     */
+    private static XmlSchema read(String body) {
+        try {
+            return new XmlSchemaCollection().read(new StringReader(HEADER + 
body + "</xs:schema>"));
+        } catch (XmlSchemaException e) {
+            return null;
+        }
+    }
+
+    @Test
+    public void testGlobalElementWithoutName() {
+        read("<xs:element form=\"unqualified\"/>");
+    }
+
+    @Test
+    public void testLocalAttributeWithoutName() {
+        read("<xs:complexType name=\"c\"><xs:attribute 
form=\"unqualified\"/></xs:complexType>");
+    }
+
+    @Test
+    public void testAttributeRefWithForm() {
+        read("<xs:attribute name=\"a\" type=\"xs:string\"/>"
+             + "<xs:attributeGroup name=\"g\"><xs:attribute ref=\"t:a\" 
form=\"unqualified\"/>"
+             + "</xs:attributeGroup>");
+    }
+
+    @Test
+    public void testElementRefWithFormKeepsTheReferencedName() {
+        XmlSchema schema = read(
+            "<xs:element name=\"e\" type=\"xs:string\"/>"
+            + "<xs:complexType name=\"c\"><xs:sequence>"
+            + "<xs:element ref=\"t:e\" form=\"unqualified\"/>"
+            + "</xs:sequence></xs:complexType>");
+        assertNotNull(schema);
+        XmlSchemaComplexType c = 
(XmlSchemaComplexType)schema.getTypeByName(new QName("urn:t", "c"));
+        XmlSchemaElement ref = 
(XmlSchemaElement)((XmlSchemaSequence)c.getParticle()).getItems().get(0);
+        assertEquals(new QName("urn:t", "e"), ref.getWireName());
+    }
+
+    @Test
+    public void testNamedElementsStillGetTheirWireName() {
+        XmlSchema schema = read(
+            "<xs:complexType name=\"c\"><xs:sequence>"
+            + "<xs:element name=\"u\" type=\"xs:string\" 
form=\"unqualified\"/>"
+            + "<xs:element name=\"q\" type=\"xs:string\" form=\"qualified\"/>"
+            + "</xs:sequence></xs:complexType>");
+        XmlSchemaComplexType c = 
(XmlSchemaComplexType)schema.getTypeByName(new QName("urn:t", "c"));
+        XmlSchemaSequence seq = (XmlSchemaSequence)c.getParticle();
+        assertEquals(new QName("", "u"), 
((XmlSchemaElement)seq.getItems().get(0)).getWireName());
+        assertEquals(new QName("urn:t", "q"), 
((XmlSchemaElement)seq.getItems().get(1)).getWireName());
+    }
+}

Reply via email to