/* * Copyright (C) 2003-2007 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see. */ package org.exoplatform.services.jcr.ext.hierarchy.impl; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.Session; import org.exoplatform.container.xml.InitParams; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.access.PermissionType; import org.exoplatform.services.jcr.config.RepositoryEntry; import org.exoplatform.services.jcr.core.ExtendedNode; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator; import org.exoplatform.services.jcr.ext.hierarchy.impl.HierarchyConfig.JcrPath; import org.exoplatform.services.jcr.ext.hierarchy.impl.HierarchyConfig.Permission; import org.exoplatform.services.organization.User; import org.exoplatform.services.organization.UserEventListener; /** * Created by The eXo Platform SAS Author : Dang Van Minh minh.dang@exoplatform.com Nov 15, 2007 * 11:13:12 AM */ public class NewUserListener extends UserEventListener { private HierarchyConfig config_; private RepositoryService jcrService_; private NodeHierarchyCreator nodeHierarchyCreatorService_; private String userPath_; final static private String USERS_PATH = "usersPath"; final static private String NT_UNSTRUCTURED = "nt:unstructured".intern(); public NewUserListener(RepositoryService jcrService, NodeHierarchyCreator nodeHierarchyCreatorService, InitParams params) throws Exception { jcrService_ = jcrService; nodeHierarchyCreatorService_ = nodeHierarchyCreatorService; config_ = (HierarchyConfig) params.getObjectParamValues(HierarchyConfig.class).get(0); nodeHierarchyCreatorService_.addPlugin(new AddPathPlugin(params)); userPath_ = nodeHierarchyCreatorService.getJcrPath(USERS_PATH); } public void preSave(User user, boolean isNew) throws Exception { String userName = user.getUserName(); List repositories = jcrService_.getConfig().getRepositoryConfigurations(); // TODO [PN, 12.02.08] only default repository should contains user structure if(isNew) { for (RepositoryEntry repo : repositories) { processUserStructure(repo.getName(), userName); } } } @SuppressWarnings("unchecked") private void processUserStructure(String repository, String userName) throws Exception { ManageableRepository manageableRepository = jcrService_.getRepository(repository); String systemWorkspace = manageableRepository.getConfiguration().getDefaultWorkspaceName(); Session session = manageableRepository.getSystemSession(systemWorkspace); Node usersHome = (Node) session.getItem(userPath_); List jcrPaths = config_.getJcrPaths(); Node userNode = null; try { userNode = usersHome.getNode(userName); } catch(PathNotFoundException e) { userNode = usersHome.addNode(userName); } for (JcrPath jcrPath : jcrPaths) { createNode(userNode, jcrPath.getPath(), jcrPath.getNodeType(), jcrPath.getMixinTypes(), getPermissions(jcrPath.getPermissions(), userName)); } session.save(); session.logout(); } public void preDelete(User user) { // use a anonymous connection for the configuration as the user is not // authentified at that time List repositories = jcrService_.getConfig().getRepositoryConfigurations(); for (RepositoryEntry repo : repositories) { try { ManageableRepository manaRepo = jcrService_.getRepository(repo.getName()); Session session = manaRepo.getSystemSession(manaRepo.getConfiguration() .getDefaultWorkspaceName()); Node usersHome = (Node) session.getItem(nodeHierarchyCreatorService_.getJcrPath(USERS_PATH)); usersHome.getNode(user.getUserName()).remove(); session.save(); session.logout(); } catch (Exception e) { e.printStackTrace(); } } } @SuppressWarnings("unchecked") private void createNode(Node userNode, String path, String nodeType, List mixinTypes, Map permissions) throws Exception { if (nodeType == null || nodeType.length() == 0) nodeType = NT_UNSTRUCTURED; try { userNode = userNode.getNode(path); } catch(PathNotFoundException e) { userNode = userNode.addNode(path, nodeType); } if (userNode.canAddMixin("exo:privilegeable")) userNode.addMixin("exo:privilegeable"); if (permissions != null && !permissions.isEmpty()) ((ExtendedNode) userNode).setPermissions(permissions); if (mixinTypes.size() > 0) { for (String mixin : mixinTypes) { if (userNode.canAddMixin(mixin)) userNode.addMixin(mixin); } } } private Map getPermissions(List permissions, String userId) { Map permissionsMap = new HashMap(); permissionsMap.put(userId, PermissionType.ALL); for (Permission permission : permissions) { StringBuilder strPer = new StringBuilder(); if ("true".equals(permission.getRead())) strPer.append(PermissionType.READ); if ("true".equals(permission.getAddNode())) strPer.append(",").append(PermissionType.ADD_NODE); if ("true".equals(permission.getSetProperty())) strPer.append(",").append(PermissionType.SET_PROPERTY); if ("true".equals(permission.getRemove())) strPer.append(",").append(PermissionType.REMOVE); permissionsMap.put(permission.getIdentity(), strPer.toString().split(",")); } return permissionsMap; } }