X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.suite.core%2Fsrc%2Forg%2Fargeo%2Fsuite%2FSuiteMaintenanceService.java;fp=org.argeo.suite.core%2Fsrc%2Forg%2Fargeo%2Fsuite%2FSuiteMaintenanceService.java;h=ef1ade057c06da70e96e601aeac1b792d989e272;hb=aa4589e3623bd00210ce1a9f56153beee45e6c1d;hp=0000000000000000000000000000000000000000;hpb=1cebaaf96f0e34a7995f960e07aa62fb6c5f40b9;p=gpl%2Fargeo-suite.git 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 index 0000000..ef1ade0 --- /dev/null +++ b/org.argeo.suite.core/src/org/argeo/suite/SuiteMaintenanceService.java @@ -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 maintenanceServices; + private Map initResources = null; + private Map 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 initialResources) { + for (AppMaintenanceService service : maintenanceServices) + service.prepareJcrTree(session); + } + + @Override + public void importData(Session session, URI uri, Map 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 maintenanceServices) { + this.maintenanceServices = maintenanceServices; + } +}