From edbd09b9849c2b7564ae684719670a7975f43ebe Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 5 Feb 2012 21:54:40 -0800 Subject: [PATCH] allow @Provides to return suppliers w/o qualifiers --- .../rest/internal/AsyncRestClientProxy.java | 44 +++++++++++++++---- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/jclouds/rest/internal/AsyncRestClientProxy.java b/core/src/main/java/org/jclouds/rest/internal/AsyncRestClientProxy.java index 86c9a2114f..4685db7bd3 100644 --- a/core/src/main/java/org/jclouds/rest/internal/AsyncRestClientProxy.java +++ b/core/src/main/java/org/jclouds/rest/internal/AsyncRestClientProxy.java @@ -149,18 +149,13 @@ public class AsyncRestClientProxy implements InvocationHandler { public Object lookupValueFromGuice(Method method) { try { + //TODO: tidy Type genericReturnType = method.getGenericReturnType(); try { Annotation qualifier = Iterables.find(ImmutableList.copyOf(method.getAnnotations()), isQualifierPresent); - Binding binding = injector.getExistingBinding(Key.get(genericReturnType, qualifier)); - if (binding != null) - return binding.getProvider().get(); - // try looking via supplier - return Supplier.class.cast( - injector.getInstance(Key.get(Types.newParameterizedType(Supplier.class, genericReturnType), - qualifier))).get(); + return getInstanceOfTypeWithQualifier(genericReturnType, qualifier); } catch (NoSuchElementException e) { - return injector.getInstance(Key.get(genericReturnType)); + return getInstanceOfType(genericReturnType); } } catch (ProvisionException e) { AuthorizationException aex = Throwables2.getFirstThrowableOfType(e, AuthorizationException.class); @@ -170,6 +165,39 @@ public class AsyncRestClientProxy implements InvocationHandler { } } + // TODO: tidy + private Object getInstanceOfType(Type genericReturnType) { + // look for an existing binding + Binding binding = injector.getExistingBinding(Key.get(genericReturnType)); + if (binding != null) + return binding.getProvider().get(); + + // then, try looking via supplier + binding = injector.getExistingBinding(Key.get(Types.newParameterizedType(Supplier.class, genericReturnType))); + if (binding != null) + return Supplier.class.cast(binding.getProvider().get()).get(); + + // else try to create an instance + return injector.getInstance(Key.get(genericReturnType)); + } + + // TODO: tidy + private Object getInstanceOfTypeWithQualifier(Type genericReturnType, Annotation qualifier) { + // look for an existing binding + Binding binding = injector.getExistingBinding(Key.get(genericReturnType, qualifier)); + if (binding != null) + return binding.getProvider().get(); + + // then, try looking via supplier + binding = injector.getExistingBinding(Key.get(Types.newParameterizedType(Supplier.class, genericReturnType), + qualifier)); + if (binding != null) + return Supplier.class.cast(binding.getProvider().get()).get(); + + // else try to create an instance + return injector.getInstance(Key.get(genericReturnType, qualifier)); + } + @SuppressWarnings( { "unchecked", "rawtypes" }) private ListenableFuture createListenableFutureForHttpRequestMappedToMethodAndArgs(Method method, Object[] args) throws ExecutionException {