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.ui.framework.ioc;
35
36 import java.util.HashMap;
37 import java.util.Map;
38 import java.util.Optional;
39 import java.util.function.BiConsumer;
40
41 import com.google.inject.Key;
42
43
44
45
46
47
48
49
50
51 public final class BeanStore {
52
53 private final Map<Key, Object> storage = new HashMap<>();
54
55 BeanStore() {
56 }
57
58 public void put(Key<?> key, Object bean) {
59 this.storage.put(key, bean);
60 }
61
62 public void put(Class<?> key, Object bean) {
63 this.put(Key.get(key), bean);
64 }
65
66 public <T> T get(Class<? extends T> key) {
67
68 return (T) this.storage.get(Key.get(key));
69 }
70
71 public <T> T get(Key<? extends T> key) {
72
73 return (T) this.storage.get(key);
74 }
75
76 public <T> Optional<T> getInstance(Class<? extends T> type) {
77
78 return this.storage.entrySet().stream()
79 .filter(entry -> type.isInstance(entry.getValue()))
80 .map(entry -> (T) entry.getValue())
81 .findFirst();
82 }
83
84 public <T> T getClosestInstance(Class<? extends T> type) {
85 return getInstance(type).orElse(null);
86 }
87
88 public <T> boolean hasInstanceOf(Class<T> type) {
89 return storage.containsKey(Key.get(type));
90 }
91
92 public void clear() {
93 this.storage.forEach((key, instance) -> {
94 if (instance instanceof Destructible) {
95 ((Destructible) instance).destroy();
96 }
97 });
98 this.storage.clear();
99 }
100
101 public void forEach(BiConsumer<? super Key, ? super Object> handler) {
102 storage.forEach(handler);
103 }
104
105 public boolean contains(Object instance) {
106 return storage.values().contains(instance);
107 }
108 }