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
.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
;
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";
23 private Repository jcrRepository
;
24 private Session adminSession
;
25 private List
<NodeIndexer
> nodeIndexers
;
28 private Map
<String
, Session
> workspaceSessions
= new TreeMap
<String
, Session
>();
29 private Map
<String
, WorkspaceIndexer
> workspaceIndexers
= new TreeMap
<String
, WorkspaceIndexer
>();
33 adminSession
= jcrRepository
.login();
34 String
[] workspaceNames
= adminSession
.getWorkspace().getAccessibleWorkspaceNames();
35 for (String workspaceName
: workspaceNames
) {
36 if (workspaceName
.equals(securityWorkspace
))
38 if (workspaceName
.equals(adminSession
.getWorkspace().getName()))
40 workspaceInit(workspaceName
);
42 } catch (RepositoryException e
) {
43 throw new SlcException("Cannot initialize repo manager", e
);
47 public void destroy() {
48 for (String key
: workspaceIndexers
.keySet()) {
49 workspaceIndexers
.get(key
).close();
52 for (String key
: workspaceSessions
.keySet()) {
53 JcrUtils
.logoutQuietly(workspaceSessions
.get(key
));
55 JcrUtils
.logoutQuietly(adminSession
);
58 public void createWorkspace(String workspaceName
) {
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
);
68 } catch (RepositoryException e
) {
69 throw new SlcException("Cannot create workspace " + workspaceName
, e
);
73 protected void workspaceInit(String workspaceName
) {
74 Session workspaceAdminSession
= null;
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
);
84 JcrUtils
.logoutQuietly(workspaceAdminSession
);
88 public void setJcrRepository(Repository jcrRepository
) {
89 this.jcrRepository
= jcrRepository
;
92 public void setNodeIndexers(List
<NodeIndexer
> nodeIndexers
) {
93 this.nodeIndexers
= nodeIndexers
;
96 public void setSecurityWorkspace(String securityWorkspace
) {
97 this.securityWorkspace
= securityWorkspace
;