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.