master moved from 338213332308 to ebe9f053ab24

10 new revisions:

Revision: 5e5e2f552430
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:04:18 2013 UTC
Log: Don't unnecessarily invoke Key#toString() when running in non-HTTP bas...
http://code.google.com/p/google-guice/source/detail?r=5e5e2f552430

Revision: 9b268e446775
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:04:48 2013 UTC
Log: Pass the correct stage to Modules.override, so currentStage() works....
http://code.google.com/p/google-guice/source/detail?r=9b268e446775

Revision: 72460885d36e
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:05:17 2013 UTC
Log:      Fix typo, alertnative -> alternative.  (Issue 777.)...
http://code.google.com/p/google-guice/source/detail?r=72460885d36e

Revision: c5848c0b57ad
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:05:44 2013 UTC
Log: Optimize RecordingBinder.withSource so it doesn't always create a new ...
http://code.google.com/p/google-guice/source/detail?r=c5848c0b57ad

Revision: be1bbda4ec75
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:06:12 2013 UTC
Log: Fix issue 748 -- add a protected method in PrivateModule for binding p...
http://code.google.com/p/google-guice/source/detail?r=be1bbda4ec75

Revision: a4c16e8b4526
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:06:40 2013 UTC
Log:      Rolled back commit -- broke some internal projects....
http://code.google.com/p/google-guice/source/detail?r=a4c16e8b4526

Revision: 32a8f2490a92
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:07:07 2013 UTC
Log:      Fix issue 720 -- minor build fixes, from the issue:...
http://code.google.com/p/google-guice/source/detail?r=32a8f2490a92

Revision: 3338a48b6abb
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:07:34 2013 UTC
Log: Fix issue 734 -- MapBinder doesn't allow injection of Map<K, javax.inj...
http://code.google.com/p/google-guice/source/detail?r=3338a48b6abb

Revision: 35023b810b1b
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:08:01 2013 UTC
Log: Fix issue 779 -- deduplicate listeners & interceptors. Using a slight...
http://code.google.com/p/google-guice/source/detail?r=35023b810b1b

Revision: ebe9f053ab24
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:08:25 2013 UTC
Log: Re-committed the rolled back CL, after fixing internal projects....
http://code.google.com/p/google-guice/source/detail?r=ebe9f053ab24

==============================================================================
Revision: 5e5e2f552430
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:04:18 2013 UTC
Log: Don't unnecessarily invoke Key#toString() when running in non-HTTP based RequestScope. Key#toString() is not memoized (unlike hashCode) and these allocations end up being consistently visible in our garbage sampling.
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=56861670

http://code.google.com/p/google-guice/source/detail?r=5e5e2f552430

Modified:
 /extensions/servlet/src/com/google/inject/servlet/ServletScopes.java

