Merge tag 'v2.3.20' into testing
[gpl/argeo-jcr.git] / org.argeo.slc.repo / src / org / argeo / slc / repo / core / AbstractJcrRepoManager.java
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 (file)
index 0000000..8099d7d
--- /dev/null
@@ -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<NodeIndexer> nodeIndexers;
+
+       // registries
+       private Map<String, Session> workspaceSessions = new TreeMap<String, Session>();
+       private Map<String, WorkspaceIndexer> workspaceIndexers = new TreeMap<String, WorkspaceIndexer>();
+
+       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<NodeIndexer> nodeIndexers) {
+               this.nodeIndexers = nodeIndexers;
+       }
+
+       public void setSecurityWorkspace(String securityWorkspace) {
+               this.securityWorkspace = securityWorkspace;
+       }
+}
\ No newline at end of file