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.contentapp.observation;
35
36 import info.magnolia.observation.WorkspaceEventListenerRegistration;
37
38 import java.util.ArrayList;
39 import java.util.Collection;
40 import java.util.Map;
41 import java.util.concurrent.ConcurrentHashMap;
42 import java.util.function.Consumer;
43
44 import javax.inject.Singleton;
45 import javax.jcr.RepositoryException;
46 import javax.jcr.observation.EventIterator;
47 import javax.jcr.observation.EventListener;
48
49 import lombok.SneakyThrows;
50
51
52
53
54 @Singleton
55 public class JcrObservation {
56
57 private final Map<String, DelegatingListener> registrarMap = new ConcurrentHashMap<>();
58
59 public void register(Consumer<EventIterator> consumer, String workspace) {
60 DelegatingListener delegatingListener = registrarMap.get(workspace);
61 if (delegatingListener == null) {
62 delegatingListener = new DelegatingListener(workspace);
63 registrarMap.put(workspace, delegatingListener);
64 }
65 delegatingListener.addConsumer(consumer);
66 }
67
68 public void unregister(Consumer<EventIterator> consumer, String workspace) {
69 DelegatingListener delegatingListener = registrarMap.get(workspace);
70 if (delegatingListener != null) {
71 delegatingListener.removeConsumer(consumer);
72 }
73 }
74
75 private static class DelegatingListener implements EventListener, WorkspaceEventListenerRegistration.Handle {
76 private final Collection<Consumer<EventIterator>> listeners = new ArrayList<>();
77 private final WorkspaceEventListenerRegistration.Handle handle;
78
79 @SneakyThrows(RepositoryException.class)
80 private DelegatingListener(String workspace) {
81 handle = WorkspaceEventListenerRegistration
82 .observe(workspace, "/", this)
83 .register();
84 }
85
86 @Override
87 public void onEvent(EventIterator events) {
88 listeners.forEach(eventListener -> eventListener.accept(events));
89 }
90
91
92 @SneakyThrows(RepositoryException.class)
93 @Override
94 public void unregister() {
95 handle.unregister();
96 }
97
98 private void addConsumer(Consumer<EventIterator> consumer) {
99 listeners.add(consumer);
100 }
101
102 private void removeConsumer(Consumer<EventIterator> consumer) {
103 listeners.remove(consumer);
104 }
105 }
106 }