package com.google.gson.internal.bind;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.internal..Gson.Types;
import com.google.gson.internal.ConstructorConstructor;
import com.google.gson.internal.ObjectConstructor;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Iterator;
public final class CollectionTypeAdapterFactory
implements TypeAdapterFactory
{
private final ConstructorConstructor constructorConstructor;
public CollectionTypeAdapterFactory(ConstructorConstructor constructorConstructor)
{
this.constructorConstructor = constructorConstructor;
}
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
Type type = typeToken.getType();
Class rawType = typeToken.getRawType();
if (!Collection.class.isAssignableFrom(rawType)) {
return null;
}
Type elementType = .Gson.Types.getCollectionElementType(type, rawType);
TypeAdapter elementTypeAdapter = gson.getAdapter(TypeToken.get(elementType));
ObjectConstructor constructor = this.constructorConstructor.get(typeToken);
TypeAdapter result = new Adapter(gson, elementType, elementTypeAdapter, constructor);
return result;
}
private final class Adapter<E> extends TypeAdapter<Collection<E>>
{
private final TypeAdapter<E> elementTypeAdapter;
private final ObjectConstructor<? extends Collection<E>> constructor;
public Adapter(Type context, TypeAdapter<E> elementType, ObjectConstructor<? extends Collection<E>> elementTypeAdapter) {
this.elementTypeAdapter = new TypeAdapterRuntimeTypeWrapper(context, elementTypeAdapter, elementType);
this.constructor = constructor;
}
public Collection<E> read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return null;
}
Collection collection = (Collection)this.constructor.construct();
in.beginArray();
while (in.hasNext()) {
Object instance = this.elementTypeAdapter.read(in);
collection.add(instance);
}
in.endArray();
return collection;
}
public void write(JsonWriter out, Collection<E> collection) throws IOException {
if (collection == null) {
out.nullValue();
return;
}
out.beginArray();
for (Iterator i$ = collection.iterator(); i$.hasNext(); ) { Object element = i$.next();
this.elementTypeAdapter.write(out, element);
}
out.endArray();
}
}
}