You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by an...@apache.org on 2014/01/24 20:45:36 UTC

[2/2] git commit: All reflection magic now :-(

All reflection magic now :-(


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/30dfdab7
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/30dfdab7
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/30dfdab7

Branch: refs/heads/JCLOUDS-427-1.6.x
Commit: 30dfdab779d6d1bd69f152fb7a958ab7e4e80401
Parents: 476c0fb
Author: Andrew Phillips <an...@apache.org>
Authored: Fri Jan 24 14:41:19 2014 -0500
Committer: Andrew Phillips <an...@apache.org>
Committed: Fri Jan 24 14:43:33 2014 -0500

----------------------------------------------------------------------
 .../main/java/org/jclouds/util/TypeToken2.java  | 37 +++++++++++++++-----
 1 file changed, 29 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/30dfdab7/core/src/main/java/org/jclouds/util/TypeToken2.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/util/TypeToken2.java b/core/src/main/java/org/jclouds/util/TypeToken2.java
index 99e47e5..d63ea0e 100644
--- a/core/src/main/java/org/jclouds/util/TypeToken2.java
+++ b/core/src/main/java/org/jclouds/util/TypeToken2.java
@@ -16,6 +16,7 @@
  */
 package org.jclouds.util;
 
+import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
@@ -27,7 +28,6 @@ import org.jclouds.reflect.Reflection2;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.reflect.Invokable;
 import com.google.common.reflect.TypeParameter;
-import com.google.common.reflect.TypeResolver;
 import com.google.common.reflect.TypeToken;
 
 /*
@@ -43,24 +43,45 @@ public class TypeToken2<T> extends TypeToken<T> {
    @SuppressWarnings("unchecked")
    public <X, Y> TypeToken<T> where(TypeParameter2<X> typeParam1,
          TypeToken<X> typeArg1, TypeParameter2<Y> typeParam2, TypeToken<Y> typeArg2) {
-      // resolving both parameters in one shot seems to work around 1635
-      TypeResolver resolver = new TypeResolver();
-      // where(Map) is package-private in TypeResolver
-      Invokable<TypeResolver, TypeResolver> whereWithMap =
-            Reflection2.<TypeResolver, TypeResolver>method(TypeResolver.class, "where",
-                  Map.class);
+      /*
+       * Resolving both parameters in one shot seems to work around 1635, but
+       * TypeResolver and where(Map) are package-private in Guava 14.x
+       */
+      Type resolvedType;
       try {
+         Object resolver = newTypeResolver();
+         Invokable<Object, Object> whereWithMap = Reflection2.method(
+               (Class<Object>) resolver.getClass(), "where", Map.class);
          resolver = whereWithMap.invoke(resolver, ImmutableMap.of(
                typeParam1.getTypeVariable(), typeArg1.getType(),
                typeParam2.getTypeVariable(), typeArg2.getType()));
+         Invokable<Object, Type> resolveType = Reflection2.method(
+               (Class<Object>) resolver.getClass(), "resolveType", Type.class);
+         resolvedType = resolveType.invoke(resolver, getType());
       } catch (IllegalAccessException exception) {
          // should never happen
          throw new IllegalStateException(exception);
       } catch (InvocationTargetException exception) {
          // should never happen
          throw new IllegalStateException(exception);
+      } catch (SecurityException exception) {
+         // should never happen
+         throw new IllegalStateException(exception);
+      } catch (IllegalArgumentException exception) {
+         // should never happen
+         throw new IllegalStateException(exception);
+      } catch (NoSuchFieldException exception) {
+         // should never happen
+         throw new IllegalStateException(exception);
       }
-      return (TypeToken<T>) TypeToken.of(resolver.resolveType(getType()));
+      return (TypeToken<T>) TypeToken.of(resolvedType);
+   }
+
+   private static Object newTypeResolver() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
+      TypeToken<?> anyToken = TypeToken.of(Object.class);
+      Field typeResolverField = TypeToken.class.getDeclaredField("typeResolver");
+      typeResolverField.setAccessible(true);
+      return typeResolverField.get(anyToken).getClass();
    }
 
    public <X, Y> TypeToken<T> where(TypeParameter2<X> typeParam1, Class<X> typeArg1,