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 cefaabb0 Properly throw XMLSchemaException in some places (#132)
cefaabb0 is described below
commit cefaabb0f7cc219ba8d2074b7ca4b0e8841ed26b
Author: Colm O hEigeartaigh <[email protected]>
AuthorDate: Wed Aug 26 14:00:15 2026 +0100
Properly throw XMLSchemaException in some places (#132)
---
.../org/apache/ws/commons/schema/EnumUtil.java | 7 +-
.../apache/ws/commons/schema/SchemaBuilder.java | 8 ++-
.../ws/commons/schema/XmlSchemaCollection.java | 8 +--
.../src/test/java/tests/ExceptionContractTest.java | 82 ++++++++++++++++++++++
4 files changed, 98 insertions(+), 7 deletions(-)
diff --git
a/xmlschema-core/src/main/java/org/apache/ws/commons/schema/EnumUtil.java
b/xmlschema-core/src/main/java/org/apache/ws/commons/schema/EnumUtil.java
index aa79127a..e5a3a3ff 100644
--- a/xmlschema-core/src/main/java/org/apache/ws/commons/schema/EnumUtil.java
+++ b/xmlschema-core/src/main/java/org/apache/ws/commons/schema/EnumUtil.java
@@ -30,7 +30,12 @@ final class EnumUtil {
}
static <T extends Enum<T>> T valueOf(Class<T> enumClass, String name) {
- return Enum.valueOf(enumClass, name.toUpperCase(Locale.ENGLISH));
+ try {
+ return Enum.valueOf(enumClass, name.toUpperCase(Locale.ENGLISH));
+ } catch (IllegalArgumentException e) {
+ throw new XmlSchemaException("Invalid value \"" + name + "\" for "
+ + enumClass.getSimpleName() + ".", e);
+ }
}
}
diff --git
a/xmlschema-core/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java
b/xmlschema-core/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java
index 66418f23..bbd215fa 100644
---
a/xmlschema-core/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java
+++
b/xmlschema-core/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java
@@ -584,7 +584,7 @@ public class SchemaBuilder {
if (isEmpty(uri)) {
valid = isEmpty(pSchema.getSyntacticalTargetNamespace());
} else {
- valid =
pSchema.getSyntacticalTargetNamespace().equals(uri);
+ valid =
uri.equals(pSchema.getSyntacticalTargetNamespace());
}
if (!valid) {
throw new XmlSchemaException("An imported schema was
announced to have the namespace "
@@ -931,7 +931,7 @@ public class SchemaBuilder {
}
if (uri == null || Constants.NULL_NS_URI.equals(uri)) {
- throw new IllegalStateException("The prefix " + prefix + " is
not bound.");
+ throw new XmlSchemaException("The prefix " + prefix + " is not
bound.");
}
localName = pName.substring(offset + 1);
}
@@ -1355,6 +1355,10 @@ public class SchemaBuilder {
}
if (constraintEl.hasAttribute("refer")) {
+ if (!(constraint instanceof XmlSchemaKeyref)) {
+ throw new XmlSchemaException("A \"refer\" attribute is
only permitted on xs:keyref,"
+ + " not on xs:" +
constraintEl.getLocalName() + ".");
+ }
String name = constraintEl.getAttribute("refer");
((XmlSchemaKeyref)constraint).refer = getRefQName(name,
constraintEl);
}
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 dfe59fb3..1383ee30 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
@@ -714,10 +714,10 @@ public final class XmlSchemaCollection {
void addSchema(SchemaKey pKey, XmlSchema pSchema) {
if (schemas.containsKey(pKey)) {
throw
- new IllegalStateException("A schema with target namespace "
- + pKey.getNamespace()
- + " and system ID "
- + pKey.getSystemId() + " is already
present.");
+ new XmlSchemaException("A schema with target namespace "
+ + pKey.getNamespace()
+ + " and system ID "
+ + pKey.getSystemId() + " is already
present.");
}
schemas.put(pKey, pSchema);
}
diff --git a/xmlschema-core/src/test/java/tests/ExceptionContractTest.java
b/xmlschema-core/src/test/java/tests/ExceptionContractTest.java
new file mode 100644
index 00000000..5e029f05
--- /dev/null
+++ b/xmlschema-core/src/test/java/tests/ExceptionContractTest.java
@@ -0,0 +1,82 @@
+/**
+ * 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 org.apache.ws.commons.schema.XmlSchemaCollection;
+import org.apache.ws.commons.schema.XmlSchemaException;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ExceptionContractTest extends Assert {
+
+ private void assertRejectedWithXmlSchemaException(String schemaBody) {
+ String schema =
+ "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\""
+ + " targetNamespace=\"urn:contract\">" + schemaBody +
"</xs:schema>";
+ XmlSchemaCollection collection = new XmlSchemaCollection();
+ try {
+ collection.read(new StringReader(schema));
+ fail("The crafted schema should have been rejected: " +
schemaBody);
+ } catch (XmlSchemaException expected) {
+ // Expected documented failure surface.
+ }
+ }
+
+ @Test
+ public void testUndeclaredPrefixInTypeReference() {
+ assertRejectedWithXmlSchemaException("<xs:element name=\"a\"
type=\"nope:T\"/>");
+ }
+
+ @Test
+ public void testReferOnKeyConstraint() {
+ assertRejectedWithXmlSchemaException(
+ "<xs:element name=\"a\" type=\"xs:string\">"
+ + "<xs:key name=\"k\" refer=\"xs:b\">"
+ + "<xs:selector xpath=\".\"/><xs:field xpath=\"@id\"/>"
+ + "</xs:key></xs:element>");
+ }
+
+ @Test
+ public void testInvalidFormAttributeValue() {
+ assertRejectedWithXmlSchemaException(
+ "<xs:element name=\"a\"><xs:complexType>"
+ + "<xs:attribute name=\"x\" form=\"bogus\"/>"
+ + "</xs:complexType></xs:element>");
+ }
+
+ @Test
+ public void testInvalidUseAttributeValue() {
+ assertRejectedWithXmlSchemaException(
+ "<xs:element name=\"a\"><xs:complexType>"
+ + "<xs:attribute name=\"x\" use=\"bogus\"/>"
+ + "</xs:complexType></xs:element>");
+ }
+
+ @Test
+ public void testInvalidProcessContentsValue() {
+ assertRejectedWithXmlSchemaException(
+ "<xs:element name=\"a\"><xs:complexType><xs:sequence>"
+ + "<xs:any processContents=\"bogus\"/>"
+ + "</xs:sequence></xs:complexType></xs:element>");
+ }
+}
\ No newline at end of file