/***************************************************************************
* 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.templates.clv;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
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.ecm.webui.utils.Utils;
import org.exoplatform.services.cms.views.ApplicationTemplateManagerService;
import org.exoplatform.services.cms.views.impl.ApplicationTemplateManagerServiceImpl;
import org.exoplatform.services.wcm.core.NodetypeConstant;
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
* Jan 22, 2013
* 9:55:06 AM
*/
@ComponentConfig(
template = "system:/groovy/ecm/webui/UIGridWithButton.gtmpl",
events = {
@EventConfig(listeners =
UICLVTemplateList.DeleteActionListener.class, confirm = "UICLVTemplateList.msg.confirm-delete"),
@EventConfig(listeners = UICLVTemplateList.EditActionListener.class),
@EventConfig(listeners = UICLVTemplateList.AddTemplateActionListener.class)
})
public class UICLVTemplateList extends UIPagingGrid {
private static String[] NODETYPE_BEAN_FIELD = {"title", "template"} ;
private static String[] NODETYPE_ACTION = {"Edit", "Delete"} ;
private String filter = UICLVTemplatesManager.CONTENT_TEMPLATE_TYPE;
public UICLVTemplateList() throws Exception {
configure("template", NODETYPE_BEAN_FIELD, NODETYPE_ACTION) ;
}
public void setTemplateFilter(String filter) {
this.filter = filter;
}
public String getTemplateFilter() {
return this.filter;
}
public String[] getActions() {
return new String[] {"AddTemplate"} ;
}
@Override
public void refresh(int currentPage) throws Exception {
ApplicationTemplateManagerService templateService = WCMCoreUtils.getService(ApplicationTemplateManagerService.class);
List<CLVTemplateData> templateData = new ArrayList<CLVTemplateData>();
if(filter.equals(UICLVTemplatesManager.CONTENT_TEMPLATE_TYPE)) {
templateData = convetListNodeToListData(templateService.getTemplatesByCategory(
ApplicationTemplateManagerService.CLV_TEMPLATE_STORAGE_FOLDER,
ApplicationTemplateManagerService.CLV_LIST_TEMPLATE_CATEGORY,
WCMCoreUtils.getUserSessionProvider()));
} else if(filter.equals(UICLVTemplatesManager.CATEGORY_TEMPLATE_TYPE)) {
templateData = convetListNodeToListData(templateService.getTemplatesByCategory(
ApplicationTemplateManagerService.CLV_TEMPLATE_STORAGE_FOLDER,
ApplicationTemplateManagerService.CLV_NAVIGATION_TEMPLATE_CATEGORY,
WCMCoreUtils.getUserSessionProvider()));
} else if(filter.equals(UICLVTemplatesManager.PAGINATOR_TEMPLATE_TYPE)){
templateData = convetListNodeToListData(templateService.getTemplatesByCategory(
ApplicationTemplateManagerService.CLV_TEMPLATE_STORAGE_FOLDER,
ApplicationTemplateManagerService.CLV_PAGINATOR_TEMPLATE_CATEGORY,
WCMCoreUtils.getUserSessionProvider()));
}
Collections.sort(templateData, new CLVTemplateComparator());
ListAccess<CLVTemplateData> dataList = new ListAccessImpl<CLVTemplateData>(CLVTemplateData.class,
templateData);
LazyPageList<CLVTemplateData> pageList = new LazyPageList<CLVTemplateData>(dataList,
getUIPageIterator().getItemsPerPage());
getUIPageIterator().setTotalItems(templateData.size());
getUIPageIterator().setPageList(pageList);
if (currentPage > getUIPageIterator().getAvailablePage())
getUIPageIterator().setCurrentPage(getUIPageIterator().getAvailablePage());
else
getUIPageIterator().setCurrentPage(currentPage);
}
private List<CLVTemplateData> convetListNodeToListData(List<Node> list) throws RepositoryException {
List<CLVTemplateData> templateDatas = new ArrayList<CLVTemplateData>();
for(Node node : list) {
Node content = node.getNode(Utils.JCR_CONTENT);
try {
templateDatas.add(new CLVTemplateData(content.getProperty(
NodetypeConstant.DC_TITLE).getValues()[0].getString(), node.getName()));
} catch(PathNotFoundException pne) {
templateDatas.add(new CLVTemplateData(node.getName(), node.getName()));
} catch(ArrayIndexOutOfBoundsException aoe) {
templateDatas.add(new CLVTemplateData(node.getName(), node.getName()));
}
}
return templateDatas;
}
static public class EditActionListener extends EventListener<UICLVTemplateList> {
public void execute(Event<UICLVTemplateList> event) throws Exception {
UICLVTemplateList clvTemplateList = event.getSource();
UICLVTemplatesManager uiTemplatesManager = clvTemplateList.getAncestorOfType(UICLVTemplatesManager.class) ;
UICLVTemplateContainer uiTemplateContainer = uiTemplatesManager.getChildById(uiTemplatesManager.getSelectedTabId());
UICLVTemplateForm uiTemplateForm = uiTemplateContainer.createUIComponent(UICLVTemplateForm.class, null,
"UICLVTemplateForm_" + uiTemplatesManager.getSelectedTabId());
String template = event.getRequestContext().getRequestParameter(OBJECTID);
uiTemplateForm.update(clvTemplateList.getCategoryFromFilter(), template);
uiTemplateContainer.removeChildById(UICLVTemplatesManager.NEW_TEMPLATE + "_" + uiTemplatesManager.getSelectedTabId());
uiTemplateContainer.initPopup(uiTemplateForm,
UICLVTemplatesManager.EDIT_CLV_TEMPLATE + "_" + uiTemplatesManager.getSelectedTabId());
event.getRequestContext().addUIComponentToUpdateByAjax(uiTemplatesManager);
}
}
static public class AddTemplateActionListener extends EventListener<UICLVTemplateList> {
public void execute(Event<UICLVTemplateList> event) throws Exception {
UICLVTemplateList uiList = event.getSource();
UICLVTemplatesManager uiTemplatesManager = uiList.getAncestorOfType(UICLVTemplatesManager.class) ;
UICLVTemplateContainer uiTemplateContainer = uiTemplatesManager.getChildById(uiTemplatesManager.getSelectedTabId());
UICLVTemplateForm uiTemplateForm = uiTemplateContainer.createUIComponent(UICLVTemplateForm.class, null,
"UICLVTemplateForm_" + uiTemplatesManager.getSelectedTabId()) ;
uiTemplateContainer.removeChildById(UICLVTemplatesManager.EDIT_CLV_TEMPLATE + "_" + uiTemplatesManager.getSelectedTabId()) ;
uiTemplateForm.refresh(uiList.getCategoryFromFilter());
uiTemplateContainer.initPopup(uiTemplateForm,
UICLVTemplatesManager.NEW_TEMPLATE + "_" + uiTemplatesManager.getSelectedTabId()) ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiTemplatesManager) ;
}
}
static public class DeleteActionListener extends EventListener<UICLVTemplateList> {
public void execute(Event<UICLVTemplateList> event) throws Exception {
UICLVTemplateList clvTemplateList = event.getSource();
UICLVTemplatesManager uiTemplatesManager = clvTemplateList.getAncestorOfType(UICLVTemplatesManager.class);
if (uiTemplatesManager.isEditingTemplate()) {
UIApplication uiApp = event.getSource().getAncestorOfType(UIApplication.class) ;
uiApp.addMessage(new ApplicationMessage("UICLVTemplateList.msg.editing-template", null, ApplicationMessage.WARNING)) ;
return;
}
String template = event.getRequestContext().getRequestParameter(OBJECTID);
ApplicationTemplateManagerService templateService =
clvTemplateList.getApplicationComponent(ApplicationTemplateManagerService.class);
try {
templateService.removeTemplate(
ApplicationTemplateManagerService.CLV_TEMPLATE_STORAGE_FOLDER,
clvTemplateList.getCategoryFromFilter(),
template,
WCMCoreUtils.getUserSessionProvider());
StringBuilder tBuilder = new StringBuilder();
tBuilder.append(clvTemplateList.getCategoryFromFilter()).append("/").append(template);
org.exoplatform.services.cms.impl.Utils.addEditedConfiguredData(tBuilder.toString(),
ApplicationTemplateManagerServiceImpl.class.getSimpleName(),
ApplicationTemplateManagerServiceImpl.EDITED_CONFIGURED_TEMPLATES, true);
} catch (PathNotFoundException ex) {
UIApplication uiApp = event.getSource().getAncestorOfType(UIApplication.class) ;
uiApp.addMessage(new ApplicationMessage("UITCLVemplateList.msg.template-not-exist", null, ApplicationMessage.WARNING)) ;
return;
}
clvTemplateList.refresh(clvTemplateList.getUIPageIterator().getCurrentPage());
event.getRequestContext().addUIComponentToUpdateByAjax(uiTemplatesManager);
}
}
static public class CLVTemplateComparator implements Comparator<CLVTemplateData> {
public int compare(CLVTemplateData t1, CLVTemplateData t2) throws ClassCastException {
String title1 = t1.getTitle();
String title2 = t2.getTitle();
return title1.compareToIgnoreCase(title2);
}
}
static public class CLVTemplateData {
private String title ;
private String template;
public CLVTemplateData(String title, String template) {
this.title = title ;
this.template = template;
}
public String getTitle() { return title ; }
public String getTemplate() { return template; }
}
private String getCategoryFromFilter() {
if(filter.equals(UICLVTemplatesManager.CONTENT_TEMPLATE_TYPE)) {
return ApplicationTemplateManagerService.CLV_LIST_TEMPLATE_CATEGORY;
} else if(filter.equals(UICLVTemplatesManager.CATEGORY_TEMPLATE_TYPE)) {
return ApplicationTemplateManagerService.CLV_NAVIGATION_TEMPLATE_CATEGORY;
} else if(filter.equals(UICLVTemplatesManager.PAGINATOR_TEMPLATE_TYPE)){
return ApplicationTemplateManagerService.CLV_PAGINATOR_TEMPLATE_CATEGORY;
}
return null;
}
}