=======================================
--- /extensions/servlet/src/com/google/inject/servlet/ServletScopes.java Wed May 15 20:16:23 2013 UTC +++ /extensions/servlet/src/com/google/inject/servlet/ServletScopes.java Fri Dec 6 22:04:18 2013 UTC
@@ -65,7 +65,6 @@
    */
   public static final Scope REQUEST = new Scope() {
public <T> Provider<T> scope(final Key<T> key, final Provider<T> creator) {
-      final String name = key.toString();
       return new Provider<T>() {
         public T get() {
// Check if the alternate request scope should be used, if no HTTP
@@ -78,7 +77,7 @@
             Context context = requestScopeContext.get();
             if (null != context) {
               @SuppressWarnings("unchecked")
-              T t = (T) context.map.get(name);
+              T t = (T) context.map.get(key);

               // Accounts for @Nullable providers.
               if (NullObject.INSTANCE == t) {
@@ -89,7 +88,7 @@
                 t = creator.get();
                 if (!Scopes.isCircularProxy(t)) {
                   // Store a sentinel for provider-given null values.
- context.map.put(name, t != null ? t : NullObject.INSTANCE); + context.map.put(key, t != null ? t : NullObject.INSTANCE);
                 }
               }

@@ -109,6 +108,7 @@
             // GuiceFilter itself.
             return creator.get();
           }
+          String name = key.toString();
           synchronized (request) {
             Object obj = request.getAttribute(name);
             if (NullObject.INSTANCE == obj) {
@@ -328,7 +328,7 @@
     final Context context = new Context();
     for (Map.Entry<Key<?>, Object> entry : seedMap.entrySet()) {
Object value = validateAndCanonicalizeValue(entry.getKey(), entry.getValue());
-      context.map.put(entry.getKey().toString(), value);
+      context.map.put(entry.getKey(), value);
     }

     return new Callable<T>() {
@@ -360,7 +360,7 @@
   }

   private static class Context {
-    final Map<String, Object> map = Maps.newHashMap();
+    final Map<Key, Object> map = Maps.newHashMap();
     volatile Thread owner;

     <T> T call(Callable<T> callable) throws Exception {

==============================================================================
Revision: 9b268e446775
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:04:48 2013 UTC
Log: Pass the correct stage to Modules.override, so currentStage() works.
Fixes issue 784 -- patch thanks to Tavian Barnes.
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=57755697

http://code.google.com/p/google-guice/source/detail?r=9b268e446775

Modified:
 /core/src/com/google/inject/util/Modules.java
 /core/test/com/google/inject/util/OverrideModuleTest.java

=======================================
--- /core/src/com/google/inject/util/Modules.java Wed Nov 13 07:06:04 2013 UTC +++ /core/src/com/google/inject/util/Modules.java Fri Dec 6 22:04:48 2013 UTC
@@ -171,7 +171,7 @@
     @Override
     public void configure() {
       Binder baseBinder = binder();
-      List<Element> baseElements = Elements.getElements(baseModules);
+ List<Element> baseElements = Elements.getElements(currentStage(), baseModules);

       // If the sole element was a PrivateElements, we want to override
       // the private elements within that -- so refocus our elements
@@ -191,7 +191,7 @@

       final Binder binder = baseBinder.skipSources(this.getClass());
final LinkedHashSet<Element> elements = new LinkedHashSet<Element>(baseElements); - final List<Element> overrideElements = Elements.getElements(overrides); + final List<Element> overrideElements = Elements.getElements(currentStage(), overrides);

       final Set<Key<?>> overriddenKeys = Sets.newHashSet();
final Map<Class<? extends Annotation>, ScopeBinding> overridesScopeAnnotations =
=======================================
--- /core/test/com/google/inject/util/OverrideModuleTest.java Sat Oct 5 21:04:53 2013 UTC +++ /core/test/com/google/inject/util/OverrideModuleTest.java Fri Dec 6 22:04:48 2013 UTC
@@ -37,6 +37,7 @@
 import com.google.inject.Provides;
 import com.google.inject.Scope;
 import com.google.inject.ScopeAnnotation;
+import com.google.inject.Stage;
 import com.google.inject.name.Named;
 import com.google.inject.util.Modules;

@@ -657,5 +658,24 @@
       return new Object();
     }
   }
-
+
+  public void testCorrectStage() {
+    final Stage stage = Stage.PRODUCTION;
+    Module module = Modules.override(new AbstractModule() {
+      @Override
+      protected void configure() {
+        if (currentStage() != Stage.PRODUCTION) {
+          addError("Wronge stage in overridden module:" + currentStage());
+        }
+      }
+    }).with(new AbstractModule() {
+      @Override
+      protected void configure() {
+        if (currentStage() != Stage.PRODUCTION) {
+          addError("Wronge stage in overriding module:" + currentStage());
+        }
+      }
+    });
+    Guice.createInjector(stage, module);
+  }
 }

==============================================================================
Revision: 72460885d36e
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:05:17 2013 UTC
Log:      Fix typo, alertnative -> alternative.  (Issue 777.)
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=57755721

http://code.google.com/p/google-guice/source/detail?r=72460885d36e

Modified:
 /extensions/servlet/src/com/google/inject/servlet/ServletScopes.java

=======================================
--- /extensions/servlet/src/com/google/inject/servlet/ServletScopes.java Fri Dec 6 22:04:18 2013 UTC +++ /extensions/servlet/src/com/google/inject/servlet/ServletScopes.java Fri Dec 6 22:05:17 2013 UTC
@@ -52,7 +52,7 @@
   /**
* A threadlocal scope map for non-http request scopes. The {@link #REQUEST} * scope falls back to this scope map if no http request is available, and
-   * requires {@link #scopeRequest} to be called as an alertnative.
+   * requires {@link #scopeRequest} to be called as an alternative.
    */
   private static final ThreadLocal<Context> requestScopeContext
       = new ThreadLocal<Context>();

==============================================================================
Revision: c5848c0b57ad
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:05:44 2013 UTC
Log: Optimize RecordingBinder.withSource so it doesn't always create a new binder.
Fixes issue 776, patch thanks to Stuart McCulloch!
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=57757534

http://code.google.com/p/google-guice/source/detail?r=c5848c0b57ad

Modified:
 /core/src/com/google/inject/internal/Errors.java
 /core/src/com/google/inject/spi/Elements.java

=======================================
--- /core/src/com/google/inject/internal/Errors.java Sat Oct 5 21:04:53 2013 UTC +++ /core/src/com/google/inject/internal/Errors.java Fri Dec 6 22:05:44 2013 UTC
@@ -115,7 +115,7 @@
* Returns an instance that uses {@code source} as a reference point for newly added errors.
    */
   public Errors withSource(Object source) {
-    return source == SourceProvider.UNKNOWN_SOURCE
+    return source == this.source || source == SourceProvider.UNKNOWN_SOURCE
         ? this
         : new Errors(this, source);
   }
=======================================
--- /core/src/com/google/inject/spi/Elements.java Sat Oct 5 21:05:39 2013 UTC +++ /core/src/com/google/inject/spi/Elements.java Fri Dec 6 22:05:44 2013 UTC
@@ -325,7 +325,7 @@
     }

     public RecordingBinder withSource(final Object source) {
-      return new RecordingBinder(this, source, null);
+ return source == this.source ? this : new RecordingBinder(this, source, null);
     }

     public RecordingBinder skipSources(Class... classesToSkip) {

==============================================================================
Revision: be1bbda4ec75
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:06:12 2013 UTC
Log: Fix issue 748 -- add a protected method in PrivateModule for binding provision
listeners.  Patch provided by Stuart McCulloch, thanks!
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=57764090

http://code.google.com/p/google-guice/source/detail?r=be1bbda4ec75

Modified:
 /core/src/com/google/inject/PrivateModule.java
 /core/test/com/google/inject/ProvisionListenerTest.java

=======================================
--- /core/src/com/google/inject/PrivateModule.java Tue Oct 18 20:43:18 2011 UTC +++ /core/src/com/google/inject/PrivateModule.java Fri Dec 6 22:06:12 2013 UTC
@@ -24,6 +24,7 @@
 import com.google.inject.binder.LinkedBindingBuilder;
 import com.google.inject.matcher.Matcher;
 import com.google.inject.spi.Message;
+import com.google.inject.spi.ProvisionListener;
 import com.google.inject.spi.TypeConverter;
 import com.google.inject.spi.TypeListener;

@@ -293,4 +294,12 @@
       TypeListener listener) {
     binder().bindListener(typeMatcher, listener);
   }
+
+  /**
+   * @see Binder#bindListener(Matcher, ProvisionListener...)
+   */
+  protected void bindListener(Matcher<? super Binding<?>> bindingMatcher,
+      ProvisionListener... listeners) {
+    binder().bindListener(bindingMatcher, listeners);
+  }
 }
=======================================
--- /core/test/com/google/inject/ProvisionListenerTest.java Thu Jun 27 00:43:11 2013 UTC +++ /core/test/com/google/inject/ProvisionListenerTest.java Fri Dec 6 22:06:12 2013 UTC
@@ -44,6 +44,7 @@
  *
  * @author [email protected] (Sam Berlin)
  */
+// TODO(sameb): Add some tests for private modules & child injectors.
 public class ProvisionListenerTest extends TestCase {

   public void testExceptionInListenerBeforeProvisioning() {

==============================================================================
Revision: a4c16e8b4526
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:06:40 2013 UTC
Log:      Rolled back commit -- broke some internal projects.

*** Original change description ***

Pass the correct stage to Modules.override, so currentStage() works.
Fixes issue 784 -- patch thanks to Tavian Barnes.

***
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=57770628

http://code.google.com/p/google-guice/source/detail?r=a4c16e8b4526

Modified:
 /core/src/com/google/inject/util/Modules.java
 /core/test/com/google/inject/util/OverrideModuleTest.java

=======================================
--- /core/src/com/google/inject/util/Modules.java Fri Dec 6 22:04:48 2013 UTC +++ /core/src/com/google/inject/util/Modules.java Fri Dec 6 22:06:40 2013 UTC
@@ -171,7 +171,7 @@
     @Override
     public void configure() {
       Binder baseBinder = binder();
- List<Element> baseElements = Elements.getElements(currentStage(), baseModules);
+      List<Element> baseElements = Elements.getElements(baseModules);

       // If the sole element was a PrivateElements, we want to override
       // the private elements within that -- so refocus our elements
@@ -191,7 +191,7 @@

       final Binder binder = baseBinder.skipSources(this.getClass());
final LinkedHashSet<Element> elements = new LinkedHashSet<Element>(baseElements); - final List<Element> overrideElements = Elements.getElements(currentStage(), overrides); + final List<Element> overrideElements = Elements.getElements(overrides);

       final Set<Key<?>> overriddenKeys = Sets.newHashSet();
final Map<Class<? extends Annotation>, ScopeBinding> overridesScopeAnnotations =
=======================================
--- /core/test/com/google/inject/util/OverrideModuleTest.java Fri Dec 6 22:04:48 2013 UTC +++ /core/test/com/google/inject/util/OverrideModuleTest.java Fri Dec 6 22:06:40 2013 UTC
@@ -37,7 +37,6 @@
 import com.google.inject.Provides;
 import com.google.inject.Scope;
 import com.google.inject.ScopeAnnotation;
-import com.google.inject.Stage;
 import com.google.inject.name.Named;
 import com.google.inject.util.Modules;

@@ -658,24 +657,5 @@
       return new Object();
     }
   }
-
-  public void testCorrectStage() {
-    final Stage stage = Stage.PRODUCTION;
-    Module module = Modules.override(new AbstractModule() {
-      @Override
-      protected void configure() {
-        if (currentStage() != Stage.PRODUCTION) {
-          addError("Wronge stage in overridden module:" + currentStage());
-        }
-      }
-    }).with(new AbstractModule() {
-      @Override
-      protected void configure() {
-        if (currentStage() != Stage.PRODUCTION) {
-          addError("Wronge stage in overriding module:" + currentStage());
-        }
-      }
-    });
-    Guice.createInjector(stage, module);
-  }
+
 }

==============================================================================
Revision: 32a8f2490a92
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:07:07 2013 UTC
Log:      Fix issue 720 -- minor build fixes, from the issue:
* Add macros to append no_aop to the Bundle-(Symbolic)Name to help disambiguate
these bundles in OSGi
* Fix some broken links in the Maven POM
(The API version was already incremented.)

Patch from Stuart McCulloch, thanks Stuart!
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=57798649

http://code.google.com/p/google-guice/source/detail?r=32a8f2490a92

Modified:
 /build.xml
 /common.xml
 /core/pom.xml
 /pom.xml

=======================================
--- /build.xml  Sat Oct  5 21:05:39 2013 UTC
+++ /build.xml  Fri Dec  6 22:07:07 2013 UTC
@@ -264,6 +264,9 @@
         <include name="NOTICE"/>
       </zipfileset>]]></replacetoken>
     </replace>
+ <replace file="build/no_aop/common.xml" value='Bundle-Name" value="$${ant.project.name} (no_aop)'> + <replacetoken><![CDATA[Bundle-Name" value="${ant.project.name}]]></replacetoken>
+    </replace>
   </target>

   <target name="clean.all"
=======================================
--- /common.xml Thu May 16 00:32:52 2013 UTC
+++ /common.xml Fri Dec  6 22:07:07 2013 UTC
@@ -7,7 +7,7 @@
   <!-- can be overridden at the command line with -Dversion=
        or in IDEA, in the ant properties dialog -->
   <property name="version" value="snapshot"/>
-  <property name="api.version" value="1.3"/>
+  <property name="api.version" value="1.4"/>

   <target name="compile" description="Compile Java source.">
     <mkdir dir="${build.dir}/classes"/>
=======================================
--- /core/pom.xml       Thu Aug  1 01:53:09 2013 UTC
+++ /core/pom.xml       Fri Dec  6 22:07:07 2013 UTC
@@ -106,6 +106,7 @@
         <artifactId>maven-bundle-plugin</artifactId>
         <configuration>
           <instructions>
+ <Bundle-Name>${project.artifactId}$(if;$(classes;NAMED;*.MethodAspect);; (no_aop))</Bundle-Name>
             <Eclipse-ExtensibleAPI>true</Eclipse-ExtensibleAPI>
           </instructions>
         </configuration>
=======================================
--- /pom.xml    Wed Nov 13 07:06:31 2013 UTC
+++ /pom.xml    Fri Dec  6 22:07:07 2013 UTC
@@ -61,9 +61,9 @@
   </mailingLists>

   <scm>
- <connection>scm:svn:http://google-guice.googlecode.com/svn/trunk</connection> - <developerConnection>scm:svn:https://google-guice.googlecode.com/svn/trunk</developerConnection>
-    <url>http://code.google.com/p/google-guice/source/browse</url>
+ <connection>scm:git:https://code.google.com/p/google-guice/</connection> + <developerConnection>scm:git:https://code.google.com/p/google-guice/</developerConnection>
+    <url>https://code.google.com/p/google-guice/</url>
   </scm>

   <issueManagement>
@@ -73,7 +73,7 @@

   <ciManagement>
     <system>Hudson</system>
-    <url>https://grid.sonatype.org/ci/job/Google-Guice/</url>
+    <url>https://grid.sonatype.org/ci/job/google-guice/</url>
   </ciManagement>

   <licenses>

==============================================================================
Revision: 3338a48b6abb
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:07:34 2013 UTC
Log: Fix issue 734 -- MapBinder doesn't allow injection of Map<K, javax.inject.Provider<V>>.
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=57798745

http://code.google.com/p/google-guice/source/detail?r=3338a48b6abb

Modified:
/extensions/multibindings/src/com/google/inject/multibindings/MapBinder.java /extensions/multibindings/test/com/google/inject/multibindings/MapBinderTest.java /extensions/multibindings/test/com/google/inject/multibindings/SpiUtils.java

=======================================
--- /extensions/multibindings/src/com/google/inject/multibindings/MapBinder.java Wed Sep 18 17:55:21 2013 UTC +++ /extensions/multibindings/src/com/google/inject/multibindings/MapBinder.java Fri Dec 6 22:07:34 2013 UTC
@@ -22,6 +22,7 @@
import static com.google.inject.multibindings.Multibinder.checkConfiguration;
 import static com.google.inject.multibindings.Multibinder.checkNotNull;
 import static com.google.inject.multibindings.Multibinder.setOf;
+import static com.google.inject.util.Types.newParameterizedType;
 import static com.google.inject.util.Types.newParameterizedTypeWithOwner;

 import com.google.common.collect.ImmutableList;
@@ -211,6 +212,15 @@
     return (TypeLiteral<Map<K, Provider<V>>>) TypeLiteral.get(
Types.mapOf(keyType.getType(), Types.providerOf(valueType.getType())));
   }
+
+  // provider map <K, V> is safely a Map<K, javax.inject.Provider<V>>>
+  @SuppressWarnings("unchecked")
+ static <K, V> TypeLiteral<Map<K, javax.inject.Provider<V>>> mapOfJavaxProviderOf(
+      TypeLiteral<K> keyType, TypeLiteral<V> valueType) {
+    return (TypeLiteral<Map<K, javax.inject.Provider<V>>>) TypeLiteral.get(
+        Types.mapOf(keyType.getType(),
+ newParameterizedType(javax.inject.Provider.class, valueType.getType())));
+  }

@SuppressWarnings("unchecked") // a provider map <K, Set<V>> is safely a Map<K, Set<Provider<V>>>
   static <K, V> TypeLiteral<Map<K, Set<Provider<V>>>> mapOfSetOfProviderOf(
@@ -296,6 +306,7 @@
     private final TypeLiteral<K> keyType;
     private final TypeLiteral<V> valueType;
     private final Key<Map<K, V>> mapKey;
+ private final Key<Map<K, javax.inject.Provider<V>>> javaxProviderMapKey;
     private final Key<Map<K, Provider<V>>> providerMapKey;
     private final Key<Map<K, Set<V>>> multimapKey;
     private final Key<Map<K, Set<Provider<V>>>> providerMultimapKey;
@@ -315,6 +326,7 @@
       this.valueType = valueType;
       this.mapKey = mapKey;
       this.providerMapKey = providerMapKey;
+ this.javaxProviderMapKey = providerMapKey.ofType(mapOfJavaxProviderOf(keyType, valueType));
       this.multimapKey = multimapKey;
       this.providerMultimapKey = providerMultimapKey;
this.entrySetBinder = (RealMultibinder<Entry<K, Provider<V>>>) entrySetBinder;
@@ -354,7 +366,9 @@
// Binds a Map<K, Provider<V>> from a collection of Set<Entry<K, Provider<V>>.
       final Provider<Set<Entry<K, Provider<V>>>> entrySetProvider = binder
           .getProvider(entrySetBinder.getSetKey());
- binder.bind(providerMapKey).toProvider(new RealMapBinderProviderWithDependencies<Map<K, Provider<V>>>(mapKey) {
+
+      binder.bind(providerMapKey).toProvider(
+ new RealMapBinderProviderWithDependencies<Map<K, Provider<V>>>(mapKey) {
         private Map<K, Provider<V>> providerMap;

         @Toolable @Inject void initialize(Injector injector) {
@@ -384,6 +398,13 @@
           return dependencies;
         }
       });
+
+ // The map this exposes is internally an ImmutableMap, so it's OK to massage + // the guice Provider to javax Provider in the value (since Guice provider
+      // implements javax Provider).
+      @SuppressWarnings("unchecked")
+      Key massagedProviderMapKey = (Key)providerMapKey;
+      binder.bind(javaxProviderMapKey).to(massagedProviderMapKey);

final Provider<Map<K, Provider<V>>> mapProvider = binder.getProvider(providerMapKey); binder.bind(mapKey).toProvider(new RealMapWithExtensionProvider<Map<K, V>>(mapKey) {
@@ -457,6 +478,7 @@

             return key.equals(mapKey)
                 || key.equals(providerMapKey)
+                || key.equals(javaxProviderMapKey)
                 || key.equals(multimapKey)
                 || key.equals(providerMultimapKey)
                 || key.equals(entrySetBinder.getSetKey())
=======================================
--- /extensions/multibindings/test/com/google/inject/multibindings/MapBinderTest.java Wed Sep 18 17:55:21 2013 UTC +++ /extensions/multibindings/test/com/google/inject/multibindings/MapBinderTest.java Fri Dec 6 22:07:34 2013 UTC
@@ -71,6 +71,10 @@
  */
 public class MapBinderTest extends TestCase {

+ final TypeLiteral<Map<String, javax.inject.Provider<String>>> mapOfStringJavaxProvider =
+      new TypeLiteral<Map<String, javax.inject.Provider<String>>>() {};
+  final TypeLiteral<Map<String, Provider<String>>> mapOfStringProvider =
+      new TypeLiteral<Map<String, Provider<String>>>() {};
final TypeLiteral<Map<String, String>> mapOfString = new TypeLiteral<Map<String, String>>() {}; final TypeLiteral<Map<String, Integer>> mapOfInteger = new TypeLiteral<Map<String, Integer>>() {};
   final TypeLiteral<Map<String, Set<String>>> mapOfSetOfString =
@@ -105,6 +109,10 @@
assertEquals(mapOf("a", "A", "b", "B", "c", "C", "d", "D", "e", "E"), abcde); assertMapVisitor(Key.get(mapOfString), stringType, stringType, setOf(abc, de), BOTH, false, 0, instance("a", "A"), instance("b", "B"), instance("c", "C"), instance("d", "D"), instance("e", "E"));
+
+    // just make sure these succeed
+    injector.getInstance(Key.get(mapOfStringProvider));
+    injector.getInstance(Key.get(mapOfStringJavaxProvider));
   }

   public void testMapBinderAggregationForAnnotationInstance() {
@@ -127,6 +135,10 @@
     assertEquals(mapOf("a", "A", "b", "B", "c", "C"), abc);
assertMapVisitor(key, stringType, stringType, setOf(module), BOTH, false, 0,
         instance("a", "A"), instance("b", "B"), instance("c", "C"));
+
+    // just make sure these succeed
+    injector.getInstance(Key.get(mapOfStringProvider, Names.named("abc")));
+ injector.getInstance(Key.get(mapOfStringJavaxProvider, Names.named("abc")));
   }

   public void testMapBinderAggregationForAnnotationType() {
@@ -149,6 +161,10 @@
     assertEquals(mapOf("a", "A", "b", "B", "c", "C"), abc);
assertMapVisitor(key, stringType, stringType, setOf(module), BOTH, false, 0,
         instance("a", "A"), instance("b", "B"), instance("c", "C"));
+
+    // just make sure these succeed
+    injector.getInstance(Key.get(mapOfStringProvider, Abc.class));
+    injector.getInstance(Key.get(mapOfStringJavaxProvider, Abc.class));
   }

   public void testMapBinderWithMultipleAnnotationValueSets() {
@@ -178,6 +194,12 @@
         instance("a", "A"), instance("b", "B"), instance("c", "C"));
assertMapVisitor(deKey, stringType, stringType, setOf(module), BOTH, false, 1,
         instance("d", "D"), instance("e", "E"));
+
+    // just make sure these succeed
+    injector.getInstance(Key.get(mapOfStringProvider, named("abc")));
+    injector.getInstance(Key.get(mapOfStringJavaxProvider, named("abc")));
+    injector.getInstance(Key.get(mapOfStringProvider, named("de")));
+    injector.getInstance(Key.get(mapOfStringJavaxProvider, named("de")));
   }

   public void testMapBinderWithMultipleAnnotationTypeSets() {
@@ -207,6 +229,12 @@
         instance("a", "A"), instance("b", "B"), instance("c", "C"));
assertMapVisitor(deKey, stringType, stringType, setOf(module), BOTH, false, 1,
         instance("d", "D"), instance("e", "E"));
+
+    // just make sure these succeed
+    injector.getInstance(Key.get(mapOfStringProvider, Abc.class));
+    injector.getInstance(Key.get(mapOfStringJavaxProvider, Abc.class));
+    injector.getInstance(Key.get(mapOfStringProvider, De.class));
+    injector.getInstance(Key.get(mapOfStringJavaxProvider, De.class));
   }

   public void testMapBinderWithMultipleTypes() {
=======================================
--- /extensions/multibindings/test/com/google/inject/multibindings/SpiUtils.java Wed Sep 18 17:55:21 2013 UTC +++ /extensions/multibindings/test/com/google/inject/multibindings/SpiUtils.java Fri Dec 6 22:07:34 2013 UTC
@@ -18,6 +18,7 @@

 import static com.google.inject.multibindings.MapBinder.entryOfProviderOf;
 import static com.google.inject.multibindings.MapBinder.mapOf;
+import static com.google.inject.multibindings.MapBinder.mapOfJavaxProviderOf;
 import static com.google.inject.multibindings.MapBinder.mapOfProviderOf;
import static com.google.inject.multibindings.MapBinder.mapOfSetOfProviderOf;
 import static com.google.inject.multibindings.Multibinder.setOf;
@@ -153,11 +154,13 @@
fail("Found all entries of: " + mapResults + ", but more were left over: " + entries);
     }

- Key<?> mapOfProvider = adapt(mapKey, mapOfProviderOf(keyType, valueType)); - Key<?> mapOfSetOfProvider = adapt(mapKey, mapOfSetOfProviderOf(keyType, valueType));
-    Key<?> mapOfSet = adapt(mapKey, mapOf(keyType, setOf(valueType)));
- Key<?> setOfEntry = adapt(mapKey, setOf(entryOfProviderOf(keyType, valueType))); + Key<?> mapOfJavaxProvider = mapKey.ofType(mapOfJavaxProviderOf(keyType, valueType)); + Key<?> mapOfProvider = mapKey.ofType(mapOfProviderOf(keyType, valueType)); + Key<?> mapOfSetOfProvider = mapKey.ofType(mapOfSetOfProviderOf(keyType, valueType));
+    Key<?> mapOfSet = mapKey.ofType(mapOf(keyType, setOf(valueType)));
+ Key<?> setOfEntry = mapKey.ofType(setOf(entryOfProviderOf(keyType, valueType)));
     boolean entrySetMatch = false;
+    boolean mapJavaxProviderMatch = false;
     boolean mapProviderMatch = false;
     boolean mapSetMatch = false;
     boolean mapSetProviderMatch = false;
@@ -175,6 +178,9 @@
       } else if(b.getKey().equals(mapOfProvider)) {
         assertTrue(contains);
         mapProviderMatch = true;
+      } else if (b.getKey().equals(mapOfJavaxProvider)) {
+        assertTrue(contains);
+        mapJavaxProviderMatch = true;
       } else if(b.getKey().equals(mapOfSet)) {
         assertTrue(contains);
         mapSetMatch = true;
@@ -199,22 +205,12 @@
assertEquals("Incorrect other matches: " + otherMatches, mapResults.size(), sizeOfOther);
     assertTrue(entrySetMatch);
     assertTrue(mapProviderMatch);
+    assertTrue(mapJavaxProviderMatch);
     assertEquals(allowDuplicates, mapSetMatch);
     assertEquals(allowDuplicates, mapSetProviderMatch);
assertEquals("other MapBindings found: " + otherMapBindings, expectedMapBindings,
         otherMapBindings.size());
   }
-
- /** Adapts a key, keeping the original annotation, using the new type literal. */
-  private static Key<?> adapt(Key<?> mapKey, TypeLiteral<?> resultType) {
-    if(mapKey.getAnnotation() != null) {
-      return Key.get(resultType, mapKey.getAnnotation());
-    } else if(mapKey.getAnnotationType() != null) {
-      return Key.get(resultType, mapKey.getAnnotationType());
-    } else {
-      return Key.get(resultType);
-    }
-  }

   @SuppressWarnings("unchecked")
private static <T> void mapModuleTest(Key<T> mapKey, TypeLiteral<?> keyType,
@@ -235,10 +231,10 @@
     assertEquals(valueType, mapbinder.getValueTypeLiteral());
     List<MapResult> mapResults = Lists.newArrayList(results);

- Key<?> mapOfProvider = adapt(mapKey, mapOfProviderOf(keyType, valueType)); - Key<?> mapOfSetOfProvider = adapt(mapKey, mapOfSetOfProviderOf(keyType, valueType));
-    Key<?> mapOfSet = adapt(mapKey, mapOf(keyType, setOf(valueType)));
- Key<?> setOfEntry = adapt(mapKey, setOf(entryOfProviderOf(keyType, valueType))); + Key<?> mapOfProvider = mapKey.ofType(mapOfProviderOf(keyType, valueType)); + Key<?> mapOfSetOfProvider = mapKey.ofType(mapOfSetOfProviderOf(keyType, valueType));
+    Key<?> mapOfSet = mapKey.ofType(mapOf(keyType, setOf(valueType)));
+ Key<?> setOfEntry = mapKey.ofType(setOf(entryOfProviderOf(keyType, valueType)));
     boolean entrySetMatch = false;
     boolean mapProviderMatch = false;
     boolean mapSetMatch = false;

==============================================================================
Revision: 35023b810b1b
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:08:01 2013 UTC
Log: Fix issue 779 -- deduplicate listeners & interceptors. Using a slightly modified patch from Tavian Barnes, thanks Tavian!
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=57798796

http://code.google.com/p/google-guice/source/detail?r=35023b810b1b

Modified:
 /core/src/com/google/inject/internal/EncounterImpl.java
 /core/src/com/google/inject/internal/MembersInjectorImpl.java
 /core/src/com/google/inject/internal/MembersInjectorStore.java
 /core/src/com/google/inject/internal/ProvisionListenerStackCallback.java
 /core/src/com/google/inject/internal/ProxyFactory.java
 /core/test/com/google/inject/MethodInterceptionTest.java
 /core/test/com/google/inject/ProvisionListenerTest.java
 /core/test/com/google/inject/TypeListenerTest.java

=======================================
--- /core/src/com/google/inject/internal/EncounterImpl.java Fri Jul 8 00:34:16 2011 UTC +++ /core/src/com/google/inject/internal/EncounterImpl.java Fri Dec 6 22:08:01 2013 UTC
@@ -19,6 +19,7 @@
 import static com.google.common.base.Preconditions.checkState;

 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.inject.Key;
 import com.google.inject.MembersInjector;
@@ -76,16 +77,16 @@
   }
   /*end[AOP]*/

-  ImmutableList<MembersInjector<? super T>> getMembersInjectors() {
+  ImmutableSet<MembersInjector<? super T>> getMembersInjectors() {
     return membersInjectors == null
-        ? ImmutableList.<MembersInjector<? super T>>of()
-        : ImmutableList.copyOf(membersInjectors);
+        ? ImmutableSet.<MembersInjector<? super T>>of()
+        : ImmutableSet.copyOf(membersInjectors);
   }

-  ImmutableList<InjectionListener<? super T>> getInjectionListeners() {
+  ImmutableSet<InjectionListener<? super T>> getInjectionListeners() {
     return injectionListeners == null
-        ? ImmutableList.<InjectionListener<? super T>>of()
-        : ImmutableList.copyOf(injectionListeners);
+        ? ImmutableSet.<InjectionListener<? super T>>of()
+        : ImmutableSet.copyOf(injectionListeners);
   }

   public void register(MembersInjector<? super T> membersInjector) {
=======================================
--- /core/src/com/google/inject/internal/MembersInjectorImpl.java Thu Jun 27 00:43:11 2013 UTC +++ /core/src/com/google/inject/internal/MembersInjectorImpl.java Fri Dec 6 22:08:01 2013 UTC
@@ -34,8 +34,8 @@
   private final TypeLiteral<T> typeLiteral;
   private final InjectorImpl injector;
   private final ImmutableList<SingleMemberInjector> memberInjectors;
- private final ImmutableList<MembersInjector<? super T>> userMembersInjectors; - private final ImmutableList<InjectionListener<? super T>> injectionListeners; + private final ImmutableSet<MembersInjector<? super T>> userMembersInjectors; + private final ImmutableSet<InjectionListener<? super T>> injectionListeners;
   /*if[AOP]*/
   private final ImmutableList<MethodAspect> addedAspects;
   /*end[AOP]*/
@@ -135,9 +135,7 @@

// TODO: There's no way to know if a user's MembersInjector wants toolable injections.
     if(!toolableOnly) {
- // optimization: use manual for/each to save allocating an iterator here
-      for (int i = 0, size = userMembersInjectors.size(); i < size; i++) {
- MembersInjector<? super T> userMembersInjector = userMembersInjectors.get(i); + for (MembersInjector<? super T> userMembersInjector : userMembersInjectors) {
         try {
           userMembersInjector.injectMembers(t);
         } catch (RuntimeException e) {
=======================================
--- /core/src/com/google/inject/internal/MembersInjectorStore.java Fri Jul 8 00:34:16 2011 UTC +++ /core/src/com/google/inject/internal/MembersInjectorStore.java Fri Dec 6 22:08:01 2013 UTC
@@ -18,9 +18,11 @@

 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import com.google.inject.ConfigurationException;
 import com.google.inject.TypeLiteral;
 import com.google.inject.spi.InjectionPoint;
+import com.google.inject.spi.TypeListener;
 import com.google.inject.spi.TypeListenerBinding;

 import java.lang.reflect.Field;
@@ -97,12 +99,15 @@
     errors.throwIfNewErrors(numErrorsBefore);

EncounterImpl<T> encounter = new EncounterImpl<T>(errors, injector.lookups);
-    for (TypeListenerBinding typeListener : typeListenerBindings) {
-      if (typeListener.getTypeMatcher().matches(type)) {
+    Set<TypeListener> alreadySeenListeners = Sets.newHashSet();
+    for (TypeListenerBinding binding : typeListenerBindings) {
+      TypeListener typeListener = binding.getListener();
+ if (!alreadySeenListeners.contains(typeListener) && binding.getTypeMatcher().matches(type)) {
+        alreadySeenListeners.add(typeListener);
         try {
-          typeListener.getListener().hear(type, encounter);
+          typeListener.hear(type, encounter);
         } catch (RuntimeException e) {
-          errors.errorNotifyingTypeListener(typeListener, type, e);
+          errors.errorNotifyingTypeListener(binding, type, e);
         }
       }
     }
=======================================
--- /core/src/com/google/inject/internal/ProvisionListenerStackCallback.java Thu Jun 27 00:43:11 2013 UTC +++ /core/src/com/google/inject/internal/ProvisionListenerStackCallback.java Fri Dec 6 22:08:01 2013 UTC
@@ -17,12 +17,14 @@
 package com.google.inject.internal;

 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
 import com.google.inject.Binding;
 import com.google.inject.ProvisionException;
 import com.google.inject.spi.DependencyAndSource;
 import com.google.inject.spi.ProvisionListener;

 import java.util.List;
+import java.util.Set;

 /**
  * Intercepts provisions with a stack of listeners.
@@ -49,7 +51,8 @@
     if (listeners.isEmpty()) {
       this.listeners = EMPTY_LISTENER;
     } else {
- this.listeners = listeners.toArray(new ProvisionListener[listeners.size()]); + Set<ProvisionListener> deDuplicated = Sets.newLinkedHashSet(listeners); + this.listeners = deDuplicated.toArray(new ProvisionListener[deDuplicated.size()]);
     }
   }

=======================================
--- /core/src/com/google/inject/internal/ProxyFactory.java Mon Feb 27 02:24:52 2012 UTC +++ /core/src/com/google/inject/internal/ProxyFactory.java Fri Dec 6 22:08:01 2013 UTC
@@ -20,6 +20,7 @@

 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.inject.spi.InjectionPoint;
@@ -135,8 +136,10 @@
         interceptorsMapBuilder = ImmutableMap.builder();
       }

- interceptorsMapBuilder.put(pair.method, ImmutableList.copyOf(pair.interceptors)); - callbacks[i] = new InterceptorStackCallback(pair.method, pair.interceptors);
+      ImmutableList<MethodInterceptor> deDuplicated =
+          ImmutableSet.copyOf(pair.interceptors).asList();
+      interceptorsMapBuilder.put(pair.method, deDuplicated);
+ callbacks[i] = new InterceptorStackCallback(pair.method, deDuplicated);
     }

     interceptors = interceptorsMapBuilder != null
=======================================
--- /core/test/com/google/inject/MethodInterceptionTest.java Mon Feb 27 02:24:52 2012 UTC +++ /core/test/com/google/inject/MethodInterceptionTest.java Fri Dec 6 22:08:01 2013 UTC
@@ -313,4 +313,17 @@
     }
   }

+  public void testDeDuplicateInterceptors() throws Exception {
+    Injector injector = Guice.createInjector(new AbstractModule() {
+      @Override protected void configure() {
+        CountingInterceptor interceptor = new CountingInterceptor();
+        bindInterceptor(Matchers.any(), Matchers.any(), interceptor);
+        bindInterceptor(Matchers.any(), Matchers.any(), interceptor);
+      }
+    });
+
+ Interceptable interceptable = injector.getInstance(Interceptable.class);
+    interceptable.foo();
+    assertEquals(1, count.get());
+  }
 }
=======================================
--- /core/test/com/google/inject/ProvisionListenerTest.java Fri Dec 6 22:06:12 2013 UTC +++ /core/test/com/google/inject/ProvisionListenerTest.java Fri Dec 6 22:08:01 2013 UTC
@@ -695,4 +695,17 @@
       this.x = xProvider.get();
     }
   }
+
+  public void testDeDuplicateProvisionListeners() {
+    final Counter counter = new Counter();
+    Injector injector = Guice.createInjector(new AbstractModule() {
+      @Override
+      protected void configure() {
+        bindListener(Matchers.any(), counter);
+        bindListener(Matchers.any(), counter);
+      }
+    });
+    injector.getInstance(Many.class);
+    assertEquals("ProvisionListener not de-duplicated", 1, counter.count);
+  }
 }
=======================================
--- /core/test/com/google/inject/TypeListenerTest.java Sat Oct 5 21:05:39 2013 UTC +++ /core/test/com/google/inject/TypeListenerTest.java Fri Dec 6 22:08:01 2013 UTC
@@ -629,6 +629,49 @@
           "4 errors");
     }
   }
+
+ private static class CountingMembersInjector implements MembersInjector<D> {
+    public void injectMembers(D instance) {
+      ++instance.userInjected;
+    }
+  }
+
+ private static class CountingInjectionListener implements InjectionListener<D> {
+    public void afterInjection(D injectee) {
+      ++injectee.listenersNotified;
+    }
+  }
+
+  private static class DuplicatingTypeListener implements TypeListener {
+    int count = 0;
+
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) {
+      ++count;
+
+      MembersInjector membersInjector = new CountingMembersInjector();
+      encounter.register(membersInjector);
+      encounter.register(membersInjector);
+
+ InjectionListener injectionListener = new CountingInjectionListener();
+      encounter.register(injectionListener);
+      encounter.register(injectionListener);
+    }
+  }
+
+  public void testDeDuplicateTypeListeners() {
+ final DuplicatingTypeListener typeListener = new DuplicatingTypeListener();
+    Injector injector = Guice.createInjector(new AbstractModule() {
+      @Override
+      protected void configure() {
+        bindListener(any(), typeListener);
+        bindListener(only(new TypeLiteral<D>() {}), typeListener);
+      }
+    });
+    D d = injector.getInstance(D.class);
+    d.assertAllCounts(1);
+    assertEquals(1, typeListener.count);
+  }

   // TODO: recursively accessing a lookup should fail


==============================================================================
Revision: ebe9f053ab24
Author:   Sam Berlin <[email protected]>
Date:     Fri Dec  6 22:08:25 2013 UTC
Log:      Re-committed the rolled back CL, after fixing internal projects.

*** Original change description ***

Pass the correct stage to Modules.override, so currentStage() works.
Fixes issue 784 -- patch thanks to Tavian Barnes.

***
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=57809778

http://code.google.com/p/google-guice/source/detail?r=ebe9f053ab24

Modified:
 /core/src/com/google/inject/util/Modules.java
 /core/test/com/google/inject/util/OverrideModuleTest.java

=======================================
--- /core/src/com/google/inject/util/Modules.java Fri Dec 6 22:06:40 2013 UTC +++ /core/src/com/google/inject/util/Modules.java Fri Dec 6 22:08:25 2013 UTC
@@ -171,7 +171,7 @@
     @Override
     public void configure() {
       Binder baseBinder = binder();
-      List<Element> baseElements = Elements.getElements(baseModules);
+ List<Element> baseElements = Elements.getElements(currentStage(), baseModules);

       // If the sole element was a PrivateElements, we want to override
       // the private elements within that -- so refocus our elements
@@ -191,7 +191,7 @@

       final Binder binder = baseBinder.skipSources(this.getClass());
final LinkedHashSet<Element> elements = new LinkedHashSet<Element>(baseElements); - final List<Element> overrideElements = Elements.getElements(overrides); + final List<Element> overrideElements = Elements.getElements(currentStage(), overrides);

       final Set<Key<?>> overriddenKeys = Sets.newHashSet();
final Map<Class<? extends Annotation>, ScopeBinding> overridesScopeAnnotations =
=======================================
--- /core/test/com/google/inject/util/OverrideModuleTest.java Fri Dec 6 22:06:40 2013 UTC +++ /core/test/com/google/inject/util/OverrideModuleTest.java Fri Dec 6 22:08:25 2013 UTC
@@ -37,6 +37,7 @@
 import com.google.inject.Provides;
 import com.google.inject.Scope;
 import com.google.inject.ScopeAnnotation;
+import com.google.inject.Stage;
 import com.google.inject.name.Named;
 import com.google.inject.util.Modules;

@@ -657,5 +658,24 @@
       return new Object();
     }
   }
-
+
+  public void testCorrectStage() {
+    final Stage stage = Stage.PRODUCTION;
+    Module module = Modules.override(new AbstractModule() {
+      @Override
+      protected void configure() {
+        if (currentStage() != Stage.PRODUCTION) {
+          addError("Wronge stage in overridden module:" + currentStage());
+        }
+      }
+    }).with(new AbstractModule() {
+      @Override
+      protected void configure() {
+        if (currentStage() != Stage.PRODUCTION) {
+          addError("Wronge stage in overriding module:" + currentStage());
+        }
+      }
+    });
+    Guice.createInjector(stage, module);
+  }
 }

--
You received this message because you are subscribed to the Google Groups 
"google-guice-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/google-guice-dev.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to