/*
* 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.ecm.jcr.model.VersionNode;
import org.exoplatform.ecm.webui.component.admin.script.UIScriptList.ScriptData;
import org.exoplatform.ecm.webui.form.validator.ECMNameValidator;
import org.exoplatform.ecm.webui.form.validator.XSSValidator;
import org.exoplatform.ecm.webui.utils.Utils;
import org.exoplatform.services.cms.scripts.ScriptService;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
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.core.UIPopupComponent;
import org.exoplatform.webui.core.UIPopupWindow;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.core.model.SelectItemOption;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.Event.Phase;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIForm;
import org.exoplatform.webui.form.UIFormSelectBox;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.UIFormTextAreaInput;
import org.exoplatform.webui.form.input.UICheckBoxInput;
import org.exoplatform.webui.form.validator.MandatoryValidator;
import javax.jcr.AccessDeniedException;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.version.VersionHistory;
import java.util.ArrayList;
import java.util.List;
/**
* Created by The eXo Platform SARL
* September 27, 2006 10:27:15 AM
*/
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "system:/groovy/webui/form/UIForm.gtmpl",
events = {
@EventConfig(listeners = UIScriptForm.SaveActionListener.class),
@EventConfig(phase=Phase.DECODE, listeners = UIScriptForm.RestoreActionListener.class),
@EventConfig(phase=Phase.DECODE, listeners = UIScriptForm.CancelActionListener.class),
@EventConfig(phase=Phase.DECODE, listeners = UIScriptForm.RefreshActionListener.class)
}
)
public class UIScriptForm extends UIForm implements UIPopupComponent {
private static final Log LOG = ExoLogger.getLogger(UIScriptForm.class.getName());
final static public String FIELD_SELECT_VERSION = "selectVersion" ;
final static public String FIELD_SCRIPT_CONTENT = "scriptContent" ;
final static public String FIELD_SCRIPT_NAME = "scriptName" ;
final static public String FIELD_SCRIPT_LABEL = "scriptLabel" ;
final static public String FIELD_ENABLE_VERSION = "enableVersion" ;
final static public String SCRIPT_FILE_TYPE = ".groovy" ;
private List<String> listVersion = new ArrayList<String>() ;
private boolean isAddNew_ = true ;
private ScriptService scriptService;
public UIScriptForm() throws Exception {
scriptService = WCMCoreUtils.getService(ScriptService.class);
List<SelectItemOption<String>> options = new ArrayList<SelectItemOption<String>>() ;
UIFormSelectBox versions =
new UIFormSelectBox(FIELD_SELECT_VERSION , FIELD_SELECT_VERSION, options) ;
UIFormTextAreaInput contents =
new UIFormTextAreaInput(FIELD_SCRIPT_CONTENT , FIELD_SCRIPT_CONTENT, null) ;
contents.addValidator(MandatoryValidator.class) ;
UICheckBoxInput isVersion = new UICheckBoxInput(FIELD_ENABLE_VERSION , FIELD_ENABLE_VERSION, null) ;
UIFormStringInput scriptLabel = new UIFormStringInput(FIELD_SCRIPT_LABEL, FIELD_SCRIPT_LABEL, null) ;
scriptLabel.addValidator(XSSValidator.class);
UIFormStringInput scriptName = new UIFormStringInput(FIELD_SCRIPT_NAME, FIELD_SCRIPT_NAME, null) ;
scriptName.addValidator(MandatoryValidator.class).addValidator(ECMNameValidator.class).addValidator(XSSValidator.class);
versions.setOnChange("Change") ;
versions.setRendered(false) ;
isVersion.setRendered(false) ;
addUIFormInput(versions) ;
addUIFormInput(contents) ;
addUIFormInput(isVersion) ;
addUIFormInput(scriptLabel) ;
addUIFormInput(scriptName) ;
}
private VersionNode getRootVersion(Node node) throws Exception{
VersionHistory vH = node.getVersionHistory() ;
return (vH == null) ? null : new VersionNode(vH.getRootVersion(), node.getSession()) ;
}
private List<String> getNodeVersions(List<VersionNode> children) throws Exception {
List<VersionNode> child = new ArrayList<VersionNode>() ;
for(int i = 0; i < children.size(); i ++){
listVersion.add(children.get(i).getName());
child = children.get(i).getChildren() ;
if(!child.isEmpty()) getNodeVersions(child) ;
}
return listVersion ;
}
private List<SelectItemOption<String>> getVersionValues(Node node) throws Exception {
List<SelectItemOption<String>> options = new ArrayList<SelectItemOption<String>>() ;
List<VersionNode> children = getRootVersion(node).getChildren() ;
listVersion.clear() ;
List<String> versionList = getNodeVersions(children) ;
for(int i = 0; i < versionList.size(); i++) {
for(int j = i + 1; j < versionList.size(); j ++) {
if(Integer.parseInt(versionList.get(j)) < Integer.parseInt(versionList.get(i))) {
String temp = versionList.get(i) ;
versionList.set(i, versionList.get(j)) ;
versionList.set(j, temp) ;
}
}
options.add(new SelectItemOption<String>(versionList.get(i), versionList.get(i))) ;
}
return options ;
}
public void update(Node script, boolean isAddNew) throws Exception{
isAddNew_ = isAddNew ;
if(script != null) {
String scriptContent = scriptService.getScriptAsText(script);
getUICheckBoxInput(FIELD_ENABLE_VERSION).setRendered(true) ;
boolean isVersioned = script.isNodeType(Utils.MIX_VERSIONABLE) ;
if(isVersioned) {
getUIFormSelectBox(FIELD_SELECT_VERSION).setRendered(true) ;
getUIFormSelectBox(FIELD_SELECT_VERSION).setOptions(getVersionValues(script)) ;
getUIFormSelectBox(FIELD_SELECT_VERSION).setValue(script.getBaseVersion().getName()) ;
getUICheckBoxInput(FIELD_ENABLE_VERSION).setDisabled(true);
getUICheckBoxInput(FIELD_ENABLE_VERSION).setChecked(true) ;
setActions(new String[]{"Save", "Restore", "Refresh", "Cancel"}) ;
} else {
getUIFormSelectBox(FIELD_SELECT_VERSION).setRendered(false) ;
getUICheckBoxInput(FIELD_ENABLE_VERSION).setDisabled(false) ;
getUICheckBoxInput(FIELD_ENABLE_VERSION).setChecked(false) ;
setActions( new String[]{"Save", "Refresh", "Cancel"}) ;
}
getUIFormTextAreaInput(FIELD_SCRIPT_CONTENT).setValue(scriptContent) ;
Node content = script.getNode(NodetypeConstant.JCR_CONTENT);
String scriptLabel = content.getProperty(NodetypeConstant.DC_DESCRIPTION).getValues()[0].getString();
getUIStringInput(FIELD_SCRIPT_LABEL).setValue(scriptLabel) ;
getUIStringInput(FIELD_SCRIPT_NAME).setValue(script.getName()) ;
getUIStringInput(FIELD_SCRIPT_NAME).setDisabled(true) ;
return ;
}
if(!isAddNew_) {
getUIFormTextAreaInput(FIELD_SCRIPT_CONTENT).setValue(null) ;
return ;
}
getUIFormSelectBox(FIELD_SELECT_VERSION).setRendered(false) ;
getUICheckBoxInput(FIELD_ENABLE_VERSION).setRendered(false) ;
getUICheckBoxInput(FIELD_ENABLE_VERSION).setChecked(false) ;
getUIStringInput(FIELD_SCRIPT_LABEL).setValue(null) ;
getUIStringInput(FIELD_SCRIPT_NAME).setDisabled(false);
getUIStringInput(FIELD_SCRIPT_NAME).setValue(null) ;
getUIFormTextAreaInput(FIELD_SCRIPT_CONTENT).setValue(null) ;
setActions( new String[]{"Save", "Refresh", "Cancel"}) ;
}
public void activate() { }
public void deActivate() { }
static public class SaveActionListener extends EventListener<UIScriptForm> {
public void execute(Event<UIScriptForm> event) throws Exception {
UIScriptForm uiForm = event.getSource() ;
ScriptService scriptService = uiForm.getApplicationComponent(ScriptService.class) ;
UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class) ;
StringBuilder name = new StringBuilder();
name.append(uiForm.getUIStringInput(FIELD_SCRIPT_NAME).getValue().trim());
String content = uiForm.getUIFormTextAreaInput(FIELD_SCRIPT_CONTENT).getValue().trim();
String label = uiForm.getUIStringInput(FIELD_SCRIPT_LABEL).getValue();
if (name.indexOf(SCRIPT_FILE_TYPE) < 0) {
name.append(SCRIPT_FILE_TYPE);
}
UIScriptList currentList = null ;
UIScriptManager uiManager = uiForm.getAncestorOfType(UIScriptManager.class) ;
List<String> listScript = new ArrayList<String>() ;
List<ScriptData> scriptData = new ArrayList<ScriptData>() ;
String namePrefix = null ;
UIScriptContainer uiContainer = uiManager.getChildById(uiManager.getSelectedTabId());
currentList = uiContainer.getChild(UIScriptList.class);
namePrefix = currentList.getScriptCategory() ;
String subNamePrefix = namePrefix.substring(namePrefix.lastIndexOf("/") + 1, namePrefix.length()) ;
scriptData = currentList.getScript(subNamePrefix) ;
for(ScriptData data : scriptData) {
listScript.add(data.getName()) ;
}
if(listScript.contains(name.toString()) && uiForm.isAddNew_) {
Object[] args = { name } ;
ApplicationMessage appMessage =
new ApplicationMessage("UIScriptForm.msg.name-exist", args, ApplicationMessage.WARNING);
appMessage.setArgsLocalized(false);
uiApp.addMessage(appMessage) ;
return ;
}
boolean isEnableVersioning = uiForm.getUICheckBoxInput(FIELD_ENABLE_VERSION).isChecked() ;
if(label == null) label = name.toString();
else label = label.trim();
if(uiForm.isAddNew_ || !isEnableVersioning) {
try {
scriptService.addScript(namePrefix + "/" + name, label, content, WCMCoreUtils.getUserSessionProvider());
} catch(AccessDeniedException ace) {
uiApp.addMessage(new ApplicationMessage("UIECMAdminControlPanel.msg.access-denied", null,
ApplicationMessage.WARNING)) ;
return ;
}
} else {
try {
Node node = currentList.getScriptNode(currentList.getTemplateFilter(), name.toString()) ;
if(!node.isNodeType(Utils.MIX_VERSIONABLE)) node.addMixin(Utils.MIX_VERSIONABLE) ;
else node.checkout() ;
scriptService.addScript(namePrefix + "/" + name, label, content, WCMCoreUtils.getUserSessionProvider());
node.save() ;
node.checkin() ;
} catch (PathNotFoundException pathNotFoundException) {
Object[] args = { namePrefix };
uiApp.addMessage(new ApplicationMessage("UIScriptForm.msg.PathNotFoundException", args,
ApplicationMessage.WARNING));
return;
}
}
uiForm.reset() ;
UIPopupWindow uiPopup = uiManager.getChild(UIPopupWindow.class);
uiPopup.setRendered(false);
event.getRequestContext().addUIComponentToUpdateByAjax(currentList) ;
currentList.refresh(currentList.getTemplateFilter(),1) ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ;
}
}
static public class RestoreActionListener extends EventListener<UIScriptForm> {
public void execute(Event<UIScriptForm> event) throws Exception {
UIScriptForm uiForm = event.getSource();
String name = uiForm.getUIStringInput(FIELD_SCRIPT_NAME).getValue() ;
UIScriptManager uiManager = uiForm.getAncestorOfType(UIScriptManager.class) ;
UIScriptContainer uiContainer = uiManager.getChildById(uiManager.getSelectedTabId());
UIScriptList uiScriptList = uiContainer.getChild(UIScriptList.class);
try {
Node node = uiScriptList.getScriptNode(uiScriptList.getTemplateFilter(), name);
String version = uiForm.getUIFormSelectBox(FIELD_SELECT_VERSION).getValue();
String baseVersion = node.getBaseVersion().getName() ;
if(!version.equals(baseVersion)) {
node.checkout() ;
node.restore(version, true) ;
uiScriptList.refresh(uiScriptList.getTemplateFilter(), 1) ;
}
UIPopupWindow uiPopup = uiManager.getChild(UIPopupWindow.class);
uiPopup.setRendered(false);
event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ;
} catch (PathNotFoundException pne) {
if (LOG.isWarnEnabled()) {
LOG.warn(pne.getMessage());
}
}
}
}
static public class RefreshActionListener extends EventListener<UIScriptForm> {
public void execute(Event<UIScriptForm> event) throws Exception {
UIScriptForm uiForm = event.getSource() ;
String scriptName = uiForm.getUIStringInput(UIScriptForm.FIELD_SCRIPT_NAME).getValue() ;
if(uiForm.isAddNew_) {
uiForm.update(null, true) ;
} else {
UIScriptManager uiScriptManager = uiForm.getAncestorOfType(UIScriptManager.class);
UIScriptContainer uiScriptContainer = uiScriptManager.getChildById(uiScriptManager.getSelectedTabId());
UIScriptList uiScriptList = uiScriptContainer.getChild(UIScriptList.class);
try {
Node script = uiScriptList.getScriptNode(uiScriptList.getTemplateFilter(), scriptName) ;
uiForm.update(script, false) ;
} catch (PathNotFoundException pathNotFoundException) {
String namePrefix = uiScriptList.getScriptCategory();
Object[] args = { namePrefix };
UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class);
uiApp.addMessage(new ApplicationMessage("UIScriptForm.msg.PathNotFoundException", args,
ApplicationMessage.WARNING));
return;
}
}
event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getAncestorOfType(UIScriptManager.class)) ;
}
}
static public class CancelActionListener extends EventListener<UIScriptForm> {
public void execute(Event<UIScriptForm> event) throws Exception {
UIScriptForm uiForm = event.getSource();
uiForm.reset() ;
UIScriptManager uiManager = uiForm.getAncestorOfType(UIScriptManager.class) ;
UIPopupWindow uiPopup = uiManager.getChildById(UIScriptManager.POPUP_TEMPLATE_ID);
uiPopup.setRendered(false);
event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ;
}
}
}