/* * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.services.cms.listeners; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.RepositoryException; 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.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; import org.exoplatform.services.jcr.ext.hierarchy.impl.HierarchyConfig.JcrPath; import org.exoplatform.services.jcr.ext.hierarchy.impl.HierarchyConfig.Permission; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.organization.Group; import org.exoplatform.services.organization.GroupEventListener; import org.exoplatform.services.wcm.core.NodetypeConstant; /** * Created by The eXo Platform SARL Author : Dang Van Minh minh.dang@exoplatform.com Nov 15, 2007 * 11:13:25 AM */ public class NewGroupListener extends GroupEventListener { /** The log. */ private static final Log LOG = ExoLogger.getLogger(NewGroupListener.class.getName()); private HierarchyConfig config_; private RepositoryService jcrService_; private String groupsPath_; final static private String NT_UNSTRUCTURED = "nt:unstructured"; final static private String GROUPS_PATH = "groupsPath"; public NewGroupListener(RepositoryService jcrService, NodeHierarchyCreator nodeHierarchyCreatorService, InitParams params) throws Exception { jcrService_ = jcrService; config_ = params.getObjectParamValues(HierarchyConfig.class).get(0); groupsPath_ = nodeHierarchyCreatorService.getJcrPath(GROUPS_PATH); } public void preSave(Group group, boolean isNew) throws Exception { buildGroupStructure(group); } public void preDelete(Group group) { try { removeGroup(group.getId()); } catch (RepositoryException e) { if (LOG.isWarnEnabled()) { LOG.warn(e.getMessage()); } } } private void removeGroup(String groupId) throws RepositoryException { ManageableRepository manageableRepository = jcrService_.getCurrentRepository(); String systemWorkspace = manageableRepository.getConfiguration().getDefaultWorkspaceName(); Session session = manageableRepository.getSystemSession(systemWorkspace); Node groupNode = (Node)session.getItem(groupsPath_ + groupId); groupNode.remove(); session.save(); session.logout(); } @SuppressWarnings("unchecked") private void buildGroupStructure(Group group) throws Exception { ManageableRepository manageableRepository = jcrService_.getCurrentRepository(); String systemWorkspace = manageableRepository.getConfiguration().getDefaultWorkspaceName(); Session session = manageableRepository.getSystemSession(systemWorkspace); Node groupsHome = (Node)session.getItem(groupsPath_); List jcrPaths = config_.getJcrPaths(); String groupId = group.getId(); String groupLabel = group.getLabel(); Node groupNode = null; try { groupNode = groupsHome.getNode(groupId.substring(1, groupId.length())); } catch (PathNotFoundException e) { groupNode = groupsHome.addNode(groupId.substring(1, groupId.length())); } if (groupNode.canAddMixin(NodetypeConstant.EXO_DRIVE)) { groupNode.addMixin(NodetypeConstant.EXO_DRIVE); } groupNode.setProperty(NodetypeConstant.EXO_LABEL, groupLabel); for (JcrPath jcrPath : (List<JcrPath>)jcrPaths) { createNode(groupNode, jcrPath.getPath(), jcrPath.getNodeType(), jcrPath.getMixinTypes(), getPermissions( jcrPath.getPermissions(), groupId)); } session.save(); session.logout(); } @SuppressWarnings("unchecked") private void createNode(Node groupNode, String path, String nodeType, List<String> mixinTypes, Map permissions) throws Exception { if (nodeType == null || nodeType.length() == 0) nodeType = NT_UNSTRUCTURED; try { groupNode = groupNode.getNode(path); } catch (PathNotFoundException e) { groupNode = groupNode.addNode(path, nodeType); } if (groupNode.canAddMixin("exo:privilegeable")) groupNode.addMixin("exo:privilegeable"); if (permissions != null && !permissions.isEmpty()) ((ExtendedNode)groupNode).setPermissions(permissions); if (mixinTypes.size() > 0) { for (String mixin : mixinTypes) { if (groupNode.canAddMixin(mixin)) groupNode.addMixin(mixin); } } } private Map getPermissions(List<Permission> permissions, String groupId) { Map<String, String[]> permissionsMap = new HashMap<String, String[]>(); String groupIdentity = "*:".concat(groupId); permissionsMap.put(groupIdentity, 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; } }