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 info.magnolia.ui.framework.UiFrameworkView;
37 import info.magnolia.ui.api.view.View;
38
39 import java.util.Collection;
40 import java.util.Optional;
41 import java.util.stream.Stream;
42
43 import com.google.common.collect.ArrayListMultimap;
44 import com.google.common.collect.BiMap;
45 import com.google.common.collect.HashBiMap;
46 import com.google.common.collect.Multimap;
47
48
49
50
51 public class ViewContextKeyRegistry {
52
53 public static ViewContextKeyRegistry access() {
54 final BeanStore uiBeanStore = SessionStore.access().getBeanStore(UiContextReference.ofCurrentUi());
55 ViewContextKeyRegistry viewContextKeyRegistry = uiBeanStore.get(ViewContextKeyRegistry.class);
56 if (viewContextKeyRegistry == null) {
57 viewContextKeyRegistry = new ViewContextKeyRegistry();
58 uiBeanStore.put(ViewContextKeyRegistry.class, viewContextKeyRegistry);
59 }
60
61 return viewContextKeyRegistry;
62 }
63
64 private final Multimap<UiContextReference, UiContextReference> viewHierarchy = ArrayListMultimap.create();
65 private final BiMap<UiFrameworkView, UiContextReference> viewKeys = HashBiMap.create();
66
67 public void register(UiFrameworkView view, UiContextReference key) {
68 this.viewKeys.put(view, key);
69 key.getParentReferences().stream()
70
71 .filter(UiContextReference.ViewContextReference.class::isInstance)
72 .findFirst()
73 .ifPresent(parentViewKey -> viewHierarchy.put(parentViewKey, key));
74 }
75
76 public Stream<UiFrameworkView> getChildViews(UiContextReference parentReference) {
77 return this.getChildViewReferences(parentReference).stream().filter(this.viewKeys.inverse()::containsKey).map(this.viewKeys.inverse()::get);
78 }
79
80 public Collection<UiContextReference> getChildViewReferences(UiContextReference parentReference) {
81 return this.viewHierarchy.get(parentReference);
82 }
83
84 public void unRegister(UiFrameworkView view) {
85 lookUp(view).ifPresent(this.viewHierarchy::removeAll);
86 this.viewKeys.remove(view);
87 }
88
89 public Optional<UiContextReference> lookUp(final View view) {
90 return Optional.ofNullable(this.viewKeys.get(view));
91 }
92
93 public boolean isRegistered(UiContextReference viewContextReference) {
94 return viewKeys.containsValue(viewContextReference);
95 }
96 }