/***************************************************************************
* 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.views;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.jcr.Node;
import org.exoplatform.commons.utils.LazyPageList;
import org.exoplatform.commons.utils.ListAccess;
import org.exoplatform.commons.utils.ListAccessImpl;
import org.exoplatform.ecm.webui.core.UIPagingGrid;
import org.exoplatform.services.cms.views.ManageViewService;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
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.event.Event;
import org.exoplatform.webui.event.EventListener;
/**
* Created by The eXo Platform SARL
* Author : Dang Van Minh
* minh.dang@exoplatform.com
* Feb 19, 2013
* 4:26:03 PM
*/
@ComponentConfig(
template = "system:/groovy/ecm/webui/UIGridWithButton.gtmpl",
events = {
@EventConfig(listeners = UIViewPermissionList.DeleteActionListener.class, confirm = "UIViewPermissionList.msg.confirm-delete")
}
)
public class UIViewPermissionList extends UIPagingGrid {
public static String[] PERMISSION_BEAN_FIELD = {"friendlyPermission"} ;
private String viewName;
public UIViewPermissionList() throws Exception {
getUIPageIterator().setId("PermissionListPageIterator") ;
configure("permission", UIViewPermissionList.PERMISSION_BEAN_FIELD, new String[] {"Delete"});
}
public String[] getActions() { return new String[] {} ;}
public String getViewName() {
return viewName;
}
public void setViewName(String name) {
viewName = name;
}
@Override
public void refresh(int currentPage) throws Exception {
UIViewPermissionContainer uiPerContainer = getParent();
UIViewFormTabPane uiTabPane = uiPerContainer.getParent();
UIViewForm uiViewForm = uiTabPane.getChild(UIViewForm.class);
List<PermissionBean> permissions = new ArrayList<PermissionBean>();
if(uiPerContainer.isView()) {
ManageViewService viewService = WCMCoreUtils.getService(ManageViewService.class);
Node viewNode = viewService.getViewByName(viewName, WCMCoreUtils.getUserSessionProvider());
String strPermission = viewNode.getProperty("exo:accessPermissions").getString();
permissions = getBeanList(strPermission);
} else {
permissions = getBeanList(uiViewForm.getPermission());
}
Collections.sort(permissions, new ViewPermissionComparator());
ListAccess<PermissionBean> permissionBeanList = new ListAccessImpl<PermissionBean>(PermissionBean.class, permissions);
getUIPageIterator().setPageList(new LazyPageList<PermissionBean>(permissionBeanList, getUIPageIterator().getItemsPerPage()));
getUIPageIterator().setTotalItems(permissions.size());
if (currentPage > getUIPageIterator().getAvailablePage()) {
getUIPageIterator().setCurrentPage(getUIPageIterator().getAvailablePage());
} else {
getUIPageIterator().setCurrentPage(currentPage);
}
}
static public class DeleteActionListener extends EventListener<UIViewPermissionList> {
public void execute(Event<UIViewPermissionList> event) throws Exception {
UIViewPermissionList uiPermissionList = event.getSource();
UIViewPermissionContainer uiContainer = uiPermissionList.getParent();
UIViewFormTabPane uiTabPane = uiContainer.getParent();
UIViewForm uiViewForm = uiTabPane.getChild(UIViewForm.class);
String permission = event.getRequestContext().getRequestParameter(OBJECTID);
String permissions = uiPermissionList.removePermission(permission, uiViewForm.getPermission());
if(permissions.length() == 0) {
UIApplication uiApp = uiPermissionList.getAncestorOfType(UIApplication.class);
uiApp.addMessage(new ApplicationMessage("UIViewPermissionList.msg.permission-cannot-empty",
null,
ApplicationMessage.WARNING));
event.getRequestContext().addUIComponentToUpdateByAjax(uiContainer);
uiTabPane.setSelectedTab(uiContainer.getId());
return;
}
uiViewForm.setPermission(permissions);
uiPermissionList.refresh(uiPermissionList.getUIPageIterator().getCurrentPage());
event.getRequestContext().addUIComponentToUpdateByAjax(uiPermissionList.getParent());
}
}
static public class ViewPermissionComparator implements Comparator<PermissionBean> {
public int compare(PermissionBean t1, PermissionBean t2) throws ClassCastException {
String per1 = t1.getPermission();
String per2 = t2.getPermission();
return per1.compareToIgnoreCase(per2);
}
}
public static class PermissionBean {
private String permssion ;
private String friendlyPermission;
public PermissionBean() {}
public String getPermission(){ return this.permssion ; }
public void setPermission( String permission) { this.permssion = permission ; }
public String getFriendlyPermission() { return friendlyPermission; }
public void setFriendlyPermission(String friendlyPer) { this.friendlyPermission = friendlyPer; }
}
private String removePermission(String removePermission, String permissions) {
StringBuilder perBuilder = new StringBuilder();
if(permissions.indexOf(",") > -1) {
String[] arrPer = permissions.split(",");
for(String per : arrPer) {
if(per.equals(removePermission)) continue;
if(perBuilder.length() > 0) perBuilder.append(",");
perBuilder.append(per);
}
}
return perBuilder.toString();
}
private List<PermissionBean> getBeanList(String permissions) throws Exception {
UIViewContainer uiContainer = getAncestorOfType(UIViewContainer.class);
List<PermissionBean> listBean = new ArrayList<PermissionBean>();
String[] arrPers = new String[] {};
if(permissions.contains(",")) {
arrPers = permissions.split(",");
} else if(permissions.length() > 0) {
arrPers = new String[] {permissions};
}
for(String per : arrPers) {
PermissionBean bean = new PermissionBean();
bean.setPermission(per);
bean.setFriendlyPermission(uiContainer.getFriendlyPermission(per));
listBean.add(bean);
}
return listBean;
}
}