001 package org.junit.experimental.categories; 002 003 import static java.util.Arrays.asList; 004 import static java.util.Collections.unmodifiableList; 005 import static java.util.Collections.unmodifiableSet; 006 007 import java.lang.annotation.Annotation; 008 import java.util.ArrayList; 009 import java.util.HashSet; 010 import java.util.List; 011 import java.util.Set; 012 013 import org.junit.After; 014 import org.junit.AfterClass; 015 import org.junit.Before; 016 import org.junit.BeforeClass; 017 import org.junit.runners.model.FrameworkMethod; 018 import org.junit.validator.AnnotationValidator; 019 020 /** 021 * Validates that there are no errors in the use of the {@code Category} 022 * annotation. If there is, a {@code Throwable} object will be added to the list 023 * of errors. 024 * 025 * @since 4.12 026 */ 027 public final class CategoryValidator extends AnnotationValidator { 028 029 @SuppressWarnings("unchecked") 030 private static final Set<Class<? extends Annotation>> INCOMPATIBLE_ANNOTATIONS = unmodifiableSet(new HashSet<Class<? extends Annotation>>( 031 asList(BeforeClass.class, AfterClass.class, Before.class, After.class))); 032 033 /** 034 * Adds to {@code errors} a throwable for each problem detected. Looks for 035 * {@code BeforeClass}, {@code AfterClass}, {@code Before} and {@code After} 036 * annotations. 037 * 038 * @param method the method that is being validated 039 * @return A list of exceptions detected 040 * 041 * @since 4.12 042 */ 043 @Override 044 public List<Exception> validateAnnotatedMethod(FrameworkMethod method) { 045 List<Exception> errors = new ArrayList<Exception>(); 046 Annotation[] annotations = method.getAnnotations(); 047 for (Annotation annotation : annotations) { 048 for (Class<?> clazz : INCOMPATIBLE_ANNOTATIONS) { 049 if (annotation.annotationType().isAssignableFrom(clazz)) { 050 addErrorMessage(errors, clazz); 051 } 052 } 053 } 054 return unmodifiableList(errors); 055 } 056 057 private void addErrorMessage(List<Exception> errors, Class<?> clazz) { 058 String message = String.format("@%s can not be combined with @Category", 059 clazz.getSimpleName()); 060 errors.add(new Exception(message)); 061 } 062 }