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.util;
35
36 import info.magnolia.context.MgnlContext;
37 import info.magnolia.module.ModuleRegistry;
38 import info.magnolia.repository.RepositoryConstants;
39
40 import java.util.ArrayList;
41 import java.util.Collections;
42 import java.util.List;
43
44 import javax.jcr.Node;
45 import javax.jcr.RepositoryException;
46 import javax.jcr.Session;
47 import javax.jcr.observation.EventIterator;
48 import javax.jcr.observation.EventListener;
49
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
52
53
54
55
56
57
58
59 public abstract class ModuleConfigurationObservingManager extends WorkspaceObservingManager {
60
61 private final Logger log = LoggerFactory.getLogger(getClass());
62
63 private final String pathWithinModule;
64 private final ModuleRegistry moduleRegistry;
65 private final List<String> observedPaths = new ArrayList<String>();
66
67 protected ModuleConfigurationObservingManager(String pathWithinModule, ModuleRegistry moduleRegistry) {
68 super(RepositoryConstants.CONFIG, null, true, (String[]) null);
69
70 this.pathWithinModule = pathWithinModule;
71 this.moduleRegistry = moduleRegistry;
72 }
73
74 @Override
75 protected void registerChangeListener(final EventListener eventListener) {
76 for (String observedPath : observedPaths) {
77 ObservationUtil.registerChangeListener(getWorkspace(), observedPath, isIncludeSubNodes(), getNodeTypes(), getEventTypesMask(), new EventListener() {
78 @Override
79 public void onEvent(EventIterator events) {
80 eventListener.onEvent(events);
81 }
82 });
83 }
84 }
85
86 @Override
87 protected void onStart() {
88 for (String moduleName : moduleRegistry.getModuleNames()) {
89 String path = "/modules/" + moduleName + "/" + pathWithinModule;
90 observedPaths.add(path);
91 }
92 }
93
94 @Override
95 protected void reload() {
96 try {
97 List<Node> nodes = getObservedNodes();
98 reload(nodes);
99 } catch (RepositoryException e) {
100 log.error("Reload of observed nodes failed", e);
101 }
102 }
103
104 protected void reload(List<Node> nodes) throws RepositoryException {
105 onClear();
106 for (Node node : nodes) {
107 try {
108 onRegister(node);
109 } catch (Exception e) {
110 log.warn("Failed to reload the node [{}]", node.getPath());
111 }
112 }
113 }
114
115 protected void onClear() throws RepositoryException {
116
117 }
118
119 protected void onRegister(Node node) throws RepositoryException {
120
121 }
122
123 protected List<Node> getObservedNodes() throws RepositoryException {
124
125 Session session = getSession();
126
127 List<Node> nodes = new ArrayList<Node>();
128 for (String observedPath : observedPaths) {
129 try {
130 if (session.nodeExists(observedPath)) {
131 nodes.add(session.getNode(observedPath));
132 }
133 } catch (RepositoryException e) {
134 log.error("Failed to acquire node for observed path [{}]", observedPath, e);
135 }
136 }
137 return nodes;
138 }
139
140 protected Session getSession() throws RepositoryException {
141 return MgnlContext.getSystemContext().getJCRSession(RepositoryConstants.CONFIG);
142 }
143
144 protected List<String> getObservedPaths() {
145 return Collections.unmodifiableList(observedPaths);
146 }
147
148 }