1 package org
.argeo
.slc
.repo
.core
;
5 import java
.util
.TreeMap
;
7 import javax
.jcr
.NoSuchWorkspaceException
;
8 import javax
.jcr
.Repository
;
9 import javax
.jcr
.RepositoryException
;
10 import javax
.jcr
.Session
;
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
;
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";
25 private Repository jcrRepository
;
26 private Session adminSession
;
27 private List
<NodeIndexer
> nodeIndexers
;
30 private Map
<String
, Session
> workspaceSessions
= new TreeMap
<String
, Session
>();
31 private Map
<String
, WorkspaceIndexer
> workspaceIndexers
= new TreeMap
<String
, WorkspaceIndexer
>();
35 adminSession
= jcrRepository
.login();
36 String
[] workspaceNames
= adminSession
.getWorkspace()
37 .getAccessibleWorkspaceNames();
38 for (String workspaceName
: workspaceNames
) {
39 if (workspaceName
.equals(securityWorkspace
))
41 if (workspaceName
.equals(adminSession
.getWorkspace().getName()))
43 workspaceInit(workspaceName
);
45 } catch (RepositoryException e
) {
46 throw new SlcException("Cannot initialize repo manager", e
);
50 public void destroy() {
51 for (String key
: workspaceIndexers
.keySet()) {
52 workspaceIndexers
.get(key
).close();
55 for (String key
: workspaceSessions
.keySet()) {
56 JcrUtils
.logoutQuietly(workspaceSessions
.get(key
));
58 JcrUtils
.logoutQuietly(adminSession
);
61 public void createWorkspace(String workspaceName
) {
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
);
72 } catch (RepositoryException e
) {
73 throw new SlcException("Cannot create workspace " + workspaceName
,
78 protected void workspaceInit(String workspaceName
) {
79 Session workspaceAdminSession
= null;
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
);
91 JcrUtils
.logoutQuietly(workspaceAdminSession
);
95 public void setJcrRepository(Repository jcrRepository
) {
96 this.jcrRepository
= jcrRepository
;
99 public void setNodeIndexers(List
<NodeIndexer
> nodeIndexers
) {
100 this.nodeIndexers
= nodeIndexers
;
103 public void setSecurityWorkspace(String securityWorkspace
) {
104 this.securityWorkspace
= securityWorkspace
;