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.cms.beans.config;
35
36 import info.magnolia.cms.core.Content;
37 import info.magnolia.cms.core.DefaultContent;
38 import info.magnolia.cms.util.ObservationUtil;
39 import info.magnolia.cms.util.SystemContentWrapper;
40 import info.magnolia.context.MgnlContext;
41 import info.magnolia.repository.RepositoryConstants;
42
43 import java.util.ArrayList;
44 import java.util.HashSet;
45 import java.util.Iterator;
46 import java.util.List;
47 import java.util.Set;
48
49 import javax.jcr.Node;
50 import javax.jcr.RepositoryException;
51 import javax.jcr.Session;
52 import javax.jcr.observation.EventIterator;
53 import javax.jcr.observation.EventListener;
54
55 import org.slf4j.Logger;
56 import org.slf4j.LoggerFactory;
57
58
59
60
61
62
63
64 public abstract class ObservedManager {
65 protected final Logger log = LoggerFactory.getLogger(getClass());
66
67
68
69
70 protected Set<String> registeredUUIDs = new HashSet<String>();
71
72
73
74
75
76 public synchronized void register(Content node) {
77 if (node == null) {
78 log.warn("Tried to register a non-existing node!");
79 return;
80 }
81
82 ObservationUtil.registerDeferredChangeListener(RepositoryConstants.CONFIG, node.getHandle(), new EventListener() {
83
84 @Override
85 public void onEvent(EventIterator events) {
86 reload();
87 }
88 }, 1000, 5000);
89
90 try {
91 registeredUUIDs.add(node.getUUID());
92 onRegister(new SystemContentWrapper(node));
93 }
94 catch (Exception e) {
95 log.warn("Was not able to register [" + node.getHandle() + "]", e);
96 }
97 }
98
99
100
101
102 public synchronized void reload() {
103
104 onClear();
105
106 Session session = null;
107 try {
108 session = MgnlContext.getSystemContext().getJCRSession(RepositoryConstants.CONFIG);
109 } catch (RepositoryException e) {
110 throw new RuntimeException(e);
111 }
112
113
114 List<String> uuids = new ArrayList<String>(registeredUUIDs);
115
116 for (Iterator<String> iter = uuids.iterator(); iter.hasNext();) {
117 String uuid = iter.next();
118 try {
119 Node node = session.getNodeByIdentifier(uuid);
120 reload(new DefaultContent(node));
121 }
122 catch (Exception e) {
123 registeredUUIDs.remove(uuid);
124 log.warn("Can't reload the the node [" + uuid + "]");
125 }
126 }
127 return;
128 }
129
130
131
132
133
134 protected void reload(Content node) {
135 onRegister(node);
136 }
137
138
139
140
141 public void clear() {
142 this.registeredUUIDs.clear();
143 onClear();
144 }
145
146
147
148
149
150 protected abstract void onRegister(Content node);
151
152
153
154
155 protected abstract void onClear();
156
157 }