| /* | 
|  * Copyright (C) 2011 Google Inc. | 
|  * | 
|  * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  * you may not use this file except in compliance with the License. | 
|  * You may obtain a copy of the License at | 
|  * | 
|  *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  * | 
|  * Unless required by applicable law or agreed to in writing, software | 
|  * distributed under the License is distributed on an "AS IS" BASIS, | 
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  * See the License for the specific language governing permissions and | 
|  * limitations under the License. | 
|  */ | 
|   | 
| package cn.emay.sdk.util.json.gson.internal.bind; | 
|   | 
| import java.io.IOException; | 
| import java.lang.reflect.Type; | 
| import java.util.Collection; | 
|   | 
| import cn.emay.sdk.util.json.gson.Gson; | 
| import cn.emay.sdk.util.json.gson.TypeAdapter; | 
| import cn.emay.sdk.util.json.gson.TypeAdapterFactory; | 
| import cn.emay.sdk.util.json.gson.internal.$Gson$Types; | 
| import cn.emay.sdk.util.json.gson.internal.ConstructorConstructor; | 
| import cn.emay.sdk.util.json.gson.internal.ObjectConstructor; | 
| import cn.emay.sdk.util.json.gson.reflect.TypeToken; | 
| import cn.emay.sdk.util.json.gson.stream.JsonReader; | 
| import cn.emay.sdk.util.json.gson.stream.JsonToken; | 
| import cn.emay.sdk.util.json.gson.stream.JsonWriter; | 
|   | 
| /** | 
|  * Adapt a homogeneous collection of objects. | 
|  */ | 
| public final class CollectionTypeAdapterFactory implements TypeAdapterFactory { | 
|     private final ConstructorConstructor constructorConstructor; | 
|   | 
|     public CollectionTypeAdapterFactory(ConstructorConstructor constructorConstructor) { | 
|         this.constructorConstructor = constructorConstructor; | 
|     } | 
|   | 
|     @Override | 
|     public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) { | 
|         Type type = typeToken.getType(); | 
|   | 
|         Class<? super T> 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<T> constructor = constructorConstructor.get(typeToken); | 
|   | 
|         @SuppressWarnings({ "unchecked", "rawtypes" }) // create() doesn't define a type parameter | 
|         TypeAdapter<T> result = new Adapter(gson, elementType, elementTypeAdapter, constructor); | 
|         return result; | 
|     } | 
|   | 
|     private static final class Adapter<E> extends TypeAdapter<Collection<E>> { | 
|         private final TypeAdapter<E> elementTypeAdapter; | 
|         private final ObjectConstructor<? extends Collection<E>> constructor; | 
|   | 
|         public Adapter(Gson context, Type elementType, TypeAdapter<E> elementTypeAdapter, ObjectConstructor<? extends Collection<E>> constructor) { | 
|             this.elementTypeAdapter = new TypeAdapterRuntimeTypeWrapper<E>(context, elementTypeAdapter, elementType); | 
|             this.constructor = constructor; | 
|         } | 
|   | 
|         @Override | 
|         public Collection<E> read(JsonReader in) throws IOException { | 
|             if (in.peek() == JsonToken.NULL) { | 
|                 in.nextNull(); | 
|                 return null; | 
|             } | 
|   | 
|             Collection<E> collection = constructor.construct(); | 
|             in.beginArray(); | 
|             while (in.hasNext()) { | 
|                 E instance = elementTypeAdapter.read(in); | 
|                 collection.add(instance); | 
|             } | 
|             in.endArray(); | 
|             return collection; | 
|         } | 
|   | 
|         @Override | 
|         public void write(JsonWriter out, Collection<E> collection) throws IOException { | 
|             if (collection == null) { | 
|                 out.nullValue(); | 
|                 return; | 
|             } | 
|   | 
|             out.beginArray(); | 
|             for (E element : collection) { | 
|                 elementTypeAdapter.write(out, element); | 
|             } | 
|             out.endArray(); | 
|         } | 
|     } | 
| } |