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