First part of the refactoring: clean backends.
[gpl/argeo-suite.git] / org.argeo.suite.core / src / org / argeo / suite / SuiteMaintenanceService.java
diff --git a/org.argeo.suite.core/src/org/argeo/suite/SuiteMaintenanceService.java b/org.argeo.suite.core/src/org/argeo/suite/SuiteMaintenanceService.java
new file mode 100644 (file)
index 0000000..ef1ade0
--- /dev/null
@@ -0,0 +1,115 @@
+package org.argeo.suite;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.security.Privilege;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.connect.AppMaintenanceService;
+import org.argeo.connect.resources.ResourceService;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.node.NodeConstants;
+
+/** Make the DJay-ing to provide a full running Suite platform */
+public class SuiteMaintenanceService implements AppMaintenanceService {
+       private final static Log log = LogFactory.getLog(SuiteMaintenanceService.class);
+
+       /* DEPENDENCY INJECTION */
+       private Repository repository;
+       private String workspaceName;
+       private ResourceService resourceService;
+       private List<AppMaintenanceService> maintenanceServices;
+       private Map<String, URI> initResources = null;
+       private Map<String, URI> legacyResources = null;
+
+       public void init() {
+               Session adminSession = null;
+               try {
+                       adminSession = repository.login(workspaceName);
+                       if (prepareJcrTree(adminSession)) {
+                               configurePrivileges(adminSession);
+                               importResources(adminSession, null);
+                       }
+               } catch (Exception e) {
+                       throw new SuiteException("Cannot initialise model", e);
+               } finally {
+                       JcrUtils.logoutQuietly(adminSession);
+               }
+       }
+
+       // TODO Hard-coded model initialisation
+       // To be cleaned once first init and config mechanisms have been implemented
+       private final static String publicPath = "/public";
+       // FIXME Users must have read access on the jcr:system/jcr:versionStorage
+       // node under JackRabbit to be able to manage versions
+       private final static String jackRabbitVersionSystemPath = "/jcr:system";
+
+       @Override
+       public boolean prepareJcrTree(Session session) {
+               boolean hasCHanged = false;
+               try {
+                       JcrUtils.mkdirs(session, publicPath, NodeType.NT_UNSTRUCTURED);
+                       if (session.hasPendingChanges()) {
+                               session.save();
+                               hasCHanged = true;
+                       }
+               } catch (RepositoryException e) {
+                       throw new SuiteException("Cannot build model", e);
+               }
+               for (AppMaintenanceService service : maintenanceServices)
+                       hasCHanged |= service.prepareJcrTree(session);
+               log.info("Repository has been initialised with Argeo Suite model");
+               return hasCHanged;
+       }
+
+       @Override
+       public void configurePrivileges(Session session) {
+               // TODO check if first init.
+               try {
+                       JcrUtils.addPrivilege(session, jackRabbitVersionSystemPath, ArgeoSuiteRole.coworker.dn(),
+                                       Privilege.JCR_READ);
+                       // Default configuration of the workspace
+                       JcrUtils.addPrivilege(session, "/", NodeConstants.ROLE_ADMIN, Privilege.JCR_ALL);
+                       JcrUtils.addPrivilege(session, publicPath, NodeConstants.ROLE_USER, Privilege.JCR_READ);
+                       JcrUtils.addPrivilege(session, publicPath, "anonymous", Privilege.JCR_READ);
+                       JcrUtils.addPrivilege(session, publicPath, NodeConstants.ROLE_ANONYMOUS, Privilege.JCR_READ);
+                       session.save();
+               } catch (RepositoryException e) {
+                       throw new SuiteException("Cannot build model", e);
+               }
+               for (AppMaintenanceService service : maintenanceServices)
+                       service.configurePrivileges(session);
+               log.info("Access control configured");
+       }
+
+       @Override
+       public void importResources(Session session, Map<String, URI> initialResources) {
+               for (AppMaintenanceService service : maintenanceServices)
+                       service.prepareJcrTree(session);
+       }
+
+       @Override
+       public void importData(Session session, URI uri, Map<String, URI> resources) {
+               for (AppMaintenanceService service : maintenanceServices)
+                       service.prepareJcrTree(session);
+
+       }
+
+       @Override
+       public void doBackup(Session session, URI uri, Object resource) {
+               for (AppMaintenanceService service : maintenanceServices)
+                       service.prepareJcrTree(session);
+       }
+
+       /* DEPENDENCY INJECTION */
+       public void setMaintenanceServices(List<AppMaintenanceService> maintenanceServices) {
+               this.maintenanceServices = maintenanceServices;
+       }
+}