package org.jboss.capedwarf.validation; import javax.validation.*; import javax.validation.metadata.BeanDescriptor; import javax.validation.metadata.ConstraintDescriptor; import java.lang.annotation.Annotation; import java.util.Collections; import java.util.HashSet; import java.util.Set; /** * javax.validation validator. * * @author <a href="mailto:ales.justin@jboss.org">Ales Justin</a> */ class SimpleValidator extends ValidatorHolder<SimpleValidator> implements Validator { private SimpleValidatorFactory factory; SimpleValidator(SimpleValidatorFactory factory) { this.factory = factory; } SimpleValidator(SimpleValidatorFactory factory, MessageInterpolator messageInterpolator, TraversableResolver traversableResolver, ConstraintValidatorFactory constraintValidatorFactory) { super(messageInterpolator, traversableResolver, constraintValidatorFactory); this.factory = factory; } @SuppressWarnings({"unchecked"}) protected <T> void validate(T object, SimpleBeanDescriptor sbd, String propertyName, final Object value, Set<ConstraintViolation<T>> violations) { SimplePropertyDescriptor spd = sbd.getConstraintsForProperty(propertyName); Class<?> beanClass = sbd.getElementClass(); for (Class<? extends Annotation> ac : spd.getConstraintAnnotations()) { ConstraintValidator cv = factory.getConstraintValidator(ac); if (cv == null) continue; final Annotation annotation = spd.getAnnotation(beanClass, ac); cv.initialize(annotation); boolean isValid = cv.isValid(value, null); if (isValid == false) { String messageTemplateKey = spd.getMessageTemplateKey(beanClass); if (messageTemplateKey == null) messageTemplateKey = "{" + ac.getName() + ".message}"; String message = getMessageInterpolator().interpolate(messageTemplateKey, new MessageInterpolator.Context() { public ConstraintDescriptor<?> getConstraintDescriptor() { return new SimpleConstraintDescriptor<Annotation>(factory, annotation); } public Object getValidatedValue() { return value; } }); ConstraintViolation<T> violation = new SimpleConstraintViolation(factory, message, object, beanClass, annotation, propertyName, value); violations.add(violation); } } } public <T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups) { if (object == null) return Collections.emptySet(); SimpleBeanDescriptor sbd = factory.getBeanDescriptor(object.getClass()); if (sbd.isBeanConstrained() == false) return Collections.emptySet(); Set<ConstraintViolation<T>> violations = new HashSet<ConstraintViolation<T>>(); for (SimplePropertyDescriptor spd : sbd.getConstrainedSimpleProperties()) { Object value = spd.getValue(object); validate(object, sbd, spd.getPropertyName(), value, violations); } return violations; } public <T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups) { if (object == null) return Collections.emptySet(); SimpleBeanDescriptor sbd = factory.getBeanDescriptor(object.getClass()); if (sbd.isBeanConstrained() == false) return Collections.emptySet(); Set<ConstraintViolation<T>> violations = new HashSet<ConstraintViolation<T>>(); SimplePropertyDescriptor spd = sbd.getConstraintsForProperty(propertyName); if (spd == null) return Collections.emptySet(); Object value = spd.getValue(object); validate(object, sbd, spd.getPropertyName(), value, violations); return violations; } public <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups) { SimpleBeanDescriptor sbd = factory.getBeanDescriptor(beanType); if (sbd.isBeanConstrained() == false) return Collections.emptySet(); Set<ConstraintViolation<T>> violations = new HashSet<ConstraintViolation<T>>(); SimplePropertyDescriptor spd = sbd.getConstraintsForProperty(propertyName); if (spd == null) return Collections.emptySet(); validate(null, sbd, spd.getPropertyName(), value, violations); return violations; } public BeanDescriptor getConstraintsForClass(Class<?> clazz) { return factory.getBeanDescriptor(clazz); } public <T> T unwrap(Class<T> type) { return null; } }