aboutsummaryrefslogtreecommitdiff
path: root/extensions/throwingproviders
diff options
context:
space:
mode:
authorSam Berlin <sameb@google.com>2012-05-27 13:42:13 -0400
committerSam Berlin <sameb@google.com>2012-05-27 13:42:13 -0400
commit8b7aaecd6164bf576c66dedad8c1988a10396341 (patch)
tree0f8b37fbdaf7baf9466fb6486396b3b4537caa84 /extensions/throwingproviders
parent15dbe7831cdb409f54180a89bfea4d3ce69c4983 (diff)
downloadguice-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')
-rw-r--r--extensions/throwingproviders/src/com/google/inject/throwingproviders/ThrowingProviderBinder.java10
-rw-r--r--extensions/throwingproviders/test/com/google/inject/throwingproviders/CheckedProviderTest.java60
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