/*
* 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.Name;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Types;
import org.hibernate.validator.ap.util.CollectionHelper;
import org.hibernate.validator.ap.util.ConstraintHelper;
/**
* Checks, that there is no mixed usage of direct annotation and its list container.
* Only one kind should be present for a constraint.
*
* @author Marko Bekhta
*/
public class MixDirectAndListAnnotationCheck extends AbstractConstraintCheck {
private final ConstraintHelper constraintHelper;
public MixDirectAndListAnnotationCheck(ConstraintHelper constraintHelper) {
this.constraintHelper = constraintHelper;
}
@Override
public Set<ConstraintCheckIssue> checkAnnotationType(TypeElement element, AnnotationMirror annotation) {
if ( constraintHelper.isComposedConstraint( element ) ) {
if ( containsDirectAnnotation( element, annotation ) ) {
return CollectionHelper.asSet(
ConstraintCheckIssue.error(
element, annotation, "MIXED_LIST_AND_DIRECT_ANNOTATION_DECLARATION",
getAnnotationQualifiedName( annotation )
)
);
}
}
return Collections.emptySet();
}
private boolean containsDirectAnnotation(TypeElement element, AnnotationMirror elementOfMultiValuedAnnotation) {
Types typeUtils = constraintHelper.getTypeUtils();
for ( AnnotationMirror annotationMirror : element.getAnnotationMirrors() ) {
if ( typeUtils.isSameType( annotationMirror.getAnnotationType(), elementOfMultiValuedAnnotation.getAnnotationType() ) ) {
return true;
}
}
return false;
}
private Name getAnnotationQualifiedName(AnnotationMirror annotationMirror) {
return ( (TypeElement) annotationMirror.getAnnotationType().asElement() ).getQualifiedName();
}
}