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