/*
* 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.component.admin.views;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
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.permission.info.UIPermissionInputSet;
import org.exoplatform.ecm.webui.component.admin.UIECMAdminPortlet;
import org.exoplatform.ecm.webui.core.UIPagingGrid;
import org.exoplatform.ecm.webui.utils.Utils;
import org.exoplatform.services.cms.drives.DriveData;
import org.exoplatform.services.cms.drives.ManageDriveService;
import org.exoplatform.services.cms.views.ManageViewService;
import org.exoplatform.services.cms.views.ViewConfig;
import org.exoplatform.services.cms.views.impl.ManageViewPlugin;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.web.application.RequestContext;
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.UIComponent;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.input.UICheckBoxInput;
/**
* Created by The eXo Platform SARL
* Author : Tran The Trong
* trongtt@exoplatform.com
* Sep 19, 2006
* 11:45:11 AM
*/
@ComponentConfig(
template = "system:/groovy/ecm/webui/UIGridWithButton.gtmpl",
events = {
@EventConfig(listeners = UIViewList.DeleteActionListener.class, confirm = "UIViewList.msg.confirm-delete"),
@EventConfig(listeners = UIViewList.EditInfoActionListener.class),
@EventConfig(listeners = UIViewList.ViewActionListener.class),
@EventConfig(listeners = UIViewList.AddViewActionListener.class)
}
)
public class UIViewList extends UIPagingGrid {
final static public String[] ACTIONS = { "AddView" };
final static public String ST_VIEW = "ViewPopup";
final static public String ST_EDIT = "EditPopup";
final static public String ST_ADD = "AddPopup";
private static String[] VIEW_BEAN_FIELD = { "name", "permissions", "tabList", "baseVersion" };
private static String[] VIEW_ACTION = { "View", "EditInfo", "Delete" };
public UIViewList() throws Exception {
getUIPageIterator().setId("UIViewsGrid") ;
configure("id", VIEW_BEAN_FIELD, VIEW_ACTION) ;
}
private String getBaseVersion(String name) throws Exception {
Node node =
getApplicationComponent(ManageViewService.class).getViewByName(name, WCMCoreUtils.getSystemSessionProvider());
if(node == null) return null ;
if(!node.isNodeType(Utils.MIX_VERSIONABLE) || node.isNodeType(Utils.NT_FROZEN)) return "";
return node.getBaseVersion().getName();
}
public String[] getActions() { return ACTIONS ; }
public void refresh(int currentPage) throws Exception {
List<ViewBean> viewBean = getViewsBean();
Collections.sort(viewBean, new ViewComparator());
ListAccess<ViewBean> viewBeanList = new ListAccessImpl<ViewBean>(ViewBean.class, viewBean);
getUIPageIterator().setPageList(new LazyPageList<ViewBean>(viewBeanList,
getUIPageIterator().getItemsPerPage()));
getUIPageIterator().setTotalItems(viewBean.size());
if (currentPage > getUIPageIterator().getAvailablePage())
getUIPageIterator().setCurrentPage(getUIPageIterator().getAvailablePage());
else
getUIPageIterator().setCurrentPage(currentPage);
}
private List<ViewBean> getViewsBean() throws Exception {
List<ViewConfig> views = getApplicationComponent(ManageViewService.class).getAllViews();
List<ViewBean> viewBeans = new ArrayList<ViewBean>();
for (ViewConfig view : views) {
List<String> tabsName = new ArrayList<String>();
for (ViewConfig.Tab tab : view.getTabList()) {
tabsName.add(tab.getTabName());
}
ViewBean bean = new ViewBean(view.getName(), getFriendlyViewPermission(view.getPermissions()), tabsName);
if (getBaseVersion(view.getName()) == null)
continue;
bean.setBaseVersion(getBaseVersion(view.getName()));
viewBeans.add(bean);
}
return viewBeans;
}
static public class ViewComparator implements Comparator<ViewBean> {
public int compare(ViewBean v1, ViewBean v2) throws ClassCastException {
String name1 = v1.getName();
String name2 = v2.getName();
return name1.compareToIgnoreCase(name2);
}
}
public boolean canDelete(List<DriveData> drivers, String viewName) {
for(DriveData driver : drivers){
String views = driver.getViews() ;
for(String view: views.split(",")){
if(viewName.equals(view.trim())) return false ;
}
}
return true ;
}
public String getRepository() {
return getAncestorOfType(UIECMAdminPortlet.class).getPreferenceRepository() ;
}
static public class AddViewActionListener extends EventListener<UIViewList> {
public void execute(Event<UIViewList> event) throws Exception {
UIViewList uiViewList = event.getSource() ;
if(uiViewList.getViewsBean().size() == 0) {
UIApplication uiApp = event.getSource().getAncestorOfType(UIApplication.class) ;
uiApp.addMessage(new ApplicationMessage("UIViewList.msg.access-denied", null, ApplicationMessage.WARNING)) ;
return ;
}
UIViewContainer uiViewContainer = uiViewList.getParent() ;
uiViewContainer.removeChildById(UIViewList.ST_VIEW) ;
uiViewContainer.removeChildById(UIViewList.ST_EDIT) ;
UIViewFormTabPane uiTabPane = uiViewContainer.createUIComponent(UIViewFormTabPane.class, null, null) ;
uiTabPane.update(false);
UIViewPermissionForm uiPermissionForm = uiTabPane.findFirstComponentOfType(UIViewPermissionForm.class);
UIPermissionInputSet uiPermissionInputSet = uiPermissionForm.getChildById(UIViewPermissionForm.TAB_PERMISSION);
for(UIComponent uiComp : uiPermissionInputSet.getChildren()) {
if(uiComp instanceof UICheckBoxInput) {
uiPermissionInputSet.removeChildById(uiComp.getId());
}
}
uiViewContainer.initPopup(UIViewList.ST_ADD, uiTabPane) ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiViewContainer) ;
}
}
static public class DeleteActionListener extends EventListener<UIViewList> {
public void execute(Event<UIViewList> event) throws Exception {
UIViewList viewList = event.getSource();
viewList.setRenderSibling(UIViewList.class);
String viewName = event.getRequestContext().getRequestParameter(OBJECTID) ;
ManageDriveService manageDrive = viewList.getApplicationComponent(ManageDriveService.class);
ManageViewService manageViewService = viewList.getApplicationComponent(ManageViewService.class);
if(!viewList.canDelete(manageDrive.getAllDrives(), viewName)) {
// Get view display name
ResourceBundle res = RequestContext.getCurrentInstance().getApplicationResourceBundle();
String viewDisplayName = null;
try {
viewDisplayName = res.getString("Views.label." + viewName);
} catch (MissingResourceException e) {
viewDisplayName = viewName;
}
// Dis play error message
UIApplication app = viewList.getAncestorOfType(UIApplication.class);
Object[] args = {viewDisplayName};
app.addMessage(new ApplicationMessage("UIViewList.msg.template-in-use", args));
event.getRequestContext().addUIComponentToUpdateByAjax(viewList.getParent());
return;
}
manageViewService.removeView(viewName);
org.exoplatform.services.cms.impl.Utils.addEditedConfiguredData(viewName, ManageViewPlugin.class.getSimpleName(), ManageViewPlugin.EDITED_CONFIGURED_VIEWS, true);
viewList.refresh(viewList.getUIPageIterator().getCurrentPage());
event.getRequestContext().addUIComponentToUpdateByAjax(viewList.getParent());
}
}
static public class EditInfoActionListener extends EventListener<UIViewList> {
public void execute(Event<UIViewList> event) throws Exception {
UIViewList uiViewList = event.getSource() ;
uiViewList.setRenderSibling(UIViewList.class) ;
String viewName = event.getRequestContext().getRequestParameter(OBJECTID) ;
Node viewNode = uiViewList.getApplicationComponent(ManageViewService.class).
getViewByName(viewName, WCMCoreUtils.getSystemSessionProvider()) ;
UIViewContainer uiViewContainer = uiViewList.getParent() ;
uiViewContainer.removeChildById(UIViewList.ST_VIEW) ;
uiViewContainer.removeChildById(UIViewList.ST_ADD) ;
UIViewFormTabPane viewTabPane = uiViewContainer.createUIComponent(UIViewFormTabPane.class, null, null) ;
viewTabPane.update(true);
UIViewForm viewForm = viewTabPane.getChild(UIViewForm.class) ;
viewForm.refresh(true) ;
viewForm.update(viewNode, false, null) ;
if(viewForm.getUICheckBoxInput(UIViewForm.FIELD_ENABLEVERSION).isChecked()) {
viewForm.getUICheckBoxInput(UIViewForm.FIELD_ENABLEVERSION).setDisabled(true);
} else {
viewForm.getUICheckBoxInput(UIViewForm.FIELD_ENABLEVERSION).setDisabled(false);
}
UIViewPermissionList uiPerList = viewTabPane.findFirstComponentOfType(UIViewPermissionList.class);
uiPerList.setViewName(viewName);
UIViewPermissionForm uiPermissionForm = viewTabPane.findFirstComponentOfType(UIViewPermissionForm.class);
UIPermissionInputSet uiPermissionInputSet = uiPermissionForm.getChildById(UIViewPermissionForm.TAB_PERMISSION);
for(UIComponent uiComp : uiPermissionInputSet.getChildren()) {
if(uiComp instanceof UICheckBoxInput) {
uiPermissionInputSet.removeChildById(uiComp.getId());
}
}
uiViewContainer.initPopup(UIViewList.ST_EDIT, viewTabPane) ;
uiPerList.refresh(uiPerList.getUIPageIterator().getCurrentPage());
UITabContainer uiTabContainer = viewTabPane.getChild(UITabContainer.class);
UITabList uiTab = uiTabContainer.getChild(UITabList.class);
uiTab.setViewName(viewName);
uiTab.refresh(uiTab.getUIPageIterator().getCurrentPage());
event.getRequestContext().addUIComponentToUpdateByAjax(uiViewContainer) ;
}
}
static public class ViewActionListener extends EventListener<UIViewList> {
public void execute(Event<UIViewList> event) throws Exception {
UIViewList uiViewList = event.getSource() ;
uiViewList.setRenderSibling(UIViewList.class) ;
String viewName = event.getRequestContext().getRequestParameter(OBJECTID) ;
Node viewNode = uiViewList.getApplicationComponent(ManageViewService.class).getViewByName(
viewName, WCMCoreUtils.getSystemSessionProvider()) ;
UIViewContainer uiViewContainer = uiViewList.getParent() ;
uiViewContainer.removeChildById(UIViewList.ST_EDIT) ;
uiViewContainer.removeChildById(UIViewList.ST_ADD) ;
UIViewFormTabPane viewTabPane = uiViewContainer.createUIComponent(UIViewFormTabPane.class, null, null) ;
viewTabPane.update(false);
viewTabPane.view(true);
UIViewPermissionList uiPerList = viewTabPane.findFirstComponentOfType(UIViewPermissionList.class);
uiPerList.configure("permission", UIViewPermissionList.PERMISSION_BEAN_FIELD, null);
uiPerList.setViewName(viewName);
UIViewPermissionContainer uiPerContainer = uiPerList.getParent();
uiPerContainer.setRenderedChild(UIViewPermissionList.class);
uiViewContainer.initPopup(UIViewList.ST_VIEW, viewTabPane) ;
uiPerList.refresh(uiPerList.getUIPageIterator().getCurrentPage());
UITabContainer uiTabContainer = viewTabPane.getChild(UITabContainer.class);
UITabList uiTab = uiTabContainer.getChild(UITabList.class);
uiTab.setViewName(viewName);
uiTab.setActions(new String[] {});
uiTab.configure("tabName", UITabList.TAB_BEAN_FIELD, null) ;
uiTab.refresh(uiTab.getUIPageIterator().getCurrentPage());
UIViewForm uiViewForm = viewTabPane.getChild(UIViewForm.class) ;
uiViewForm.refresh(false) ;
uiViewForm.update(viewNode, true, null) ;
viewTabPane.setActions(new String[] {"Close"});
event.getRequestContext().addUIComponentToUpdateByAjax(uiViewContainer) ;
}
}
public class ViewBean {
private String id;
private String name ;
private String permissions ;
private String tabList ;
private String baseVersion = "";
public ViewBean(String n, String per, List<String> tabs) {
id = n;
name = n ;
permissions = per ;
StringBuilder str = new StringBuilder() ;
for(int i = 0; i < tabs.size(); i++) {
str.append(" [").append(tabs.get(i)).append("]");
}
tabList = str.toString() ;
}
public String getBaseVersion() { return baseVersion; }
public void setBaseVersion(String s) { baseVersion = s;
}
public String getName() {
ResourceBundle res = RequestContext.getCurrentInstance().getApplicationResourceBundle();
String label = null;
try {
label = res.getString("Views.label." + name);
} catch (MissingResourceException e) {
label = name;
}
return label;
}
public void setName(String s) { name = s; }
public String getPermissions() { return permissions; }
public void setPermissions(String s) { permissions = s; }
public String getTabList() { return tabList; }
public void setTabList(String ls) { tabList = ls; }
public String getId() { return id; }
}
private String getFriendlyViewPermission(String permissions) throws Exception {
UIViewContainer uiViewContainer = getParent() ;
String[] arrPers = new String[] {};
if(permissions.contains(",")) {
arrPers = permissions.split(",");
} else if(permissions.length() > 0){
arrPers = new String[] {permissions};
}
StringBuilder perBuilder = new StringBuilder();
for(String per : arrPers) {
if(perBuilder.length() > 0) perBuilder.append(", ");
perBuilder.append(uiViewContainer.getFriendlyPermission(per));
}
return perBuilder.toString();
}
}