/*
* 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.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import org.hibernate.validator.ap.util.CollectionHelper;
/**
* A {@link ConstraintChecks} implementation that simply executes all
* contained checks against given elements and annotations.
*
* @author Gunnar Morling
*/
public class SingleValuedChecks implements ConstraintChecks {
//TODO GM: the "ordered set" character is currently ensured by adding
//each check only once in ConstraintCheckFactory. Should this be a real set?
private final List<ConstraintCheck> checks;
/**
* Creates a new SingleValuedChecks.
*
* @param checks The checks to execute.
*/
public SingleValuedChecks(ConstraintCheck... checks) {
if ( checks == null ) {
this.checks = Collections.emptyList();
}
else {
this.checks = Arrays.asList( checks );
}
}
@Override
public Set<ConstraintCheckIssue> execute(Element element, AnnotationMirror annotation) {
Set<ConstraintCheckIssue> theValue = CollectionHelper.newHashSet();
//for each check execute the check method appropriate for the kind of
//the given element
for ( ConstraintCheck oneCheck : checks ) {
if ( element.getKind() == ElementKind.PARAMETER ) {
theValue.addAll( oneCheck.checkField( (VariableElement) element, annotation ) );
}
else if ( element.getKind() == ElementKind.FIELD ) {
theValue.addAll( oneCheck.checkField( (VariableElement) element, annotation ) );
}
else if ( element.getKind() == ElementKind.METHOD ) {
theValue.addAll( oneCheck.checkMethod( (ExecutableElement) element, annotation ) );
}
else if ( element.getKind() == ElementKind.ANNOTATION_TYPE ) {
theValue.addAll( oneCheck.checkAnnotationType( (TypeElement) element, annotation ) );
}
else if (
element.getKind() == ElementKind.CLASS ||
element.getKind() == ElementKind.INTERFACE ||
element.getKind() == ElementKind.ENUM ) {
theValue.addAll( oneCheck.checkNonAnnotationType( (TypeElement) element, annotation ) );
}
if ( !theValue.isEmpty() ) {
return theValue;
}
}
return theValue;
}
}