/* * 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<http://www.gnu.org/licenses/>. */ package org.exoplatform.ecm.webui.core; import java.util.Iterator; import java.util.List; import javax.jcr.Node; import org.exoplatform.ecm.permission.info.UIPermissionInputSet; import org.exoplatform.ecm.webui.selector.UIGroupMemberSelector; import org.exoplatform.ecm.webui.selector.UISelectable; import org.exoplatform.ecm.webui.utils.PermissionUtil; import org.exoplatform.ecm.webui.utils.Utils; import org.exoplatform.services.cms.link.LinkManager; 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.NodetypeConstant; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.exoplatform.webui.core.UIPopupContainer; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIForm; public abstract class UIPermissionFormBase extends UIForm implements UISelectable { public static final String PERMISSION = "permission"; public static final String POPUP_SELECT = "SelectUserOrGroup"; public static final String SYMLINK = "exo:symlink"; private static final String[] PERMISSION_TYPES = {PermissionType.READ, PermissionType.ADD_NODE, PermissionType.REMOVE}; protected static final Log LOG = ExoLogger.getLogger(UIPermissionFormBase.class.getName()); public UIPermissionFormBase() throws Exception { addChild(new UIPermissionInputSet(PERMISSION)); setActions(new String[] { "Save", "Reset", "Close" }); } public abstract Node getCurrentNode() throws Exception; public void fillForm(String user, ExtendedNode node) throws Exception { UIPermissionInputSet uiInputSet = getChildById(PERMISSION); refresh(); uiInputSet.getUIStringInput(UIPermissionInputSet.FIELD_USERORGROUP).setValue(user); if(user.equals(Utils.getNodeOwner(node))) { for (String perm : PERMISSION_TYPES) { 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 = perIter.next(); if(user.equals(accessControlEntry.getIdentity())) { userPermission.append(accessControlEntry.getPermission()).append(" "); } } for (String perm : PERMISSION_TYPES) { boolean isCheck = userPermission.toString().contains(perm); uiInputSet.getUICheckBoxInput(perm).setChecked(isCheck); } } } public void updateSymlinks(Node node) throws Exception { if(node.isNodeType(NodetypeConstant.MIX_REFERENCEABLE)){ LinkManager linkManager = WCMCoreUtils.getService(LinkManager.class); List<Node> symlinks = linkManager.getAllLinks(node, SYMLINK); for (Node symlink : symlinks) { try { linkManager.updateLink(symlink, node); } catch (Exception e) { if (LOG.isWarnEnabled()) { LOG.warn(e.getMessage()); } } } } } protected void lockForm(boolean isLock) { UIPermissionInputSet uiInputSet = getChildById(PERMISSION); if(isLock) { uiInputSet.setButtonActions(new String[] {"Reset" }); } else { uiInputSet.setButtonActions(new String[] {"Save", "Reset" }); } for (String perm : PERMISSION_TYPES) { uiInputSet.getUICheckBoxInput(perm).setDisabled(isLock); } } protected boolean isEditable(Node node) throws Exception { return PermissionUtil.canChangePermission(node); } protected void refresh() { reset(); checkAll(false); } protected void checkAll(boolean check) { UIPermissionInputSet uiInputSet = getChildById(PERMISSION); for (String perm : PERMISSION_TYPES) { uiInputSet.getUICheckBoxInput(perm).setChecked(check); } } protected String getExoOwner(Node node) throws Exception { return Utils.getNodeOwner(node); } static public class ResetActionListener extends EventListener<UIPermissionFormBase> { public void execute(Event<UIPermissionFormBase> event) throws Exception { UIPermissionFormBase uiForm = event.getSource(); uiForm.lockForm(false); uiForm.refresh(); event.getRequestContext().addUIComponentToUpdateByAjax(uiForm); } } static public class SelectUserActionListener extends EventListener<UIPermissionFormBase> { public void execute(Event<UIPermissionFormBase> event) throws Exception { UIPermissionFormBase uiForm = event.getSource(); ((UIPermissionManagerBase)uiForm.getParent()).initUserSelector(); UIPopupContainer popupContainer = uiForm.getAncestorOfType(UIPopupContainer.class); if (popupContainer != null) { event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer); } else { event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent()); } } } static public class AddAnyActionListener extends EventListener<UIPermissionFormBase> { public void execute(Event<UIPermissionFormBase> event) throws Exception { UIPermissionFormBase uiForm = event.getSource(); UIPermissionInputSet uiInputSet = uiForm.getChildById(UIPermissionFormBase.PERMISSION); uiInputSet.getUIStringInput(UIPermissionInputSet.FIELD_USERORGROUP).setValue(IdentityConstants.ANY); uiForm.checkAll(false); uiInputSet.getUICheckBoxInput(PermissionType.READ).setChecked(true); UIPopupContainer popupContainer = uiForm.getAncestorOfType(UIPopupContainer.class); if (popupContainer != null) { event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer); } else { event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent()); } } } static public class SelectMemberActionListener extends EventListener<UIPermissionFormBase> { public void execute(Event<UIPermissionFormBase> event) throws Exception { UIPermissionFormBase uiForm = event.getSource(); UIGroupMemberSelector uiGroupMemberSelector = uiForm.createUIComponent(UIGroupMemberSelector.class, null, null); uiGroupMemberSelector.setSourceComponent(uiForm, new String[] { UIPermissionInputSet.FIELD_USERORGROUP }); uiForm.getAncestorOfType(UIPermissionManagerBase.class).initPopupPermission(uiGroupMemberSelector); UIPopupContainer popupContainer = uiForm.getAncestorOfType(UIPopupContainer.class); if (popupContainer != null) { event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer); } else { event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent()); } } } }