You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by co...@apache.org on 2026/09/24 14:06:35 UTC

(ws-xmlschema) branch coheigea/wire created (now e16de038)

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

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


      at e16de038 Do not build a wire name for an element or attribute with no name

This branch includes the following new commits:

     new e16de038 Do not build a wire name for an element or attribute with no name

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(ws-xmlschema) 01/01: Do not build a wire name for an element or attribute with no name

Posted by co...@apache.org.
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 <co...@apache.org>
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());
+    }
+}