/*************************************************************************** * Copyright (C) 2003-2009 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<http://www.gnu.org/licenses/>. * **************************************************************************/ package org.exoplatform.ecm.webui.component.admin.taxonomy.tree.info; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.jcr.AccessDeniedException; import javax.jcr.Node; import org.exoplatform.ecm.permission.info.UIPermissionInputSet; import org.exoplatform.ecm.webui.component.admin.taxonomy.UITaxonomyManagerTrees; import org.exoplatform.ecm.webui.component.admin.taxonomy.UITaxonomyTreeContainer; import org.exoplatform.ecm.webui.component.admin.taxonomy.UITaxonomyTreeList; import org.exoplatform.ecm.webui.component.admin.taxonomy.action.UIActionForm; import org.exoplatform.ecm.webui.component.admin.taxonomy.action.UIActionTaxonomyManager; import org.exoplatform.ecm.webui.component.admin.taxonomy.info.UIPermissionForm; import org.exoplatform.ecm.webui.core.UIPermissionFormBase; import org.exoplatform.ecm.webui.core.bean.PermissionBean; import org.exoplatform.ecm.webui.selector.UIAnyPermission; import org.exoplatform.ecm.webui.selector.UIGroupMemberSelector; import org.exoplatform.ecm.webui.selector.UISelectable; import org.exoplatform.ecm.utils.lock.LockUtil; import org.exoplatform.ecm.webui.utils.PermissionUtil; import org.exoplatform.ecm.webui.utils.Utils; import org.exoplatform.services.cms.taxonomy.TaxonomyService; import org.exoplatform.services.cms.taxonomy.TaxonomyTreeData; import org.exoplatform.services.jcr.access.AccessControlEntry; import org.exoplatform.services.jcr.access.PermissionType; import org.exoplatform.services.jcr.core.ExtendedNode; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.security.IdentityConstants; import org.exoplatform.services.wcm.core.NodeLocation; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIApplication; import org.exoplatform.webui.core.UIBreadcumbs; import org.exoplatform.webui.core.UIContainer; import org.exoplatform.webui.core.UIPopupWindow; import org.exoplatform.webui.core.UITree; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.event.Event.Phase; /** * Created by The eXo Platform SARL * Author : Hoang Van Hung * hunghvit@gmail.com * Apr 17, 2009 */ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "app:/groovy/webui/component/admin/taxonomy/UIPermissionTreeForm.gtmpl", events = { @EventConfig(listeners = UIPermissionTreeForm.SaveActionListener.class), @EventConfig(phase = Phase.DECODE, listeners = UIPermissionTreeForm.NextAddActionActionListener.class), @EventConfig(phase = Phase.DECODE, listeners = UIPermissionTreeForm.PreviousActionListener.class), @EventConfig(phase = Phase.DECODE, listeners = UIPermissionTreeForm.ResetActionListener.class), @EventConfig(phase = Phase.DECODE, listeners = UIPermissionTreeForm.SelectUserActionListener.class), @EventConfig(phase = Phase.DECODE, listeners = UIPermissionTreeForm.SelectMemberActionListener.class), @EventConfig(phase = Phase.DECODE, listeners = UIPermissionTreeForm.AddAnyActionListener.class), @EventConfig(phase = Phase.DECODE, listeners = UIPermissionInputSet.OnChangeActionListener.class), @EventConfig(listeners = UIPermissionTreeForm.CancelActionListener.class) } ) public class UIPermissionTreeForm extends UIPermissionFormBase implements UISelectable { public static final String PERMISSION = "permission"; public static final String POPUP_SELECT = "TaxoTreeSelectUserOrGroupPopup"; public static final String[] PERMISSIONS = new String[] { PermissionType.READ, PermissionType.ADD_NODE, PermissionType.REMOVE }; public static final String SELECT_GROUP_ID = "TaxoTreeSelectUserOrGroup"; private static final Log LOG = ExoLogger.getLogger(UIPermissionTreeForm.class.getName()); private NodeLocation currentNode; private PermissionBean permBean; public UIPermissionTreeForm() throws Exception { super(); setActions(new String[] { "Previous", "NextAddAction", "Cancel"}); } public void checkAll(boolean check) { UIPermissionInputSet uiInputSet = getChildById(PERMISSION) ; for (String perm : PermissionType.ALL) { if(uiInputSet.getUICheckBoxInput(perm) != null) uiInputSet.getUICheckBoxInput(perm).setChecked(check); } } public void fillForm(String user, ExtendedNode node) throws Exception { UIPermissionInputSet uiInputSet = getChildById(PERMISSION); refresh(); uiInputSet.getUIStringInput(UIPermissionInputSet.FIELD_USERORGROUP).setValue(user); if (node != null) { if (user.equals(Utils.getNodeOwner(node))) { for (String perm : PERMISSIONS) { uiInputSet.getUICheckBoxInput(perm).setChecked(true); } } else { List<AccessControlEntry> permsList = node.getACL().getPermissionEntries(); Iterator<AccessControlEntry> perIter = permsList.iterator(); StringBuilder userPermission = new StringBuilder(); while (perIter.hasNext()) { AccessControlEntry accessControlEntry = (AccessControlEntry) perIter.next(); if (user.equals(accessControlEntry.getIdentity())) { userPermission.append(accessControlEntry.getPermission()).append(" "); } } for (String perm : PERMISSIONS) { boolean isCheck = userPermission.toString().contains(perm); uiInputSet.getUICheckBoxInput(perm).setChecked(isCheck); } } } else { UIPermissionTreeInfo uiInfo = ((UIContainer)getParent()).getChild(UIPermissionTreeInfo.class); for (PermissionBean permBeanTemp : uiInfo.getPermBeans()) { if(permBeanTemp.getUsersOrGroups().equals(user)) { getUICheckBoxInput(PermissionType.READ).setValue(permBeanTemp.isRead()); getUICheckBoxInput(PermissionType.ADD_NODE).setValue(permBeanTemp.isAddNode()); getUICheckBoxInput(PermissionType.REMOVE).setValue(permBeanTemp.isRemove()); break; } } } } protected void lockForm(boolean isLock) { UIPermissionInputSet uiInputSet = getChildById(PERMISSION); if (isLock) { setActions(new String[] { "Previous", "NextAddAction", "Cancel" }); uiInputSet.setActionInfo(UIPermissionInputSet.FIELD_USERORGROUP, null); } else { setActions(new String[] { "Previous", "NextAddAction", "Cancel" }); uiInputSet.setActionInfo(UIPermissionInputSet.FIELD_USERORGROUP, new String[] { "SelectUser", "SelectMember", "AddAny" }); } for (String perm : PERMISSIONS) { uiInputSet.getUICheckBoxInput(perm).setDisabled(isLock); } } public Node getCurrentNode() { return NodeLocation.getNodeByLocation(currentNode); } public void setCurrentNode(Node currentNode) { this.currentNode = NodeLocation.getNodeLocationByNode(currentNode); } public PermissionBean getPermBean() { return permBean; } public void setPermBean(PermissionBean permBean) { this.permBean = permBean; } public void doSelect(String selectField, Object value) { try { ExtendedNode node = (ExtendedNode) this.getCurrentNode(); checkAll(false); fillForm(value.toString(), node); lockForm(value.toString().equals(getExoOwner(node))); getUIStringInput(selectField).setValue(value.toString()); } catch (Exception e) { if (LOG.isErrorEnabled()) { LOG.error("Unexpected error", e); } } } public static class ResetActionListener extends EventListener<UIPermissionTreeForm> { public void execute(Event<UIPermissionTreeForm> event) throws Exception { UIPermissionTreeForm uiForm = event.getSource(); uiForm.lockForm(false); uiForm.refresh(); event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent()); } } public static class SaveActionListener extends EventListener<UIPermissionTreeForm> { public void execute(Event<UIPermissionTreeForm> event) throws Exception { UIPermissionTreeForm uiForm = event.getSource(); Node currentNode = uiForm.getCurrentNode(); UIPermissionTreeManager uiParent = uiForm.getParent(); UITaxonomyTreeContainer uiContainer = uiForm.getAncestorOfType(UITaxonomyTreeContainer.class); UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class); String userOrGroup = uiForm.getChild(UIPermissionInputSet.class).getUIStringInput( UIPermissionInputSet.FIELD_USERORGROUP).getValue(); List<String> permsList = new ArrayList<String>(); List<String> permsRemoveList = new ArrayList<String>(); PermissionBean permBean = new PermissionBean(); permBean.setUsersOrGroups(userOrGroup); permBean.setRead(uiForm.getUICheckBoxInput(PermissionType.READ).isChecked()); permBean.setAddNode(uiForm.getUICheckBoxInput(PermissionType.ADD_NODE).isChecked()); permBean.setRemove(uiForm.getUICheckBoxInput(PermissionType.REMOVE).isChecked()); for (String perm : PERMISSIONS) { if (uiForm.getUICheckBoxInput(perm).isChecked()) { permsList.add(perm); } else { permsRemoveList.add(perm); } } if (uiForm.getUICheckBoxInput(PermissionType.ADD_NODE).isChecked() || uiForm.getUICheckBoxInput(PermissionType.REMOVE).isChecked()) { if (!permsList.contains(PermissionType.READ)) { permsList.add(PermissionType.READ); } permBean.setRead(true); } if (uiForm.getUICheckBoxInput(PermissionType.ADD_NODE).isChecked()) permsList.add(PermissionType.SET_PROPERTY); else permsRemoveList.add(PermissionType.SET_PROPERTY); if (Utils.isNameEmpty(userOrGroup)) { uiApp.addMessage(new ApplicationMessage("UIPermissionTreeForm.msg.userOrGroup-required", null, ApplicationMessage.WARNING)); return; } if (permsList.size() == 0) { uiApp.addMessage(new ApplicationMessage("UIPermissionTreeForm.msg.checkbox-require", null, ApplicationMessage.WARNING)); return; } String[] permsArray = permsList.toArray(new String[permsList.size()]); uiForm.setPermBean(permBean); if (currentNode != null) { if(currentNode.isLocked()) { String lockToken = LockUtil.getLockToken(currentNode); if(lockToken != null) currentNode.getSession().addLockToken(lockToken); } if(!currentNode.isCheckedOut()) { uiApp.addMessage(new ApplicationMessage("UIPermissionTreeForm.msg.node-checkedin", null, ApplicationMessage.WARNING)); return; } ExtendedNode node = (ExtendedNode) currentNode; if (PermissionUtil.canChangePermission(node)) { if (node.canAddMixin("exo:privilegeable")){ node.addMixin("exo:privilegeable"); node.setPermission(Utils.getNodeOwner(node),PermissionType.ALL); } for (String perm : permsRemoveList) { try { node.removePermission(userOrGroup, perm); } catch (AccessDeniedException ade) { uiApp.addMessage(new ApplicationMessage("UIPermissionTreeForm.msg.access-denied", null, ApplicationMessage.WARNING)); return; } } if(PermissionUtil.canChangePermission(node)) node.setPermission(userOrGroup, permsArray); uiParent.getChild(UIPermissionTreeInfo.class).updateGrid(); node.save(); } else { uiApp.addMessage(new ApplicationMessage("UIPermissionTreeForm.msg.not-change-permission", null, ApplicationMessage.WARNING)); return; } currentNode.getSession().save(); TaxonomyService taxonomyService = uiForm.getApplicationComponent(TaxonomyService.class); taxonomyService.updateTaxonomyTree(uiContainer.getTaxonomyTreeData().getTaxoTreeName(), currentNode); } uiForm.refresh(); UIPermissionTreeInfo uiInfo = uiParent.getChild(UIPermissionTreeInfo.class); uiInfo.updateGrid(); event.getRequestContext().addUIComponentToUpdateByAjax(uiParent); } } public static class NextAddActionActionListener extends EventListener<UIPermissionTreeForm> { public void execute(Event<UIPermissionTreeForm> event) throws Exception { UIPermissionTreeForm uiForm = event.getSource(); UIPermissionTreeInfo uiPermInfo = ((UIContainer)uiForm.getParent()).getChild(UIPermissionTreeInfo.class); UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class); if (uiPermInfo.getPermBeans().size() < 1) { uiApp.addMessage(new ApplicationMessage("UIPermissionTreeForm.msg.have-not-any-permission", null, ApplicationMessage.WARNING)); return; } UITaxonomyTreeContainer uiTaxonomyTreeContainer = uiForm.getAncestorOfType(UITaxonomyTreeContainer.class); UITaxonomyManagerTrees uiTaxonomyManagerTrees = uiTaxonomyTreeContainer.getAncestorOfType(UITaxonomyManagerTrees.class); TaxonomyTreeData taxonomyTreeData = uiTaxonomyTreeContainer.getTaxonomyTreeData(); if (!taxonomyTreeData.isEdit()) { UIActionTaxonomyManager uiActionTaxonomyManager = uiTaxonomyTreeContainer.getChild(UIActionTaxonomyManager.class); UIActionForm uiActionForm = uiActionTaxonomyManager.getChild(UIActionForm.class); uiActionForm.createNewAction(null, TaxonomyTreeData.ACTION_TAXONOMY_TREE, true); uiActionForm.setWorkspace(taxonomyTreeData.getTaxoTreeWorkspace()); } uiTaxonomyTreeContainer.viewStep(3); uiTaxonomyTreeContainer.setRenderedChild(UIActionTaxonomyManager.class); event.getRequestContext().addUIComponentToUpdateByAjax(uiTaxonomyManagerTrees); } } public static class SelectUserActionListener extends EventListener<UIPermissionTreeForm> { public void execute(Event<UIPermissionTreeForm> event) throws Exception { UIPermissionTreeForm uiForm = event.getSource(); ((UIPermissionTreeManager)uiForm.getParent()).initUserSelector(); event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent()); } } public static class AddAnyActionListener extends EventListener<UIPermissionTreeForm> { public void execute(Event<UIPermissionTreeForm> event) throws Exception { UIPermissionTreeForm uiForm = event.getSource(); UIPermissionInputSet uiInputSet = uiForm.getChildById(UIPermissionForm.PERMISSION); uiInputSet.getUIStringInput(UIPermissionInputSet.FIELD_USERORGROUP).setValue( IdentityConstants.ANY); uiForm.checkAll(false); uiInputSet.getUICheckBoxInput(PermissionType.READ).setChecked(true); event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent()); } } public static class SelectMemberActionListener extends EventListener<UIPermissionTreeForm> { public void execute(Event<UIPermissionTreeForm> event) throws Exception { UIPermissionTreeForm uiForm = event.getSource(); UIGroupMemberSelector uiGroupMember; uiGroupMember = uiForm.createUIComponent(UIGroupMemberSelector.class, null, UIPermissionTreeForm.SELECT_GROUP_ID); uiGroupMember.getChild(UIAnyPermission.class).setId("TaxoTreeAnyPermission"); uiGroupMember.getChild(UIBreadcumbs.class).setId("TaxoTreeBreadcumbMembershipSelector"); uiGroupMember.getChild(UITree.class).setId("TaxoTreeMembershipSelector"); uiGroupMember.setSourceComponent(uiForm, new String[] { UIPermissionInputSet.FIELD_USERORGROUP }); uiForm.getAncestorOfType(UIPermissionTreeManager.class).initPopupPermission(uiGroupMember); event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent()); } } public static class PreviousActionListener extends EventListener<UIPermissionTreeForm> { public void execute(Event<UIPermissionTreeForm> event) throws Exception { UITaxonomyTreeContainer uiTaxonomyTreeContainer = event.getSource().getAncestorOfType(UITaxonomyTreeContainer.class); uiTaxonomyTreeContainer.viewStep(1); UITaxonomyManagerTrees uiTaxonomyManagerTrees = uiTaxonomyTreeContainer.getAncestorOfType(UITaxonomyManagerTrees.class); event.getRequestContext().addUIComponentToUpdateByAjax(uiTaxonomyManagerTrees); } } public static class CancelActionListener extends EventListener<UIPermissionTreeForm> { public void execute(Event<UIPermissionTreeForm> event) throws Exception { UIPermissionTreeForm uiForm = event.getSource(); UITaxonomyTreeContainer uiTaxonomyTreeContainer = uiForm.getAncestorOfType(UITaxonomyTreeContainer.class); UIPopupWindow uiPopup = uiTaxonomyTreeContainer.getParent(); UITaxonomyManagerTrees uiTaxonomyManagerTrees = uiTaxonomyTreeContainer.getAncestorOfType(UITaxonomyManagerTrees.class); uiTaxonomyManagerTrees.removeChildById(UITaxonomyTreeList.ST_ADD); uiTaxonomyManagerTrees.removeChildById(UITaxonomyTreeList.ST_EDIT); uiTaxonomyManagerTrees.update(); uiPopup.setRendered(false); uiPopup.setShow(false); event.getRequestContext().addUIComponentToUpdateByAjax(uiTaxonomyManagerTrees); } } }