]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/core/AbstractJcrRepoManager.java
Improve archive and BND wrappers
[gpl/argeo-slc.git] / runtime / org.argeo.slc.repo / src / main / java / org / argeo / slc / repo / core / AbstractJcrRepoManager.java
1 package org.argeo.slc.repo.core;
2
3 import java.util.List;
4 import java.util.Map;
5 import java.util.TreeMap;
6
7 import javax.jcr.NoSuchWorkspaceException;
8 import javax.jcr.Repository;
9 import javax.jcr.RepositoryException;
10 import javax.jcr.Session;
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.SlcConstants;
16 import org.argeo.slc.SlcException;
17 import org.argeo.slc.repo.NodeIndexer;
18
19 /** Generic operations on a JCR-based repo. */
20 abstract class AbstractJcrRepoManager {
21 private final static Log log = LogFactory
22 .getLog(AbstractJcrRepoManager.class);
23 private String securityWorkspace = "security";
24
25 private Repository jcrRepository;
26 private Session adminSession;
27 private List<NodeIndexer> nodeIndexers;
28
29 // registries
30 private Map<String, Session> workspaceSessions = new TreeMap<String, Session>();
31 private Map<String, WorkspaceIndexer> workspaceIndexers = new TreeMap<String, WorkspaceIndexer>();
32
33 public void init() {
34 try {
35 adminSession = jcrRepository.login();
36 String[] workspaceNames = adminSession.getWorkspace()
37 .getAccessibleWorkspaceNames();
38 for (String workspaceName : workspaceNames) {
39 if (workspaceName.equals(securityWorkspace))
40 continue;
41 if (workspaceName.equals(adminSession.getWorkspace().getName()))
42 continue;
43 workspaceInit(workspaceName);
44 }
45 } catch (RepositoryException e) {
46 throw new SlcException("Cannot initialize repo manager", e);
47 }
48 }
49
50 public void destroy() {
51 for (String key : workspaceIndexers.keySet()) {
52 workspaceIndexers.get(key).close();
53 }
54
55 for (String key : workspaceSessions.keySet()) {
56 JcrUtils.logoutQuietly(workspaceSessions.get(key));
57 }
58 JcrUtils.logoutQuietly(adminSession);
59 }
60
61 public void createWorkspace(String workspaceName) {
62 try {
63 try {
64 jcrRepository.login(workspaceName);
65 throw new SlcException("Workspace " + workspaceName
66 + " exists already.");
67 } catch (NoSuchWorkspaceException e) {
68 // try to create workspace
69 adminSession.getWorkspace().createWorkspace(workspaceName);
70 workspaceInit(workspaceName);
71 }
72 } catch (RepositoryException e) {
73 throw new SlcException("Cannot create workspace " + workspaceName,
74 e);
75 }
76 }
77
78 protected void workspaceInit(String workspaceName) {
79 Session workspaceAdminSession = null;
80 try {
81 workspaceAdminSession = jcrRepository.login(workspaceName);
82 workspaceSessions.put(workspaceName, adminSession);
83 JcrUtils.addPrivilege(workspaceAdminSession, "/",
84 SlcConstants.ROLE_SLC, "jcr:all");
85 WorkspaceIndexer workspaceIndexer = new WorkspaceIndexer(
86 workspaceAdminSession, nodeIndexers);
87 workspaceIndexers.put(workspaceName, workspaceIndexer);
88 } catch (RepositoryException e) {
89 log.error("Cannot initialize workspace " + workspaceName, e);
90 } finally {
91 JcrUtils.logoutQuietly(workspaceAdminSession);
92 }
93 }
94
95 public void setJcrRepository(Repository jcrRepository) {
96 this.jcrRepository = jcrRepository;
97 }
98
99 public void setNodeIndexers(List<NodeIndexer> nodeIndexers) {
100 this.nodeIndexers = nodeIndexers;
101 }
102
103 public void setSecurityWorkspace(String securityWorkspace) {
104 this.securityWorkspace = securityWorkspace;
105 }
106 }