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