/*
* 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.script;
import org.exoplatform.commons.utils.LazyPageList;
import org.exoplatform.commons.utils.ListAccess;
import org.exoplatform.commons.utils.ListAccessImpl;
import org.exoplatform.services.cms.impl.Utils;
import org.exoplatform.services.cms.scripts.ScriptService;
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.UIComponentDecorator;
import org.exoplatform.webui.core.UIPageIterator;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.exception.MessageException;
import javax.jcr.AccessDeniedException;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* Created by The eXo Platform SARL
* Author : pham tuan
* phamtuanchip@yahoo.de
* September 27, 2006
* 10:37:15 AM
*/
@ComponentConfig(
template = "app:/groovy/webui/component/admin/script/UIScriptList.gtmpl",
events = {
@EventConfig(listeners = UIScriptList.EditActionListener.class),
@EventConfig(listeners = UIScriptList.DeleteActionListener.class, confirm="UIScriptList.msg.confirm-delete"),
@EventConfig(listeners = UIScriptList.AddNewActionListener.class)
}
)
public class UIScriptList extends UIComponentDecorator {
private UIPageIterator uiPageIterator_;
public static final String ACTION_SCRIPT_TYPE = "action";
public static final String INTERCEPTOR_SCRIPT_TYPE = "interceptor";
public static final String WIDGET_SCRIPT_TYPE = "widget";
private static final String EDITED_CONFIGURED_SCRIPTS = "EditedConfiguredScripts";
private String filter = ACTION_SCRIPT_TYPE;
public void setTemplateFilter(String filter) {
this.filter = filter;
}
public String getTemplateFilter() {
return this.filter;
}
public UIScriptList() throws Exception {
uiPageIterator_ = createUIComponent(UIPageIterator.class, null, "ScriptListIterator");
setUIComponent(uiPageIterator_);
}
public void updateGrid(List<ScriptData> scriptData, int currentPage) throws Exception {
Collections.sort(scriptData, new ScriptComparator());
ListAccess<ScriptData> scriptList = new ListAccessImpl<ScriptData>(ScriptData.class, scriptData);
LazyPageList<ScriptData> dataPageList = new LazyPageList<ScriptData>(scriptList, 10);
uiPageIterator_.setPageList(dataPageList);
if (currentPage > uiPageIterator_.getAvailablePage())
uiPageIterator_.setCurrentPage(uiPageIterator_.getAvailablePage());
else
uiPageIterator_.setCurrentPage(currentPage);
}
public UIPageIterator getUIPageIterator() { return uiPageIterator_; }
public List getScriptList() throws Exception { return uiPageIterator_.getCurrentPageData(); }
public String getScriptCategory() throws Exception {
ScriptService scriptService = getApplicationComponent(ScriptService.class);
UIScriptManager uiManager = getAncestorOfType(UIScriptManager.class);
UIScriptContainer uiContainer = uiManager.getChildById(uiManager.getSelectedTabId());
UIScriptList uiScriptList = uiContainer.getChild(UIScriptList.class);
Node script = scriptService.getECMScriptHome(WCMCoreUtils.getSystemSessionProvider()).getNode(uiScriptList.getTemplateFilter());
String basePath = scriptService.getBaseScriptPath() + "/";
return script.getPath().substring(basePath.length());
}
public void refresh(String templateFilter, int currentPage) throws Exception {
this.updateGrid(getScript(templateFilter), currentPage);
}
public List<ScriptData> getScript(String name) throws Exception {
List <ScriptData> scriptData = new ArrayList <ScriptData>() ;
List<Node> scripts = new ArrayList<Node> () ;
if(name.equals(ACTION_SCRIPT_TYPE)) {
scripts = getApplicationComponent(ScriptService.class).getECMActionScripts(WCMCoreUtils.getSystemSessionProvider());
}else if(name.equals(WIDGET_SCRIPT_TYPE)){
scripts = getApplicationComponent(ScriptService.class).getECMWidgetScripts(WCMCoreUtils.getUserSessionProvider());
}else if(name.equals(INTERCEPTOR_SCRIPT_TYPE)) {
scripts =
getApplicationComponent(ScriptService.class).getECMInterceptorScripts(WCMCoreUtils.getSystemSessionProvider());
}
for(Node scriptNode : scripts) {
Node content = scriptNode.getNode(NodetypeConstant.JCR_CONTENT);
String scriptDescription;
try {
scriptDescription = content.getProperty(NodetypeConstant.DC_DESCRIPTION).getValues()[0].getString();
} catch(ArrayIndexOutOfBoundsException are) {
scriptDescription = scriptNode.getName();
} catch(PathNotFoundException pne) {
scriptDescription = scriptNode.getName();
}
scriptData.add(new ScriptData(scriptNode.getName(), scriptNode.getPath(), scriptDescription)) ;
}
return scriptData ;
}
public String[] getActions() {return new String[]{"AddNew"};}
public Node getScriptNode(String templateFilter, String nodeName) throws Exception {
ScriptService scriptService = getApplicationComponent(ScriptService.class);
Node category = scriptService.getECMScriptHome(WCMCoreUtils.getUserSessionProvider()).getNode(templateFilter);
return category.getNode(nodeName);
}
static public class ScriptComparator implements Comparator<ScriptData> {
public int compare(ScriptData o1, ScriptData o2) throws ClassCastException {
String name1 = o1.getName();
String name2 = o2.getName();
return name1.compareToIgnoreCase(name2);
}
}
static public class AddNewActionListener extends EventListener<UIScriptList> {
public void execute(Event<UIScriptList> event) throws Exception {
UIScriptList uiScriptList = event.getSource();
UIScriptManager uiManager = uiScriptList.getAncestorOfType(UIScriptManager.class);
UIScriptContainer uiScriptContainer = uiManager.getChildById(uiManager.getSelectedTabId());
UIScriptForm uiScriptForm = uiScriptContainer.createUIComponent(UIScriptForm.class, null, null) ;
uiManager.initPopup(uiScriptForm);
uiScriptForm.update(null, true);
event.getRequestContext().addUIComponentToUpdateByAjax(uiManager);
}
}
static public class EditActionListener extends EventListener<UIScriptList> {
public void execute(Event<UIScriptList> event) throws Exception {
UIScriptManager uiManager = event.getSource().getAncestorOfType(UIScriptManager.class);
UIScriptContainer uiScriptContainer = uiManager.getChildById(uiManager.getSelectedTabId());
UIScriptList uiScriptList = uiScriptContainer.getChild(UIScriptList.class);
String scriptName = event.getRequestContext().getRequestParameter(OBJECTID);
UIScriptForm uiScriptForm = uiScriptContainer.createUIComponent(UIScriptForm.class, null, null) ;
uiScriptForm.update(uiScriptList.getScriptNode(uiScriptList.getTemplateFilter(), scriptName), false);
uiManager.initPopup(uiScriptForm);
event.getRequestContext().addUIComponentToUpdateByAjax(uiManager);
}
}
static public class DeleteActionListener extends EventListener<UIScriptList> {
public void execute(Event<UIScriptList> event) throws Exception {
UIScriptManager uiManager = event.getSource().getAncestorOfType(UIScriptManager.class);
UIScriptContainer uiScriptContainer = uiManager.getChildById(uiManager.getSelectedTabId());
UIScriptList uiScriptList = uiScriptContainer.getChild(UIScriptList.class);
ScriptService scriptService = uiScriptList.getApplicationComponent(ScriptService.class);
String scriptName = event.getRequestContext().getRequestParameter(OBJECTID);
String namePrefix = uiScriptList.getScriptCategory();
try {
scriptService.removeScript(namePrefix + "/" + scriptName, WCMCoreUtils.getUserSessionProvider());
Utils.addEditedConfiguredData(namePrefix + "/" + scriptName, "ScriptServiceImpl", EDITED_CONFIGURED_SCRIPTS, true);
} catch(AccessDeniedException ace) {
throw new MessageException(new ApplicationMessage("UIECMAdminControlPanel.msg.access-denied",
null, ApplicationMessage.WARNING));
}
uiScriptList.refresh(uiScriptList.getTemplateFilter(), uiScriptList.uiPageIterator_.getCurrentPage());
event.getRequestContext().addUIComponentToUpdateByAjax(uiManager);
}
}
public static class ScriptData {
private String name;
private String path;
private String label;
public ScriptData(String scriptName, String scriptParth, String label) {
this.name = scriptName;
this.path = scriptParth;
this.label = label;
}
public String getName() { return name; }
public String getPath() { return path; }
public String getLabel() { return label; }
}
}