X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.repo%2Fsrc%2Forg%2Fargeo%2Fslc%2Frepo%2Fcore%2FAbstractJcrRepoManager.java;fp=org.argeo.slc.repo%2Fsrc%2Forg%2Fargeo%2Fslc%2Frepo%2Fcore%2FAbstractJcrRepoManager.java;h=8099d7dcec7cbfb7db05d5bf76dcad3c4cfc9471;hb=825d60c5348dbe3f5be25b0bccf7bdebfe694219;hp=0000000000000000000000000000000000000000;hpb=5e991fff5cba01858dcc5747a27e637325bc5c8e;p=gpl%2Fargeo-jcr.git diff --git a/org.argeo.slc.repo/src/org/argeo/slc/repo/core/AbstractJcrRepoManager.java b/org.argeo.slc.repo/src/org/argeo/slc/repo/core/AbstractJcrRepoManager.java new file mode 100644 index 0000000..8099d7d --- /dev/null +++ b/org.argeo.slc.repo/src/org/argeo/slc/repo/core/AbstractJcrRepoManager.java @@ -0,0 +1,99 @@ +package org.argeo.slc.repo.core; + +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import javax.jcr.NoSuchWorkspaceException; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.argeo.api.cms.CmsLog; +import org.argeo.jcr.JcrUtils; +import org.argeo.slc.SlcConstants; +import org.argeo.slc.SlcException; +import org.argeo.slc.repo.NodeIndexer; + +/** Generic operations on a JCR-based repo. */ +abstract class AbstractJcrRepoManager { + private final static CmsLog log = CmsLog.getLog(AbstractJcrRepoManager.class); + private String securityWorkspace = "security"; + + private Repository jcrRepository; + private Session adminSession; + private List nodeIndexers; + + // registries + private Map workspaceSessions = new TreeMap(); + private Map workspaceIndexers = new TreeMap(); + + public void init() { + try { + adminSession = jcrRepository.login(); + String[] workspaceNames = adminSession.getWorkspace().getAccessibleWorkspaceNames(); + for (String workspaceName : workspaceNames) { + if (workspaceName.equals(securityWorkspace)) + continue; + if (workspaceName.equals(adminSession.getWorkspace().getName())) + continue; + workspaceInit(workspaceName); + } + } catch (RepositoryException e) { + throw new SlcException("Cannot initialize repo manager", e); + } + } + + public void destroy() { + for (String key : workspaceIndexers.keySet()) { + workspaceIndexers.get(key).close(); + } + + for (String key : workspaceSessions.keySet()) { + JcrUtils.logoutQuietly(workspaceSessions.get(key)); + } + JcrUtils.logoutQuietly(adminSession); + } + + public void createWorkspace(String workspaceName) { + try { + try { + jcrRepository.login(workspaceName); + throw new SlcException("Workspace " + workspaceName + " exists already."); + } catch (NoSuchWorkspaceException e) { + // try to create workspace + adminSession.getWorkspace().createWorkspace(workspaceName); + workspaceInit(workspaceName); + } + } catch (RepositoryException e) { + throw new SlcException("Cannot create workspace " + workspaceName, e); + } + } + + protected void workspaceInit(String workspaceName) { + Session workspaceAdminSession = null; + try { + workspaceAdminSession = jcrRepository.login(workspaceName); + workspaceSessions.put(workspaceName, adminSession); + JcrUtils.addPrivilege(workspaceAdminSession, "/", SlcConstants.ROLE_SLC, "jcr:all"); + WorkspaceIndexer workspaceIndexer = new WorkspaceIndexer(workspaceAdminSession, nodeIndexers); + workspaceIndexers.put(workspaceName, workspaceIndexer); + } catch (RepositoryException e) { + log.error("Cannot initialize workspace " + workspaceName, e); + } finally { + JcrUtils.logoutQuietly(workspaceAdminSession); + } + } + + public void setJcrRepository(Repository jcrRepository) { + this.jcrRepository = jcrRepository; + } + + public void setNodeIndexers(List nodeIndexers) { + this.nodeIndexers = nodeIndexers; + } + + public void setSecurityWorkspace(String securityWorkspace) { + this.securityWorkspace = securityWorkspace; + } +} \ No newline at end of file