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.