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/23 09:01:47 UTC

[1/2] git commit: JCLOUDS-427: Adding a version of TypeToken.where that replaces two parameters

Updated Branches:
  refs/heads/JCLOUDS-427 e00bf7eb8 -> 4ae4aae99 (forced update)


JCLOUDS-427: Adding a version of TypeToken.where that replaces two parameters

Works around https://code.google.com/p/guava-libraries/issues/detail?id=1635


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

Branch: refs/heads/JCLOUDS-427
Commit: 3845710400edc4745be3755a0632c3eb5ba36681
Parents: d76a9d9
Author: Andrew Phillips <an...@apache.org>
Authored: Fri Jan 17 10:33:23 2014 -0500
Committer: Andrew Phillips <an...@apache.org>
Committed: Thu Jan 23 02:59:50 2014 -0500

----------------------------------------------------------------------
 .../com/google/common/reflect/TypeToken2.java   | 44 ++++++++++++++++++++
 .../org/jclouds/rest/config/BinderUtils.java    | 12 +++---
 .../rest/internal/BaseRestApiMetadata.java      |  5 ++-
 3 files changed, 54 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/38457104/core/src/main/java/com/google/common/reflect/TypeToken2.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/google/common/reflect/TypeToken2.java b/core/src/main/java/com/google/common/reflect/TypeToken2.java
