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

Reply via email to