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 23:25:12 UTC
[1/2] git commit: Fixing an error message about an unassignable
backend
Updated Branches:
refs/heads/JCLOUDS-427 3d28bddee -> 0c09d44b3 (forced update)
Fixing an error message about an unassignable backend
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/b59457a4
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/b59457a4
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/b59457a4
Branch: refs/heads/JCLOUDS-427
Commit: b59457a405f1741cebfa14775b397ae225dd714b
Parents: d76a9d9
Author: Andrew Phillips <an...@apache.org>
Authored: Thu Jan 23 02:55:59 2014 -0500
Committer: Andrew Phillips <an...@apache.org>
Committed: Thu Jan 23 09:09:47 2014 -0500
----------------------------------------------------------------------
core/src/main/java/org/jclouds/internal/BaseView.java | 2 +-
core/src/test/java/org/jclouds/internal/BaseViewTest.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/b59457a4/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..50c191e 100644
--- a/core/src/main/java/org/jclouds/internal/BaseView.java
+++ b/core/src/main/java/org/jclouds/internal/BaseView.java
@@ -51,7 +51,7 @@ public abstract class BaseView extends ForwardingObject implements View {
@SuppressWarnings("unchecked")
@Override
public <C extends Context> C unwrap(TypeToken<C> type) {
- checkArgument(checkNotNull(type, "type").isAssignableFrom(backendType), "backend type: %s not assignable from %s", backendType, type);
+ checkArgument(checkNotNull(type, "type").isAssignableFrom(backendType), "backend type: %s not assignable to %s", backendType, type);
return (C) backend;
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/b59457a4/core/src/test/java/org/jclouds/internal/BaseViewTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/jclouds/internal/BaseViewTest.java b/core/src/test/java/org/jclouds/internal/BaseViewTest.java
index 2d82e3b..c9471fa 100644
--- a/core/src/test/java/org/jclouds/internal/BaseViewTest.java
+++ b/core/src/test/java/org/jclouds/internal/BaseViewTest.java
@@ -105,7 +105,7 @@ public class BaseViewTest {
wine.unwrap(typeToken(PeanutButter.class));
fail();
} catch (IllegalArgumentException e) {
- assertEquals(e.getMessage(), "backend type: org.jclouds.internal.BaseViewTest$Water not assignable from org.jclouds.internal.BaseViewTest$PeanutButter");
+ assertEquals(e.getMessage(), "backend type: org.jclouds.internal.BaseViewTest$Water not assignable to org.jclouds.internal.BaseViewTest$PeanutButter");
}
}
[2/2] git commit: JCLOUDS-427: Avoiding Guava reflection code broken
in Java 7u51
Posted by an...@apache.org.
JCLOUDS-427: Avoiding Guava reflection code broken in Java 7u51
- Adding a version of TypeToken.where that replaces two parameters in one go
- Avoiding TypeToken type parameter replacement with wildcard bounds
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/0c09d44b
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/0c09d44b
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/0c09d44b
Branch: refs/heads/JCLOUDS-427
Commit: 0c09d44b359c7d228794c51d1c78fbfc5e472aef
Parents: b59457a
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 17:24:26 2014 -0500
----------------------------------------------------------------------
.../java/org/jclouds/internal/BaseView.java | 15 +++-
.../org/jclouds/rest/config/BinderUtils.java | 17 +++--
.../rest/internal/BaseRestApiMetadata.java | 9 ++-
.../main/java/org/jclouds/util/TypeToken2.java | 78 ++++++++++++++++++++
4 files changed, 104 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/0c09d44b/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 50c191e..87e7d5f 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
http://git-wip-us.apache.org/repos/asf/jclouds/blob/0c09d44b/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..6a79d5e 100644
--- a/core/src/main/java/org/jclouds/rest/config/BinderUtils.java
+++ b/core/src/main/java/org/jclouds/rest/config/BinderUtils.java
@@ -21,6 +21,9 @@ import com.google.common.reflect.TypeToken;
import com.google.inject.Binder;
import com.google.inject.TypeLiteral;
+import org.jclouds.util.TypeToken2;
+import org.jclouds.util.TypeToken2.TypeParameter2;
+
/**
*
* @author Adrian Cole
@@ -99,13 +102,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>>() {
- }.where(new TypeParameter<S>() {
- }, sync).where(new TypeParameter<A>() {
+ TypeToken<SyncToAsyncHttpApiProvider<S, A>> token = new TypeToken2<SyncToAsyncHttpApiProvider<S, A>>() {
+ }.where(new TypeParameter2<S>() {
+ }, sync, new TypeParameter2<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 +142,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>>() {
- }.where(new TypeParameter<S>() {
- }, sync).where(new TypeParameter<A>() {
+ TypeToken<CallGetOnFuturesProvider<S, A>> token = new TypeToken2<CallGetOnFuturesProvider<S, A>>() {
+ }.where(new TypeParameter2<S>() {
+ }, sync, new TypeParameter2<A>() {
}, async);
binder.bind(sync).toProvider(TypeLiteral.class.cast(TypeLiteral.get(token.getType())));
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/0c09d44b/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..8af312d 100644
--- a/core/src/main/java/org/jclouds/rest/internal/BaseRestApiMetadata.java
+++ b/core/src/main/java/org/jclouds/rest/internal/BaseRestApiMetadata.java
@@ -24,10 +24,11 @@ import java.util.Properties;
import org.jclouds.apis.ApiMetadata;
import org.jclouds.apis.internal.BaseApiMetadata;
import org.jclouds.rest.RestApiMetadata;
+import org.jclouds.util.TypeToken2;
+import org.jclouds.util.TypeToken2.TypeParameter2;
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;
/**
@@ -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>() {
+ }.where(new TypeParameter2<S>() {
+ }, apiToken, new TypeParameter2<A>() {
}, asyncApiToken);
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/0c09d44b/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
new file mode 100644
index 0000000..465e5f2
--- /dev/null
+++ b/core/src/main/java/org/jclouds/util/TypeToken2.java
@@ -0,0 +1,78 @@
+/*
+ * 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 org.jclouds.util;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.util.Map;
+
+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;
+
+/*
+ * 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> {
+ private static final long serialVersionUID = 1L;
+
+ @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);
+ try {
+ resolver = whereWithMap.invoke(resolver, ImmutableMap.of(
+ typeParam1.getTypeVariable(), typeArg1.getType(),
+ typeParam2.getTypeVariable(), typeArg2.getType()));
+ } catch (IllegalAccessException exception) {
+ // should never happen
+ throw new IllegalStateException(exception);
+ } catch (InvocationTargetException exception) {
+ // should never happen
+ throw new IllegalStateException(exception);
+ }
+ return (TypeToken<T>) TypeToken.of(resolver.resolveType(getType()));
+ }
+
+ public <X, Y> TypeToken<T> where(TypeParameter2<X> typeParam1, Class<X> typeArg1,
+ TypeParameter2<Y> typeParam2, Class<Y> typeArg2) {
+ return where(typeParam1, of(typeArg1), typeParam2, of(typeArg2));
+ }
+
+ public static abstract class TypeParameter2<T> extends TypeParameter<T> {
+ TypeVariable<?> getTypeVariable() {
+ // duplicated from TypeCapture, where it's package-private
+ Type superclass = getClass().getGenericSuperclass();
+ return (TypeVariable<?>) ((ParameterizedType) superclass).getActualTypeArguments()[0];
+ }
+ }
+}
\ No newline at end of file