org.deephacks.tools4j.config.internal.core.admin.Jsr303Validator Maven / Gradle / Ivy
package org.deephacks.tools4j.config.internal.core.admin;
import org.deephacks.tools4j.config.model.AbortRuntimeException;
import org.deephacks.tools4j.config.model.Bean;
import org.deephacks.tools4j.config.model.Events;
import org.deephacks.tools4j.config.spi.Conversion;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Collection;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
*
* When beans are created or updated, it is the responsibility of the
* validator to maintain data integrity by enforcing validation
* constraints and reject operations that violate these rules.
*
* This validator does JSR 303, Bean Validation and will not try to do schema
* validation, ie check data types or referential integrity etc.
*
* Validation will only be peformed if JSR 303 1.0 Bean Validation API
* and compliant implementation are available on classpath.
*
*
* @author Kristoffer Sjogren
*/
final class Jsr303Validator {
private Validator validator;
private Conversion conversion = Conversion.get();
private ConcurrentHashMap> classCache = new ConcurrentHashMap<>();
/**
* Validate a collection of bean instances. This method is called
* when beans are provisioned from an administrative context.
*
* Beans can correlate their respective validation constraints using
* the schema name.
*
*
* @param beans to be validated.
* @throws AbortRuntimeException
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public void validate(Collection beans) throws AbortRuntimeException {
if (validator == null) {
validator = Validation.buildDefaultValidatorFactory().getValidator();
}
for (Bean bean : beans) {
Class genclazz = loadClass(bean.getSchema().getType());
Object beanToValidate = conversion.convert(bean, genclazz);
Set> violations = validator.validate(beanToValidate);
String msg = "";
for (ConstraintViolation