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