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