public <T> TypeAdapter<T> getAdapter(TypeToken<T> paramTypeToken) { Object localObject1 = (TypeAdapter) this.typeTokenCache.get(paramTypeToken); if (localObject1 != null) return localObject1; localObject1 = (Map) this.calls.get(); FutureTypeAdapter localFutureTypeAdapter = (FutureTypeAdapter) ((Map) localObject1).get(paramTypeToken); if (localFutureTypeAdapter != null) return localFutureTypeAdapter; localFutureTypeAdapter = new FutureTypeAdapter(); ((Map) localObject1).put(paramTypeToken, localFutureTypeAdapter); try { Iterator localIterator = this.factories.iterator(); while (localIterator.hasNext()) { TypeAdapter localTypeAdapter = ((TypeAdapterFactory) localIterator.next()).create(this, paramTypeToken); if (localTypeAdapter != null) { localFutureTypeAdapter.setDelegate(localTypeAdapter); this.typeTokenCache.put(paramTypeToken, localTypeAdapter); return localTypeAdapter; } } throw new IllegalArgumentException("GSON cannot handle " + paramTypeToken); } finally { ((Map) localObject1).remove(paramTypeToken); } }
public <T> TypeAdapter<T> getAdapter(TypeToken<T> typeToken) { TypeAdapter<T> typeAdapter = (TypeAdapter) this.typeTokenCache.get(typeToken); if (typeAdapter == null) { Map map; Map map2 = (Map) this.calls.get(); Object obj = null; if (map2 == null) { HashMap hashMap = new HashMap(); this.calls.set(hashMap); map = hashMap; obj = 1; } else { map = map2; } FutureTypeAdapter futureTypeAdapter = (FutureTypeAdapter) map.get(typeToken); if (futureTypeAdapter == null) { try { FutureTypeAdapter futureTypeAdapter2 = new FutureTypeAdapter(); map.put(typeToken, futureTypeAdapter2); for (TypeAdapterFactory create : this.factories) { typeAdapter = create.create(this, typeToken); if (typeAdapter != null) { futureTypeAdapter2.setDelegate(typeAdapter); this.typeTokenCache.put(typeToken, typeAdapter); map.remove(typeToken); if (obj != null) { this.calls.remove(); } } } throw new IllegalArgumentException("GSON cannot handle " + typeToken); } catch (Throwable th) { map.remove(typeToken); if (obj != null) { this.calls.remove(); } } } } return typeAdapter; }
/** * Returns the type adapter for {@code} type. * * @throws IllegalArgumentException if this GSON cannot serialize and deserialize {@code type}. */ @SuppressWarnings("unchecked") public <T> TypeAdapter<T> getAdapter(TypeToken<T> type) { TypeAdapter<?> cached = typeTokenCache.get(type); if (cached != null) { return (TypeAdapter<T>) cached; } Map<TypeToken<?>, FutureTypeAdapter<?>> threadCalls = calls.get(); boolean requiresThreadLocalCleanup = false; if (threadCalls == null) { threadCalls = new HashMap<TypeToken<?>, FutureTypeAdapter<?>>(); calls.set(threadCalls); requiresThreadLocalCleanup = true; } // the key and value type parameters always agree FutureTypeAdapter<T> ongoingCall = (FutureTypeAdapter<T>) threadCalls.get(type); if (ongoingCall != null) { return ongoingCall; } try { FutureTypeAdapter<T> call = new FutureTypeAdapter<T>(); threadCalls.put(type, call); for (TypeAdapterFactory factory : factories) { // TypeAdapter<T> candidate = factory.create(this, type); TypeAdapter<T> candidate = factory.create( new AdapterCreator() { @Override public TypeAdapter<?> getAdapter(TypeToken<?> typeToken) { return this.getAdapter(typeToken); } @Override public TypeAdapter<Object> getAdapter(Class<? extends Object> class1) { return this.getAdapter(class1); } @Override public <T> TypeAdapter<T> getDelegateAdapter( TypeAdapterFactory skipPast, TypeToken<T> type) { // TODO Auto-generated method stub return null; } }, type); if (candidate != null) { call.setDelegate(candidate); typeTokenCache.put(type, candidate); return candidate; } } throw new IllegalArgumentException("GSON cannot handle " + type); } finally { threadCalls.remove(type); if (requiresThreadLocalCleanup) { calls.remove(); } } }