Enhance refactoring, bug shooting
[gpl/argeo-suite.git] / org.argeo.suite.core / src / org / argeo / suite / people / PeopleSuiteServiceImpl.java
index 27efb4d19eb50f87d5d64b97975dde96be70e15c..1aaf15b68f5aa1ceeb4c17cd2b327a091445ece7 100644 (file)
@@ -1,5 +1,8 @@
 package org.argeo.suite.people;
 
+import java.net.URI;
+import java.util.Map;
+
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
@@ -9,23 +12,28 @@ import javax.jcr.security.Privilege;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.connect.people.PeopleConstants;
-import org.argeo.connect.people.PeopleNames;
 import org.argeo.connect.people.PeopleService;
-import org.argeo.connect.people.PeopleTypes;
-import org.argeo.connect.people.ResourceService;
 import org.argeo.connect.people.core.PeopleServiceImpl;
+import org.argeo.connect.resources.ResourcesService;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.node.NodeConstants;
+import org.argeo.suite.ArgeoSuiteRole;
 import org.argeo.suite.SuiteException;
 
-/** Default implementation of an Argeo Suite specific People Backend */
+/**
+ * Default implementation of an Argeo Suite specific People Backend
+ * 
+ * TODO refactor and clean init process and service dependencies
+ */
 public class PeopleSuiteServiceImpl extends PeopleServiceImpl implements PeopleService, PeopleConstants {
        private final static Log log = LogFactory.getLog(PeopleSuiteServiceImpl.class);
 
        /* DEPENDENCY INJECTION */
        private Repository repository;
        private String workspaceName;
-       // private UserAdminService userAdminService;
+       private ResourcesService resourceService;
+       private Map<String, URI> initResources = null;
+       private Map<String, URI> legacyResources = null;
 
        public void init() {
                super.init();
@@ -33,6 +41,7 @@ public class PeopleSuiteServiceImpl extends PeopleServiceImpl implements PeopleS
                try {
                        adminSession = repository.login(workspaceName);
                        initialiseModel(adminSession);
+                       initModelResources(adminSession);
                } catch (Exception e) {
                        throw new SuiteException("Cannot initialise model", e);
                } finally {
@@ -40,37 +49,38 @@ public class PeopleSuiteServiceImpl extends PeopleServiceImpl implements PeopleS
                }
        }
 
-       // HELPERS
-
-       // TODO Hard-coded creation of default public and shared file directories
-       // To be cleaned once first init and configuration mechanisms have been
-       // implemented
+       // TODO Hard-coded model initialisation
+       // To be cleaned once first init and config mechanisms have been implemented
        private final static String publicPath = "/public";
-       private final static String sharedFilePath = "/sharedFiles";
+       // 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
        protected void initialiseModel(Session adminSession) throws RepositoryException {
                super.initialiseModel(adminSession);
 
                JcrUtils.mkdirs(adminSession, publicPath, NodeType.NT_UNSTRUCTURED);
-               JcrUtils.mkdirs(adminSession, sharedFilePath, NodeType.NT_FOLDER);
-               initModelResources(adminSession);
                if (adminSession.hasPendingChanges()) {
                        adminSession.save();
-                       log.info("Repository has been initialized " + "with People's model");
                        configureACL(adminSession);
+                       log.info("Repository has been initialised with Argeo Suite model");
                }
        }
 
        // First draft of configuration of the people specific rights
        private void configureACL(Session session) throws RepositoryException {
-               String memberGroupDn = "cn=" + PeopleConstants.ROLE_MEMBER + ",ou=roles,ou=node";
-               JcrUtils.addPrivilege(session, getBasePath(null), memberGroupDn, Privilege.JCR_ALL);
+
+               // Initialise people
+               JcrUtils.addPrivilege(session, getBasePath(null), ArgeoSuiteRole.coworker.dn(), Privilege.JCR_ALL);
+               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);
-               JcrUtils.addPrivilege(session, sharedFilePath, NodeConstants.ROLE_USER, Privilege.JCR_ALL);
+
                session.save();
                log.info("Access control configured");
        }
@@ -78,11 +88,11 @@ public class PeopleSuiteServiceImpl extends PeopleServiceImpl implements PeopleS
        /**
         * Initialises People resource model and optionally imports legacy resources
         */
