/*
* Hibernate Validator, declare and validate application constraints
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package org.hibernate.validator.ap.checks;
import java.util.Collections;
import java.util.Set;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror;
import org.hibernate.validator.ap.util.CollectionHelper;
import org.hibernate.validator.ap.util.ConstraintHelper;
import org.hibernate.validator.ap.util.ConstraintHelper.ConstraintCheckResult;
import org.hibernate.validator.ap.util.ConstraintHelper.AnnotationProcessorValidationTarget;
/**
* Checks, that constraint annotations are only specified at elements of a type supported by the constraints. Applies to
* fields, methods and non-annotation type declarations.
*
* @author Gunnar Morling
*/
public class TypeCheck extends AbstractConstraintCheck {
private ConstraintHelper constraintHelper;
public TypeCheck(ConstraintHelper constraintHelper) {
this.constraintHelper = constraintHelper;
}
@Override
public Set<ConstraintCheckIssue> checkField(VariableElement element,
AnnotationMirror annotation) {
return checkInternal( element, annotation, element.asType(), "NOT_SUPPORTED_TYPE" );
}
@Override
public Set<ConstraintCheckIssue> checkMethod(ExecutableElement element,
AnnotationMirror annotation) {
AnnotationProcessorValidationTarget target = AnnotationProcessorValidationTarget.ANNOTATED_ELEMENT;
if ( constraintHelper.isConstraintAnnotation( annotation.getAnnotationType().asElement() ) ) {
target = constraintHelper.resolveValidationTarget( element, annotation );
}
if ( target == AnnotationProcessorValidationTarget.PARAMETERS ) {
return Collections.emptySet();
}
// check the return type
return checkInternal( element, annotation, element.getReturnType(), "NOT_SUPPORTED_RETURN_TYPE" );
}
@Override
public Set<ConstraintCheckIssue> checkNonAnnotationType(
TypeElement element, AnnotationMirror annotation) {
return checkInternal( element, annotation, element.asType(), "NOT_SUPPORTED_TYPE" );
}
private Set<ConstraintCheckIssue> checkInternal(Element element,
AnnotationMirror annotation, TypeMirror type, String messageKey) {
if ( constraintHelper.checkConstraint(
annotation.getAnnotationType(), type ) != ConstraintCheckResult.ALLOWED ) {
return CollectionHelper.asSet(
ConstraintCheckIssue.error(
element, annotation, messageKey,
annotation.getAnnotationType().asElement().getSimpleName() ) );
}
return Collections.emptySet();
}
}