in daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/RestrictionUnion.scala [368:442]
def checkRangeReturnsValue(
value: String,
primType: PrimType,
theContext: ThrowsSDE
): (Boolean, Option[JBigDecimal]) = {
// EmptyString is only valid for hexBinary and String
if ((value == null | value.length() == 0)) {
return primType match {
case PrimType.HexBinary | PrimType.String => (true, None)
case _ => (false, None)
}
}
// Don't need to range check String or HexBinary or blobs.
// no point attempting a conversion to BigDecimal so
// return early here.
primType match {
case PrimType.String | PrimType.HexBinary | PrimType.AnyURI => return (true, None)
case _ => /* Continue on below */
}
// Check Boolean, and the Numeric types.
(value.toLowerCase(), primType) match {
case ("true", PrimType.Boolean) => (true, Some(JBigDecimal.ONE))
case ("false", PrimType.Boolean) => (true, Some(JBigDecimal.ZERO))
case (x, PrimType.Boolean) =>
theContext.SDE("%s is not a valid Boolean value. Expected 'true' or 'false'.", x)
case (_, _) => {
// Perform conversions once
val theValue = convertStringToBigDecimal(value, primType, theContext)
// Here we're just doing range checking for the
// specified primitive type
val res: Boolean = primType match {
case PrimType.Int => isInIntRange(theValue)
case PrimType.Byte => isInByteRange(theValue)
case PrimType.Short => isInShortRange(theValue)
case PrimType.Long => isInLongRange(theValue)
case PrimType.Integer => true // Unbounded Integer
case PrimType.UnsignedInt => isInUnsignedIntRange(theValue)
case PrimType.UnsignedByte => isInUnsignedByteRange(theValue)
case PrimType.UnsignedShort => isInUnsignedShortRange(theValue)
case PrimType.UnsignedLong => isInUnsignedLongRange(theValue)
case PrimType.Double => isInDoubleRange(theValue)
case PrimType.Float => isInFloatRange(theValue)
case PrimType.DateTime => true
case PrimType.Date => true
case PrimType.Time => true
case PrimType.Boolean => Assert.impossibleCase // Handled earlier, shouldn't get here
case PrimType.Decimal => true // Unbounded Decimal
case PrimType.HexBinary =>
Assert.impossibleCase // Handled earlier, shouldn't get here
case PrimType.String => Assert.impossibleCase // Handled earlier, shouldn't get here
case PrimType.AnyURI => Assert.impossibleCase // Handled earlier, shouldn't get here
case PrimType.NonNegativeInteger => isInNonNegativeIntegerRange(theValue)
}
val isValueWhole = {
val IsWholeRegex = """^[^.]*(\.0*)?$""".r
value match {
case IsWholeRegex(_) => true
case _ => false
}
}
primType match {
case PrimType.Int | PrimType.Byte | PrimType.Short | PrimType.Long |
PrimType.Integer | PrimType.UnsignedInt | PrimType.UnsignedByte |
PrimType.UnsignedShort | PrimType.UnsignedLong =>
if (!isValueWhole)
theContext.SDE("checkRange - Value (%s) must be a whole number.", value)
case _ => // OK
}
(res, Some(theValue))
}
}
}