1b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpackage org.junit.runners.model;
2b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
3b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.GenericArrayType;
4b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.Method;
5b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.ParameterizedType;
6b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.Type;
7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.TypeVariable;
8b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.WildcardType;
9b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.util.List;
10b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
11b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotclass NoGenericTypeParametersValidator {
12aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    private final Method method;
13aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin
14aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    NoGenericTypeParametersValidator(Method method) {
15aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        this.method = method;
16aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
17aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin
18aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    void validate(List<Throwable> errors) {
19aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        for (Type each : method.getGenericParameterTypes()) {
20aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin            validateNoTypeParameterOnType(each, errors);
21aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        }
22aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
23aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin
24aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    private void validateNoTypeParameterOnType(Type type, List<Throwable> errors) {
25aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        if (type instanceof TypeVariable<?>) {
26aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin            errors.add(new Exception("Method " + method.getName()
27aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin                    + "() contains unresolved type variable " + type));
28aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        } else if (type instanceof ParameterizedType) {
29aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin            validateNoTypeParameterOnParameterizedType((ParameterizedType) type, errors);
30aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        } else if (type instanceof WildcardType) {
31aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin            validateNoTypeParameterOnWildcardType((WildcardType) type, errors);
32aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        } else if (type instanceof GenericArrayType) {
33aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin            validateNoTypeParameterOnGenericArrayType((GenericArrayType) type, errors);
34aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        }
35aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
36aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin
37aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    private void validateNoTypeParameterOnParameterizedType(ParameterizedType parameterized,
38aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin            List<Throwable> errors) {
39aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        for (Type each : parameterized.getActualTypeArguments()) {
40aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin            validateNoTypeParameterOnType(each, errors);
41aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        }
42aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
43aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin
44aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    private void validateNoTypeParameterOnWildcardType(WildcardType wildcard,
45aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin            List<Throwable> errors) {
46aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        for (Type each : wildcard.getUpperBounds()) {
47aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin            validateNoTypeParameterOnType(each, errors);
48aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        }
49aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        for (Type each : wildcard.getLowerBounds()) {
50aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin            validateNoTypeParameterOnType(each, errors);
51aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        }
52aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
53aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin
54aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    private void validateNoTypeParameterOnGenericArrayType(
55aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin            GenericArrayType arrayType, List<Throwable> errors) {
56aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        validateNoTypeParameterOnType(arrayType.getGenericComponentType(), errors);
57aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
58b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot}