1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.objectfactory.guice;
35
36 import java.util.Arrays;
37 import java.util.HashSet;
38 import java.util.Map;
39 import java.util.Set;
40 import java.util.logging.Logger;
41
42 import com.google.inject.AbstractModule;
43 import com.google.inject.Binding;
44 import com.google.inject.Injector;
45 import com.google.inject.Key;
46 import com.google.inject.Provider;
47 import com.google.inject.Stage;
48
49
50
51
52
53
54
55
56 public class GuiceParentBindingsModule extends AbstractModule {
57
58 private Injector parentInjector;
59 private Set<Key<?>> excluded = new HashSet<Key<?>>();
60
61 public GuiceParentBindingsModule(Injector parentInjector) {
62 this.parentInjector = parentInjector;
63 exclude(Injector.class, Stage.class, Logger.class);
64 }
65
66 public void exclude(Key<?>... keys) {
67 this.excluded.addAll(Arrays.asList(keys));
68 }
69
70 public void exclude(Class<?>... classes) {
71 for (Class<?> clazz : classes) {
72 this.excluded.add(Key.get(clazz));
73 }
74 }
75
76 @Override
77 protected void configure() {
78
79 Injector injector = parentInjector;
80 do {
81 Map<Key<?>, Binding<?>> explicitBindings = injector.getBindings();
82 for (Map.Entry<Key<?>, Binding<?>> entry : explicitBindings.entrySet()) {
83 Key<?> key = entry.getKey();
84 if (!excluded.contains(key)) {
85 final Provider<?> provider = entry.getValue().getProvider();
86
87 bind(key).toProvider(new Provider() {
88 @Override
89 public Object get() {
90 return provider.get();
91 }
92 });
93 }
94 }
95 injector = injector.getParent();
96 } while (injector != null);
97 }
98 }