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>