462 lines
18 KiB
Java
462 lines
18 KiB
Java
package retrofit2;
|
|
|
|
import java.io.IOException;
|
|
import java.lang.annotation.Annotation;
|
|
import java.lang.reflect.Array;
|
|
import java.lang.reflect.GenericArrayType;
|
|
import java.lang.reflect.ParameterizedType;
|
|
import java.lang.reflect.Type;
|
|
import java.lang.reflect.TypeVariable;
|
|
import java.lang.reflect.WildcardType;
|
|
import java.util.Arrays;
|
|
import java.util.NoSuchElementException;
|
|
import okhttp3.ResponseBody;
|
|
import okio.Buffer;
|
|
|
|
/* loaded from: classes2.dex */
|
|
final class Utils {
|
|
static final Type[] EMPTY_TYPE_ARRAY = new Type[0];
|
|
|
|
private static final class GenericArrayTypeImpl implements GenericArrayType {
|
|
private final Type componentType;
|
|
|
|
GenericArrayTypeImpl(Type type) {
|
|
this.componentType = type;
|
|
}
|
|
|
|
public boolean equals(Object obj) {
|
|
return (obj instanceof GenericArrayType) && Utils.equals(this, (GenericArrayType) obj);
|
|
}
|
|
|
|
@Override // java.lang.reflect.GenericArrayType
|
|
public Type getGenericComponentType() {
|
|
return this.componentType;
|
|
}
|
|
|
|
public int hashCode() {
|
|
return this.componentType.hashCode();
|
|
}
|
|
|
|
public String toString() {
|
|
return Utils.typeToString(this.componentType) + "[]";
|
|
}
|
|
}
|
|
|
|
private static final class ParameterizedTypeImpl implements ParameterizedType {
|
|
private final Type ownerType;
|
|
private final Type rawType;
|
|
private final Type[] typeArguments;
|
|
|
|
ParameterizedTypeImpl(Type type, Type type2, Type... typeArr) {
|
|
if (type2 instanceof Class) {
|
|
if ((type == null) != (((Class) type2).getEnclosingClass() == null)) {
|
|
throw new IllegalArgumentException();
|
|
}
|
|
}
|
|
for (Type type3 : typeArr) {
|
|
Utils.checkNotNull(type3, "typeArgument == null");
|
|
Utils.checkNotPrimitive(type3);
|
|
}
|
|
this.ownerType = type;
|
|
this.rawType = type2;
|
|
this.typeArguments = (Type[]) typeArr.clone();
|
|
}
|
|
|
|
public boolean equals(Object obj) {
|
|
return (obj instanceof ParameterizedType) && Utils.equals(this, (ParameterizedType) obj);
|
|
}
|
|
|
|
@Override // java.lang.reflect.ParameterizedType
|
|
public Type[] getActualTypeArguments() {
|
|
return (Type[]) this.typeArguments.clone();
|
|
}
|
|
|
|
@Override // java.lang.reflect.ParameterizedType
|
|
public Type getOwnerType() {
|
|
return this.ownerType;
|
|
}
|
|
|
|
@Override // java.lang.reflect.ParameterizedType
|
|
public Type getRawType() {
|
|
return this.rawType;
|
|
}
|
|
|
|
public int hashCode() {
|
|
int hashCode = Arrays.hashCode(this.typeArguments) ^ this.rawType.hashCode();
|
|
Type type = this.ownerType;
|
|
return hashCode ^ (type != null ? type.hashCode() : 0);
|
|
}
|
|
|
|
public String toString() {
|
|
Type[] typeArr = this.typeArguments;
|
|
if (typeArr.length == 0) {
|
|
return Utils.typeToString(this.rawType);
|
|
}
|
|
StringBuilder sb = new StringBuilder((typeArr.length + 1) * 30);
|
|
sb.append(Utils.typeToString(this.rawType));
|
|
sb.append("<");
|
|
sb.append(Utils.typeToString(this.typeArguments[0]));
|
|
for (int i = 1; i < this.typeArguments.length; i++) {
|
|
sb.append(", ");
|
|
sb.append(Utils.typeToString(this.typeArguments[i]));
|
|
}
|
|
sb.append(">");
|
|
return sb.toString();
|
|
}
|
|
}
|
|
|
|
private static final class WildcardTypeImpl implements WildcardType {
|
|
private final Type lowerBound;
|
|
private final Type upperBound;
|
|
|
|
WildcardTypeImpl(Type[] typeArr, Type[] typeArr2) {
|
|
if (typeArr2.length > 1) {
|
|
throw new IllegalArgumentException();
|
|
}
|
|
if (typeArr.length != 1) {
|
|
throw new IllegalArgumentException();
|
|
}
|
|
if (typeArr2.length != 1) {
|
|
if (typeArr[0] == null) {
|
|
throw new NullPointerException();
|
|
}
|
|
Utils.checkNotPrimitive(typeArr[0]);
|
|
this.lowerBound = null;
|
|
this.upperBound = typeArr[0];
|
|
return;
|
|
}
|
|
if (typeArr2[0] == null) {
|
|
throw new NullPointerException();
|
|
}
|
|
Utils.checkNotPrimitive(typeArr2[0]);
|
|
if (typeArr[0] != Object.class) {
|
|
throw new IllegalArgumentException();
|
|
}
|
|
this.lowerBound = typeArr2[0];
|
|
this.upperBound = Object.class;
|
|
}
|
|
|
|
public boolean equals(Object obj) {
|
|
return (obj instanceof WildcardType) && Utils.equals(this, (WildcardType) obj);
|
|
}
|
|
|
|
@Override // java.lang.reflect.WildcardType
|
|
public Type[] getLowerBounds() {
|
|
Type type = this.lowerBound;
|
|
return type != null ? new Type[]{type} : Utils.EMPTY_TYPE_ARRAY;
|
|
}
|
|
|
|
@Override // java.lang.reflect.WildcardType
|
|
public Type[] getUpperBounds() {
|
|
return new Type[]{this.upperBound};
|
|
}
|
|
|
|
public int hashCode() {
|
|
Type type = this.lowerBound;
|
|
return (type != null ? type.hashCode() + 31 : 1) ^ (this.upperBound.hashCode() + 31);
|
|
}
|
|
|
|
public String toString() {
|
|
if (this.lowerBound != null) {
|
|
return "? super " + Utils.typeToString(this.lowerBound);
|
|
}
|
|
if (this.upperBound == Object.class) {
|
|
return "?";
|
|
}
|
|
return "? extends " + Utils.typeToString(this.upperBound);
|
|
}
|
|
}
|
|
|
|
private Utils() {
|
|
}
|
|
|
|
static ResponseBody buffer(ResponseBody responseBody) throws IOException {
|
|
Buffer buffer = new Buffer();
|
|
responseBody.source().readAll(buffer);
|
|
return ResponseBody.create(responseBody.contentType(), responseBody.contentLength(), buffer);
|
|
}
|
|
|
|
static <T> T checkNotNull(T t, String str) {
|
|
if (t != null) {
|
|
return t;
|
|
}
|
|
throw new NullPointerException(str);
|
|
}
|
|
|
|
static void checkNotPrimitive(Type type) {
|
|
if ((type instanceof Class) && ((Class) type).isPrimitive()) {
|
|
throw new IllegalArgumentException();
|
|
}
|
|
}
|
|
|
|
private static Class<?> declaringClassOf(TypeVariable<?> typeVariable) {
|
|
Object genericDeclaration = typeVariable.getGenericDeclaration();
|
|
if (genericDeclaration instanceof Class) {
|
|
return (Class) genericDeclaration;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
static boolean equals(Type type, Type type2) {
|
|
if (type == type2) {
|
|
return true;
|
|
}
|
|
if (type instanceof Class) {
|
|
return type.equals(type2);
|
|
}
|
|
if (type instanceof ParameterizedType) {
|
|
if (!(type2 instanceof ParameterizedType)) {
|
|
return false;
|
|
}
|
|
ParameterizedType parameterizedType = (ParameterizedType) type;
|
|
ParameterizedType parameterizedType2 = (ParameterizedType) type2;
|
|
Type ownerType = parameterizedType.getOwnerType();
|
|
Type ownerType2 = parameterizedType2.getOwnerType();
|
|
return (ownerType == ownerType2 || (ownerType != null && ownerType.equals(ownerType2))) && parameterizedType.getRawType().equals(parameterizedType2.getRawType()) && Arrays.equals(parameterizedType.getActualTypeArguments(), parameterizedType2.getActualTypeArguments());
|
|
}
|
|
if (type instanceof GenericArrayType) {
|
|
if (type2 instanceof GenericArrayType) {
|
|
return equals(((GenericArrayType) type).getGenericComponentType(), ((GenericArrayType) type2).getGenericComponentType());
|
|
}
|
|
return false;
|
|
}
|
|
if (type instanceof WildcardType) {
|
|
if (!(type2 instanceof WildcardType)) {
|
|
return false;
|
|
}
|
|
WildcardType wildcardType = (WildcardType) type;
|
|
WildcardType wildcardType2 = (WildcardType) type2;
|
|
return Arrays.equals(wildcardType.getUpperBounds(), wildcardType2.getUpperBounds()) && Arrays.equals(wildcardType.getLowerBounds(), wildcardType2.getLowerBounds());
|
|
}
|
|
if (!(type instanceof TypeVariable) || !(type2 instanceof TypeVariable)) {
|
|
return false;
|
|
}
|
|
TypeVariable typeVariable = (TypeVariable) type;
|
|
TypeVariable typeVariable2 = (TypeVariable) type2;
|
|
return typeVariable.getGenericDeclaration() == typeVariable2.getGenericDeclaration() && typeVariable.getName().equals(typeVariable2.getName());
|
|
}
|
|
|
|
static Type getCallResponseType(Type type) {
|
|
if (type instanceof ParameterizedType) {
|
|
return getParameterUpperBound(0, (ParameterizedType) type);
|
|
}
|
|
throw new IllegalArgumentException("Call return type must be parameterized as Call<Foo> or Call<? extends Foo>");
|
|
}
|
|
|
|
static Type getGenericSupertype(Type type, Class<?> cls, Class<?> cls2) {
|
|
if (cls2 == cls) {
|
|
return type;
|
|
}
|
|
if (cls2.isInterface()) {
|
|
Class<?>[] interfaces = cls.getInterfaces();
|
|
int length = interfaces.length;
|
|
for (int i = 0; i < length; i++) {
|
|
if (interfaces[i] == cls2) {
|
|
return cls.getGenericInterfaces()[i];
|
|
}
|
|
if (cls2.isAssignableFrom(interfaces[i])) {
|
|
return getGenericSupertype(cls.getGenericInterfaces()[i], interfaces[i], cls2);
|
|
}
|
|
}
|
|
}
|
|
if (!cls.isInterface()) {
|
|
while (cls != Object.class) {
|
|
Class<? super Object> superclass = cls.getSuperclass();
|
|
if (superclass == cls2) {
|
|
return cls.getGenericSuperclass();
|
|
}
|
|
if (cls2.isAssignableFrom(superclass)) {
|
|
return getGenericSupertype(cls.getGenericSuperclass(), superclass, cls2);
|
|
}
|
|
cls = superclass;
|
|
}
|
|
}
|
|
return cls2;
|
|
}
|
|
|
|
static Type getParameterUpperBound(int i, ParameterizedType parameterizedType) {
|
|
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
|
|
if (i >= 0 && i < actualTypeArguments.length) {
|
|
Type type = actualTypeArguments[i];
|
|
return type instanceof WildcardType ? ((WildcardType) type).getUpperBounds()[0] : type;
|
|
}
|
|
throw new IllegalArgumentException("Index " + i + " not in range [0," + actualTypeArguments.length + ") for " + parameterizedType);
|
|
}
|
|
|
|
static Class<?> getRawType(Type type) {
|
|
checkNotNull(type, "type == null");
|
|
if (type instanceof Class) {
|
|
return (Class) type;
|
|
}
|
|
if (type instanceof ParameterizedType) {
|
|
Type rawType = ((ParameterizedType) type).getRawType();
|
|
if (rawType instanceof Class) {
|
|
return (Class) rawType;
|
|
}
|
|
throw new IllegalArgumentException();
|
|
}
|
|
if (type instanceof GenericArrayType) {
|
|
return Array.newInstance(getRawType(((GenericArrayType) type).getGenericComponentType()), 0).getClass();
|
|
}
|
|
if (type instanceof TypeVariable) {
|
|
return Object.class;
|
|
}
|
|
if (type instanceof WildcardType) {
|
|
return getRawType(((WildcardType) type).getUpperBounds()[0]);
|
|
}
|
|
throw new IllegalArgumentException("Expected a Class, ParameterizedType, or GenericArrayType, but <" + type + "> is of type " + type.getClass().getName());
|
|
}
|
|
|
|
static Type getSupertype(Type type, Class<?> cls, Class<?> cls2) {
|
|
if (cls2.isAssignableFrom(cls)) {
|
|
return resolve(type, cls, getGenericSupertype(type, cls, cls2));
|
|
}
|
|
throw new IllegalArgumentException();
|
|
}
|
|
|
|
static boolean hasUnresolvableType(Type type) {
|
|
if (type instanceof Class) {
|
|
return false;
|
|
}
|
|
if (type instanceof ParameterizedType) {
|
|
for (Type type2 : ((ParameterizedType) type).getActualTypeArguments()) {
|
|
if (hasUnresolvableType(type2)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
if (type instanceof GenericArrayType) {
|
|
return hasUnresolvableType(((GenericArrayType) type).getGenericComponentType());
|
|
}
|
|
if ((type instanceof TypeVariable) || (type instanceof WildcardType)) {
|
|
return true;
|
|
}
|
|
throw new IllegalArgumentException("Expected a Class, ParameterizedType, or GenericArrayType, but <" + type + "> is of type " + (type == null ? "null" : type.getClass().getName()));
|
|
}
|
|
|
|
private static int indexOf(Object[] objArr, Object obj) {
|
|
for (int i = 0; i < objArr.length; i++) {
|
|
if (obj.equals(objArr[i])) {
|
|
return i;
|
|
}
|
|
}
|
|
throw new NoSuchElementException();
|
|
}
|
|
|
|
static boolean isAnnotationPresent(Annotation[] annotationArr, Class<? extends Annotation> cls) {
|
|
for (Annotation annotation : annotationArr) {
|
|
if (cls.isInstance(annotation)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
static Type resolve(Type type, Class<?> cls, Type type2) {
|
|
Type type3 = type2;
|
|
while (type3 instanceof TypeVariable) {
|
|
TypeVariable typeVariable = (TypeVariable) type3;
|
|
Type resolveTypeVariable = resolveTypeVariable(type, cls, typeVariable);
|
|
if (resolveTypeVariable == typeVariable) {
|
|
return resolveTypeVariable;
|
|
}
|
|
type3 = resolveTypeVariable;
|
|
}
|
|
if (type3 instanceof Class) {
|
|
Class cls2 = (Class) type3;
|
|
if (cls2.isArray()) {
|
|
Class<?> componentType = cls2.getComponentType();
|
|
Type resolve = resolve(type, cls, componentType);
|
|
return componentType == resolve ? cls2 : new GenericArrayTypeImpl(resolve);
|
|
}
|
|
}
|
|
if (type3 instanceof GenericArrayType) {
|
|
GenericArrayType genericArrayType = (GenericArrayType) type3;
|
|
Type genericComponentType = genericArrayType.getGenericComponentType();
|
|
Type resolve2 = resolve(type, cls, genericComponentType);
|
|
return genericComponentType == resolve2 ? genericArrayType : new GenericArrayTypeImpl(resolve2);
|
|
}
|
|
if (type3 instanceof ParameterizedType) {
|
|
ParameterizedType parameterizedType = (ParameterizedType) type3;
|
|
Type ownerType = parameterizedType.getOwnerType();
|
|
Type resolve3 = resolve(type, cls, ownerType);
|
|
boolean z = resolve3 != ownerType;
|
|
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
|
|
int length = actualTypeArguments.length;
|
|
for (int i = 0; i < length; i++) {
|
|
Type resolve4 = resolve(type, cls, actualTypeArguments[i]);
|
|
if (resolve4 != actualTypeArguments[i]) {
|
|
if (!z) {
|
|
actualTypeArguments = (Type[]) actualTypeArguments.clone();
|
|
z = true;
|
|
}
|
|
actualTypeArguments[i] = resolve4;
|
|
}
|
|
}
|
|
return z ? new ParameterizedTypeImpl(resolve3, parameterizedType.getRawType(), actualTypeArguments) : parameterizedType;
|
|
}
|
|
boolean z2 = type3 instanceof WildcardType;
|
|
Type type4 = type3;
|
|
if (z2) {
|
|
WildcardType wildcardType = (WildcardType) type3;
|
|
Type[] lowerBounds = wildcardType.getLowerBounds();
|
|
Type[] upperBounds = wildcardType.getUpperBounds();
|
|
if (lowerBounds.length == 1) {
|
|
Type resolve5 = resolve(type, cls, lowerBounds[0]);
|
|
type4 = wildcardType;
|
|
if (resolve5 != lowerBounds[0]) {
|
|
return new WildcardTypeImpl(new Type[]{Object.class}, new Type[]{resolve5});
|
|
}
|
|
} else {
|
|
type4 = wildcardType;
|
|
if (upperBounds.length == 1) {
|
|
Type resolve6 = resolve(type, cls, upperBounds[0]);
|
|
type4 = wildcardType;
|
|
if (resolve6 != upperBounds[0]) {
|
|
return new WildcardTypeImpl(new Type[]{resolve6}, EMPTY_TYPE_ARRAY);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return type4;
|
|
}
|
|
|
|
private static Type resolveTypeVariable(Type type, Class<?> cls, TypeVariable<?> typeVariable) {
|
|
Class<?> declaringClassOf = declaringClassOf(typeVariable);
|
|
if (declaringClassOf == null) {
|
|
return typeVariable;
|
|
}
|
|
Type genericSupertype = getGenericSupertype(type, cls, declaringClassOf);
|
|
if (!(genericSupertype instanceof ParameterizedType)) {
|
|
return typeVariable;
|
|
}
|
|
return ((ParameterizedType) genericSupertype).getActualTypeArguments()[indexOf(declaringClassOf.getTypeParameters(), typeVariable)];
|
|
}
|
|
|
|
static void throwIfFatal(Throwable th) {
|
|
if (th instanceof VirtualMachineError) {
|
|
throw ((VirtualMachineError) th);
|
|
}
|
|
if (th instanceof ThreadDeath) {
|
|
throw ((ThreadDeath) th);
|
|
}
|
|
if (th instanceof LinkageError) {
|
|
throw ((LinkageError) th);
|
|
}
|
|
}
|
|
|
|
static String typeToString(Type type) {
|
|
return type instanceof Class ? ((Class) type).getName() : type.toString();
|
|
}
|
|
|
|
static <T> void validateServiceInterface(Class<T> cls) {
|
|
if (!cls.isInterface()) {
|
|
throw new IllegalArgumentException("API declarations must be interfaces.");
|
|
}
|
|
if (cls.getInterfaces().length > 0) {
|
|
throw new IllegalArgumentException("API interfaces must not extend other interfaces.");
|
|
}
|
|
}
|
|
}
|