Author: limpbizkit
Date: Sat Jun 27 15:22:54 2009
New Revision: 1039
Modified:
trunk/src/com/google/inject/util/Modules.java
trunk/test/com/google/inject/OverrideModuleTest.java
Log:
Fixing a TODO for modules.override() plus private modules
Modified: trunk/src/com/google/inject/util/Modules.java
==============================================================================
--- trunk/src/com/google/inject/util/Modules.java (original)
+++ trunk/src/com/google/inject/util/Modules.java Sat Jun 27 15:22:54 2009
@@ -142,7 +142,7 @@
final List<Element> elements = Elements.getElements(baseModules);
final List<Element> overrideElements =
Elements.getElements(overrides);
- final Set<Key> overriddenKeys = Sets.newHashSet();
+ 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
@@ -183,30 +183,35 @@
return null;
}
- @Override public Void visit(PrivateElements privateElements) {
+ void rewrite(Binder binder, PrivateElements privateElements,
Set<Key<?>> keysToSkip) {
PrivateBinder privateBinder =
binder.withSource(privateElements.getSource())
.newPrivateBinder();
Set<Key<?>> skippedExposes = Sets.newHashSet();
for (Key<?> key : privateElements.getExposedKeys()) {
- if (overriddenKeys.remove(key)) {
+ if (keysToSkip.remove(key)) {
skippedExposes.add(key);
} else {
privateBinder.withSource(privateElements.getExposedSource(key)).expose(key);
}
}
- // we're not skipping deep exposes, but that should be okay.
If we ever need to, we
- // have to search through this set of elements for
PrivateElements, recursively
for (Element element : privateElements.getElements()) {
if (element instanceof Binding
- && skippedExposes.contains(((Binding)
element).getKey())) {
+ && skippedExposes.remove(((Binding)
element).getKey())) {
+ continue;
+ }
+ if (element instanceof PrivateElements) {
+ rewrite(privateBinder, (PrivateElements) element,
skippedExposes);
continue;
}
element.applyTo(privateBinder);
}
+ }
+ @Override public Void visit(PrivateElements privateElements) {
+ rewrite(binder, privateElements, overriddenKeys);
return null;
}
Modified: trunk/test/com/google/inject/OverrideModuleTest.java
==============================================================================
--- trunk/test/com/google/inject/OverrideModuleTest.java (original)
+++ trunk/test/com/google/inject/OverrideModuleTest.java Sat Jun 27
15:22:54 2009
@@ -387,6 +387,59 @@
assertEquals(5, reverse.getInstance(Integer.class).intValue());
}
+ public void testOverrideDeepExpose() {
+ final AtomicReference<Provider<Character>> charAProvider
+ = new AtomicReference<Provider<Character>>();
+
+ Module exposes5 = new PrivateModule() {
+ protected void configure() {
+ install(new PrivateModule() {
+ protected void configure() {
+ bind(Integer.class).toInstance(5);
+ expose(Integer.class);
+ charAProvider.set(getProvider(Character.class));
+ bind(Character.class).toInstance('A');
+ }
+ });
+ expose(Integer.class);
+ }
+ };
+
+ Injector injector =
Guice.createInjector(Modules.override(exposes5).with(EMPTY_MODULE));
+ assertEquals(5, injector.getInstance(Integer.class).intValue());
+ assertEquals('A', charAProvider.getAndSet(null).get().charValue());
+
+ injector =
Guice.createInjector(Modules.override(EMPTY_MODULE).with(exposes5));
+ assertEquals(5, injector.getInstance(Integer.class).intValue());
+ assertEquals('A', charAProvider.getAndSet(null).get().charValue());
+
+ final AtomicReference<Provider<Character>> charBProvider
+ = new AtomicReference<Provider<Character>>();
+
+ Module binds15 = new AbstractModule() {
+ protected void configure() {
+ bind(Integer.class).toInstance(15);
+
+ install(new PrivateModule() {
+ protected void configure() {
+ charBProvider.set(getProvider(Character.class));
+ bind(Character.class).toInstance('B');
+ }
+ });
+ }
+ };
+
+ injector =
Guice.createInjector(Modules.override(binds15).with(exposes5));
+ assertEquals(5, injector.getInstance(Integer.class).intValue());
+ assertEquals('A', charAProvider.getAndSet(null).get().charValue());
+ assertEquals('B', charBProvider.getAndSet(null).get().charValue());
+
+ injector =
Guice.createInjector(Modules.override(exposes5).with(binds15));
+ assertEquals(15, injector.getInstance(Integer.class).intValue());
+ assertEquals('A', charAProvider.getAndSet(null).get().charValue());
+ assertEquals('B', charBProvider.getAndSet(null).get().charValue());
+ }
+
@Retention(RUNTIME)
@Target(TYPE)
@ScopeAnnotation
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---