new file mode 100644
index 0000000..1ca4752
--- /dev/null
+++ b/core/src/main/java/com/google/common/reflect/TypeToken2.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 com.google.common.reflect;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.reflect.TypeParameter;
+import com.google.common.reflect.TypeToken;
+
+/*
+ * FIXME: remove this class ASAP!
+ *
+ * Evil stuff, adapted from https://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/reflect/TypeToken.java#236.
+ * See https://issues.apache.org/jira/browse/JCLOUDS-427 and
+ * https://code.google.com/p/guava-libraries/issues/detail?id=1635
+ */
+public class TypeToken2<T> extends TypeToken<T> {
+   @SuppressWarnings("unchecked")
+   public <X, Y> TypeToken<T> where(TypeParameter<X> typeParam1, 
+         TypeToken<X> typeArg1, TypeParameter<Y> typeParam2, TypeToken<Y> typeArg2) {
+      // resolving both parameters in one shot seems to work around 1635
+      TypeResolver resolver = new TypeResolver()
+            .where(ImmutableMap.of(typeParam1.typeVariable, typeArg1.getType(), typeParam2.typeVariable, typeArg2.getType()));
+      return (TypeToken<T>) TypeToken.of(resolver.resolveType(getType()));
+   }  
+
+   public <X, Y> TypeToken<T> where(TypeParameter<X> typeParam1, Class<X> typeArg1,
+         TypeParameter<Y> typeParam2, Class<Y> typeArg2) {
+      return where(typeParam1, of(typeArg1), typeParam2, of(typeArg2));
+   } 
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/38457104/core/src/main/java/org/jclouds/rest/config/BinderUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/rest/config/BinderUtils.java b/core/src/main/java/org/jclouds/rest/config/BinderUtils.java
index bf21dab..8d3fdbe 100644
--- a/core/src/main/java/org/jclouds/rest/config/BinderUtils.java
+++ b/core/src/main/java/org/jclouds/rest/config/BinderUtils.java
@@ -18,8 +18,10 @@ package org.jclouds.rest.config;
 
 import com.google.common.reflect.TypeParameter;
 import com.google.common.reflect.TypeToken;
+import com.google.common.reflect.TypeToken2;
 import com.google.inject.Binder;
 import com.google.inject.TypeLiteral;
+import java.util.Map;
 
 /**
  * 
@@ -99,13 +101,13 @@ public class BinderUtils {
    @Deprecated
    @SuppressWarnings({ "unchecked", "serial" })
    private static <S, A> void bindHttpApiProvider(Binder binder, Class<S> sync, Class<A> async) {
-      TypeToken<SyncToAsyncHttpApiProvider<S, A>> token = new TypeToken<SyncToAsyncHttpApiProvider<S, A>>() {
+      TypeToken<SyncToAsyncHttpApiProvider<S, A>> token = new TypeToken2<SyncToAsyncHttpApiProvider<S, A>>() {
       }.where(new TypeParameter<S>() {
-      }, sync).where(new TypeParameter<A>() {
+      }, sync, new TypeParameter<A>() {
       }, async);
       binder.bind(sync).toProvider(TypeLiteral.class.cast(TypeLiteral.get(token.getType())));
    }
-   
+     
    /**
     * adds an explicit binding for an interface which synchronously blocks on
     * similar calls to an {@code async} type.
@@ -139,9 +141,9 @@ public class BinderUtils {
    @Deprecated
    @SuppressWarnings({ "unchecked", "serial" })
    private static <S, A> void bindCallGetOnFutures(Binder binder, Class<S> sync, Class<A> async) {
-      TypeToken<CallGetOnFuturesProvider<S, A>> token = new TypeToken<CallGetOnFuturesProvider<S, A>>() {
+      TypeToken<CallGetOnFuturesProvider<S, A>> token = new TypeToken2<CallGetOnFuturesProvider<S, A>>() {
       }.where(new TypeParameter<S>() {
-      }, sync).where(new TypeParameter<A>() {
+      }, sync, new TypeParameter<A>() {
       }, async);
       binder.bind(sync).toProvider(TypeLiteral.class.cast(TypeLiteral.get(token.getType())));
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/38457104/core/src/main/java/org/jclouds/rest/internal/BaseRestApiMetadata.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/rest/internal/BaseRestApiMetadata.java b/core/src/main/java/org/jclouds/rest/internal/BaseRestApiMetadata.java
index efc3002..800ce4f 100644
--- a/core/src/main/java/org/jclouds/rest/internal/BaseRestApiMetadata.java
+++ b/core/src/main/java/org/jclouds/rest/internal/BaseRestApiMetadata.java
@@ -29,6 +29,7 @@ import com.google.common.annotations.Beta;
 import com.google.common.base.Objects.ToStringHelper;
 import com.google.common.reflect.TypeParameter;
 import com.google.common.reflect.TypeToken;
+import com.google.common.reflect.TypeToken2;
 
 /**
  * Useful in creating rest apis.
@@ -56,10 +57,10 @@ public abstract class BaseRestApiMetadata extends BaseApiMetadata implements Res
    }
    
    public static <S, A> TypeToken<org.jclouds.rest.RestContext<S, A>> contextToken(TypeToken<S> apiToken, TypeToken<A> asyncApiToken) {
-      return new TypeToken<org.jclouds.rest.RestContext<S, A>>() {
+      return new TypeToken2<org.jclouds.rest.RestContext<S, A>>() {
          private static final long serialVersionUID = 1L;
       }.where(new TypeParameter<S>() {
-      }, apiToken).where(new TypeParameter<A>() {
+      }, apiToken, new TypeParameter<A>() {
       }, asyncApiToken);
    }
    


[2/2] git commit: JCLOUDS-427: Avoiding TypeToken type parameter replacement with bounds

Posted by an...@apache.org.
JCLOUDS-427: Avoiding TypeToken type parameter replacement with bounds


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

Branch: refs/heads/JCLOUDS-427
Commit: 4ae4aae997d54f63dee8379a5f5745a2b59c3259
Parents: 3845710
Author: Andrew Phillips <an...@apache.org>
Authored: Thu Jan 23 01:23:15 2014 -0500
Committer: Andrew Phillips <an...@apache.org>
Committed: Thu Jan 23 03:01:00 2014 -0500

----------------------------------------------------------------------
 .../src/main/java/org/jclouds/internal/BaseView.java | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/4ae4aae9/core/src/main/java/org/jclouds/internal/BaseView.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/internal/BaseView.java b/core/src/main/java/org/jclouds/internal/BaseView.java
index 1da574e..f6c8a58 100644
--- a/core/src/main/java/org/jclouds/internal/BaseView.java
+++ b/core/src/main/java/org/jclouds/internal/BaseView.java
@@ -70,11 +70,18 @@ public abstract class BaseView extends ForwardingObject implements View {
    public <A extends Closeable> A unwrapApi(Class<A> apiClass) {
       checkArgument(ApiContext.class.isAssignableFrom(backendType.getRawType()),
             "backend type: %s should be an ApiContext", backendType);
-      TypeToken<ApiContext<? extends A>> contextToken = new TypeToken<ApiContext<? extends A>>(delegate().getClass()) {
+      /*
+       * Revert back to ApiContext<? extends A>...where(A, apiClass) as soon as
+       * https://code.google.com/p/guava-libraries/issues/detail?id=1635
+       * is resolved.
+       */
+      TypeToken<ApiContext<? extends Closeable>> contextToken = new TypeToken<ApiContext<? extends Closeable>>() {
          private static final long serialVersionUID = 1L;
-      }.where(new TypeParameter<A>() {
-      }, TypeToken.of(apiClass));
-      return unwrap(contextToken).getApi();
+      };
+      Closeable api = unwrap(contextToken).getApi();
+      checkArgument(apiClass.isAssignableFrom(api.getClass()),
+            "API type: %s not assignable to %s", api.getClass(), apiClass);
+      return apiClass.cast(api);
    }
 
    @Override