Repository: jclouds Updated Branches: refs/heads/master 7aad59972 -> 7cde28a4d
JCLOUDS-1074: Guava 20 compatibility * dynamically call TypeToken.isSupertypeOf with Guava 19 and later and TypeToken.isAssignableFrom with Guava 18 and earlier * consume or ignore values from methods with CheckReturnValue * replace usage of removed Iterators.emptyIterator Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/7cde28a4 Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/7cde28a4 Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/7cde28a4 Branch: refs/heads/master Commit: 7cde28a4d2af3cde0adec62186b19116893b06f2 Parents: 7aad599 Author: Andrew Gaul <[email protected]> Authored: Thu Feb 4 14:36:21 2016 -0800 Committer: Andrew Gaul <[email protected]> Committed: Tue Sep 6 21:49:20 2016 -0700 ---------------------------------------------------------------------- .../docker/features/ImageApiLiveTest.java | 5 +- .../options/UpdateCDNContainerOptionsTest.java | 2 + .../jclouds/googlecloud/internal/ListPages.java | 3 +- .../main/java/org/jclouds/ContextBuilder.java | 3 +- .../java/org/jclouds/apis/ApiPredicates.java | 5 +- core/src/main/java/org/jclouds/apis/Apis.java | 3 +- .../java/org/jclouds/internal/BaseView.java | 3 +- .../jclouds/providers/ProviderPredicates.java | 3 +- .../org/jclouds/rest/InputParamValidator.java | 2 +- .../java/org/jclouds/util/TypeTokenUtils.java | 74 ++++++++++++++++++++ .../java/org/jclouds/internal/BaseViewTest.java | 2 +- .../ec2/features/PlacementGroupApiLiveTest.java | 1 + .../features/VirtualGuestApiLiveTest.java | 9 ++- 13 files changed, 103 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/7cde28a4/apis/docker/src/test/java/org/jclouds/docker/features/ImageApiLiveTest.java ---------------------------------------------------------------------- diff --git a/apis/docker/src/test/java/org/jclouds/docker/features/ImageApiLiveTest.java b/apis/docker/src/test/java/org/jclouds/docker/features/ImageApiLiveTest.java index 051ea01..b75b6e8 100644 --- a/apis/docker/src/test/java/org/jclouds/docker/features/ImageApiLiveTest.java +++ b/apis/docker/src/test/java/org/jclouds/docker/features/ImageApiLiveTest.java @@ -16,6 +16,7 @@ */ package org.jclouds.docker.features; +import static org.assertj.guava.api.Assertions.assertThat; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; @@ -29,6 +30,7 @@ import org.jclouds.docker.domain.ImageSummary; import org.jclouds.docker.options.CreateImageOptions; import org.testng.annotations.Test; +import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; @@ -61,12 +63,13 @@ public class ImageApiLiveTest extends BaseDockerApiLiveTest { List<ImageSummary> listImages = api().listImages(); assertNotNull(listImages); - Iterables.find(listImages, new Predicate<ImageSummary>() { + Optional<ImageSummary> summary = Iterables.tryFind(listImages, new Predicate<ImageSummary>() { @Override public boolean apply(ImageSummary input) { return input.repoTags().contains("jclouds:testTag"); } }); + assertThat(summary).isPresent(); } @Test(dependsOnMethods = "testListImages", alwaysRun = true) http://git-wip-us.apache.org/repos/asf/jclouds/blob/7cde28a4/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptionsTest.java ---------------------------------------------------------------------- diff --git a/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptionsTest.java b/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptionsTest.java index 04c2bc0..c4d47f6 100644 --- a/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptionsTest.java +++ b/apis/rackspace-cloudfiles/src/test/java/org/jclouds/rackspace/cloudfiles/v1/options/UpdateCDNContainerOptionsTest.java @@ -44,6 +44,7 @@ public class UpdateCDNContainerOptionsTest { assertEquals(ImmutableList.of("123456"), options.buildRequestHeaders().get(CDN_TTL)); } + @SuppressWarnings("CheckReturnValue") @Test(expectedExceptions = IllegalStateException.class) public void testTTLLessThanMin() { UpdateCDNContainerOptions options = @@ -51,6 +52,7 @@ public class UpdateCDNContainerOptionsTest { options.buildRequestHeaders().get(CDN_TTL); } + @SuppressWarnings("CheckReturnValue") @Test(expectedExceptions = IllegalStateException.class) public void testTTLGreaterThanMax() { UpdateCDNContainerOptions options = http://git-wip-us.apache.org/repos/asf/jclouds/blob/7cde28a4/common/googlecloud/src/main/java/org/jclouds/googlecloud/internal/ListPages.java ---------------------------------------------------------------------- diff --git a/common/googlecloud/src/main/java/org/jclouds/googlecloud/internal/ListPages.java b/common/googlecloud/src/main/java/org/jclouds/googlecloud/internal/ListPages.java index b874ca0..2955681 100644 --- a/common/googlecloud/src/main/java/org/jclouds/googlecloud/internal/ListPages.java +++ b/common/googlecloud/src/main/java/org/jclouds/googlecloud/internal/ListPages.java @@ -27,6 +27,7 @@ import org.jclouds.googlecloud.options.ListOptions; import org.jclouds.javax.annotation.Nullable; import com.google.common.collect.AbstractIterator; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterators; public final class ListPages { @@ -49,7 +50,7 @@ public final class ListPages { } static <T> Iterator<ListPage<T>> singletonOrEmptyIterator(ListPage<T> input) { - return input.isEmpty() ? Iterators.<ListPage<T>>emptyIterator() : Iterators.singletonIterator(input); + return input.isEmpty() ? ImmutableList.<ListPage<T>>of().iterator() : Iterators.singletonIterator(input); } private ListPages() { http://git-wip-us.apache.org/repos/asf/jclouds/blob/7cde28a4/core/src/main/java/org/jclouds/ContextBuilder.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/ContextBuilder.java b/core/src/main/java/org/jclouds/ContextBuilder.java index 2e82808..404ef79 100644 --- a/core/src/main/java/org/jclouds/ContextBuilder.java +++ b/core/src/main/java/org/jclouds/ContextBuilder.java @@ -82,6 +82,7 @@ import org.jclouds.rest.config.CredentialStoreModule; import org.jclouds.rest.config.HttpApiModule; import org.jclouds.rest.config.RestModule; import org.jclouds.rest.internal.InvokeHttpMethod; +import org.jclouds.util.TypeTokenUtils; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; @@ -620,7 +621,7 @@ public class ContextBuilder { @SuppressWarnings("unchecked") public <C extends Context> C build(TypeToken<C> contextType) { TypeToken<C> returnType = null; - if (contextType.isAssignableFrom(apiMetadata.getContext())) + if (TypeTokenUtils.isSupertypeOf(contextType, apiMetadata.getContext())) returnType = (TypeToken<C>) apiMetadata.getContext(); else throw new IllegalArgumentException(String.format("api %s not assignable from %s; context: %s", apiMetadata, http://git-wip-us.apache.org/repos/asf/jclouds/blob/7cde28a4/core/src/main/java/org/jclouds/apis/ApiPredicates.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/apis/ApiPredicates.java b/core/src/main/java/org/jclouds/apis/ApiPredicates.java index f75fe3a..0be2324 100644 --- a/core/src/main/java/org/jclouds/apis/ApiPredicates.java +++ b/core/src/main/java/org/jclouds/apis/ApiPredicates.java @@ -20,6 +20,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Strings.emptyToNull; import org.jclouds.View; +import org.jclouds.util.TypeTokenUtils; import com.google.common.base.Predicate; import com.google.common.base.Predicates; @@ -84,7 +85,7 @@ public class ApiPredicates { */ @Override public boolean apply(ApiMetadata apiMetadata) { - return type.isAssignableFrom(apiMetadata.getContext()); + return TypeTokenUtils.isSupertypeOf(type, apiMetadata.getContext()); } /** @@ -114,7 +115,7 @@ public class ApiPredicates { @Override public boolean apply(ApiMetadata apiMetadata) { for (TypeToken<? extends View> to : apiMetadata.getViews()) - if (type.isAssignableFrom(to)) + if (TypeTokenUtils.isSupertypeOf(type, to)) return true; return false; } http://git-wip-us.apache.org/repos/asf/jclouds/blob/7cde28a4/core/src/main/java/org/jclouds/apis/Apis.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/apis/Apis.java b/core/src/main/java/org/jclouds/apis/Apis.java index 9031300..a94a857 100644 --- a/core/src/main/java/org/jclouds/apis/Apis.java +++ b/core/src/main/java/org/jclouds/apis/Apis.java @@ -26,6 +26,7 @@ import java.util.ServiceLoader; import org.jclouds.View; import org.jclouds.osgi.ApiRegistry; +import org.jclouds.util.TypeTokenUtils; import com.google.common.base.Function; import com.google.common.base.Predicate; @@ -131,7 +132,7 @@ public class Apis { @Override public boolean apply(TypeToken<?> input) { - return view.isAssignableFrom(input); + return TypeTokenUtils.isSupertypeOf(view, input); } }); http://git-wip-us.apache.org/repos/asf/jclouds/blob/7cde28a4/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 153bfc5..287852c 100644 --- a/core/src/main/java/org/jclouds/internal/BaseView.java +++ b/core/src/main/java/org/jclouds/internal/BaseView.java @@ -25,6 +25,7 @@ import org.jclouds.Context; import org.jclouds.View; import org.jclouds.location.Provider; import org.jclouds.rest.ApiContext; +import org.jclouds.util.TypeTokenUtils; import com.google.common.base.Objects; import com.google.common.base.Objects.ToStringHelper; @@ -45,7 +46,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 to %s", backendType, type); + checkArgument(TypeTokenUtils.isSupertypeOf(checkNotNull(type, "type"), backendType), "%s is not a supertype of backend type %s", type, backendType); return (C) backend; } http://git-wip-us.apache.org/repos/asf/jclouds/blob/7cde28a4/core/src/main/java/org/jclouds/providers/ProviderPredicates.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/providers/ProviderPredicates.java b/core/src/main/java/org/jclouds/providers/ProviderPredicates.java index 4aa5594..d9996cc 100644 --- a/core/src/main/java/org/jclouds/providers/ProviderPredicates.java +++ b/core/src/main/java/org/jclouds/providers/ProviderPredicates.java @@ -23,6 +23,7 @@ import org.jclouds.Context; import org.jclouds.View; import org.jclouds.apis.ApiMetadata; import org.jclouds.apis.ApiPredicates; +import org.jclouds.util.TypeTokenUtils; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; @@ -237,7 +238,7 @@ public class ProviderPredicates { */ @Override public boolean apply(ProviderMetadata providerMetadata) { - return apiClass.isAssignableFrom(providerMetadata.getApiMetadata().getClass()); + return TypeTokenUtils.isSupertypeOf(apiClass, providerMetadata.getApiMetadata().getClass()); } /** http://git-wip-us.apache.org/repos/asf/jclouds/blob/7cde28a4/core/src/main/java/org/jclouds/rest/InputParamValidator.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/rest/InputParamValidator.java b/core/src/main/java/org/jclouds/rest/InputParamValidator.java index efb84dd..8586240 100644 --- a/core/src/main/java/org/jclouds/rest/InputParamValidator.java +++ b/core/src/main/java/org/jclouds/rest/InputParamValidator.java @@ -129,7 +129,7 @@ public class InputParamValidator { } } - @SuppressWarnings("unchecked") + @SuppressWarnings({"CheckReturnValue", "unchecked"}) private void runPredicatesAgainstArgs(List<Validator<?>> predicates, List<Object> args) { for (@SuppressWarnings("rawtypes") Validator validator : predicates) { http://git-wip-us.apache.org/repos/asf/jclouds/blob/7cde28a4/core/src/main/java/org/jclouds/util/TypeTokenUtils.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/util/TypeTokenUtils.java b/core/src/main/java/org/jclouds/util/TypeTokenUtils.java new file mode 100644 index 0000000..7eb23f5 --- /dev/null +++ b/core/src/main/java/org/jclouds/util/TypeTokenUtils.java @@ -0,0 +1,74 @@ +/* + * 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.Method; +import java.lang.reflect.Type; + +import com.google.common.annotations.Beta; +import com.google.common.base.Throwables; +import com.google.common.reflect.TypeToken; + +@Beta +public final class TypeTokenUtils { + private static final Method IS_SUPERTYPE_OF_TYPE; + private static final Method IS_SUPERTYPE_OF_TYPETOKEN; + static { + Method isSuperTypeOfType; + Method isSuperTypeOfTypeToken; + try { + // Guava 19 and later method + isSuperTypeOfType = TypeToken.class.getDeclaredMethod("isSupertypeOf", Type.class); + isSuperTypeOfTypeToken = TypeToken.class.getDeclaredMethod("isSupertypeOf", TypeToken.class); + } catch (NoSuchMethodException nsme) { + try { + // Guava 18 and earlier method + isSuperTypeOfType = TypeToken.class.getDeclaredMethod("isAssignableFrom", Type.class); + isSuperTypeOfTypeToken = TypeToken.class.getDeclaredMethod("isAssignableFrom", TypeToken.class); + } catch (NoSuchMethodException nsme2) { + throw Throwables.propagate(nsme2); + } + } + IS_SUPERTYPE_OF_TYPE = isSuperTypeOfType; + IS_SUPERTYPE_OF_TYPETOKEN = isSuperTypeOfTypeToken; + } + + private TypeTokenUtils() { + throw new AssertionError("intentionally not implemented"); + } + + public static <C> boolean isSupertypeOf(TypeToken<C> token, Type type) { + try { + return (Boolean) IS_SUPERTYPE_OF_TYPE.invoke(token, type); + } catch (IllegalAccessException iae) { + throw Throwables.propagate(iae); + } catch (InvocationTargetException ite) { + throw Throwables.propagate(ite); + } + } + + public static <C, D> boolean isSupertypeOf(TypeToken<C> token, TypeToken<D> token2) { + try { + return (Boolean) IS_SUPERTYPE_OF_TYPETOKEN.invoke(token, token2); + } catch (IllegalAccessException iae) { + throw Throwables.propagate(iae); + } catch (InvocationTargetException ite) { + throw Throwables.propagate(ite); + } + } +} http://git-wip-us.apache.org/repos/asf/jclouds/blob/7cde28a4/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 75be8df..f634caa 100644 --- a/core/src/test/java/org/jclouds/internal/BaseViewTest.java +++ b/core/src/test/java/org/jclouds/internal/BaseViewTest.java @@ -104,7 +104,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 to org.jclouds.internal.BaseViewTest$PeanutButter"); + assertEquals(e.getMessage(), "org.jclouds.internal.BaseViewTest$PeanutButter is not a supertype of backend type org.jclouds.internal.BaseViewTest$Water"); } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/7cde28a4/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/PlacementGroupApiLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/PlacementGroupApiLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/PlacementGroupApiLiveTest.java index 754edcf..816e7a9 100644 --- a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/PlacementGroupApiLiveTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/PlacementGroupApiLiveTest.java @@ -165,6 +165,7 @@ public class PlacementGroupApiLiveTest extends BaseComputeServiceContextLiveTest assert availableTester.apply(group) : group; } + @SuppressWarnings("CheckReturnValue") public void testStartHS1Instance() throws Exception { Template template = view.getComputeService().templateBuilder() http://git-wip-us.apache.org/repos/asf/jclouds/blob/7cde28a4/providers/softlayer/src/test/java/org/jclouds/softlayer/features/VirtualGuestApiLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/features/VirtualGuestApiLiveTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/VirtualGuestApiLiveTest.java index c35474b..d540bc7 100644 --- a/providers/softlayer/src/test/java/org/jclouds/softlayer/features/VirtualGuestApiLiveTest.java +++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/VirtualGuestApiLiveTest.java @@ -17,6 +17,7 @@ package org.jclouds.softlayer.features; import static com.google.common.base.Preconditions.checkState; +import static org.assertj.core.api.Assertions.assertThat; import static org.jclouds.util.Predicates2.retry; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; @@ -132,9 +133,13 @@ public class VirtualGuestApiLiveTest extends BaseSoftLayerApiLiveTest { VirtualGuest found = virtualGuestApi.getVirtualGuest(virtualGuest.getId()); Set<TagReference> tagReferences = found.getTagReferences(); assertNotNull(tagReferences); - for (String tag : tags) { - Iterables.contains(tagReferences, tag); + + ImmutableSet.Builder<String> actualTagsBuilder = ImmutableSet.builder(); + for (TagReference ref : tagReferences) { + actualTagsBuilder.add(ref.getTag().getName()); } + Set<String> actualTags = actualTagsBuilder.build(); + assertThat(actualTags).containsAll(tags); } @Test(dependsOnMethods = "testSetTagsOnVirtualGuest")
