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.ui.datasource.jcr.JcrDatasourceDefinition;
37 import info.magnolia.ui.framework.ioc.Destructible;
38
39 import java.util.Collections;
40 import java.util.Set;
41 import java.util.concurrent.ConcurrentHashMap;
42 import java.util.function.Consumer;
43
44 import javax.jcr.RepositoryException;
45 import javax.jcr.observation.EventIterator;
46
47 import org.apache.commons.lang3.StringUtils;
48
49 import com.vaadin.data.provider.DataProvider;
50 import com.vaadin.shared.Registration;
51
52 import lombok.SneakyThrows;
53
54
55
56
57 public class JcrDataSourceObservation implements Destructible {
58
59 private final JcrObservation jcrObservation;
60 private final Set<Registration> registrations = Collections.newSetFromMap(new ConcurrentHashMap<>());
61
62 public JcrDataSourceObservation(JcrObservation jcrObservation) {
63 this.jcrObservation = jcrObservation;
64 }
65
66 public void register(JcrDatasourceDefinition datasourceDefinition, DataProvider dataProvider) {
67 Consumer<EventIterator> consumer = new Consumer<EventIterator>() {
68 @SneakyThrows(RepositoryException.class)
69 @Override
70 public void accept(EventIterator eventIterator) {
71 if (eventIterator.hasNext()) {
72 String path = StringUtils.substringBeforeLast(eventIterator.nextEvent().getPath(), "/");
73 if (StringUtils.startsWith(path, datasourceDefinition.getRootPath())) {
74 dataProvider.refreshAll();
75 }
76 }
77 }
78 };
79 jcrObservation.register(consumer, datasourceDefinition.getWorkspace());
80 registrations.add(() -> jcrObservation.unregister(consumer, datasourceDefinition.getWorkspace()));
81 }
82
83 @Override
84 public void destroy() {
85 registrations.removeIf(registration -> {
86 registration.remove();
87 return true;
88 });
89 }
90 }