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