]> git.argeo.org Git - gpl/argeo-slc.git/blob - cms/org.argeo.slc.repo/src/org/argeo/slc/repo/core/WorkspaceIndexer.java
Adapt to changes in Argeo Commons.
[gpl/argeo-slc.git] / cms / org.argeo.slc.repo / src / org / argeo / slc / repo / core / WorkspaceIndexer.java
1 package org.argeo.slc.repo.core;
2
3 import java.util.List;
4
5 import javax.jcr.Node;
6 import javax.jcr.RepositoryException;
7 import javax.jcr.Session;
8 import javax.jcr.observation.Event;
9 import javax.jcr.observation.EventIterator;
10 import javax.jcr.observation.EventListener;
11
12 import org.apache.commons.logging.Log;
13 import org.apache.commons.logging.LogFactory;
14 import org.argeo.jcr.JcrUtils;
15 import org.argeo.slc.SlcException;
16 import org.argeo.slc.repo.NodeIndexer;
17
18 /** Maintains the metadata of a workspace, using listeners */
19 public class WorkspaceIndexer {
20 private final static Log log = LogFactory.getLog(WorkspaceIndexer.class);
21
22 private final Session adminSession;
23 private IndexingListener artifactListener;
24 /** order may be important */
25 private final List<NodeIndexer> nodeIndexers;
26
27 public WorkspaceIndexer(Session adminSession, List<NodeIndexer> nodeIndexers) {
28 this.adminSession = adminSession;
29 this.nodeIndexers = nodeIndexers;
30 try {
31 artifactListener = new IndexingListener();
32 adminSession
33 .getWorkspace()
34 .getObservationManager()
35 .addEventListener(artifactListener, Event.NODE_ADDED, "/",
36 true, null, null, true);
37 } catch (RepositoryException e) {
38 throw new SlcException("Cannot initialize repository backend", e);
39 }
40 }
41
42 public void close() {
43 try {
44 adminSession.getWorkspace().getObservationManager()
45 .removeEventListener(artifactListener);
46 } catch (RepositoryException e) {
47 log.error("Cannot close workspace indexer "
48 + adminSession.getWorkspace().getName(), e);
49 }
50 }
51
52 class IndexingListener implements EventListener {
53
54 public void onEvent(EventIterator events) {
55 while (events.hasNext()) {
56 Event event = events.nextEvent();
57 try {
58 String newNodePath = event.getPath();
59 Node newNode = null;
60 for (NodeIndexer nodeIndexer : nodeIndexers) {
61 try {
62 if (nodeIndexer.support(newNodePath)) {
63 if (newNode == null)
64 newNode = adminSession.getNode(newNodePath);
65 nodeIndexer.index(newNode);
66 }
67 } catch (RuntimeException e) {
68 e.printStackTrace();
69 throw e;
70 }
71 }
72 if (newNode != null)
73 adminSession.save();
74 } catch (RepositoryException e) {
75 throw new SlcException("Cannot process event " + event, e);
76 } finally {
77 JcrUtils.discardQuietly(adminSession);
78 }
79 }
80 }
81 }
82 }