Revision: 1292
Author: sberlin
Date: Sat Oct 16 14:38:22 2010
Log: update ThrowingProviders to implement HasDependencies and use getProvider instead of injecting the Injector.
http://code.google.com/p/google-guice/source/detail?r=1292

Modified:
/trunk/extensions/throwingproviders/src/com/google/inject/throwingproviders/ThrowingProviderBinder.java /trunk/extensions/throwingproviders/test/com/google/inject/throwingproviders/ThrowingProviderBinderTest.java

=======================================
--- /trunk/extensions/throwingproviders/src/com/google/inject/throwingproviders/ThrowingProviderBinder.java Sat Jul 3 08:51:31 2010 +++ /trunk/extensions/throwingproviders/src/com/google/inject/throwingproviders/ThrowingProviderBinder.java Sat Oct 16 14:38:22 2010
@@ -17,14 +17,15 @@
 package com.google.inject.throwingproviders;

 import com.google.inject.Binder;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
 import com.google.inject.Key;
 import com.google.inject.Provider;
 import com.google.inject.TypeLiteral;
 import com.google.inject.binder.ScopedBindingBuilder;
 import static com.google.inject.internal.util.Preconditions.checkNotNull;
 import com.google.inject.internal.UniqueAnnotations;
+import com.google.inject.internal.util.ImmutableSet;
+import com.google.inject.spi.Dependency;
+import com.google.inject.spi.ProviderWithDependencies;
 import com.google.inject.util.Types;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.InvocationHandler;
@@ -33,6 +34,7 @@
 import java.lang.reflect.Proxy;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
