X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=blobdiff_plain;f=org.argeo.suite.core%2Fsrc%2Forg%2Fargeo%2Fsuite%2Fcore%2FDefaultSuiteMaintenanceService.java;fp=org.argeo.suite.core%2Fsrc%2Forg%2Fargeo%2Fsuite%2Fcore%2FDefaultSuiteMaintenanceService.java;h=d0a04684a61ba29e81a3de411aa73d2322279a35;hp=0000000000000000000000000000000000000000;hb=be7cb3f18ce76bde064cbbc2a38de6386f3498d2;hpb=aa4589e3623bd00210ce1a9f56153beee45e6c1d diff --git a/org.argeo.suite.core/src/org/argeo/suite/core/DefaultSuiteMaintenanceService.java b/org.argeo.suite.core/src/org/argeo/suite/core/DefaultSuiteMaintenanceService.java new file mode 100644 index 0000000..d0a0468 --- /dev/null +++ b/org.argeo.suite.core/src/org/argeo/suite/core/DefaultSuiteMaintenanceService.java @@ -0,0 +1,106 @@ +package org.argeo.suite.core; + +import java.util.List; + +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.jcr.JcrUtils; +import org.argeo.node.NodeConstants; +import org.argeo.suite.ArgeoSuiteRole; +import org.argeo.suite.SuiteException; + +/** Make the DJay-ing to provide a full running Suite platform */ +public class DefaultSuiteMaintenanceService implements AppMaintenanceService { + private final static Log log = LogFactory.getLog(DefaultSuiteMaintenanceService.class); + + /* DEPENDENCY INJECTION */ + private Repository repository; + private String workspaceName; + private List maintenanceServices; + + public void init() { + Session adminSession = null; + try { + adminSession = repository.login(workspaceName); + if (prepareJcrTree(adminSession)) { + configurePrivileges(adminSession); + } + } 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); + if (hasCHanged) + log.info("Repository has been initialised with Argeo Suite model"); + return hasCHanged; + } + + @Override + public void configurePrivileges(Session session) { + try { + // Remove unused default JCR rights + JcrUtils.clearAccessControList(session, "/", "everyone"); + + 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"); + } + + public void destroy() { + } + + /* DEPENDENCY INJECTION */ + public void setRepository(Repository repository) { + this.repository = repository; + } + + public void setWorkspaceName(String workspaceName) { + this.workspaceName = workspaceName; + } + + public void setMaintenanceServices(List maintenanceServices) { + this.maintenanceServices = maintenanceServices; + } +}