Author: limpbizkit
Date: Mon Sep 1 09:03:43 2008
New Revision: 613
Modified:
trunk/src/com/google/inject/InjectorImpl.java
trunk/test/com/google/inject/BinderTestSuite.java
Log:
Fixing a bug where exceptions thrown by @ProvidedBy providers weren't being
wrapped in a ProvisionException.
Also adding some test cases for injecting into various injection points.
Modified: trunk/src/com/google/inject/InjectorImpl.java
==============================================================================
--- trunk/src/com/google/inject/InjectorImpl.java (original)
+++ trunk/src/com/google/inject/InjectorImpl.java Mon Sep 1 09:03:43 2008
@@ -515,14 +515,17 @@
public T get(Errors errors, InternalContext context, Dependency
dependency)
throws ErrorsException {
Provider<?> provider = providerBinding.internalFactory.get(errors,
context, dependency);
- Object o = provider.get();
- if (o != null && !type.isInstance(o)) {
- throw errors.withSource(type).subtypeNotProvided(providerType,
type).toException();
+ try {
+ Object o = provider.get();
+ if (o != null && !type.isInstance(o)) {
+ throw errors.withSource(type).subtypeNotProvided(providerType,
type).toException();
+ }
+ @SuppressWarnings("unchecked") // protected by isInstance()
check above
+ T t = (T) o;
+ return t;
+ } catch (RuntimeException e) {
+ throw errors.withSource(type).errorInProvider(e,
null).toException();
}
-
- @SuppressWarnings("unchecked") // protected by isInstance() check
above
- T t = (T) o;
- return t;
}
};
Modified: trunk/test/com/google/inject/BinderTestSuite.java
==============================================================================
--- trunk/test/com/google/inject/BinderTestSuite.java (original)
+++ trunk/test/com/google/inject/BinderTestSuite.java Mon Sep 1 09:03:43
2008
@@ -21,7 +21,9 @@
import static com.google.inject.Asserts.assertContains;
import com.google.inject.binder.AnnotatedBindingBuilder;
import com.google.inject.binder.ScopedBindingBuilder;
+import com.google.inject.name.Named;
import static com.google.inject.name.Names.named;
+import com.google.inject.util.Providers;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import java.lang.annotation.Retention;
@@ -73,37 +75,39 @@
new Builder()
.name("no binding, AWithProvidedBy")
- .key(Key.get(AWithProvidedBy.class))
+ .key(Key.get(AWithProvidedBy.class), InjectsAWithProvidedBy.class)
.addToSuite(suite);
new Builder()
.name("no binding, AWithImplementedBy")
- .key(Key.get(AWithImplementedBy.class))
+ .key(Key.get(AWithImplementedBy.class),
InjectsAWithImplementedBy.class)
.addToSuite(suite);
new Builder()
.name("no binding, ScopedA")
- .key(Key.get(ScopedA.class))
+ .key(Key.get(ScopedA.class), InjectsScopedA.class)
.expectedValues(new PlainA(201), new PlainA(201), new PlainA(202),
new PlainA(202))
.addToSuite(suite);
new Builder()
.name("no binding, AWithProvidedBy named apple")
- .key(Key.get(AWithProvidedBy.class, named("apple")))
+ .key(Key.get(AWithProvidedBy.class, named("apple")),
+ InjectsAWithProvidedByNamedApple.class)
.provisionException("No implementation for %s annotated with %s
was bound",
AWithProvidedBy.class.getName(), named("apple"))
.addToSuite(suite);
new Builder()
.name("no binding, AWithImplementedBy named apple")
- .key(Key.get(AWithImplementedBy.class, named("apple")))
+ .key(Key.get(AWithImplementedBy.class, named("apple")),
+ InjectsAWithImplementedByNamedApple.class)
.provisionException("No implementation for %s annotated with %s
was bound",
AWithImplementedBy.class.getName(), named("apple"))
.addToSuite(suite);
new Builder()
.name("no binding, ScopedA named apple")
- .key(Key.get(ScopedA.class, named("apple")))
+ .key(Key.get(ScopedA.class, named("apple")),
InjectsScopedANamedApple.class)
.provisionException("No implementation for %s annotated with %s
was bound",
ScopedA.class.getName(), named("apple"))
.addToSuite(suite);
@@ -111,7 +115,7 @@
for (final Scoper scoper : Scoper.values()) {
new Builder()
.name("bind PlainA")
- .key(Key.get(PlainA.class))
+ .key(Key.get(PlainA.class), InjectsPlainA.class)
.module(new AbstractModule() {
protected void configure() {
AnnotatedBindingBuilder<PlainA> abb = bind(PlainA.class);
@@ -156,7 +160,7 @@
new Builder()
.name("bind AWithProvidedBy")
- .key(Key.get(AWithProvidedBy.class))
+ .key(Key.get(AWithProvidedBy.class),
InjectsAWithProvidedBy.class)
.module(new AbstractModule() {
protected void configure() {
ScopedBindingBuilder sbb = bind(AWithProvidedBy.class);
@@ -168,7 +172,7 @@
new Builder()
.name("bind AWithImplementedBy")
- .key(Key.get(AWithImplementedBy.class))
+ .key(Key.get(AWithImplementedBy.class),
InjectsAWithImplementedBy.class)
.module(new AbstractModule() {
protected void configure() {
ScopedBindingBuilder sbb = bind(AWithImplementedBy.class);
@@ -180,7 +184,7 @@
new Builder()
.name("bind ScopedA")
- .key(Key.get(ScopedA.class))
+ .key(Key.get(ScopedA.class), InjectsScopedA.class)
.module(new AbstractModule() {
protected void configure() {
ScopedBindingBuilder sbb = bind(ScopedA.class);
@@ -294,6 +298,7 @@
public static class Builder {
private String name = "test";
private Key<?> key = Key.get(A.class);
+ private Class<? extends Injectable> injectsKey = InjectsA.class;
private List<Module> modules = Lists.<Module>newArrayList(new
AbstractModule() {
protected void configure() {
bindScope(TwoAtATimeScoped.class, new TwoAtATimeScope());
@@ -320,8 +325,9 @@
return this;
}
- public Builder key(Key<?> key) {
+ public Builder key(Key<?> key, Class<? extends Injectable> injectsKey)
{
this.key = key;
+ this.injectsKey = injectsKey;
return this;
}
@@ -366,6 +372,7 @@
public static class SuccessTest extends TestCase {
final String name;
final Key<?> key;
+ final Class<? extends Injectable> injectsKey;
final ImmutableList<Module> modules;
final ImmutableList<Object> expectedValues;
@@ -373,6 +380,7 @@
super("test");
name = builder.name;
key = builder.key;
+ injectsKey = builder.injectsKey;
modules = ImmutableList.copyOf(builder.modules);
expectedValues = ImmutableList.copyOf(builder.expectedValues);
}
@@ -381,27 +389,52 @@
return name;
}
- public void test() {
+ Injector newInjector() {
nextId.set(101);
- Injector injector = Guice.createInjector(modules);
-
- Provider<?> provider = injector.getProvider(key);
- Provider<?> bindingProvider = injector.getBinding(key).getProvider();
+ return Guice.createInjector(modules);
+ }
+ public void test() throws IllegalAccessException,
InstantiationException {
+ Injector injector = newInjector();
nextId.set(201);
for (Object value : expectedValues) {
assertEquals(value, injector.getInstance(key));
}
+ Provider<?> provider = newInjector().getProvider(key);
nextId.set(201);
for (Object value : expectedValues) {
assertEquals(value, provider.get());
}
+ Provider<?> bindingProvider =
newInjector().getBinding(key).getProvider();
nextId.set(201);
for (Object value : expectedValues) {
assertEquals(value, bindingProvider.get());
}
+
+ injector = newInjector();
+ nextId.set(201);
+ for (Object value : expectedValues) {
+ assertEquals(value, injector.getInstance(injectsKey).value);
+ }
+
+ injector = newInjector();
+ nextId.set(201);
+ for (Object value : expectedValues) {
+ Injectable injectable = injectsKey.newInstance();
+ injector.injectMembers(injectable);
+ assertEquals(value, injectable.value);
+ }
+
+ Injector injector1 = newInjector();
+ nextId.set(201);
+ Injectable hasProvider = injector1.getInstance(injectsKey);
+ hasProvider.provider.get();
+ nextId.set(201);
+ for (Object value : expectedValues) {
+ assertEquals(value, hasProvider.provider.get());
+ }
}
}
@@ -436,6 +469,7 @@
public static class ProvisionExceptionTest extends TestCase {
final String name;
final Key<?> key;
+ final Class<? extends Injectable> injectsKey;
final ImmutableList<Module> modules;
final String provisionException;
@@ -443,6 +477,7 @@
super("test");
name = builder.name;
key = builder.key;
+ injectsKey = builder.injectsKey;
modules = ImmutableList.copyOf(builder.modules);
provisionException = builder.provisionException;
}
@@ -451,35 +486,59 @@
return "provision errors:" + name;
}
- public void test() {
- Injector injector = Guice.createInjector(modules);
+ Injector newInjector() {
+ return Guice.createInjector(modules);
+ }
+ public void test() throws IllegalAccessException,
InstantiationException {
try {
- injector.getProvider(key);
+ newInjector().getProvider(key);
fail();
} catch (ProvisionException expected) {
assertContains(expected.getMessage(), provisionException);
}
try {
- injector.getBinding(key).getProvider();
+ newInjector().getBinding(key).getProvider();
fail();
} catch (ProvisionException expected) {
assertContains(expected.getMessage(), provisionException);
}
try {
- injector.getInstance(key);
+ newInjector().getInstance(key);
fail();
} catch (ProvisionException expected) {
assertContains(expected.getMessage(), provisionException);
}
+
+ try {
+ newInjector().getInstance(injectsKey);
+ fail();
+ } catch (ProvisionException expected) {
+ assertContains(expected.getMessage(),
+ injectsKey.getName() + ".inject", provisionException,
+ injectsKey.getName() + ".inject", provisionException,
+ "2 error[s]");
+ }
+
+ try {
+ Injectable injectable = injectsKey.newInstance();
+ newInjector().injectMembers(injectable);
+ fail();
+ } catch (ProvisionException expected) {
+ assertContains(expected.getMessage(),
+ injectsKey.getName() + ".inject", provisionException,
+ injectsKey.getName() + ".inject", provisionException,
+ "2 error[s]");
+ }
}
}
public static class UserExceptionsTest extends TestCase {
final String name;
final Key<?> key;
+ final Class<? extends Injectable> injectsKey;
final ImmutableList<Module> modules;
final ImmutableList<Object> expectedValues;
final CreationTime creationTime;
@@ -488,6 +547,7 @@
super("test");
name = builder.name;
key = builder.key;
+ injectsKey = builder.injectsKey;
modules = ImmutableList.copyOf(builder.modules);
expectedValues = ImmutableList.copyOf(builder.expectedValues);
creationTime = builder.creationTime;
@@ -497,11 +557,14 @@
return "provision errors:" + name;
}
- public void test() {
- Injector injector;
+ Injector newInjector() {
+ return Guice.createInjector(modules);
+ }
+
+ public void test() throws IllegalAccessException,
InstantiationException {
+ nextId.set(-1);
try {
- nextId.set(-1);
- injector = Guice.createInjector(modules);
+ newInjector();
assertEquals(CreationTime.LAZY, creationTime);
} catch (CreationException expected) {
assertEquals(CreationTime.EAGER, creationTime);
@@ -509,12 +572,12 @@
return;
}
- Provider<?> provider = injector.getProvider(key);
- Provider<?> bindingProvider = injector.getBinding(key).getProvider();
+ Provider<?> provider = newInjector().getProvider(key);
+ Provider<?> bindingProvider =
newInjector().getBinding(key).getProvider();
nextId.set(-1);
try {
- injector.getInstance(key);
+ newInjector().getInstance(key);
fail();
} catch (ProvisionException expected) {
assertContains(expected.getMessage(), "Illegal value: -1");
@@ -535,6 +598,37 @@
} catch (ProvisionException expected) {
assertContains(expected.getMessage(), "Illegal value: -1");
}
+
+ try {
+ nextId.set(-1);
+ newInjector().getInstance(injectsKey);
+ } catch (ProvisionException expected) {
+ assertContains(expected.getMessage(), "Illegal value: -1",
+ "while locating ", key.getTypeLiteral().toString(),
+ "for parameter 0 at " + injectsKey.getName() + ".inject");
+ }
+
+ nextId.set(201);
+ Injectable injectable = injectsKey.newInstance();
+ try {
+ nextId.set(-1);
+ newInjector().injectMembers(injectable);
+ } catch (ProvisionException expected) {
+ assertContains(expected.getMessage(), "Illegal value: -1",
+ "while locating ", key.getTypeLiteral().toString(),
+ "for parameter 0 at " + injectsKey.getName() + ".inject");
+ }
+
+ nextId.set(201);
+ Injectable hasProvider = newInjector().getInstance(injectsKey);
+ hasProvider.provider.get();
+ try {
+ nextId.set(-1);
+ hasProvider.provider.get();
+ } catch (ProvisionException expected) {
+ assertContains(expected.getMessage(), "Illegal value: -1",
+ "while locating ", key.getTypeLiteral().toString());
+ }
}
}
@@ -544,11 +638,50 @@
@ProvidedBy(PlainAProvider.class)
interface AWithProvidedBy {}
+ static class InjectsAWithProvidedBy extends Injectable {
+ @Inject public void inject(AWithProvidedBy aWithProvidedBy,
+ Provider<AWithProvidedBy> aWithProvidedByProvider) {
+ this.value = aWithProvidedBy;
+ this.provider = aWithProvidedByProvider;
+ }
+ }
+
+ static class InjectsAWithProvidedByNamedApple extends Injectable {
+ @Inject public void inject(@Named("apple") AWithProvidedBy
aWithProvidedBy,
+ @Named("apple") Provider<AWithProvidedBy> aWithProvidedByProvider)
{
+ this.value = aWithProvidedBy;
+ this.provider = aWithProvidedByProvider;
+ }
+ }
+
@ImplementedBy(PlainA.class)
interface AWithImplementedBy {}
+ static class InjectsAWithImplementedBy extends Injectable {
+ @Inject public void inject(AWithImplementedBy aWithImplementedBy,
+ Provider<AWithImplementedBy> aWithImplementedByProvider) {
+ this.value = aWithImplementedBy;
+ this.provider = aWithImplementedByProvider;
+ }
+ }
+
+ static class InjectsAWithImplementedByNamedApple extends Injectable {
+ @Inject public void inject(@Named("apple") AWithImplementedBy
aWithImplementedBy,
+ @Named("apple") Provider<AWithImplementedBy>
aWithImplementedByProvider) {
+ this.value = aWithImplementedBy;
+ this.provider = aWithImplementedByProvider;
+ }
+ }
+
interface A extends AWithProvidedBy, AWithImplementedBy {}
+ static class InjectsA extends Injectable {
+ @Inject public void inject(A a, Provider<A> aProvider) {
+ this.value = a;
+ this.provider = aProvider;
+ }
+ }
+
static class PlainA implements A {
final int value;
PlainA() {
@@ -578,6 +711,13 @@
}
}
+ static class InjectsPlainA extends Injectable {
+ @Inject public void inject(PlainA plainA, Provider<PlainA>
plainAProvider) {
+ this.value = plainA;
+ this.provider = plainAProvider;
+ }
+ }
+
/** This scope hands out each value exactly twice */
static class TwoAtATimeScope implements Scope {
public <T> Provider<T> scope(Key<T> key, final Provider<T> unscoped) {
@@ -602,4 +742,24 @@
@TwoAtATimeScoped
static class ScopedA extends PlainA {}
+
+ static class InjectsScopedA extends Injectable {
+ @Inject public void inject(ScopedA scopedA, Provider<ScopedA>
scopedAProvider) {
+ this.value = scopedA;
+ this.provider = scopedAProvider;
+ }
+ }
+
+ static class InjectsScopedANamedApple extends Injectable {
+ @Inject public void inject(@Named("apple") ScopedA scopedA,
+ @Named("apple") Provider<ScopedA> scopedAProvider) {
+ this.value = scopedA;
+ this.provider = scopedAProvider;
+ }
+ }
+
+ static class Injectable {
+ Object value = new Object();
+ Provider<?> provider = Providers.of(new Object());
+ }
}
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"google-guice-dev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/google-guice-dev?hl=en
-~----------~----~----~----~------~----~------~--~---