This is an automated email from the ASF dual-hosted git repository.
coheigea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ws-xmlschema.git
The following commit(s) were added to refs/heads/master by this push:
new 0ca48b63 Serialize notation as well and fix some NPEs (#156)
0ca48b63 is described below
commit 0ca48b632b4cd03a346eafc0630425e503108989
Author: Colm O hEigeartaigh <[email protected]>
AuthorDate: Thu Sep 17 10:13:38 2026 +0100
Serialize notation as well and fix some NPEs (#156)
---
.../ws/commons/schema/XmlSchemaCollection.java | 3 +
.../ws/commons/schema/XmlSchemaSerializer.java | 41 ++++++++
.../src/test/java/tests/NotationRoundTripTest.java | 105 +++++++++++++++++++++
3 files changed, 149 insertions(+)
diff --git
a/xmlschema-core/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java
b/xmlschema-core/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java
index 97df7772..7c78389f 100644
---
a/xmlschema-core/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java
+++
b/xmlschema-core/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java
@@ -294,6 +294,9 @@ public final class XmlSchemaCollection {
* @return the type object, or null.
*/
public XmlSchemaType getTypeByQName(QName schemaTypeName) {
+ if (schemaTypeName == null) {
+ return null;
+ }
String uri = schemaTypeName.getNamespaceURI();
for (Map.Entry<SchemaKey, XmlSchema> entry : schemas.entrySet()) {
if (entry.getKey().getNamespace().equals(uri)) {
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 26be3e2c..76f60f6b 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
@@ -510,6 +510,44 @@ public class XmlSchemaSerializer {
* Return: Element of attribute group.
* **********************************************************************
*/
+ /**
+ * Serializes an xs:notation declaration.
+ *
+ * @param doc the parent document.
+ * @param notationObj the notation to serialize.
+ * @param schema the owning schema.
+ * @return the notation element.
+ * @throws XmlSchemaSerializerException if the notation has no name.
+ */
+ Element serializeNotation(Document doc, XmlSchemaNotation notationObj,
XmlSchema schema)
+ throws XmlSchemaSerializerException {
+
+ Element notation = createNewElement(doc, "notation",
schema.getSchemaNamespacePrefix(),
+ XmlSchema.SCHEMA_NS);
+
+ if (notationObj.isAnonymous()) {
+ throw new XmlSchemaSerializerException("Notation must have name");
+ }
+ notation.setAttributeNS(null, "name", notationObj.getName());
+
+ if (notationObj.getId() != null) {
+ notation.setAttributeNS(null, "id", notationObj.getId());
+ }
+ if (notationObj.getPublic() != null) {
+ notation.setAttributeNS(null, "public", notationObj.getPublic());
+ }
+ if (notationObj.getSystem() != null) {
+ notation.setAttributeNS(null, "system", notationObj.getSystem());
+ }
+ if (notationObj.getAnnotation() != null) {
+ notation.appendChild(serializeAnnotation(doc,
notationObj.getAnnotation(), schema));
+ }
+
+ processExtensibilityComponents(notationObj, notation);
+
+ return notation;
+ }
+
Element serializeAttributeGroup(Document doc, XmlSchemaAttributeGroup
attributeGroupObj, XmlSchema schema)
throws XmlSchemaSerializerException {
@@ -2453,6 +2491,9 @@ public class XmlSchemaSerializer {
} else if (obj instanceof XmlSchemaRedefine) {
Element e = serializeRedefine(serializedSchemaDocs,
(XmlSchemaRedefine)obj, schemaObj);
serializedSchema.appendChild(e);
+ } else if (obj instanceof XmlSchemaNotation) {
+ Element e = serializeNotation(serializedSchemaDocs,
(XmlSchemaNotation)obj, schemaObj);
+ serializedSchema.appendChild(e);
}
}
}
diff --git a/xmlschema-core/src/test/java/tests/NotationRoundTripTest.java
b/xmlschema-core/src/test/java/tests/NotationRoundTripTest.java
new file mode 100644
index 00000000..aa16dca0
--- /dev/null
+++ b/xmlschema-core/src/test/java/tests/NotationRoundTripTest.java
@@ -0,0 +1,105 @@
+/**
+ * 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 java.io.StringWriter;
+
+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.XmlSchemaNotation;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * read() builds an xs:notation into the model, so write() has to put it back.
+ */
+public class NotationRoundTripTest extends Assert {
+
+ private static final String SCHEMA =
+ "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"
targetNamespace=\"urn:n\">"
+ + "<xs:notation name=\"jpeg\" public=\"image/jpeg\"
system=\"viewer.exe\">"
+ + "<xs:annotation><xs:documentation>a
picture</xs:documentation></xs:annotation>"
+ + "</xs:notation>"
+ + "<xs:element name=\"e\" type=\"xs:string\"/>"
+ + "</xs:schema>";
+
+ private static XmlSchema read(String text) {
+ return new XmlSchemaCollection().read(new StringReader(text));
+ }
+
+ @Test
+ public void testNotationSurvivesARoundTrip() throws Exception {
+ XmlSchema before = read(SCHEMA);
+ assertEquals(1, before.getNotations().size());
+
+ StringWriter writer = new StringWriter();
+ before.write(writer);
+
+ XmlSchema after = read(writer.toString());
+ assertEquals("the notation must not be dropped by write()",
+ before.getNotations().size(),
after.getNotations().size());
+
+ XmlSchemaNotation notation =
+ after.getNotationByName(new QName("urn:n", "jpeg"));
+ assertNotNull(notation);
+ assertEquals("image/jpeg", notation.getPublic());
+ assertEquals("viewer.exe", notation.getSystem());
+ assertNotNull("the notation's annotation must survive too",
notation.getAnnotation());
+ }
+
+ @Test
+ public void testOtherTopLevelComponentsStillSurvive() throws Exception {
+ XmlSchema before = read(
+ "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"
targetNamespace=\"urn:n\">"
+ + "<xs:element name=\"el\" type=\"xs:string\"/>"
+ + "<xs:attribute name=\"at\" type=\"xs:string\"/>"
+ + "<xs:complexType name=\"ct\"><xs:sequence/></xs:complexType>"
+ + "<xs:group name=\"g\"><xs:sequence>"
+ + "<xs:element name=\"x\"
type=\"xs:string\"/></xs:sequence></xs:group>"
+ + "<xs:attributeGroup name=\"ag\">"
+ + "<xs:attribute name=\"y\"
type=\"xs:string\"/></xs:attributeGroup>"
+ + "<xs:notation name=\"n\" public=\"urn:p\"/>"
+ + "</xs:schema>");
+
+ StringWriter writer = new StringWriter();
+ before.write(writer);
+ XmlSchema after = read(writer.toString());
+
+ assertEquals(before.getElements().size(), after.getElements().size());
+ assertEquals(before.getAttributes().size(),
after.getAttributes().size());
+ assertEquals(before.getSchemaTypes().size(),
after.getSchemaTypes().size());
+ assertEquals(before.getGroups().size(), after.getGroups().size());
+ assertEquals(before.getAttributeGroups().size(),
after.getAttributeGroups().size());
+ assertEquals(before.getNotations().size(),
after.getNotations().size());
+ }
+
+ /** getTypeByQName was the only QName lookup that threw on null. */
+ @Test
+ public void testQNameLookupsTolerateNull() {
+ XmlSchemaCollection collection = new XmlSchemaCollection();
+ assertNull(collection.getTypeByQName(null));
+ assertNull(collection.getElementByQName(null));
+ assertNull(collection.getAttributeByQName(null));
+ }
+}