+package org.argeo.suite.people;
+
+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.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.jcr.JcrUtils;
+import org.argeo.node.NodeConstants;
+import org.argeo.suite.SuiteException;
+
+/** Default implementation of an Argeo Suite specific People Backend */
+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;
+
+ public void init() {
+ super.init();
+ Session adminSession = null;
+ try {
+ adminSession = repository.login(workspaceName);
+ initialiseModel(adminSession);
+ } catch (Exception e) {
+ throw new SuiteException("Cannot initialise model", e);
+ } finally {
+ JcrUtils.logoutQuietly(adminSession);
+ }
+ }
+
+ // HELPERS
+
+ // TODO Hard-coded creation of default public and shared file directories
+ // To be cleaned once first init and configuration mechanisms have been
+ // implemented
+ private final static String publicPath = "/public";
+ private final static String sharedFilePath = "/sharedFiles";
+
+ @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);
+ }
+ }
+
+ // 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);
+ 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");
+ }
+
+ /**
+ * Initialises People resource model and optionally imports legacy resources
+ */
+ protected void initModelResources(Session adminSession) throws RepositoryException {
+ // initialisation
+ ResourceService resourceService = getResourceService();
+ resourceService.initialiseResources(adminSession);
+
+ // Resource resource = initResources.get("Countries");
+ // if (resourceService.getTagLikeResourceParent(adminSession,
+ // PeopleConstants.RESOURCE_COUNTRY) == null
+ // && resource != null) {
+ // resourceService.createTagLikeResourceParent(adminSession,
+ // PeopleConstants.RESOURCE_COUNTRY,
+ // PeopleTypes.PEOPLE_TAG_ENCODED_INSTANCE, PeopleNames.PEOPLE_CODE,
+ // getBasePath(null),
+ // JcrUiUtils.getLocalJcrItemName(NodeType.NT_UNSTRUCTURED), new
+ // ArrayList<String>());
+ // String EN_SHORT_NAME = "English short name (upper-lower case)";
+ // String ISO_CODE = "Alpha-2 code";
+ // new EncodedTagCsvFileParser(resourceService, adminSession,
+ // PeopleConstants.RESOURCE_COUNTRY, ISO_CODE,
+ // EN_SHORT_NAME).parse(resource.getInputStream(), "UTF-8");
+ // }
+ //
+ // resource = initResources.get("Languages");
+ // if (resourceService.getTagLikeResourceParent(adminSession,
+ // PeopleConstants.RESOURCE_LANG) == null
+ // && resource != null) {
+ // resourceService.createTagLikeResourceParent(adminSession,
+ // PeopleConstants.RESOURCE_LANG,
+ // PeopleTypes.PEOPLE_TAG_ENCODED_INSTANCE, PeopleNames.PEOPLE_CODE,
+ // getBasePath(null),
+ // JcrUiUtils.getLocalJcrItemName(NodeType.NT_UNSTRUCTURED), new
+ // ArrayList<String>());
+ // String EN_SHORT_NAME = "Language name";
+ // String ISO_CODE = "639-1";
+ // new EncodedTagCsvFileParser(resourceService, adminSession,
+ // 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);
+
+ if (adminSession.hasPendingChanges()) {
+ adminSession.save();
+ log.info("Resources have been added to People's model");
+ }
+ }
+
+ /* DEPENDENCY INJECTION */
+ public void setRepository(Repository repository) {
+ this.repository = repository;
+ }
+
+ public void setWorkspaceName(String workspaceName) {
+ this.workspaceName = workspaceName;
+ }
+}