Author: limpbizkit
Date: Sun Dec 28 21:21:16 2008
New Revision: 747
Modified:
trunk/extensions/assistedinject/assistedinject.iml
trunk/extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider.java
trunk/extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider2.java
trunk/extensions/assistedinject/src/com/google/inject/assistedinject/Parameter.java
trunk/extensions/assistedinject/test/com/google/inject/assistedinject/FactoryProviderTest.java
trunk/extensions/multibindings/multibindings.iml
trunk/extensions/multibindings/src/com/google/inject/multibindings/MapBinder.java
trunk/extensions/multibindings/src/com/google/inject/multibindings/Multibinder.java
trunk/extensions/multibindings/test/com/google/inject/multibindings/MapBinderTest.java
trunk/extensions/multibindings/test/com/google/inject/multibindings/MultibinderTest.java
trunk/guice.ipr
Log:
Supporting HasDependencies for Multibinder, MapBinder and AssistedInject v1.
AssistedInject v2 support isn't here yet, it's difficult. Since we use a
child injector in that package, we need a strategy for how the bindings
from that injector should work. I don't think getting this perfect is
urgent.
Modified: trunk/extensions/assistedinject/assistedinject.iml
==============================================================================
--- trunk/extensions/assistedinject/assistedinject.iml (original)
+++ trunk/extensions/assistedinject/assistedinject.iml Sun Dec 28 21:21:16
2008
@@ -8,7 +8,7 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="guice" />
+ <orderEntry type="module" module-name="guice" exported="" />
<orderEntry type="module-library">
<library>
<CLASSES>
Modified:
trunk/extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider.java
==============================================================================
---
trunk/extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider.java
(original)
+++
trunk/extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider.java
Sun Dec 28 21:21:16 2008
@@ -26,6 +26,8 @@
import com.google.inject.Key;
import com.google.inject.Provider;
import com.google.inject.internal.Errors;
+import com.google.inject.spi.Dependency;
+import com.google.inject.spi.HasDependencies;
import com.google.inject.spi.Message;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
@@ -34,6 +36,7 @@
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* Provides a factory that combines caller-provided parameters with
injector-provided values when
@@ -132,7 +135,7 @@
* @author [email protected] (Jesse Wilson)
* @author [email protected] (Daniel Martin)
*/
-public class FactoryProvider<F> implements Provider<F> {
+public class FactoryProvider<F> implements Provider<F>, HasDependencies {
/*
* This class implements the old @AssistedInject implementation that
manually matches constructors
@@ -267,6 +270,18 @@
result.put(method, matchingConstructor);
}
return result;
+ }
+
+ public Set<Dependency<?>> getDependencies() {
+ List<Dependency<?>> dependencies = Lists.newArrayList();
+ for (AssistedConstructor<?> constructor :
factoryMethodToConstructor.values()) {
+ for (Parameter parameter : constructor.getAllParameters()) {
+ if (!parameter.isProvidedByFactory()) {
+
dependencies.add(Dependency.get(parameter.getPrimaryBindingKey()));
+ }
+ }
+ }
+ return ImmutableSet.copyOf(dependencies);
}
public F get() {
Modified:
trunk/extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider2.java
==============================================================================
---
trunk/extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider2.java
(original)
+++
trunk/extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider2.java
Sun Dec 28 21:21:16 2008
@@ -74,7 +74,7 @@
}
@Override public String toString() {
- return Assisted.class.getName() + "(value=)";
+ return "@" + Assisted.class.getName() + "(value=)";
}
};
Modified:
trunk/extensions/assistedinject/src/com/google/inject/assistedinject/Parameter.java
==============================================================================
---
trunk/extensions/assistedinject/src/com/google/inject/assistedinject/Parameter.java
(original)
+++
trunk/extensions/assistedinject/src/com/google/inject/assistedinject/Parameter.java
Sun Dec 28 21:21:16 2008
@@ -116,7 +116,7 @@
: Key.get(key.getTypeLiteral(),
key.getAnnotation().annotationType());
}
- private Key<?> getPrimaryBindingKey() {
+ Key<?> getPrimaryBindingKey() {
return isProvider
? getBindingForType(getProvidedType(type))
: getBindingForType(type);
Modified:
trunk/extensions/assistedinject/test/com/google/inject/assistedinject/FactoryProviderTest.java
==============================================================================
---
trunk/extensions/assistedinject/test/com/google/inject/assistedinject/FactoryProviderTest.java
(original)
+++
trunk/extensions/assistedinject/test/com/google/inject/assistedinject/FactoryProviderTest.java
Sun Dec 28 21:21:16 2008
@@ -16,17 +16,22 @@
package com.google.inject.assistedinject;
+import com.google.common.collect.ImmutableSet;
import com.google.inject.AbstractModule;
import static com.google.inject.Asserts.assertContains;
+import com.google.inject.Binding;
import com.google.inject.ConfigurationException;
import com.google.inject.CreationException;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
+import com.google.inject.Key;
import com.google.inject.Provider;
import com.google.inject.TypeLiteral;
import com.google.inject.name.Named;
import com.google.inject.name.Names;
+import com.google.inject.spi.Dependency;
+import com.google.inject.spi.HasDependencies;
import java.awt.Color;
import java.util.Collection;
import java.util.Collections;
@@ -57,6 +62,22 @@
Mustang redMustang = (Mustang) carFactory.create(Color.RED);
assertEquals(Color.RED, redMustang.color);
assertEquals(5.0d, redMustang.engineSize);
+ }
+
+ public void testFactoryBindingDependencies() {
+ Injector injector = Guice.createInjector(new AbstractModule() {
+ @Override
+ protected void configure() {
+ bind(Double.class).toInstance(5.0d);
+ bind(ColoredCarFactory.class)
+ .toProvider(FactoryProvider.newFactory(ColoredCarFactory.class,
Mustang.class));
+ }
+ });
+
+ Binding<?> binding = injector.getBinding(ColoredCarFactory.class);
+ HasDependencies hasDependencies = (HasDependencies) binding;
+
assertEquals(ImmutableSet.<Dependency<?>>of(Dependency.get(Key.get(double.class))),
+ hasDependencies.getDependencies());
}
public void testAssistedFactoryWithAnnotations() {
Modified: trunk/extensions/multibindings/multibindings.iml
==============================================================================
--- trunk/extensions/multibindings/multibindings.iml (original)
+++ trunk/extensions/multibindings/multibindings.iml Sun Dec 28 21:21:16
2008
@@ -8,7 +8,7 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="guice" />
+ <orderEntry type="module" module-name="guice" exported="" />
</component>
</module>
Modified:
trunk/extensions/multibindings/src/com/google/inject/multibindings/MapBinder.java
==============================================================================
---
trunk/extensions/multibindings/src/com/google/inject/multibindings/MapBinder.java
(original)
+++
trunk/extensions/multibindings/src/com/google/inject/multibindings/MapBinder.java
Sun Dec 28 21:21:16 2008
@@ -16,6 +16,7 @@
package com.google.inject.multibindings;
+import com.google.common.collect.ImmutableSet;
import com.google.inject.Binder;
import com.google.inject.Inject;
import com.google.inject.Key;
@@ -26,6 +27,8 @@
import com.google.inject.multibindings.Multibinder.RealMultibinder;
import static
com.google.inject.multibindings.Multibinder.checkConfiguration;
import static com.google.inject.multibindings.Multibinder.checkNotNull;
+import com.google.inject.spi.Dependency;
+import com.google.inject.spi.ProviderWithDependencies;
import com.google.inject.util.Types;
import static com.google.inject.util.Types.newParameterizedType;
import static com.google.inject.util.Types.newParameterizedTypeWithOwner;
@@ -264,10 +267,13 @@
public void configure(Binder binder) {
checkConfiguration(!isInitialized(), "MapBinder was already
initialized");
+ final ImmutableSet<Dependency<?>> dependencies
+ =
ImmutableSet.<Dependency<?>>of(Dependency.get(entrySetBinder.getSetKey()));
+
// binds a Map<K, Provider<V>> from a collection of Map<Entry<K,
Provider<V>>
final Provider<Set<Entry<K, Provider<V>>>> entrySetProvider = binder
.getProvider(entrySetBinder.getSetKey());
- binder.bind(providerMapKey).toProvider(new Provider<Map<K,
Provider<V>>>() {
+ binder.bind(providerMapKey).toProvider(new
ProviderWithDependencies<Map<K, Provider<V>>>() {
private Map<K, Provider<V>> providerMap;
@SuppressWarnings("unused")
@@ -286,10 +292,14 @@
public Map<K, Provider<V>> get() {
return providerMap;
}
+
+ public Set<Dependency<?>> getDependencies() {
+ return dependencies;
+ }
});
final Provider<Map<K, Provider<V>>> mapProvider =
binder.getProvider(providerMapKey);
- binder.bind(mapKey).toProvider(new Provider<Map<K, V>>() {
+ binder.bind(mapKey).toProvider(new ProviderWithDependencies<Map<K,
V>>() {
public Map<K, V> get() {
Map<K, V> map = new LinkedHashMap<K, V>();
for (Entry<K, Provider<V>> entry : mapProvider.get().entrySet())
{
@@ -300,6 +310,10 @@
map.put(key, value);
}
return Collections.unmodifiableMap(map);
+ }
+
+ public Set<Dependency<?>> getDependencies() {
+ return dependencies;
}
});
}
Modified:
trunk/extensions/multibindings/src/com/google/inject/multibindings/Multibinder.java
==============================================================================
---
trunk/extensions/multibindings/src/com/google/inject/multibindings/Multibinder.java
(original)
+++
trunk/extensions/multibindings/src/com/google/inject/multibindings/Multibinder.java
Sun Dec 28 21:21:16 2008
@@ -18,6 +18,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
import com.google.inject.Binder;
import com.google.inject.Binding;
import com.google.inject.ConfigurationException;
@@ -29,11 +30,12 @@
import com.google.inject.TypeLiteral;
import com.google.inject.binder.LinkedBindingBuilder;
import com.google.inject.internal.Errors;
+import com.google.inject.spi.Dependency;
+import com.google.inject.spi.HasDependencies;
import com.google.inject.spi.Message;
import com.google.inject.util.Types;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
@@ -190,7 +192,8 @@
* <p>We use a subclass to hide 'implements Module, Provider' from the
public
* API.
*/
- static final class RealMultibinder<T> extends Multibinder<T> implements
Module, Provider<Set<T>> {
+ static final class RealMultibinder<T> extends Multibinder<T>
+ implements Module, Provider<Set<T>>, HasDependencies {
private final TypeLiteral<T> elementType;
private final String setName;
@@ -201,6 +204,7 @@
/* a provider for each element in the set. null until initialization,
non-null afterwards */
private List<Provider<T>> providers;
+ private Set<Dependency<?>> dependencies;
private RealMultibinder(Binder binder, TypeLiteral<T> elementType,
String setName, Key<Set<T>> setKey) {
@@ -229,15 +233,18 @@
* contents are only evaluated when get() is invoked.
*/
@Inject void initialize(Injector injector) {
- providers = new ArrayList<Provider<T>>();
+ providers = Lists.newArrayList();
+ List<Dependency<?>> dependencies = Lists.newArrayList();
for (Map.Entry<Key<?>, Binding<?>> entry :
injector.getBindings().entrySet()) {
if (keyMatches(entry.getKey())) {
- @SuppressWarnings("unchecked")
+ @SuppressWarnings("unchecked") // protected by keyMatches()
Binding<T> binding = (Binding<T>) entry.getValue();
providers.add(binding.getProvider());
+ dependencies.add(Dependency.get(binding.getKey()));
}
}
+ this.dependencies = ImmutableSet.copyOf(dependencies);
this.binder = null;
}
@@ -270,6 +277,10 @@
Key<Set<T>> getSetKey() {
return setKey;
+ }
+
+ public Set<Dependency<?>> getDependencies() {
+ return dependencies;
}
@Override public boolean equals(Object o) {
Modified:
trunk/extensions/multibindings/test/com/google/inject/multibindings/MapBinderTest.java
==============================================================================
---
trunk/extensions/multibindings/test/com/google/inject/multibindings/MapBinderTest.java
(original)
+++
trunk/extensions/multibindings/test/com/google/inject/multibindings/MapBinderTest.java
Sun Dec 28 21:21:16 2008
@@ -16,8 +16,10 @@
package com.google.inject.multibindings;
+import com.google.common.collect.ImmutableSet;
import com.google.inject.AbstractModule;
import static com.google.inject.Asserts.assertContains;
+import com.google.inject.Binding;
import com.google.inject.BindingAnnotation;
import com.google.inject.CreationException;
import com.google.inject.Guice;
@@ -29,12 +31,15 @@
import com.google.inject.TypeLiteral;
import com.google.inject.name.Names;
import static com.google.inject.name.Names.named;
+import com.google.inject.spi.Dependency;
+import com.google.inject.spi.HasDependencies;
import com.google.inject.util.Providers;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
+import java.util.Set;
import junit.framework.TestCase;
/**
@@ -230,8 +235,7 @@
try {
Guice.createInjector(new AbstractModule() {
@Override protected void configure() {
- MapBinder.newMapBinder(binder(), String.class, String.class)
- .addBinding(null);
+ MapBinder.newMapBinder(binder(), String.class,
String.class).addBinding(null);
}
});
fail();
@@ -288,6 +292,26 @@
"1) No implementation for java.lang.Integer",
"at " + getClass().getName());
}
+ }
+
+ /** We just want to make sure that mapbinder's binding depends on the
underlying multibinder. */
+ public void testMultibinderDependencies() {
+ Injector injector = Guice.createInjector(new AbstractModule() {
+ protected void configure() {
+ MapBinder<Integer, String> mapBinder
+ = MapBinder.newMapBinder(binder(), Integer.class,
String.class);
+ mapBinder.addBinding(1).toInstance("A");
+ mapBinder.addBinding(2).to(Key.get(String.class,
Names.named("b")));
+
+ bindConstant().annotatedWith(Names.named("b")).to("B");
+ }
+ });
+
+ Binding<Map<Integer, String>> binding = injector.getBinding(new
Key<Map<Integer, String>>() {});
+ HasDependencies withDependencies = (HasDependencies) binding;
+ Key<?> setKey = new Key<Set<Map.Entry<Integer, Provider<String>>>>()
{};
+ assertEquals(ImmutableSet.<Dependency<?>>of(Dependency.get(setKey)),
+ withDependencies.getDependencies());
}
@Retention(RUNTIME) @BindingAnnotation
Modified:
trunk/extensions/multibindings/test/com/google/inject/multibindings/MultibinderTest.java
==============================================================================
---
trunk/extensions/multibindings/test/com/google/inject/multibindings/MultibinderTest.java
(original)
+++
trunk/extensions/multibindings/test/com/google/inject/multibindings/MultibinderTest.java
Sun Dec 28 21:21:16 2008
@@ -16,9 +16,11 @@
package com.google.inject.multibindings;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.google.inject.AbstractModule;
import static com.google.inject.Asserts.assertContains;
+import com.google.inject.Binding;
import com.google.inject.BindingAnnotation;
import com.google.inject.CreationException;
import com.google.inject.Guice;
@@ -30,6 +32,8 @@
import com.google.inject.TypeLiteral;
import com.google.inject.name.Names;
import static com.google.inject.name.Names.named;
+import com.google.inject.spi.Dependency;
+import com.google.inject.spi.HasDependencies;
import com.google.inject.util.Providers;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@@ -253,6 +257,30 @@
assertContains(expected.getMessage(), "No implementation for
java.lang.Integer",
"at " + getClass().getName());
}
+ }
+
+ /**
+ * We just want to make sure that multibinder's binding depends on each
of its values. We don't
+ * really care about the underlying structure of those bindings, which
are implementation details.
+ */
+ public void testMultibinderDependencies() {
+ Injector injector = Guice.createInjector(new AbstractModule() {
+ protected void configure() {
+ Multibinder<String> multibinder =
Multibinder.newSetBinder(binder(), String.class);
+ multibinder.addBinding().toInstance("A");
+ multibinder.addBinding().to(Key.get(String.class,
Names.named("b")));
+
+ bindConstant().annotatedWith(Names.named("b")).to("B");
+ }
+ });
+
+ Binding<Set<String>> binding = injector.getBinding(new
Key<Set<String>>() {});
+ HasDependencies withDependencies = (HasDependencies) binding;
+ Set<String> elements = Sets.newHashSet();
+ for (Dependency<?> dependency : withDependencies.getDependencies()) {
+ elements.add((String) injector.getInstance(dependency.getKey()));
+ }
+ assertEquals(ImmutableSet.of("A", "B"), elements);
}
@Retention(RUNTIME) @BindingAnnotation
Modified: trunk/guice.ipr
==============================================================================
--- trunk/guice.ipr (original)
+++ trunk/guice.ipr Sun Dec 28 21:21:16 2008
@@ -526,7 +526,7 @@
<module
fileurl="file://$PROJECT_DIR$/extensions/throwingproviders/throwingproviders.iml"
filepath="$PROJECT_DIR$/extensions/throwingproviders/throwingproviders.iml"
/>
</modules>
</component>
- <component name="ProjectRootManager" version="2" languageLevel="JDK_1_5"
assert-keyword="true" jdk-15="true" project-jdk-name="1.5"
project-jdk-type="JavaSDK">
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6"
assert-keyword="true" jdk-15="true" project-jdk-name="1.6"
project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/classes" />
</component>
<component name="ResourceManagerContainer">
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---