package com.perunlabs.testinjector.util;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import com.google.inject.Provider;
import com.google.inject.TypeLiteral;
public class Types {
public static TypeLiteral<?> typeProvidedBy(Field field) {
if (!(isProvider(field) || (isJavaxProvider(field)))) {
throw new IllegalArgumentException("Field " + field.toGenericString() + " is not a Provider");
}
TypeLiteral<?> typeLiteral = typeOf(field);
if (!(typeLiteral.getType() instanceof ParameterizedType)) {
throw new IllegalArgumentException("Type " + typeLiteral
+ " is a raw Provider. Use generic one instead.");
}
return TypeLiteral.get(((ParameterizedType) typeLiteral.getType()).getActualTypeArguments()[0]);
}
public static boolean isProvider(Field field) {
TypeLiteral<?> typeLiteral = typeOf(field);
return typeLiteral.getRawType().equals(Provider.class);
}
public static boolean isJavaxProvider(Field field) {
TypeLiteral<?> typeLiteral = typeOf(field);
return typeLiteral.getRawType().equals(javax.inject.Provider.class);
}
public static TypeLiteral<?> typeOf(Field field) {
return TypeLiteral.get(field.getGenericType());
}
}