This is an automated email from the ASF dual-hosted git repository. coheigea pushed a commit to branch coheigea/XmlSchemaElementValidator in repository https://gitbox.apache.org/repos/asf/ws-xmlschema.git
commit 08c096fbe99b9b06d3e4cdab8cedca650ee8ebbf Author: Colm O hEigeartaigh <[email protected]> AuthorDate: Fri Aug 21 09:48:37 2026 +0100 Explicitly catch NumberFormatException in XmlSchemaElementValidator --- .../schema/docpath/XmlSchemaElementValidator.java | 37 ++++++-- .../docpath/TestXmlSchemaElementValidator.java | 98 ++++++++++++++++++++++ 2 files changed, 129 insertions(+), 6 deletions(-) diff --git a/xmlschema-walker/src/main/java/org/apache/ws/commons/schema/docpath/XmlSchemaElementValidator.java b/xmlschema-walker/src/main/java/org/apache/ws/commons/schema/docpath/XmlSchemaElementValidator.java index 972aef58..11e2c836 100644 --- a/xmlschema-walker/src/main/java/org/apache/ws/commons/schema/docpath/XmlSchemaElementValidator.java +++ b/xmlschema-walker/src/main/java/org/apache/ws/commons/schema/docpath/XmlSchemaElementValidator.java @@ -522,7 +522,7 @@ final class XmlSchemaElementValidator { if ((rangeFacets != null) && !rangeFacets.isEmpty()) { for (XmlSchemaRestriction rangeFacet : rangeFacets) { - compareTo = getBigDecimalOf(rangeFacet.getValue()); + compareTo = getBigDecimalOf(name, rangeType, rangeFacet.getValue()); final int comparison = value.compareTo(compareTo); switch (rangeType) { @@ -554,7 +554,8 @@ final class XmlSchemaElementValidator { } } - private static BigDecimal getBigDecimalOf(Object numericValue) { + private static BigDecimal getBigDecimalOf(String name, XmlSchemaRestriction.Type rangeType, + Object numericValue) throws ValidationException { BigDecimal newValue = null; if (numericValue instanceof BigDecimal) { @@ -573,7 +574,13 @@ final class XmlSchemaElementValidator { newValue = new BigDecimal(((Number)numericValue).longValue()); } else if (numericValue instanceof String) { - newValue = new BigDecimal(numericValue.toString()); + try { + newValue = new BigDecimal(numericValue.toString()); + } catch (NumberFormatException e) { + throw new ValidationException(name + " has a " + rangeType + + " restriction with a malformed numeric value \"" + + numericValue + "\".", e); + } } else { throw new IllegalArgumentException(numericValue.getClass().getName() @@ -608,7 +615,13 @@ final class XmlSchemaElementValidator { if (lengthFacets != null) { for (XmlSchemaRestriction lengthFacet : lengthFacets) { - lengthRestriction = Integer.parseInt(lengthFacet.getValue().toString()); + try { + lengthRestriction = Integer.parseInt(lengthFacet.getValue().toString()); + } catch (NumberFormatException e) { + throw new ValidationException(name + " has a " + facetType + + " restriction with a malformed numeric value \"" + + lengthFacet.getValue() + "\".", e); + } switch (facetType) { case LENGTH: @@ -660,7 +673,13 @@ final class XmlSchemaElementValidator { if (lengthFacets != null) { for (XmlSchemaRestriction lengthFacet : lengthFacets) { - lengthRestriction = Integer.parseInt(lengthFacet.getValue().toString()); + try { + lengthRestriction = Integer.parseInt(lengthFacet.getValue().toString()); + } catch (NumberFormatException e) { + throw new ValidationException(name + " has a " + facetType + + " restriction with a malformed numeric value \"" + + lengthFacet.getValue() + "\".", e); + } switch (facetType) { case LENGTH: @@ -712,7 +731,13 @@ final class XmlSchemaElementValidator { if (digitsFacets != null) { for (XmlSchemaRestriction digitsFacet : digitsFacets) { - numDigits = Integer.parseInt(digitsFacet.getValue().toString()); + try { + numDigits = Integer.parseInt(digitsFacet.getValue().toString()); + } catch (NumberFormatException e) { + throw new ValidationException(name + " has a " + facetType + + " restriction with a malformed numeric value \"" + + digitsFacet.getValue() + "\".", e); + } switch (facetType) { case DIGITS_FRACTION: satisfied = (value.scale() <= numDigits); diff --git a/xmlschema-walker/src/test/java/org/apache/ws/commons/schema/docpath/TestXmlSchemaElementValidator.java b/xmlschema-walker/src/test/java/org/apache/ws/commons/schema/docpath/TestXmlSchemaElementValidator.java index 2fb899ae..0bd21021 100644 --- a/xmlschema-walker/src/test/java/org/apache/ws/commons/schema/docpath/TestXmlSchemaElementValidator.java +++ b/xmlschema-walker/src/test/java/org/apache/ws/commons/schema/docpath/TestXmlSchemaElementValidator.java @@ -1346,6 +1346,59 @@ public class TestXmlSchemaElementValidator { XmlSchemaElementValidator.validateContent(stateMachine, "128", nsContext); } + @Test(expected = ValidationException.class) + public void testInvalidStringLengthFacetValue() throws Exception { + HashMap<XmlSchemaRestriction.Type, List<XmlSchemaRestriction>> facets = new HashMap<XmlSchemaRestriction.Type, List<XmlSchemaRestriction>>(); + + facets.put(XmlSchemaRestriction.Type.LENGTH, + Collections + .<XmlSchemaRestriction> singletonList(new XmlSchemaRestriction( + XmlSchemaRestriction.Type.LENGTH, + "bogus", false))); + + XmlSchemaTypeInfo typeInfo = new XmlSchemaTypeInfo(XmlSchemaBaseSimpleType.STRING, facets); + + XmlSchemaStateMachineNode stateMachine = new XmlSchemaStateMachineNode(xmlElement, null, typeInfo); + + XmlSchemaElementValidator.validateContent(stateMachine, "123", nsContext); + } + + @Test(expected = ValidationException.class) + public void testInvalidListLengthFacetValue() throws Exception { + XmlSchemaTypeInfo baseType = new XmlSchemaTypeInfo(XmlSchemaBaseSimpleType.STRING); + + HashMap<XmlSchemaRestriction.Type, List<XmlSchemaRestriction>> listFacets = new HashMap<XmlSchemaRestriction.Type, List<XmlSchemaRestriction>>(); + + listFacets.put(XmlSchemaRestriction.Type.LENGTH, + Collections + .<XmlSchemaRestriction> singletonList(new XmlSchemaRestriction( + XmlSchemaRestriction.Type.LENGTH, + "bogus", false))); + + XmlSchemaTypeInfo listType = new XmlSchemaTypeInfo(baseType, listFacets); + + XmlSchemaStateMachineNode stateMachine = new XmlSchemaStateMachineNode(xmlElement, null, listType); + + XmlSchemaElementValidator.validateContent(stateMachine, "1 2 3", nsContext); + } + + @Test(expected = ValidationException.class) + public void testInvalidDigitsFacetValue() throws Exception { + HashMap<XmlSchemaRestriction.Type, List<XmlSchemaRestriction>> facets = new HashMap<XmlSchemaRestriction.Type, List<XmlSchemaRestriction>>(); + + facets.put(XmlSchemaRestriction.Type.DIGITS_TOTAL, + Collections + .<XmlSchemaRestriction> singletonList(new XmlSchemaRestriction( + XmlSchemaRestriction.Type.DIGITS_TOTAL, + "bogus", false))); + + XmlSchemaTypeInfo type = new XmlSchemaTypeInfo(XmlSchemaBaseSimpleType.DECIMAL, facets); + + XmlSchemaStateMachineNode stateMachine = new XmlSchemaStateMachineNode(xmlElement, null, type); + + XmlSchemaElementValidator.validateContent(stateMachine, "12345", nsContext); + } + @Test public void testValidStringNoFacets() throws Exception { XmlSchemaTypeInfo typeInfo = new XmlSchemaTypeInfo(XmlSchemaBaseSimpleType.STRING); @@ -1754,6 +1807,51 @@ public class TestXmlSchemaElementValidator { XmlSchemaElementValidator.validateContent(stateMachine, "fail!", nsContext); } + @Test + public void testUnionSkipsMemberWithMalformedFacet() throws Exception { + HashMap<XmlSchemaRestriction.Type, List<XmlSchemaRestriction>> malformedFacets = new HashMap<XmlSchemaRestriction.Type, List<XmlSchemaRestriction>>(); + + malformedFacets.put(XmlSchemaRestriction.Type.INCLUSIVE_MAX, + Collections + .<XmlSchemaRestriction> singletonList(new XmlSchemaRestriction( + XmlSchemaRestriction.Type.INCLUSIVE_MAX, + "bogus", false))); + + ArrayList<XmlSchemaTypeInfo> unionTypes = new ArrayList<XmlSchemaTypeInfo>(2); + + unionTypes.add(new XmlSchemaTypeInfo(XmlSchemaBaseSimpleType.DECIMAL, malformedFacets)); + unionTypes.add(new XmlSchemaTypeInfo(XmlSchemaBaseSimpleType.STRING)); + + XmlSchemaTypeInfo unionType = new XmlSchemaTypeInfo(unionTypes); + + XmlSchemaStateMachineNode stateMachine = new XmlSchemaStateMachineNode(xmlElement, null, unionType); + + // The DECIMAL member's malformed facet must not abort the whole union check. + XmlSchemaElementValidator.validateContent(stateMachine, "not-a-number", nsContext); + } + + @Test(expected = ValidationException.class) + public void testUnionAllMembersFailIncludingMalformedFacet() throws Exception { + HashMap<XmlSchemaRestriction.Type, List<XmlSchemaRestriction>> malformedFacets = new HashMap<XmlSchemaRestriction.Type, List<XmlSchemaRestriction>>(); + + malformedFacets.put(XmlSchemaRestriction.Type.INCLUSIVE_MAX, + Collections + .<XmlSchemaRestriction> singletonList(new XmlSchemaRestriction( + XmlSchemaRestriction.Type.INCLUSIVE_MAX, + "bogus", false))); + + ArrayList<XmlSchemaTypeInfo> unionTypes = new ArrayList<XmlSchemaTypeInfo>(2); + + unionTypes.add(new XmlSchemaTypeInfo(XmlSchemaBaseSimpleType.DECIMAL, malformedFacets)); + unionTypes.add(new XmlSchemaTypeInfo(XmlSchemaBaseSimpleType.BOOLEAN)); + + XmlSchemaTypeInfo unionType = new XmlSchemaTypeInfo(unionTypes); + + XmlSchemaStateMachineNode stateMachine = new XmlSchemaStateMachineNode(xmlElement, null, unionType); + + XmlSchemaElementValidator.validateContent(stateMachine, "not-a-number", nsContext); + } + @Test public void testNillableElement() throws Exception { XmlSchemaElement element = new XmlSchemaElement(xmlSchema, false);
