]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoImpl.java
b2c8fc01175e8a85819cf6340371f8e52a5ae525
[gpl/argeo-slc.git] / runtime / org.argeo.slc.repo / src / main / java / org / argeo / slc / repo / RepoImpl.java
1 package org.argeo.slc.repo;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.List;
6
7 import javax.jcr.Node;
8 import javax.jcr.Repository;
9 import javax.jcr.RepositoryException;
10 import javax.jcr.Session;
11 import javax.jcr.observation.Event;
12 import javax.jcr.observation.EventIterator;
13 import javax.jcr.observation.EventListener;
14
15 import org.argeo.jcr.JcrUtils;
16 import org.argeo.slc.SlcException;
17
18 /** Repository backend, maintain the JCR repository, mainly through listeners */
19 public class RepoImpl {
20
21 private Repository jcrRepository;
22 private Session adminSession;
23
24 private ArtifactListener artifactListener;
25
26 /** order may be important */
27 private List<NodeIndexer> nodeIndexers = new ArrayList<NodeIndexer>();
28
29 public void init() {
30 try {
31 adminSession = jcrRepository.login();
32 artifactListener = new ArtifactListener();
33 adminSession
34 .getWorkspace()
35 .getObservationManager()
36 .addEventListener(artifactListener, Event.NODE_ADDED,
37 RepoConstants.ARTIFACTS_BASE_PATH, true, null,
38 null, true);
39 // localrepo
40 String localrepoWorkspace = "localrepo";
41 if (!Arrays.asList(
42 adminSession.getWorkspace().getAccessibleWorkspaceNames())
43 .contains(localrepoWorkspace))
44 adminSession.getWorkspace().createWorkspace(localrepoWorkspace);
45 } catch (RepositoryException e) {
46 throw new SlcException("Cannot initialize repository backend", e);
47 }
48 }
49
50 public void destroy() {
51 JcrUtils.logoutQuietly(adminSession);
52 }
53
54 public void setJcrRepository(Repository jcrRepository) {
55 this.jcrRepository = jcrRepository;
56 }
57
58 public void setNodeIndexers(List<NodeIndexer> nodeIndexers) {
59 this.nodeIndexers = nodeIndexers;
60 }
61
62 class ArtifactListener implements EventListener {
63
64 public void onEvent(EventIterator events) {
65 while (events.hasNext()) {
66 Event event = events.nextEvent();
67 try {
68 String newNodePath = event.getPath();
69 Node newNode = null;
70 for (NodeIndexer nodeIndexer : nodeIndexers) {
71 try {
72 if (nodeIndexer.support(newNodePath)) {
73 if (newNode == null)
74 newNode = adminSession.getNode(newNodePath);
75 nodeIndexer.index(newNode);
76 }
77 } catch (RuntimeException e) {
78 e.printStackTrace();
79 throw e;
80 }
81 }
82 if (newNode != null)
83 adminSession.save();
84 } catch (RepositoryException e) {
85 throw new SlcException("Cannot process event " + event, e);
86 } finally {
87 JcrUtils.discardQuietly(adminSession);
88 }
89 }
90
91 }
92
93 }
94
95 }