You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by dk...@apache.org on 2021/05/04 15:24:41 UTC

[ws-xmlschema] 02/02: [XMLSCHEMA-57] Fix namespace prefixes not being defined for unions

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

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

commit f08d3a339fd546878b6848c8987fb9cb05fbb1c8
Author: Daniel Kulp <dk...@apache.org>
AuthorDate: Tue May 4 11:22:34 2021 -0400

    [XMLSCHEMA-57] Fix namespace prefixes not being defined for unions
---
 .../ws/commons/schema/XmlSchemaSerializer.java     | 18 ++++++++++--
 xmlschema-core/src/test/java/tests/UnionTest.java  | 33 ++++++++++++++++++++++
 xmlschema-core/src/test/resources/union-schema.xsd | 17 +++++++++++
 3 files changed, 65 insertions(+), 3 deletions(-)

diff --git a/xmlschema-core/src/main/java/org/apache/ws/commons/schema/XmlSchemaSerializer.java b/xmlschema-core/src/main/java/org/apache/ws/commons/schema/XmlSchemaSerializer.java
index e535b4f..307be76 100644
--- a/xmlschema-core/src/main/java/org/apache/ws/commons/schema/XmlSchemaSerializer.java
+++ b/xmlschema-core/src/main/java/org/apache/ws/commons/schema/XmlSchemaSerializer.java
@@ -2146,9 +2146,21 @@ public class XmlSchemaSerializer {
         }
 
         if (unionObj.getMemberTypesSource() != null) {
+            QName[] memberTypesQNames = unionObj.getMemberTypesQNames();            
+            for (QName qn : memberTypesQNames) {
+                String namespace = qn.getNamespaceURI();
+                if (namespace.length() != 0 && qn.getPrefix().length() != 0) {
+                    String prefix = schemaNamespace.get(namespace);
+                    if (!qn.getPrefix().equals(prefix)) {
+                        prefix = union.lookupPrefix(namespace);
+                    }
+                    if (!qn.getPrefix().equals(prefix)) {
+                        union.setAttributeNS(XMLNS_NAMESPACE_URI, "xmlns:" + qn.getPrefix(), qn.getNamespaceURI());
+                    }
+                }
+            }
             union.setAttributeNS(null, "memberTypes", unionObj.getMemberTypesSource());
-        }
-        else {
+        } else {
             QName[] memberTypesQNames = unionObj.getMemberTypesQNames();
             if (memberTypesQNames != null && memberTypesQNames.length > 0) {
                 StringBuilder memberTypes = new StringBuilder();
@@ -2163,7 +2175,7 @@ public class XmlSchemaSerializer {
                     }
                     memberTypes.append(memberTypesQName.getLocalPart());
                     if (i != n) {
-                      memberTypes.append(' ');
+                        memberTypes.append(' ');
                     }
                 }
                 
diff --git a/xmlschema-core/src/test/java/tests/UnionTest.java b/xmlschema-core/src/test/java/tests/UnionTest.java
index fab488e..64dfcc7 100644
--- a/xmlschema-core/src/test/java/tests/UnionTest.java
+++ b/xmlschema-core/src/test/java/tests/UnionTest.java
@@ -21,6 +21,8 @@ package tests;
 
 import java.io.FileInputStream;
 import java.io.InputStream;
+import java.io.StringReader;
+import java.io.StringWriter;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -81,5 +83,36 @@ public class UnionTest extends Assert {
         assertEquals("float decimal", xsstu.getMemberTypesSource());
 
     }
+    
+    @Test
+    public void testUnionNamespacePrefix() throws Exception {
+
+        QName elementQName = new QName("http://some.uri", "myDateTime");
+        InputStream is = new FileInputStream(Resources.asURI("union-schema.xsd"));
+        XmlSchemaCollection schemaCol = new XmlSchemaCollection();
+        schemaCol.read(new StreamSource(is));
+
+        XmlSchemaSimpleType simpleType = (XmlSchemaSimpleType)schemaCol.getTypeByQName(elementQName);
+        assertNotNull(simpleType);
+
+        XmlSchemaSimpleTypeUnion xsstu = (XmlSchemaSimpleTypeUnion)simpleType.getContent();
+        assertNotNull(xsstu);
+
+        QName[] qname = xsstu.getMemberTypesQNames();
+        Set<QName> s = new HashSet<QName>();
+        s.add(new QName("http://some.uri", "emptyString"));
+        s.add(new QName("http://www.w3.org/2001/XMLSchema", "dateTime"));
+        for (QName element : qname) {
+            assertTrue(s.remove(element));
+        }
+        assertTrue("The set should have been empty, but instead contained: " + s + ".", s.isEmpty());
+        
+        StringWriter writer = new StringWriter();
+        schemaCol.schemaForNamespace("http://some.uri").write(writer);
+        String sc = writer.toString();
+        assertTrue(sc, sc.contains("xmlns:q2"));
+        
+        new XmlSchemaCollection().read(new StringReader(sc));
+    }
 
 }
diff --git a/xmlschema-core/src/test/resources/union-schema.xsd b/xmlschema-core/src/test/resources/union-schema.xsd
new file mode 100644
index 0000000..4c9d0f2
--- /dev/null
+++ b/xmlschema-core/src/test/resources/union-schema.xsd
@@ -0,0 +1,17 @@
+<xs:schema elementFormDefault="qualified" targetNamespace="http://some.uri" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+	<xs:element name="DynamicObject">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="DatePicker1" xmlns:q1="http://some.uri" type="q1:myDateTime"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:simpleType name="emptyString">
+		<xs:restriction base="xs:string">
+			<xs:length value="0"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="myDateTime">
+		<xs:union xmlns:q2="http://some.uri" memberTypes="q2:emptyString xs:dateTime"/>
+	</xs:simpleType>
+</xs:schema>