/* * 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.List; import javax.jcr.AccessDeniedException; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.version.VersionHistory; import org.exoplatform.ecm.jcr.model.VersionNode; import org.exoplatform.ecm.resolver.JCRResourceResolver; import org.exoplatform.ecm.webui.form.validator.ECMNameValidator; import org.exoplatform.ecm.webui.utils.Utils; import org.exoplatform.groovyscript.text.TemplateService; import org.exoplatform.services.cms.BasePath; import org.exoplatform.services.cms.views.ManageViewService; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.wcm.core.NodeLocation; 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.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; /** * Created by The eXo Platform SARL Author : Tran The Trong trongtt@gmail.com * July 3, 2006 10:07:15 AM */ @ComponentConfig(lifecycle = UIFormLifecycle.class, template = "system:/groovy/webui/form/UIForm.gtmpl", events = { @EventConfig(listeners = UITemplateForm.SaveActionListener.class), @EventConfig(phase = Phase.DECODE, listeners = UITemplateForm.CancelActionListener.class), @EventConfig(phase = Phase.DECODE, listeners = UITemplateForm.ResetActionListener.class), @EventConfig(phase = Phase.DECODE, listeners = UITemplateForm.ChangeActionListener.class), @EventConfig(phase = Phase.DECODE, listeners = UITemplateForm.RestoreActionListener.class) }) public class UITemplateForm extends UIForm { final static private String FIELD_VERSION = "version"; final static private String FIELD_CONTENT = "content"; final static private String FIELD_NAME = "name"; final static private String FIELD_HOMETEMPLATE = "homeTemplate"; final static private String FIELD_ENABLEVERSION = "enableVersion"; private NodeLocation template_ = null; private List<String> listVersion = new ArrayList<String>(); private String baseVersionName_; private VersionNode selectedVersion_; public boolean isAddNew_ = false; private String templatePath_; private VersionNode rootVersionNode; private org.exoplatform.services.cms.templates.TemplateService templateService; public UITemplateForm() throws Exception { templateService = WCMCoreUtils.getService(org.exoplatform.services.cms.templates.TemplateService.class); List<SelectItemOption<String>> options = new ArrayList<SelectItemOption<String>>(); UIFormSelectBox versions = new UIFormSelectBox(FIELD_VERSION, FIELD_VERSION, options); versions.setOnChange("Change"); versions.setRendered(false); addUIFormInput(versions); addUIFormInput(new UIFormTextAreaInput(FIELD_CONTENT, FIELD_CONTENT, null) .addValidator(MandatoryValidator.class)); addUIFormInput(new UIFormStringInput(FIELD_NAME, FIELD_NAME, null).addValidator( MandatoryValidator.class).addValidator(ECMNameValidator.class)); List<SelectItemOption<String>> typeList = new ArrayList<SelectItemOption<String>>(); addUIFormInput(new UIFormSelectBox(FIELD_HOMETEMPLATE, FIELD_HOMETEMPLATE, typeList)); UICheckBoxInput enableVersion = new UICheckBoxInput(FIELD_ENABLEVERSION, FIELD_ENABLEVERSION, null); enableVersion.setRendered(false); addUIFormInput(enableVersion); } public String getRepository() { try { return getApplicationComponent(RepositoryService.class).getCurrentRepository() .getConfiguration() .getName(); } catch (RepositoryException e) { return null; } } public void updateOptionList() throws Exception { getUIFormSelectBox(FIELD_HOMETEMPLATE).setOptions(getOptionList()); } public List<SelectItemOption<String>> getOptionList() throws Exception { List<SelectItemOption<String>> typeList = new ArrayList<SelectItemOption<String>>(); SessionProvider provider = WCMCoreUtils.getUserSessionProvider(); if (getId().equalsIgnoreCase("ecmTempForm")) { Node ecmTemplateHome = getApplicationComponent(ManageViewService.class).getTemplateHome( BasePath.ECM_EXPLORER_TEMPLATES, provider); if (ecmTemplateHome != null) { typeList.add(new SelectItemOption<String>(ecmTemplateHome.getName(), ecmTemplateHome .getPath())); } } return typeList; } public boolean canEnableVersionning(Node node) throws Exception { return node.canAddMixin(Utils.MIX_VERSIONABLE); } private boolean isVersioned(Node node) throws RepositoryException { return node.isNodeType(Utils.MIX_VERSIONABLE); } private VersionNode getRootVersion(Node node) throws Exception { VersionHistory vH = node.getVersionHistory(); return (vH != null) ? new VersionNode(vH.getRootVersion(), node.getSession()) : null; } private List<String> getNodeVersions(List<VersionNode> children) throws Exception { List<VersionNode> child = new ArrayList<VersionNode>(); for (VersionNode vNode : children) { listVersion.add(vNode.getName()); child = vNode.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 refresh() throws Exception { UIFormSelectBox versionField = getUIFormSelectBox(FIELD_VERSION); if (isAddNew_) { versionField.setRendered(false); getUIFormTextAreaInput(FIELD_CONTENT).setValue(null); getUIStringInput(FIELD_NAME).setDisabled(false).setValue(null); getUIFormSelectBox(FIELD_HOMETEMPLATE).setValue(null); getUIFormSelectBox(FIELD_HOMETEMPLATE).setDisabled(false); getUICheckBoxInput(FIELD_ENABLEVERSION).setRendered(false); template_ = null; selectedVersion_ = null; baseVersionName_ = null; return; } update(template_.getPath(), null); } public void update(String templatePath, VersionNode selectedVersion) throws Exception { if (templatePath != null) { templatePath_ = templatePath; Node templateNode = getApplicationComponent(ManageViewService.class). getTemplate(templatePath, WCMCoreUtils.getUserSessionProvider()); template_ = NodeLocation.getNodeLocationByNode(templateNode); getUIStringInput(FIELD_NAME).setValue(templateNode.getName()); getUIStringInput(FIELD_NAME).setDisabled(true); String value = templatePath.substring(0, templatePath.lastIndexOf("/")); getUIFormSelectBox(FIELD_HOMETEMPLATE).setValue(value); getUIFormSelectBox(FIELD_HOMETEMPLATE).setDisabled(false); getUICheckBoxInput(FIELD_ENABLEVERSION).setRendered(true); if (isVersioned(templateNode)) { rootVersionNode = getRootVersion(templateNode); baseVersionName_ = templateNode.getBaseVersion().getName(); List<SelectItemOption<String>> options = getVersionValues(templateNode); getUIFormSelectBox(FIELD_VERSION).setOptions(options).setRendered(true); getUIFormSelectBox(FIELD_VERSION).setValue(baseVersionName_); getUICheckBoxInput(FIELD_ENABLEVERSION).setChecked(true).setDisabled(true); if (options.size() > 1) setActions(new String[] { "Save", "Reset", "Restore", "Cancel" }); else setActions(new String[] { "Save", "Reset", "Cancel" }); } else if (canEnableVersionning(templateNode)) { getUIFormSelectBox(FIELD_VERSION).setRendered(false); getUICheckBoxInput(FIELD_ENABLEVERSION).setChecked(false).setDisabled(false); } } if (selectedVersion != null) { NodeLocation.getNodeByLocation(template_).restore(selectedVersion.getName(), false); selectedVersion_ = selectedVersion; Object[] args = { getUIStringInput(FIELD_VERSION).getValue() }; UIApplication app = getAncestorOfType(UIApplication.class); app.addMessage(new ApplicationMessage("UITemplateForm.msg.version-restored", args)); } String content = templateService.getTemplate(NodeLocation.getNodeByLocation(template_)); getUIFormTextAreaInput(FIELD_CONTENT).setValue(content); } static public class SaveActionListener extends EventListener<UITemplateForm> { public void execute(Event<UITemplateForm> event) throws Exception { UITemplateForm uiForm = event.getSource(); String templateName = uiForm.getUIStringInput(FIELD_NAME).getValue().trim(); String content = uiForm.getUIFormTextAreaInput(FIELD_CONTENT).getValue(); String homeTemplate = uiForm.getUIFormSelectBox(FIELD_HOMETEMPLATE).getValue(); ManageViewService manageViewService = uiForm.getApplicationComponent(ManageViewService.class); UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class); if (homeTemplate == null) { String tempPath = uiForm.template_.getPath(); homeTemplate = tempPath.substring(0, tempPath.lastIndexOf("/")); } boolean isEnableVersioning = uiForm.getUICheckBoxInput(FIELD_ENABLEVERSION).isChecked(); String path = null; if (uiForm.getId().equalsIgnoreCase(UIECMTemplateList.ST_ecmTempForm)) { List<Node> ecmTemps = manageViewService.getAllTemplates(BasePath.ECM_EXPLORER_TEMPLATES, WCMCoreUtils.getUserSessionProvider()); for (Node temp : ecmTemps) { if (temp.getName().equals(templateName) && uiForm.isAddNew_) { Object[] args = { templateName }; uiApp.addMessage(new ApplicationMessage("UITemplateForm.msg.template-name-exist", args, ApplicationMessage.WARNING)); return; } } } if (uiForm.isAddNew_) { try { if (uiForm.templatePath_ != null) { String oldHomeTemplate = uiForm.templatePath_.substring(0, uiForm.templatePath_.lastIndexOf("/")); if (!oldHomeTemplate.equals(homeTemplate)) { Node oldNode = manageViewService.getTemplate(uiForm.templatePath_, WCMCoreUtils.getUserSessionProvider()); oldNode.remove(); manageViewService.getTemplate(oldHomeTemplate, WCMCoreUtils.getUserSessionProvider()).save(); } } path = manageViewService.addTemplate(templateName, content, homeTemplate, WCMCoreUtils.getUserSessionProvider()); uiForm.template_ = NodeLocation.getNodeLocationByNode(manageViewService.getTemplate(path, WCMCoreUtils.getUserSessionProvider())); } catch (AccessDeniedException ex) { uiApp.addMessage(new ApplicationMessage("UITemplateForm.msg.add-permission-denied", null, ApplicationMessage.WARNING)); return; } } else { try { Node templateNode = NodeLocation.getNodeByLocation(uiForm.template_); if (isEnableVersioning) { if (!templateNode.isNodeType(Utils.MIX_VERSIONABLE)) { templateNode.addMixin(Utils.MIX_VERSIONABLE); templateNode.save(); } else { templateNode.checkout(); } } path = manageViewService.updateTemplate(templateName, content, homeTemplate, WCMCoreUtils.getUserSessionProvider()); templateNode.save(); if (isEnableVersioning) { templateNode.checkin(); } } catch (AccessDeniedException ex) { Object[] args = { "UIViewFormTabPane.label.option." + templateName }; uiApp.addMessage(new ApplicationMessage("UITemplateForm.msg.edit-permission-denied", args, ApplicationMessage.WARNING)); return; } } String workspaceName = NodeLocation.getNodeByLocation(uiForm.template_).getSession().getWorkspace().getName(); JCRResourceResolver resourceResolver = new JCRResourceResolver(workspaceName); TemplateService templateService = uiForm.getApplicationComponent(TemplateService.class); if (path != null) templateService.invalidateTemplate(path, resourceResolver); UITemplateContainer uiTempContainer = uiForm.getAncestorOfType(UIPopupWindow.class).getParent(); UIECMTemplateList uiECMTempList = uiTempContainer.getChild(UIECMTemplateList.class); uiECMTempList.refresh(uiECMTempList.getUIPageIterator().getCurrentPage()); if (uiForm.isAddNew_) { uiTempContainer.removeChildById(UIECMTemplateList.ST_ecmTempForm + "Add"); } else { uiTempContainer.removeChildById(UIECMTemplateList.ST_ecmTempForm + "Edit"); } event.getRequestContext().addUIComponentToUpdateByAjax(uiTempContainer); } } static public class CancelActionListener extends EventListener<UITemplateForm> { public void execute(Event<UITemplateForm> event) throws Exception { UITemplateForm uiForm = event.getSource(); uiForm.refresh(); UITemplateContainer uiTempContainer = uiForm.getAncestorOfType(UIPopupWindow.class).getParent(); if (uiForm.isAddNew_) { uiTempContainer.removeChildById(UIECMTemplateList.ST_ecmTempForm + "Add"); } else { uiTempContainer.removeChildById(UIECMTemplateList.ST_ecmTempForm + "Edit"); } event.getRequestContext().addUIComponentToUpdateByAjax(uiTempContainer); } } static public class ResetActionListener extends EventListener<UITemplateForm> { public void execute(Event<UITemplateForm> event) throws Exception { UITemplateForm uiForm = event.getSource(); UITemplateContainer uiTempContainer = uiForm.getAncestorOfType(UIPopupWindow.class).getParent(); if (uiForm.selectedVersion_ != null) { if (!uiForm.selectedVersion_.getName().equals(uiForm.baseVersionName_)) { Node templateNode = NodeLocation.getNodeByLocation(uiForm.template_); templateNode.restore(uiForm.baseVersionName_, true); templateNode.checkout(); } } uiForm.refresh(); UIECMTemplateList uiECMTempList = uiTempContainer.getChild(UIECMTemplateList.class); uiECMTempList.refresh(uiECMTempList.getUIPageIterator().getCurrentPage()); event.getRequestContext().addUIComponentToUpdateByAjax(uiForm); } } static public class ChangeActionListener extends EventListener<UITemplateForm> { public void execute(Event<UITemplateForm> event) throws Exception { UITemplateForm uiForm = event.getSource(); String version = uiForm.getUIFormSelectBox(FIELD_VERSION).getValue(); String path = NodeLocation.getNodeByLocation(uiForm.template_).getVersionHistory().getVersion(version).getPath(); VersionNode versionNode = uiForm.rootVersionNode.findVersionNode(path); Node frozenNode = versionNode.getNode(Utils.JCR_FROZEN); String content = uiForm.templateService.getTemplate(frozenNode); uiForm.getUIFormTextAreaInput(FIELD_CONTENT).setValue(content); event.getRequestContext().addUIComponentToUpdateByAjax(uiForm); } } static public class RestoreActionListener extends EventListener<UITemplateForm> { public void execute(Event<UITemplateForm> event) throws Exception { UITemplateForm uiForm = event.getSource(); String version = uiForm.getUIFormSelectBox(FIELD_VERSION).getValue(); String path = NodeLocation.getNodeByLocation(uiForm.template_).getVersionHistory().getVersion(version).getPath(); VersionNode selectedVesion = uiForm.rootVersionNode.findVersionNode(path); if (uiForm.baseVersionName_.equals(selectedVesion.getName())) return; uiForm.update(null, selectedVesion); UITemplateContainer uiTempContainer = uiForm.getAncestorOfType(UIPopupWindow.class).getParent(); UIECMTemplateList uiECMTempList = uiTempContainer.getChild(UIECMTemplateList.class); uiECMTempList.refresh(uiECMTempList.getUIPageIterator().getCurrentPage()); UITemplateContainer uiTemplateContainer = uiForm.getAncestorOfType(UITemplateContainer.class); if (uiForm.isAddNew_) { uiTemplateContainer.removeChildById(UIECMTemplateList.ST_ecmTempForm + "Add"); } else { uiTemplateContainer.removeChildById(UIECMTemplateList.ST_ecmTempForm + "Edit"); } event.getRequestContext().addUIComponentToUpdateByAjax(uiTempContainer); } } }