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
-~----------~----~----~----~------~----~------~--~---

Reply via email to