diff options
author | Sam Berlin <sameb@google.com> | 2012-05-27 13:42:13 -0400 |
---|---|---|
committer | Sam Berlin <sameb@google.com> | 2012-05-27 13:42:13 -0400 |
commit | 8b7aaecd6164bf576c66dedad8c1988a10396341 (patch) | |
tree | 0f8b37fbdaf7baf9466fb6486396b3b4537caa84 /extensions/throwingproviders | |
parent | 15dbe7831cdb409f54180a89bfea4d3ce69c4983 (diff) | |
download | guice-8b7aaecd6164bf576c66dedad8c1988a10396341.tar.gz |
Update ThrowingProviderBinder to have a better exception in case of ProvisionExceptions from more than one dependency.
Revision created by MOE tool push_codebase.
MOE_MIGRATION=4877
Diffstat (limited to 'extensions/throwingproviders')
2 files changed, 69 insertions, 1 deletions
diff --git a/extensions/throwingproviders/src/com/google/inject/throwingproviders/ThrowingProviderBinder.java b/extensions/throwingproviders/src/com/google/inject/throwingproviders/ThrowingProviderBinder.java index 61121dec..01cbee57 100644 --- a/extensions/throwingproviders/src/com/google/inject/throwingproviders/ThrowingProviderBinder.java +++ b/extensions/throwingproviders/src/com/google/inject/throwingproviders/ThrowingProviderBinder.java @@ -222,7 +222,11 @@ public class ThrowingProviderBinder { } else if (pe.getCause() instanceof Error) { throw (Error) pe.getCause(); } else { - throw new AssertionError(pe); // Impossible! + // If this failed because of multiple reasons (ie, more than + // one dependency failed due to scoping errors), then + // the ProvisionException won't have a cause, so we need + // to rethrow it as-is. + throw pe; } } } @@ -265,6 +269,10 @@ public class ThrowingProviderBinder { new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + // Allow methods like .equals(..), .hashcode(..), .toString(..) to work. + if (method.getDeclaringClass() == Object.class) { + return method.invoke(this, args); + } return resultProvider.get().getOrThrow(); } })); diff --git a/extensions/throwingproviders/test/com/google/inject/throwingproviders/CheckedProviderTest.java b/extensions/throwingproviders/test/com/google/inject/throwingproviders/CheckedProviderTest.java index 94c47f30..ca13c63b 100644 --- a/extensions/throwingproviders/test/com/google/inject/throwingproviders/CheckedProviderTest.java +++ b/extensions/throwingproviders/test/com/google/inject/throwingproviders/CheckedProviderTest.java @@ -20,6 +20,7 @@ import com.google.common.base.Function; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import com.google.inject.AbstractModule; import com.google.inject.Asserts; import com.google.inject.CreationException; @@ -27,6 +28,11 @@ import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Key; +import com.google.inject.OutOfScopeException; +import com.google.inject.Provider; +import com.google.inject.ProvisionException; +import com.google.inject.Scope; +import com.google.inject.ScopeAnnotation; import com.google.inject.TypeLiteral; import com.google.inject.internal.util.Classes; import com.google.inject.name.Named; @@ -39,6 +45,10 @@ import com.google.inject.throwingproviders.ThrowingProviderBinder.Result; import junit.framework.TestCase; import java.io.IOException; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.net.BindException; import java.rmi.AccessException; import java.rmi.RemoteException; @@ -1383,6 +1393,56 @@ public class CheckedProviderTest extends TestCase { @Override public String s() { return null; } } + public void testProvisionExceptionOnDependenciesOfCxtor() throws Exception { + Injector injector = Guice.createInjector(new AbstractModule() { + @Override + protected void configure() { + ThrowingProviderBinder.create(binder()) + .bind(RemoteProvider.class, Foo.class) + .providing(ProvisionExceptionFoo.class); + bindScope(BadScope.class, new Scope() { + @Override + public <T> Provider<T> scope(Key<T> key, Provider<T> unscoped) { + return new Provider<T>() { + @Override + public T get() { + throw new OutOfScopeException("failure"); + } + }; + } + }); + } + }); + + try { + injector.getInstance(Key.get(remoteProviderOfFoo)).get(); + fail(); + } catch(ProvisionException pe) { + assertEquals(2, pe.getErrorMessages().size()); + List<Message> messages = Lists.newArrayList(pe.getErrorMessages()); + assertEquals("Error in custom provider, com.google.inject.OutOfScopeException: failure", + messages.get(0).getMessage()); + assertEquals("Error in custom provider, com.google.inject.OutOfScopeException: failure", + messages.get(1).getMessage()); + } + } + + @ScopeAnnotation + @Target(ElementType.TYPE) + @Retention(RetentionPolicy.RUNTIME) + private @interface BadScope { } + + @BadScope private static class Unscoped1 {} + @BadScope private static class Unscoped2 {} + + static class ProvisionExceptionFoo implements Foo { + @ThrowingInject + public ProvisionExceptionFoo(Unscoped1 a, Unscoped2 b) { + } + + @Override public String s() { return null; } + } + public void testUsingDoesntClashWithBindingsOfSameType() throws Exception { cxtorInjector = Guice.createInjector(new AbstractModule() { @Override |