From 2a3280fba58ff9a5b87bd490eeb0b846feb15ae2 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Mon, 31 Dec 2012 16:07:35 -0800 Subject: [PATCH 1/2] removed AuthorizationException catch, as error handler already coerces auth exception to ResourceNotFound --- .../VAppTemplatesForCatalogItems.java | 33 ++++--------------- .../VAppTemplatesForCatalogItems.java | 29 +++------------- 2 files changed, 10 insertions(+), 52 deletions(-) diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/VAppTemplatesForCatalogItems.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/VAppTemplatesForCatalogItems.java index 200a8399ea..381afbcd95 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/VAppTemplatesForCatalogItems.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/VAppTemplatesForCatalogItems.java @@ -19,6 +19,7 @@ package org.jclouds.vcloud.functions; import static com.google.common.collect.Iterables.filter; +import static org.jclouds.Constants.PROPERTY_USER_THREADS; import static org.jclouds.concurrent.FutureIterables.transformParallel; import java.util.concurrent.ExecutorService; @@ -29,13 +30,8 @@ import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; -import org.jclouds.Constants; import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.concurrent.ExceptionParsingListenableFuture; -import org.jclouds.concurrent.Futures; import org.jclouds.logging.Logger; -import org.jclouds.rest.AuthorizationException; -import org.jclouds.util.Iterables2; import org.jclouds.vcloud.VCloudAsyncClient; import org.jclouds.vcloud.VCloudMediaType; import org.jclouds.vcloud.domain.CatalogItem; @@ -44,7 +40,6 @@ import org.jclouds.vcloud.domain.VAppTemplate; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; -import com.google.common.base.Throwables; /** * @author Adrian Cole @@ -53,34 +48,20 @@ import com.google.common.base.Throwables; public class VAppTemplatesForCatalogItems implements Function, Iterable> { @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) - public Logger logger = Logger.NULL; + private Logger logger = Logger.NULL; private final VCloudAsyncClient aclient; private final ExecutorService executor; - private final NullOnAuthorizationException NullOnAuthorizationException; - @Singleton - static class NullOnAuthorizationException implements Function { - - public VAppTemplate apply(Exception from) { - if (from instanceof AuthorizationException) { - return null; - } - throw Throwables.propagate(from); - } - } @Inject - VAppTemplatesForCatalogItems(VCloudAsyncClient aclient, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, - NullOnAuthorizationException NullOnAuthorizationException) { + VAppTemplatesForCatalogItems(VCloudAsyncClient aclient, @Named(PROPERTY_USER_THREADS) ExecutorService executor) { this.aclient = aclient; this.executor = executor; - this.NullOnAuthorizationException = NullOnAuthorizationException; } @Override public Iterable apply(Iterable from) { - return Iterables2.concreteCopy(filter(transformParallel(filter(from, new Predicate() { + return filter(transformParallel(filter(from, new Predicate() { @Override public boolean apply(CatalogItem input) { @@ -91,12 +72,10 @@ public class VAppTemplatesForCatalogItems implements Function apply(CatalogItem from) { - return new ExceptionParsingListenableFuture(Futures.makeListenable(VCloudAsyncClient.class - .cast(aclient).getVAppTemplateClient().getVAppTemplate(from.getEntity().getHref()), executor), - NullOnAuthorizationException); + return aclient.getVAppTemplateClient().getVAppTemplate(from.getEntity().getHref()); } - }, executor, null, logger, "vappTemplates in"), Predicates.notNull())); + }, executor, null, logger, "vappTemplates in"), Predicates.notNull()); } } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/VAppTemplatesForCatalogItems.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/VAppTemplatesForCatalogItems.java index 0734cd25c7..fecca6303e 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/VAppTemplatesForCatalogItems.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/VAppTemplatesForCatalogItems.java @@ -19,6 +19,7 @@ package org.jclouds.vcloud.director.v1_5.functions; import static com.google.common.collect.Iterables.filter; +import static org.jclouds.Constants.PROPERTY_USER_THREADS; import static org.jclouds.concurrent.FutureIterables.transformParallel; import java.util.concurrent.ExecutorService; @@ -29,12 +30,8 @@ import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; -import org.jclouds.Constants; import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.concurrent.ExceptionParsingListenableFuture; -import org.jclouds.concurrent.Futures; import org.jclouds.logging.Logger; -import org.jclouds.rest.AuthorizationException; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import org.jclouds.vcloud.director.v1_5.domain.CatalogItem; import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate; @@ -42,7 +39,6 @@ import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorAsyncApi; import com.google.common.base.Function; import com.google.common.base.Predicate; -import com.google.common.base.Throwables; /** * @author danikov @@ -51,29 +47,14 @@ import com.google.common.base.Throwables; public class VAppTemplatesForCatalogItems implements Function, Iterable> { @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) - public Logger logger = Logger.NULL; + private Logger logger = Logger.NULL; private final VCloudDirectorAsyncApi aapi; private final ExecutorService executor; - private final NullOnAuthorizationException NullOnAuthorizationException; - - @Singleton - static class NullOnAuthorizationException implements Function { - - public VAppTemplate apply(Exception from) { - if (from instanceof AuthorizationException) { - return null; - } - throw Throwables.propagate(from); - } - } @Inject - VAppTemplatesForCatalogItems(VCloudDirectorAsyncApi aapi, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, - NullOnAuthorizationException NullOnAuthorizationException) { + VAppTemplatesForCatalogItems(VCloudDirectorAsyncApi aapi, @Named(PROPERTY_USER_THREADS) ExecutorService executor) { this.aapi = aapi; this.executor = executor; - this.NullOnAuthorizationException = NullOnAuthorizationException; } @Override @@ -89,9 +70,7 @@ public class VAppTemplatesForCatalogItems implements Function apply(CatalogItem from) { - return new ExceptionParsingListenableFuture(Futures.makeListenable(VCloudDirectorAsyncApi.class - .cast(aapi).getVAppTemplateApi().get(from.getEntity().getHref()), executor), - NullOnAuthorizationException); + return aapi.getVAppTemplateApi().get(from.getEntity().getHref()); } }, executor, null, logger, "vappTemplates in"); From f5743a7f41031b25dc571d907bb4b66be368677d Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Mon, 31 Dec 2012 16:08:09 -0800 Subject: [PATCH 2/2] removed code redudant to guava FutureFallback --- .../ExceptionParsingListenableFuture.java | 98 ------------------- .../concurrent/FutureExceptionParserTest.java | 96 ------------------ 2 files changed, 194 deletions(-) delete mode 100644 core/src/main/java/org/jclouds/concurrent/ExceptionParsingListenableFuture.java delete mode 100644 core/src/test/java/org/jclouds/concurrent/FutureExceptionParserTest.java diff --git a/core/src/main/java/org/jclouds/concurrent/ExceptionParsingListenableFuture.java b/core/src/main/java/org/jclouds/concurrent/ExceptionParsingListenableFuture.java deleted file mode 100644 index a19eb55ff6..0000000000 --- a/core/src/main/java/org/jclouds/concurrent/ExceptionParsingListenableFuture.java +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Licensed to jclouds, Inc. (jclouds) under one or more - * contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. jclouds 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.concurrent; - -import static com.google.common.base.Preconditions.checkNotNull; - -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import com.google.common.base.Function; -import com.google.common.util.concurrent.ListenableFuture; - -/** - * Transforms the exceptions in a future upon get - * - * Temporarily here until the following is resolved: guava issue 310 - * - * @author Adrian Cole - */ -public class ExceptionParsingListenableFuture implements ListenableFuture { - - private final ListenableFuture future; - private final Function function; - - public static ExceptionParsingListenableFuture create(ListenableFuture future, - Function function) { - return new ExceptionParsingListenableFuture(future, function); - } - - public ExceptionParsingListenableFuture(ListenableFuture future, Function function) { - this.future = checkNotNull(future); - this.function = checkNotNull(function); - } - - public boolean cancel(boolean mayInterruptIfRunning) { - return future.cancel(mayInterruptIfRunning); - } - - public T get() throws InterruptedException, ExecutionException { - try { - return future.get(); - } catch (InterruptedException ie) { - throw ie; - } catch (Exception e) { - return attemptConvert(e); - } - } - - private T attemptConvert(Exception e) { - if (e instanceof ExecutionException && e.getCause() instanceof Exception) - return function.apply((Exception) e.getCause()); - return function.apply(e); - } - - public T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - try { - return future.get(timeout, unit); - } catch (InterruptedException ie) { - throw ie; - } catch (TimeoutException te) { - throw te; - } catch (Exception e) { - return attemptConvert(e); - } - } - - public boolean isCancelled() { - return future.isCancelled(); - } - - public boolean isDone() { - return future.isDone(); - } - - @Override - public void addListener(Runnable listener, Executor exec) { - future.addListener(listener, exec); - } -} diff --git a/core/src/test/java/org/jclouds/concurrent/FutureExceptionParserTest.java b/core/src/test/java/org/jclouds/concurrent/FutureExceptionParserTest.java deleted file mode 100644 index e9a65b8a8e..0000000000 --- a/core/src/test/java/org/jclouds/concurrent/FutureExceptionParserTest.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Licensed to jclouds, Inc. (jclouds) under one or more - * contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. jclouds 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.concurrent; - -import static org.testng.Assert.assertEquals; - -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.testng.annotations.Test; - -import com.google.common.base.Function; -import com.google.common.base.Throwables; -import com.google.common.collect.Iterables; -import com.google.common.util.concurrent.ListenableFuture; - -/** - * Tests behavior of FutureExceptionParser - * - * @author Adrian Cole - */ -@Test(groups = "unit") -public class FutureExceptionParserTest { - ExecutorService executorService = MoreExecutors.sameThreadExecutor(); - - @Test - public void testGet() throws InterruptedException, ExecutionException { - Future future = createFuture(new RuntimeException("foo")); - assertEquals(future.get(), "foo"); - } - - @Test(expectedExceptions = Exception.class) - public void testGetUnmatched() throws InterruptedException, ExecutionException { - Future future = createFuture(new Exception("foo")); - assertEquals(future.get(), "foo"); - } - - @Test - public void testGetLongTimeUnit() throws InterruptedException, ExecutionException, TimeoutException { - Future future = createFuture(new RuntimeException("foo")); - assertEquals(future.get(1, TimeUnit.SECONDS), "foo"); - } - - @Test(expectedExceptions = Exception.class) - public void testGetLongTimeUnitUnmatched() throws InterruptedException, ExecutionException, TimeoutException { - Future future = createFuture(new Exception("foo")); - assertEquals(future.get(1, TimeUnit.SECONDS), "foo"); - } - - @SuppressWarnings( { "unchecked", "rawtypes" }) - private Future createFuture(final Exception exception) { - ListenableFuture future = Futures.makeListenable(executorService.submit(new Callable() { - - public String call() throws Exception { - throw exception; - } - - @Override - public String toString() { - return "throwException(" + exception + ")"; - } - }), executorService); - - future = new ExceptionParsingListenableFuture(future, new Function() { - - public String apply(Exception from) { - if (Iterables.size(Iterables.filter(Throwables.getCausalChain(from), RuntimeException.class)) >= 1) - return from.getMessage(); - throw Throwables.propagate(from); - } - - }); - return future; - } - -}