-       protected void initModelResources(Session adminSession) throws RepositoryException {
-               // initialisation
-               ResourceService resourceService = getResourceService();
-               resourceService.initialiseResources(adminSession);
-
+       protected void initModelResources(Session adminSession) {
+               // try {
+               // // initialisation
+               // resourceService.initialiseResources(adminSession);
+               //
                // Resource resource = initResources.get("Countries");
                // if (resourceService.getTagLikeResourceParent(adminSession,
                // PeopleConstants.RESOURCE_COUNTRY) == null
@@ -91,7 +101,7 @@ public class PeopleSuiteServiceImpl extends PeopleServiceImpl implements PeopleS
                // PeopleConstants.RESOURCE_COUNTRY,
                // PeopleTypes.PEOPLE_TAG_ENCODED_INSTANCE, PeopleNames.PEOPLE_CODE,
                // getBasePath(null),
-               // JcrUiUtils.getLocalJcrItemName(NodeType.NT_UNSTRUCTURED), new
+               // ConnectJcrUtils.getLocalJcrItemName(NodeType.NT_UNSTRUCTURED), new
                // ArrayList<String>());
                // String EN_SHORT_NAME = "English short name (upper-lower case)";
                // String ISO_CODE = "Alpha-2 code";
@@ -108,7 +118,7 @@ public class PeopleSuiteServiceImpl extends PeopleServiceImpl implements PeopleS
                // PeopleConstants.RESOURCE_LANG,
                // PeopleTypes.PEOPLE_TAG_ENCODED_INSTANCE, PeopleNames.PEOPLE_CODE,
                // getBasePath(null),
-               // JcrUiUtils.getLocalJcrItemName(NodeType.NT_UNSTRUCTURED), new
+               // ConnectJcrUtils.getLocalJcrItemName(NodeType.NT_UNSTRUCTURED), new
                // ArrayList<String>());
                // String EN_SHORT_NAME = "Language name";
                // String ISO_CODE = "639-1";
@@ -116,20 +126,42 @@ public class PeopleSuiteServiceImpl extends PeopleServiceImpl implements PeopleS
                // PeopleConstants.RESOURCE_LANG, ISO_CODE,
                // EN_SHORT_NAME).parse(resource.getInputStream(), "UTF-8");
                // }
+               //
+               // // Create tag & mailing list parents
+               // if (resourceService.getTagLikeResourceParent(adminSession,
+               // PeopleConstants.RESOURCE_TAG) == null)
+               // resourceService.createTagLikeResourceParent(adminSession,
+               // PeopleConstants.RESOURCE_TAG,
+               // PeopleTypes.PEOPLE_TAG_INSTANCE, null, getBasePath(null),
+               // PeopleTypes.PEOPLE_ENTITY,
+               // PeopleNames.PEOPLE_TAGS);
+               // if (resourceService.getTagLikeResourceParent(adminSession,
+               // PeopleTypes.PEOPLE_MAILING_LIST) == null)
+               // resourceService.createTagLikeResourceParent(adminSession, null,
+               // PeopleTypes.PEOPLE_MAILING_LIST, null,
+               // getBasePath(null), PeopleTypes.PEOPLE_ENTITY,
+               // PeopleNames.PEOPLE_MAILING_LISTS);
+               //
+               // // Initialise catalogues
+               // importCatalogue(adminSession, initResources.get("SimpleTasks"),
+               // PeopleTypes.PEOPLE_TASK);
+               //
+               // if (adminSession.hasPendingChanges()) {
+               // adminSession.save();
+               // log.info("Resources have been added to Argeo Suite model");
+               // }
+               // } catch (IOException | RepositoryException e) {
+               // throw new SuiteException("Cannot initialise resources ", e);
+               // }
+       }
 
-               // Create tag & mailing list parents
-               if (resourceService.getTagLikeResourceParent(adminSession, PeopleConstants.RESOURCE_TAG) == null)
-                       resourceService.createTagLikeResourceParent(adminSession, PeopleConstants.RESOURCE_TAG,
-                                       PeopleTypes.PEOPLE_TAG_INSTANCE, null, getBasePath(null), PeopleTypes.PEOPLE_ENTITY,
-                                       PeopleNames.PEOPLE_TAGS);
-               if (resourceService.getTagLikeResourceParent(adminSession, PeopleTypes.PEOPLE_MAILING_LIST) == null)
-                       resourceService.createTagLikeResourceParent(adminSession, null, PeopleTypes.PEOPLE_MAILING_LIST, null,
-                                       getBasePath(null), PeopleTypes.PEOPLE_ENTITY, PeopleNames.PEOPLE_MAILING_LISTS);
+       /** Give access to the repository to extending classes */
+       protected Repository getRepository() {
+               return repository;
+       }
 
-               if (adminSession.hasPendingChanges()) {
-                       adminSession.save();
-                       log.info("Resources have been added to People's model");
-               }
+       protected String getWorkspaceName() {
+               return workspaceName;
        }
 
        /* DEPENDENCY INJECTION */
@@ -140,4 +172,8 @@ public class PeopleSuiteServiceImpl extends PeopleServiceImpl implements PeopleS
        public void setWorkspaceName(String workspaceName) {
                this.workspaceName = workspaceName;
        }
+
+       public void setInitResources(Map<String, URI> initResources) {
+               this.initResources = initResources;
+       }
 }