in util-validator/src/main/scala/com/twitter/util/validation/internal/engine/ConstraintViolationFactory.scala [61:114]
def buildConstraintViolations[T](
rootClazz: Option[Class[T]],
root: Option[T],
leaf: Option[Any],
path: PathImpl,
invalidValue: Any,
constraintDescriptor: ConstraintDescriptor[_],
constraintValidatorContext: ConstraintValidatorContext
): Set[ConstraintViolation[T]] = {
val results = mutable.HashSet[ConstraintViolation[T]]()
val constraintViolationCreationContexts =
constraintValidatorContext
.asInstanceOf[ConstraintValidatorContextImpl]
.getConstraintViolationCreationContexts
var index = 0
val size = constraintViolationCreationContexts.size()
while (index < size) {
val constraintViolationCreationContext = constraintViolationCreationContexts.get(index)
val messageTemplate = constraintViolationCreationContext.getMessage
val interpolatedMessage =
validatorFactory.messageInterpolator
.interpolate(
messageTemplate,
new MessageInterpolatorContext(
constraintDescriptor,
invalidValue,
root.map(_.getClass.asInstanceOf[Class[T]]).orNull,
constraintViolationCreationContext.getPath,
constraintViolationCreationContext.getMessageParameters,
constraintViolationCreationContext.getExpressionVariables,
constraintViolationCreationContext.getExpressionLanguageFeatureLevel,
constraintViolationCreationContext.isCustomViolation
)
)
results.add(
newConstraintViolation[T](
messageTemplate,
interpolatedMessage,
path,
invalidValue,
rootClazz.orNull,
root.map(_.asInstanceOf[T]).getOrElse(null.asInstanceOf[T]),
leaf.orNull,
constraintDescriptor,
constraintViolationCreationContext
)
)
index += 1
}
if (results.nonEmpty) results.toSet
else Set.empty[ConstraintViolation[T]]
}