Repository: jclouds Updated Branches: refs/heads/master 5e12796a3 -> e08acc6ed
JCLOUDS-1334: Guava 23 compatiblity Reflective creation of SimpleTimeLimiter to allow compatibility with Guava 23.0. SimpleTimeLimiter.create(ExecutorService) was introduced in Guava 22.0 to replace the SimpleTimeLimiter(ExecutorService) constructor, which was deprecated in Guava 22.0 and removed in Guava 23.0. Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/e08acc6e Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/e08acc6e Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/e08acc6e Branch: refs/heads/master Commit: e08acc6ed6b2761b6063f9ae105ee9f4077ef418 Parents: 5e12796 Author: Tim Peierls <[email protected]> Authored: Sat Aug 26 10:41:36 2017 -0400 Committer: Andrew Gaul <[email protected]> Committed: Sat Aug 26 20:19:06 2017 -0700 ---------------------------------------------------------------------- .../config/ExecutorServiceModule.java | 59 +++++++++++++++++++- .../rest/internal/BaseRestApiExpectTest.java | 4 +- .../jclouds/rest/internal/BaseRestApiTest.java | 4 +- 3 files changed, 62 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/e08acc6e/core/src/main/java/org/jclouds/concurrent/config/ExecutorServiceModule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/concurrent/config/ExecutorServiceModule.java b/core/src/main/java/org/jclouds/concurrent/config/ExecutorServiceModule.java index a78411c..8ccfd6d 100644 --- a/core/src/main/java/org/jclouds/concurrent/config/ExecutorServiceModule.java +++ b/core/src/main/java/org/jclouds/concurrent/config/ExecutorServiceModule.java @@ -20,6 +20,9 @@ import static com.google.common.util.concurrent.MoreExecutors.listeningDecorator import static org.jclouds.Constants.PROPERTY_USER_THREADS; import static org.jclouds.concurrent.DynamicExecutors.newScalingThreadPool; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.io.Closeable; import java.io.IOException; import java.util.List; @@ -54,6 +57,60 @@ import com.google.inject.Provides; @ConfiguresExecutorService public class ExecutorServiceModule extends AbstractModule { + private static final Method CREATE_STL; + private static final Constructor<SimpleTimeLimiter> CONSTRUCT_STL; + static { + Method create = null; + Constructor ctor = null; + try { + create = SimpleTimeLimiter.class.getDeclaredMethod("create", ExecutorService.class); + } catch (NoSuchMethodException nsme) { + try { + ctor = SimpleTimeLimiter.class.getConstructor(ExecutorService.class); + } catch (NoSuchMethodException nsme2) { + throw new UnsupportedOperationException( + "Can't find SimpleTimeLimiter creator or constructor taking ExecutorService", nsme2); + } + } + CREATE_STL = create; + CONSTRUCT_STL = ctor; + } + + /** + * Reflective creation of SimpleTimeLimiter to allow compatibility with Guava 23.0. + * SimpleTimeLimiter.create(ExecutorService) was introduced in Guava 22.0 to replace + * the SimpleTimeLimiter(ExecutorService) constructor, which was deprecated in + * Guava 22.0 and removed in Guava 23.0. The method is public to allow test methods + * in other packages to use it. + * @param executorService the execution service to use when running time-limited tasks + * @return a new instance of SimpleTimeLimiter that uses executorService + */ + public static SimpleTimeLimiter createSimpleTimeLimiter(ExecutorService executorService) { + try { + if (CREATE_STL != null) { + return (SimpleTimeLimiter) CREATE_STL.invoke(null, executorService); + } else if (CONSTRUCT_STL != null) { + return CONSTRUCT_STL.newInstance(executorService); + } + throw new UnsupportedOperationException( + "Can't find SimpleTimeLimiter creator or constructor taking ExecutorService"); + } catch (IllegalAccessException iae) { + throw new UnsupportedOperationException("Can't access SimpleTimeLimiter method/ctor", iae); + } catch (InstantiationException ie) { + throw new UnsupportedOperationException("Can't construct SimpleTimeLimiter", ie); + } catch (InvocationTargetException ite) { + Throwable throwable = ite.getCause(); + if (throwable instanceof RuntimeException) { + throw (RuntimeException) throwable; + } + if (throwable instanceof Error) { + throw (Error) throwable; + } + throw new UnsupportedOperationException( + "Checked exception thrown while creating SimpleTimeLimiter", throwable); + } + } + static final class ShutdownExecutorOnClose implements Closeable { @Resource private Logger logger = Logger.NULL; @@ -113,7 +170,7 @@ public class ExecutorServiceModule extends AbstractModule { @Provides @Singleton final TimeLimiter timeLimiter(@Named(PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) { - return new SimpleTimeLimiter(userExecutor); + return createSimpleTimeLimiter(userExecutor); } @Provides http://git-wip-us.apache.org/repos/asf/jclouds/blob/e08acc6e/core/src/test/java/org/jclouds/rest/internal/BaseRestApiExpectTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/jclouds/rest/internal/BaseRestApiExpectTest.java b/core/src/test/java/org/jclouds/rest/internal/BaseRestApiExpectTest.java index c6c66b3..144ad7e 100644 --- a/core/src/test/java/org/jclouds/rest/internal/BaseRestApiExpectTest.java +++ b/core/src/test/java/org/jclouds/rest/internal/BaseRestApiExpectTest.java @@ -22,6 +22,7 @@ import static com.google.inject.name.Names.named; import static org.jclouds.Constants.PROPERTY_IDEMPOTENT_METHODS; import static org.jclouds.Constants.PROPERTY_MAX_RETRIES; import static org.jclouds.Constants.PROPERTY_USER_THREADS; +import static org.jclouds.concurrent.config.ExecutorServiceModule.createSimpleTimeLimiter; import static org.testng.Assert.assertEquals; import java.io.IOException; @@ -80,7 +81,6 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.io.ByteSource; import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.common.util.concurrent.SimpleTimeLimiter; import com.google.common.util.concurrent.TimeLimiter; import com.google.gson.JsonElement; import com.google.gson.JsonParser; @@ -235,7 +235,7 @@ public abstract class BaseRestApiExpectTest<S> { @Provides @Singleton TimeLimiter timeLimiter(@Named(PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) { - return new SimpleTimeLimiter(userExecutor); + return createSimpleTimeLimiter(userExecutor); } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/e08acc6e/core/src/test/java/org/jclouds/rest/internal/BaseRestApiTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/jclouds/rest/internal/BaseRestApiTest.java b/core/src/test/java/org/jclouds/rest/internal/BaseRestApiTest.java index 915aa99..cee3a5a 100644 --- a/core/src/test/java/org/jclouds/rest/internal/BaseRestApiTest.java +++ b/core/src/test/java/org/jclouds/rest/internal/BaseRestApiTest.java @@ -22,6 +22,7 @@ import static com.google.common.util.concurrent.MoreExecutors.newDirectExecutorS import static com.google.inject.name.Names.named; import static org.easymock.EasyMock.createMock; import static org.jclouds.Constants.PROPERTY_USER_THREADS; +import static org.jclouds.concurrent.config.ExecutorServiceModule.createSimpleTimeLimiter; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; @@ -50,7 +51,6 @@ import com.google.common.collect.SortedSetMultimap; import com.google.common.collect.TreeMultimap; import com.google.common.reflect.Invokable; import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.common.util.concurrent.SimpleTimeLimiter; import com.google.common.util.concurrent.TimeLimiter; import com.google.inject.AbstractModule; import com.google.inject.Injector; @@ -84,7 +84,7 @@ public abstract class BaseRestApiTest { @Provides @Singleton TimeLimiter timeLimiter(@Named(PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) { - return new SimpleTimeLimiter(userExecutor); + return createSimpleTimeLimiter(userExecutor); } }
