All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.validator.internal.engine.constraintvalidation.ClassBasedValidatorDescriptor Maven / Gradle / Ivy

Go to download

JSR 380's RI, Hibernate Validator version ${hibernate-validator.version} and its dependencies repackaged as OSGi bundle

There is a newer version: 5.1.0
Show newest version
/*
 * Hibernate Validator, declare and validate application constraints
 *
 * License: Apache License, Version 2.0
 * See the license.txt file in the root directory or .
 */
package org.hibernate.validator.internal.engine.constraintvalidation;

import java.lang.annotation.Annotation;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.EnumSet;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorFactory;
import javax.validation.constraintvalidation.SupportedValidationTarget;
import javax.validation.constraintvalidation.ValidationTarget;

import org.hibernate.validator.internal.util.TypeHelper;
import org.hibernate.validator.internal.util.logging.Log;
import org.hibernate.validator.internal.util.logging.LoggerFactory;

/**
 * Represents an implementation of {@link ConstraintValidator}.
 *
 * @author Gunnar Morling
 * @author Guillaume Smet
 */
class ClassBasedValidatorDescriptor implements ConstraintValidatorDescriptor {

	private static final Log LOG = LoggerFactory.make( MethodHandles.lookup() );

	private final Class> validatorClass;
	private final Type validatedType;
	private final EnumSet validationTargets;

	private ClassBasedValidatorDescriptor(Class> validatorClass) {
		this.validatorClass = validatorClass;
		this.validatedType = TypeHelper.extractValidatedType( validatorClass );
		this.validationTargets = determineValidationTargets( validatorClass );
	}

	public static  ClassBasedValidatorDescriptor of(Class> validatorClass,
			Class registeredConstraintAnnotationType) {
		Type definedConstraintAnnotationType = TypeHelper.extractConstraintType( validatorClass );
		if ( !registeredConstraintAnnotationType.equals( definedConstraintAnnotationType ) ) {
			throw LOG.getConstraintValidatorDefinitionConstraintMismatchException( validatorClass, registeredConstraintAnnotationType,
					definedConstraintAnnotationType );
		}

		return new ClassBasedValidatorDescriptor( validatorClass );
	}

	private static EnumSet determineValidationTargets(Class> validatorClass) {
		SupportedValidationTarget supportedTargetAnnotation = validatorClass.getAnnotation(
				SupportedValidationTarget.class );

		// by default constraints target the annotated element
		if ( supportedTargetAnnotation == null ) {
			return EnumSet.of( ValidationTarget.ANNOTATED_ELEMENT );
		}
		else {
			return EnumSet.copyOf( Arrays.asList( supportedTargetAnnotation.value() ) );
		}
	}

	@Override
	public Class> getValidatorClass() {
		return validatorClass;
	}

	@Override
	public ConstraintValidator newInstance(ConstraintValidatorFactory constraintValidatorFactory) {
		ConstraintValidator constraintValidator = constraintValidatorFactory.getInstance( validatorClass );

		if ( constraintValidator == null ) {
			throw LOG.getConstraintValidatorFactoryMustNotReturnNullException( validatorClass );
		}

		return constraintValidator;
	}

	@Override
	public Type getValidatedType() {
		return validatedType;
	}

	@Override
	public EnumSet getValidationTargets() {
		return validationTargets;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy