in util-validator/src/main/scala/com/twitter/util/validation/ScalaValidator.scala [1451:1506]
private[validation] def parseMethodValidationFailures[T](
rootClazz: Option[Class[T]],
root: Option[T],
leaf: Option[Any],
path: PathImpl,
annotation: MethodValidation,
method: Method,
result: MethodValidationResult,
value: Any,
constraintDescriptor: ConstraintDescriptor[_]
): Set[ConstraintViolation[T]] = {
def methodValidationConstraintViolation(
validationPath: PathImpl,
message: String,
payload: Payload
): ConstraintViolation[T] = {
constraintViolationFactory.newConstraintViolation[T](
messageTemplate = annotation.message(),
interpolatedMessage = message,
path = validationPath,
invalidValue = value.asInstanceOf[T],
rootClazz = rootClazz.orNull,
root = root.getOrElse(null.asInstanceOf[T]),
leaf = leaf.orNull,
constraintDescriptor = constraintDescriptor,
payload = payload
)
}
result match {
case invalid: MethodValidationResult.Invalid =>
val results = mutable.HashSet[ConstraintViolation[T]]()
val annotationFields: Array[String] = annotation.fields.filter(_.nonEmpty)
if (annotationFields.nonEmpty) {
var index = 0
val length = annotationFields.length
while (index < length) {
val fieldName = annotationFields(index)
val parameterPath = PathImpl.createCopy(path)
parameterPath.addParameterNode(fieldName, index)
results.add(
methodValidationConstraintViolation(
parameterPath,
invalid.message,
invalid.payload.orNull)
)
index += 1
}
if (results.nonEmpty) results.toSet
else Set.empty[ConstraintViolation[T]]
} else {
Set(methodValidationConstraintViolation(path, invalid.message, invalid.payload.orNull))
}
case _ => Set.empty[ConstraintViolation[T]]
}
}