Author: limpbizkit
Date: Wed Apr 1 09:33:29 2009
New Revision: 924
Modified:
trunk/src/com/google/inject/ConstructorInjectorStore.java
trunk/src/com/google/inject/EncounterImpl.java
trunk/src/com/google/inject/MembersInjectorStore.java
trunk/src/com/google/inject/spi/InjectableType.java
trunk/test/com/google/inject/InjectableTypeListenerTest.java
Log:
Fixing a bug reported by James Strachan. The Encounter isn't being
invalidated, which is leading to problems since its methods don't work
after the hear() method returns.
http://groups.google.com/group/google-guice/browse_thread/thread/969b28c86c79d0e7/c0ba9f6fb1f0115a
Modified: trunk/src/com/google/inject/ConstructorInjectorStore.java
==============================================================================
--- trunk/src/com/google/inject/ConstructorInjectorStore.java (original)
+++ trunk/src/com/google/inject/ConstructorInjectorStore.java Wed Apr 1
09:33:29 2009
@@ -92,6 +92,7 @@
}
}
}
+ encounter.invalidate();
// rebuild the proxy factory and injectable type if new interceptors
were added
if (encounter.hasAddedAspects()) {
Modified: trunk/src/com/google/inject/EncounterImpl.java
==============================================================================
--- trunk/src/com/google/inject/EncounterImpl.java (original)
+++ trunk/src/com/google/inject/EncounterImpl.java Wed Apr 1 09:33:29 2009
@@ -19,6 +19,7 @@
import com.google.inject.internal.Errors;
import com.google.inject.internal.ImmutableList;
import com.google.inject.internal.Lists;
+import static com.google.inject.internal.Preconditions.checkState;
import com.google.inject.matcher.Matcher;
import com.google.inject.matcher.Matchers;
import com.google.inject.spi.InjectableType;
@@ -37,12 +38,17 @@
private final Lookups lookups;
private List<InjectionListener<? super T>> injectionListeners; // lazy
private List<MethodAspect> aspects; // lazy
+ private boolean valid = true;
public EncounterImpl(Errors errors, Lookups lookups) {
this.errors = errors;
this.lookups = lookups;
}
+ public void invalidate() {
+ valid = false;
+ }
+
public boolean hasAddedAspects() {
return aspects != null;
}
@@ -63,6 +69,8 @@
@SuppressWarnings("unchecked") // an InjectionListener<? super T> is an
InjectionListener<T>
public void register(InjectionListener<? super T> injectionListener) {
+ checkState(valid, "Encounters may not be used after hear() returns.");
+
if (injectionListeners == null) {
injectionListeners = Lists.newArrayList();
}
@@ -72,6 +80,8 @@
public void bindInterceptor(Matcher<? super Method> methodMatcher,
MethodInterceptor... interceptors) {
+ checkState(valid, "Encounters may not be used after hear() returns.");
+
// make sure the applicable aspects is mutable
if (aspects == null) {
aspects = Lists.newArrayList();
@@ -81,18 +91,22 @@
}
public void addError(String message, Object... arguments) {
+ checkState(valid, "Encounters may not be used after hear() returns.");
errors.addMessage(message, arguments);
}
public void addError(Throwable t) {
+ checkState(valid, "Encounters may not be used after hear() returns.");
errors.errorInUserCode(t, "An exception was caught and reported.
Message: %s", t.getMessage());
}
public void addError(Message message) {
+ checkState(valid, "Encounters may not be used after hear() returns.");
errors.addMessage(message);
}
public <T> Provider<T> getProvider(Key<T> key) {
+ checkState(valid, "Encounters may not be used after hear() returns.");
return lookups.getProvider(key);
}
@@ -101,6 +115,7 @@
}
public <T> MembersInjector<T> getMembersInjector(TypeLiteral<T>
typeLiteral) {
+ checkState(valid, "Encounters may not be used after hear() returns.");
return lookups.getMembersInjector(typeLiteral);
}
Modified: trunk/src/com/google/inject/MembersInjectorStore.java
==============================================================================
--- trunk/src/com/google/inject/MembersInjectorStore.java (original)
+++ trunk/src/com/google/inject/MembersInjectorStore.java Wed Apr 1
09:33:29 2009
@@ -100,6 +100,7 @@
}
}
}
+ encounter.invalidate();
errors.throwIfNewErrors(numErrorsBefore);
return
membersInjector.withListeners(encounter.getInjectionListeners());
Modified: trunk/src/com/google/inject/spi/InjectableType.java
==============================================================================
--- trunk/src/com/google/inject/spi/InjectableType.java (original)
+++ trunk/src/com/google/inject/spi/InjectableType.java Wed Apr 1 09:33:29
2009
@@ -148,7 +148,9 @@
/**
* Context of the injectable type encounter. Enables reporting errors,
registering injection
- * listeners and binding method interceptors for injectable type {...@code
I}.
+ * listeners and binding method interceptors for injectable type {...@code
I}. It is an error to use
+ * an encounter after the {...@link Listener#hear(InjectableType,Encounter)
hear()} method has
+ * returned.
*
* @param <I> the injectable type encountered
*/
Modified: trunk/test/com/google/inject/InjectableTypeListenerTest.java
==============================================================================
--- trunk/test/com/google/inject/InjectableTypeListenerTest.java
(original)
+++ trunk/test/com/google/inject/InjectableTypeListenerTest.java Wed Apr
1
09:33:29 2009
@@ -438,6 +438,59 @@
assertEquals(1, notificationCount.get());
}
+ public void testEncounterCannotBeUsedAfterHearReturns() {
+ final AtomicReference<Encounter<?>> encounterReference = new
AtomicReference<Encounter<?>>();
+
+ Guice.createInjector(new AbstractModule() {
+ protected void configure() {
+ bindListener(any(), new InjectableType.Listener() {
+ public <I> void hear(InjectableType<I> injectableType,
Encounter<I> encounter) {
+ encounterReference.set(encounter);
+ }
+ });
+
+ bind(C.class);
+ }
+ });
+ Encounter<?> encounter = encounterReference.get();
+
+ try {
+ encounter.register(new InjectionListener<Object>() {
+ public void afterInjection(Object injectee) {}
+ });
+ fail();
+ } catch (IllegalStateException expected) {
+ }
+
+ try {
+ encounter.bindInterceptor(any(), new MethodInterceptor() {
+ public Object invoke(MethodInvocation methodInvocation) throws
Throwable {
+ return methodInvocation.proceed();
+ }
+ });
+ fail();
+ } catch (IllegalStateException expected) {
+ }
+
+ try {
+ encounter.addError(new Exception());
+ fail();
+ } catch (IllegalStateException expected) {
+ }
+
+ try {
+ encounter.getMembersInjector(A.class);
+ fail();
+ } catch (IllegalStateException expected) {
+ }
+
+ try {
+ encounter.getProvider(B.class);
+ fail();
+ } catch (IllegalStateException expected) {
+ }
+ }
+
// TODO: recursively accessing a lookup should fail
static class A {
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---