From e5576fce4e2bc7dd55ff1128867245d51d707835 Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Wed, 5 Feb 2014 00:04:11 +0100 Subject: [PATCH 1/2] JCLOUDS-427: Upgrading Guava 16.0 -> 16.0.1 Fixes Guava issue 1635. --- core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/pom.xml b/core/pom.xml index a8ebdac..fddbe91 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -95,7 +95,7 @@ com.google.guava guava - 16.0 + 16.0.1 org.osgi -- 1.8.5.1 From 9f935146dcbc52cd4f10328dbf81f499c552493e Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Wed, 5 Feb 2014 00:04:55 +0100 Subject: [PATCH 2/2] JCLOUDS-432: Revert "JCLOUDS-427: Avoiding Guava reflection code broken in Java 7u51" This reverts commit 8ff60020f85ae5d9f57e9a25a6342fb7b00e1d2a. --- .../main/java/org/jclouds/internal/BaseView.java | 15 ++--- .../java/org/jclouds/rest/config/BinderUtils.java | 17 ++--- .../jclouds/rest/internal/BaseRestApiMetadata.java | 9 ++- .../src/main/java/org/jclouds/util/TypeToken2.java | 78 ---------------------- 4 files changed, 15 insertions(+), 104 deletions(-) delete mode 100644 core/src/main/java/org/jclouds/util/TypeToken2.java diff --git a/core/src/main/java/org/jclouds/internal/BaseView.java b/core/src/main/java/org/jclouds/internal/BaseView.java index 87e7d5f..50c191e 100644 --- a/core/src/main/java/org/jclouds/internal/BaseView.java +++ b/core/src/main/java/org/jclouds/internal/BaseView.java @@ -70,18 +70,11 @@ protected BaseView(@Provider Context backend, @Provider TypeToken A unwrapApi(Class apiClass) { checkArgument(ApiContext.class.isAssignableFrom(backendType.getRawType()), "backend type: %s should be an ApiContext", backendType); - /* - * Revert back to ApiContext...where(A, apiClass) as soon as - * https://code.google.com/p/guava-libraries/issues/detail?id=1635 - * is resolved. - */ - TypeToken> contextToken = new TypeToken>() { + TypeToken> contextToken = new TypeToken>(delegate().getClass()) { private static final long serialVersionUID = 1L; - }; - Closeable api = unwrap(contextToken).getApi(); - checkArgument(apiClass.isAssignableFrom(api.getClass()), - "API type: %s not assignable to %s", api.getClass(), apiClass); - return apiClass.cast(api); + }.where(new TypeParameter() { + }, TypeToken.of(apiClass)); + return unwrap(contextToken).getApi(); } @Override 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 6a79d5e..bf21dab 100644 --- a/core/src/main/java/org/jclouds/rest/config/BinderUtils.java +++ b/core/src/main/java/org/jclouds/rest/config/BinderUtils.java @@ -21,9 +21,6 @@ import com.google.inject.Binder; import com.google.inject.TypeLiteral; -import org.jclouds.util.TypeToken2; -import org.jclouds.util.TypeToken2.TypeParameter2; - /** * * @author Adrian Cole @@ -102,13 +99,13 @@ @Deprecated @SuppressWarnings({ "unchecked", "serial" }) private static void bindHttpApiProvider(Binder binder, Class sync, Class async) { - TypeToken> token = new TypeToken2>() { - }.where(new TypeParameter2() { - }, sync, new TypeParameter2() { + TypeToken> token = new TypeToken>() { + }.where(new TypeParameter() { + }, sync).where(new TypeParameter() { }, 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. @@ -142,9 +139,9 @@ @Deprecated @SuppressWarnings({ "unchecked", "serial" }) private static void bindCallGetOnFutures(Binder binder, Class sync, Class async) { - TypeToken> token = new TypeToken2>() { - }.where(new TypeParameter2() { - }, sync, new TypeParameter2() { + TypeToken> token = new TypeToken>() { + }.where(new TypeParameter() { + }, sync).where(new TypeParameter() { }, async); binder.bind(sync).toProvider(TypeLiteral.class.cast(TypeLiteral.get(token.getType()))); } 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 8af312d..efc3002 100644 --- a/core/src/main/java/org/jclouds/rest/internal/BaseRestApiMetadata.java +++ b/core/src/main/java/org/jclouds/rest/internal/BaseRestApiMetadata.java @@ -24,11 +24,10 @@ 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; /** @@ -57,10 +56,10 @@ public static Properties defaultProperties() { } public static TypeToken> contextToken(TypeToken apiToken, TypeToken asyncApiToken) { - return new TypeToken2>() { + return new TypeToken>() { private static final long serialVersionUID = 1L; - }.where(new TypeParameter2() { - }, apiToken, new TypeParameter2() { + }.where(new TypeParameter() { + }, apiToken).where(new TypeParameter() { }, asyncApiToken); } diff --git a/core/src/main/java/org/jclouds/util/TypeToken2.java b/core/src/main/java/org/jclouds/util/TypeToken2.java deleted file mode 100644 index 99e47e5..0000000 --- a/core/src/main/java/org/jclouds/util/TypeToken2.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * 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 extends TypeToken { - private static final long serialVersionUID = 1L; - - @SuppressWarnings("unchecked") - public TypeToken where(TypeParameter2 typeParam1, - TypeToken typeArg1, TypeParameter2 typeParam2, TypeToken typeArg2) { - // resolving both parameters in one shot seems to work around 1635 - TypeResolver resolver = new TypeResolver(); - // where(Map) is package-private in TypeResolver - Invokable whereWithMap = - Reflection2.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) TypeToken.of(resolver.resolveType(getType())); - } - - public TypeToken where(TypeParameter2 typeParam1, Class typeArg1, - TypeParameter2 typeParam2, Class typeArg2) { - return where(typeParam1, of(typeArg1), typeParam2, of(typeArg2)); - } - - public static abstract class TypeParameter2 extends TypeParameter { - 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 -- 1.8.5.1