Ejemplo n.º 1
0
 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);
   }
 }
Ejemplo n.º 2
0
 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;
 }
Ejemplo n.º 3
0
  /**
   * 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();
      }
    }
  }