+import java.util.Set;

 /**
  * <p>Builds a binding for a {...@link ThrowingProvider} using a fluent API:
@@ -106,36 +108,32 @@
       checkNotNull(targetKey, "targetKey");
final Key<Result> resultKey = Key.get(Result.class, UniqueAnnotations.create());
       final Key<P> key = createKey();
-
-      binder.bind(key).toProvider(new Provider<P>() {
-        private P instance;
-
-        @Inject void initialize(final Injector injector) {
-          instance = interfaceType.cast(Proxy.newProxyInstance(
- interfaceType.getClassLoader(), new Class<?>[] { interfaceType },
-              new InvocationHandler() {
- public Object invoke(Object proxy, Method method, Object[] args)
-                    throws Throwable {
-                  return injector.getInstance(resultKey).getOrThrow();
-                }
-              }));
-          }
-
+ final Provider<Result> resultProvider = binder.getProvider(resultKey); + final Provider<? extends P> targetProvider = binder.getProvider(targetKey);
+
+      binder.bind(key).toProvider(new ProviderWithDependencies<P>() {
+ private final P instance = interfaceType.cast(Proxy.newProxyInstance( + interfaceType.getClassLoader(), new Class<?>[] { interfaceType },
+            new InvocationHandler() {
+ public Object invoke(Object proxy, Method method, Object[] args)
+                  throws Throwable {
+                return resultProvider.get().getOrThrow();
+              }
+            }));
+
           public P get() {
             return instance;
           }
+
+          public Set<Dependency<?>> getDependencies() {
+ return ImmutableSet.<Dependency<?>>of(Dependency.get(resultKey));
+          }
         });

-      return binder.bind(resultKey).toProvider(new Provider<Result>() {
-        private Injector injector;
-
-        @Inject void initialize(Injector injector) {
-          this.injector = injector;
-        }
-
+ return binder.bind(resultKey).toProvider(new ProviderWithDependencies<Result>() {
         public Result get() {
           try {
-            return Result.forValue(injector.getInstance(targetKey).get());
+            return Result.forValue(targetProvider.get().get());
           } catch (Exception e) {
             if (exceptionType.isInstance(e)) {
               return Result.forException(e);
@@ -147,6 +145,10 @@
             }
           }
         }
+
+        public Set<Dependency<?>> getDependencies() {
+          return ImmutableSet.<Dependency<?>>of(Dependency.get(targetKey));
+        }
       });
     }

=======================================
--- /trunk/extensions/throwingproviders/test/com/google/inject/throwingproviders/ThrowingProviderBinderTest.java Tue Sep 2 23:19:56 2008 +++ /trunk/extensions/throwingproviders/test/com/google/inject/throwingproviders/ThrowingProviderBinderTest.java Sat Oct 16 14:38:22 2010
@@ -18,15 +18,25 @@

 import com.google.inject.AbstractModule;
 import static com.google.inject.Asserts.assertContains;
+
 import com.google.inject.CreationException;
 import com.google.inject.Guice;
+import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.Key;
 import com.google.inject.TypeLiteral;
+import com.google.inject.internal.util.Function;
+import com.google.inject.internal.util.ImmutableSet;
+import com.google.inject.internal.util.Iterables;
 import com.google.inject.name.Names;
+import com.google.inject.spi.Dependency;
+import com.google.inject.spi.HasDependencies;
+
 import java.rmi.RemoteException;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Set;
+
 import junit.framework.TestCase;

 /**
@@ -207,12 +217,59 @@
assertContains(expected.getMessage(), "is not a compliant interface");
     }
   }
+
+  public void testDependencies() {
+    injector = Guice.createInjector(new AbstractModule() {
+      protected void configure() {
+        bind(String.class).toInstance("Foo");
+        bind(Integer.class).toInstance(5);
+        bind(Double.class).toInstance(5d);
+        bind(Long.class).toInstance(5L);
+        ThrowingProviderBinder.create(binder())
+            .bind(RemoteProvider.class, String.class)
+            .to(DependentRemoteProvider.class);
+      }
+    });
+
+    HasDependencies hasDependencies =
+ (HasDependencies)injector.getBinding(Key.get(remoteProviderOfString));
+    hasDependencies =
+        (HasDependencies)injector.getBinding(
+ Iterables.getOnlyElement(hasDependencies.getDependencies()).getKey());
+    // Make sure that that is dependent on DependentRemoteProvider.
+    assertEquals(Dependency.get(Key.get(DependentRemoteProvider.class)),
+        Iterables.getOnlyElement(hasDependencies.getDependencies()));
+    // And make sure DependentRemoteProvider has the proper dependencies.
+ hasDependencies = (HasDependencies)injector.getBinding(DependentRemoteProvider.class);
+    Set<Key<?>> dependencyKeys = ImmutableSet.copyOf(
+        Iterables.transform(hasDependencies.getDependencies(),
+          new Function<Dependency<?>, Key<?>>() {
+            public Key<?> apply(Dependency<?> from) {
+              return from.getKey();
+            }
+          }));
+ assertEquals(ImmutableSet.<Key<?>>of(Key.get(String.class), Key.get(Integer.class),
+        Key.get(Long.class), Key.get(Double.class)), dependencyKeys);
+  }

interface RemoteProviderWithExtraMethod<T> extends ThrowingProvider<T, RemoteException> {
     T get(T defaultValue) throws RemoteException;
   }

interface RemoteProvider<T> extends ThrowingProvider<T, RemoteException> { }
+
+  static class DependentRemoteProvider<T> implements RemoteProvider<T> {
+    @Inject double foo;
+
+    @Inject public DependentRemoteProvider(String foo, int bar) {
+    }
+
+    @Inject void initialize(long foo) {}
+
+    public T get() throws RemoteException {
+      return null;
+    }
+  }

   static class MockRemoteProvider<T> implements RemoteProvider<T> {
     Exception nextToThrow;

--
You received this message because you are subscribed to the Google Groups 
"google-guice-dev" group.
To post to this group, send email to google-guice-...@googlegroups.com.
To unsubscribe from this group, send email to 
google-guice-dev+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-guice-dev?hl=en.

Reply via email to