Revision: 1201
Author: sberlin
Date: Sun Aug  1 17:58:02 2010
Log: remove additional API for overriding a PrivateModule and instead fold the functionality into the existing methods.
http://code.google.com/p/google-guice/source/detail?r=1201

Modified:
 /trunk/src/com/google/inject/util/Modules.java

=======================================
--- /trunk/src/com/google/inject/util/Modules.java      Sun Aug  1 09:15:50 2010
+++ /trunk/src/com/google/inject/util/Modules.java      Sun Aug  1 17:58:02 2010
@@ -54,30 +54,14 @@
   public static final Module EMPTY_MODULE = new Module() {
     public void configure(Binder binder) {}
   };
-
-  /**
- * Returns a builder that creates a module that overlays override modules over the given - * PrivateModule. This allows private elements in the module to be overridden. No new keys - * may be exposed. If a key is bound in both sets of modules, only the binding from the override modules - * is kept. This can be used to replace the bindings of a production module with test bindings:
-   * <pre>
-   * Module functionalTestModule
- * = Modules.override(new PrivateProductionModule()).with(getTestModules());
-   * </pre>
-   *
- * <p>Prefer to write smaller modules that can be reused and tested without overrides.
-   *
-   * @param modules the modules whose bindings are open to be overridden
-   * @since 3.0
-   */
- public static PrivateOverriddenModuleBuilder override(PrivateModule privateModule) {
-    return new RealPrivateOverriddenModuleBuilder(privateModule);
-  }

   /**
* Returns a builder that creates a module that overlays override modules over the given * modules. If a key is bound in both sets of modules, only the binding from the override modules - * is kept. This can be used to replace the bindings of a production module with test bindings: + * is kept. If a single {...@link PrivateModule} is supplied or all elements are from + * a single {...@link PrivateBinder}, then this will overwrite the private bindings. + * Otherwise, private bindings will not be overwritten unless they are exposed. + * This can be used to replace the bindings of a production module with test bindings:
    * <pre>
    * Module functionalTestModule
    *     = Modules.override(new ProductionModule()).with(new TestModule());
@@ -94,7 +78,10 @@
   /**
* Returns a builder that creates a module that overlays override modules over the given * modules. If a key is bound in both sets of modules, only the binding from the override modules - * is kept. This can be used to replace the bindings of a production module with test bindings: + * is kept. If a single {...@link PrivateModule} is supplied or all elements are from + * a single {...@link PrivateBinder}, then this will overwrite the private bindings. + * Otherwise, private bindings will not be overwritten unless they are exposed. + * This can be used to replace the bindings of a production module with test bindings:
    * <pre>
    * Module functionalTestModule
    *     = Modules.override(getProductionModules()).with(getTestModules());
@@ -145,54 +132,7 @@
      */
     Module with(Iterable<? extends Module> overrides);
   }
-
-  /**
- * See the EDSL example at {...@link Modules#override(PrivateModule) override()}.
-   * @since 3.0
-   */
-  public interface PrivateOverriddenModuleBuilder {
-
-    /**
- * See the EDSL example at {...@link Modules#override(PrivateModule) override()}.
-     */
-    PrivateModule with(Module... overrides);
-
-    /**
- * See the EDSL example at {...@link Modules#override(PrivateModule) override()}.
-     */
-    PrivateModule with(Iterable<? extends Module> overrides);
-  }
-
-  /**
-   * An override builder specifically for private modules.
-   * This allows elements within a PrivateModule to be overridden.
-   */
- private static final class RealPrivateOverriddenModuleBuilder implements PrivateOverriddenModuleBuilder {
-    private final PrivateModule baseModule;
-
- private RealPrivateOverriddenModuleBuilder(PrivateModule privateModule) {
-      this.baseModule = privateModule;
-    }
-
-    public PrivateModule with(Module... overrides) {
-      return with(Arrays.asList(overrides));
-    }
-
-    public PrivateModule with(final Iterable<? extends Module> overrides) {
-      return new PrivateModule() {
-        @Override
-        public void configure() {
- PrivateElements privateElements = (PrivateElements)Iterables.getOnlyElement(Elements.getElements(baseModule)); - PrivateBinder binder = binder().withSource(privateElements.getSource()); - override(Elements.getModule(privateElements.getElements())).with(overrides).configure(binder);
-          for(Key exposed : privateElements.getExposedKeys()) {
- binder.withSource(privateElements.getExposedSource(exposed)).expose(exposed);
-          }
-        }
-      };
-    }
-  }
-
+
private static final class RealOverriddenModuleBuilder implements OverriddenModuleBuilder {
     private final ImmutableSet<Module> baseModules;

@@ -208,15 +148,34 @@
       return new AbstractModule() {
         @Override
         public void configure() {
-          final LinkedHashSet<Element> elements =
-            new LinkedHashSet<Element>(Elements.getElements(baseModules));
+          Binder baseBinder = binder();
+          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
+          // and binder.
+          if(baseElements.size() == 1) {
+            Element element = Iterables.getOnlyElement(baseElements);
+            if(element instanceof PrivateElements) {
+              PrivateElements privateElements = (PrivateElements)element;
+ PrivateBinder privateBinder = baseBinder.newPrivateBinder().withSource(privateElements.getSource());
+              for(Key exposed : privateElements.getExposedKeys()) {
+ privateBinder.withSource(privateElements.getExposedSource(exposed)).expose(exposed);
+              }
+              baseBinder = privateBinder;
+              baseElements = privateElements.getElements();
+            }
+          }
+
+          final Binder binder = baseBinder;
+ final LinkedHashSet<Element> elements = new LinkedHashSet<Element>(baseElements); final List<Element> overrideElements = Elements.getElements(overrides);

           final Set<Key<?>> overriddenKeys = Sets.newHashSet();
final Set<Class<? extends Annotation>> overridesScopeAnnotations = Sets.newHashSet();

// execute the overrides module, keeping track of which keys and scopes are bound
-          new ModuleWriter(binder()) {
+          new ModuleWriter(binder) {
             @Override public <T> Void visit(Binding<T> binding) {
               overriddenKeys.add(binding.getKey());
               return super.visit(binding);
@@ -238,7 +197,7 @@
           // multiple times.
           final Map<Scope, Object> scopeInstancesInUse = Maps.newHashMap();
           final List<ScopeBinding> scopeBindings = Lists.newArrayList();
-          new ModuleWriter(binder()) {
+          new ModuleWriter(binder) {
             @Override public <T> Void visit(Binding<T> binding) {
               if (!overriddenKeys.remove(binding.getKey())) {
                 super.visit(binding);
@@ -293,14 +252,14 @@

// execute the scope bindings, skipping scopes that have been overridden. Any scope that
           // is overridden and in active use will prompt an error
-          new ModuleWriter(binder()) {
+          new ModuleWriter(binder) {
             @Override public Void visit(ScopeBinding scopeBinding) {
if (!overridesScopeAnnotations.remove(scopeBinding.getAnnotationType())) {
                 super.visit(scopeBinding);
               } else {
Object source = scopeInstancesInUse.get(scopeBinding.getScope());
                 if (source != null) {
-                  binder().withSource(source).addError(
+                  binder.withSource(source).addError(
"The scope for @%s is bound directly and cannot be overridden.",
                       scopeBinding.getAnnotationType().getSimpleName());
                 }

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