/* * 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.templates; import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.List; import javax.jcr.Node; import javax.jcr.Value; import javax.jcr.version.VersionHistory; import org.exoplatform.ecm.jcr.model.VersionNode; import org.exoplatform.ecm.webui.form.UIFormInputSetWithAction; import org.exoplatform.ecm.webui.form.validator.ECMNameValidator; import org.exoplatform.ecm.webui.selector.UISelectable; import org.exoplatform.ecm.webui.utils.Utils; import org.exoplatform.services.cms.templates.TemplateService; import org.exoplatform.services.organization.OrganizationService; 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.UIComponent; 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 : pham tuan * phamtuanchip@yahoo.de * Oct 03, 2006 * 9:43:23 AM */ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "system:/groovy/webui/form/UIForm.gtmpl", events = { @EventConfig(listeners = UITemplateContent.SaveActionListener.class), @EventConfig(phase=Phase.DECODE, listeners = UITemplateContent.ChangeActionListener.class), @EventConfig(phase=Phase.DECODE, listeners = UITemplateContent.CancelActionListener.class), @EventConfig(phase=Phase.DECODE, listeners = UITemplateContent.RestoreActionListener.class), @EventConfig(phase=Phase.DECODE, listeners = UITemplateContent.RefreshActionListener.class), @EventConfig(phase=Phase.DECODE, listeners = UITemplateContent.AddPermissionActionListener.class), @EventConfig(phase=Phase.DECODE, listeners = UITemplateContent.RemovePermissionActionListener.class) } ) public class UITemplateContent extends UIForm implements UISelectable { final static public String FIELD_SELECT_VERSION = "selectVersion" ; final static public String FIELD_CONTENT = "content" ; final static public String FIELD_NAME = "name" ; final static public String FIELD_VIEWPERMISSION = "viewPermission" ; final static public String FIELD_ENABLE_VERSION = "enableVersion" ; final static public String[] REG_EXPRESSION = {"[", "]", ":", "&", "%"} ; private boolean isAddNew_ = true ; private String nodeTypeName_ ; private List<String> listVersion_ = new ArrayList<String>() ; private String templateType; final static public String TEMPLATE_PERMISSION = "TemplatePermission" ; public UITemplateContent() throws Exception { List<SelectItemOption<String>> options = new ArrayList<SelectItemOption<String>>() ; UIFormSelectBox versions = new UIFormSelectBox(FIELD_SELECT_VERSION, FIELD_SELECT_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)) ; UICheckBoxInput isVersion = new UICheckBoxInput(FIELD_ENABLE_VERSION , FIELD_ENABLE_VERSION, null) ; isVersion.setRendered(false) ; addUIFormInput(isVersion) ; UIFormInputSetWithAction uiActionTab = new UIFormInputSetWithAction("UITemplateContent"); uiActionTab.addUIFormInput(new UIFormStringInput(FIELD_VIEWPERMISSION, FIELD_VIEWPERMISSION, null).setDisabled(true).addValidator(MandatoryValidator.class)); uiActionTab.setActionInfo(FIELD_VIEWPERMISSION, new String[] { "AddPermission", "RemovePermission" }); addUIComponentInput(uiActionTab) ; } public void setTemplateType(String templateType) { this.templateType = templateType; } public String getTemplateType() { return templateType; } public void setNodeTypeName (String nodeType) {nodeTypeName_ = nodeType ;} public void update(String templateName) throws Exception { if(templateName != null) { isAddNew_ = false ; TemplateService templateService = getApplicationComponent(TemplateService.class) ; String templateContent = templateService.getTemplate(templateType, nodeTypeName_, templateName) ; Node template = templateService.getTemplateNode(templateType, nodeTypeName_, templateName, WCMCoreUtils.getSystemSessionProvider()) ; getUICheckBoxInput(FIELD_ENABLE_VERSION).setRendered(true) ; String templateRole = templateService.getTemplateRoles(template) ; boolean isVersioned = template.isNodeType(Utils.MIX_VERSIONABLE) ; if(isVersioned) { getUIFormSelectBox(FIELD_SELECT_VERSION).setRendered(true) ; getUIFormSelectBox(FIELD_SELECT_VERSION).setOptions(getVersionValues(template)) ; getUIFormSelectBox(FIELD_SELECT_VERSION).setValue(template.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_CONTENT).setValue(templateContent) ; getUIStringInput(FIELD_NAME).setValue(template.getName()) ; getUIStringInput(FIELD_NAME).setDisabled(true); getUIStringInput(FIELD_VIEWPERMISSION).setValue(templateRole) ; return ; } isAddNew_ = true ; getUIFormSelectBox(FIELD_SELECT_VERSION).setRendered(false) ; getUICheckBoxInput(FIELD_ENABLE_VERSION).setRendered(false) ; getUIStringInput(FIELD_NAME).setDisabled(false); setActions( new String[]{"Save", "Refresh", "Cancel"}) ; } private void refresh() throws Exception { UIViewTemplate uiViewTemplate = getAncestorOfType(UIViewTemplate.class) ; uiViewTemplate.refresh() ; UIComponent parent = getParent() ; if(parent instanceof UIDialogTab) { uiViewTemplate.setSelectedTab(UIDialogTab.class.getSimpleName()) ; } else if(parent instanceof UIViewTab) { uiViewTemplate.setSelectedTab(UIViewTab.class.getSimpleName()) ; } else if(parent instanceof UISkinTab) { uiViewTemplate.setSelectedTab(UISkinTab.class.getSimpleName()) ; } update(null) ; reset() ; } private VersionNode getRootVersion(Node node) throws Exception{ VersionHistory vH = node.getVersionHistory() ; if(vH != null) return new VersionNode(vH.getRootVersion(), node.getSession()) ; return null ; } private List<String> getNodeVersions(List<VersionNode> children) throws Exception { List<VersionNode> child = new ArrayList<VersionNode>() ; for(VersionNode version : children) { listVersion_.add(version.getName()) ; child = version.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 ; } @SuppressWarnings("unused") public void doSelect(String selectField, Object value) { String viewPermission = getUIStringInput(FIELD_VIEWPERMISSION).getValue(); if (viewPermission == null) viewPermission = ""; if ((viewPermission != null) && (viewPermission.length() == 0)) { viewPermission = value.toString(); } else { StringBuffer sb = new StringBuffer(); sb.append(viewPermission).append(",").append(value.toString()); viewPermission = sb.toString(); } getUIStringInput(FIELD_VIEWPERMISSION).setValue(viewPermission) ; } static public class RestoreActionListener extends EventListener<UITemplateContent> { public void execute(Event<UITemplateContent> event) throws Exception { UITemplateContent uiForm = event.getSource() ; UITemplatesManager uiManager = uiForm.getAncestorOfType(UITemplatesManager.class) ; String name = uiForm.getUIStringInput(FIELD_NAME).getValue() ; TemplateService templateService = uiForm.getApplicationComponent(TemplateService.class) ; Node node = templateService.getTemplateNode(uiForm.getTemplateType(), uiForm.nodeTypeName_, name, WCMCoreUtils.getSystemSessionProvider()) ; String vesion = uiForm.getUIFormSelectBox(FIELD_SELECT_VERSION).getValue() ; String baseVesion = node.getBaseVersion().getName() ; UIApplication app = uiForm.getAncestorOfType(UIApplication.class) ; if(vesion.equals(baseVesion)) return ; node.checkout() ; node.restore(vesion, true) ; Object[] args = {uiForm.getUIStringInput(FIELD_SELECT_VERSION).getValue()} ; app.addMessage(new ApplicationMessage("UITemplateContent.msg.version-restored", args)) ; uiForm.refresh() ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; } } static public class SaveActionListener extends EventListener<UITemplateContent> { public void execute(Event<UITemplateContent> event) throws Exception { UITemplateContent uiForm = event.getSource() ; UITemplatesManager uiManager = uiForm.getAncestorOfType(UITemplatesManager.class) ; UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class) ; String name = uiForm.getUIStringInput(FIELD_NAME).getValue() ; if(name == null || name.trim().length() == 0) { Object[] args = { FIELD_NAME } ; uiApp.addMessage(new ApplicationMessage("ECMNameValidator.msg.empty-input", args, ApplicationMessage.WARNING)) ; return ; } if(!Utils.isNameValid(name, UITemplateContent.REG_EXPRESSION)){ uiApp.addMessage(new ApplicationMessage("UITemplateContent.msg.name-invalid", null, ApplicationMessage.WARNING)) ; return ; } String content = uiForm.getUIFormTextAreaInput(FIELD_CONTENT).getValue() ; if(content == null) content = "" ; UIFormInputSetWithAction permField = uiForm.getChildById("UITemplateContent") ; String role = permField.getUIStringInput(FIELD_VIEWPERMISSION).getValue() ; if ((role == null) || (role.trim().length() == 0)) { uiApp.addMessage(new ApplicationMessage("UITemplateForm.msg.role-require", null, ApplicationMessage.WARNING)); return; } UIViewTemplate uiViewTemplate = uiForm.getAncestorOfType(UIViewTemplate.class) ; if(uiForm.getId().equals(UIDialogTab.DIALOG_FORM_NAME)) { UIDialogTab uiDialogTab = uiViewTemplate.getChild(UIDialogTab.class) ; if(uiDialogTab.getListDialog().contains(name) && uiForm.isAddNew_) { Object[] args = { name } ; uiApp.addMessage(new ApplicationMessage("UITemplateContent.msg.name-exist", args, ApplicationMessage.WARNING)) ; return ; } } else if(uiForm.getId().equals(UIViewTab.VIEW_FORM_NAME)) { UIViewTab uiViewTab = uiViewTemplate.getChild(UIViewTab.class) ; if(uiViewTab.getListView().contains(name) && uiForm.isAddNew_) { Object[] args = { name } ; uiApp.addMessage(new ApplicationMessage("UITemplateContent.msg.name-exist", args, ApplicationMessage.WARNING)) ; return ; } } else if(uiForm.getId().equals(UISkinTab.SKIN_FORM_NAME)) { UISkinTab uiSkinTab = uiViewTemplate.getChild(UISkinTab.class) ; if(uiSkinTab.getListSkin().contains(name) && uiForm.isAddNew_) { Object[] args = { name } ; uiApp.addMessage(new ApplicationMessage("UITemplateContent.msg.name-exist", args, ApplicationMessage.WARNING)) ; return ; } } TemplateService templateService = uiForm.getApplicationComponent(TemplateService.class) ; boolean isEnableVersioning = uiForm.getUICheckBoxInput(FIELD_ENABLE_VERSION).isChecked() ; if(uiForm.isAddNew_){ templateService.addTemplate(uiForm.getTemplateType(), uiForm.nodeTypeName_, null, false, name, new String[] {role}, new ByteArrayInputStream(content.getBytes("utf-8"))); } else { Node node = templateService.getTemplateNode(uiForm.getTemplateType(), uiForm.nodeTypeName_, name, WCMCoreUtils.getSystemSessionProvider()) ; if(isEnableVersioning && !node.isNodeType(Utils.MIX_VERSIONABLE)) { node.addMixin(Utils.MIX_VERSIONABLE) ; } if (areValidPermissions(role, uiForm)) { templateService.addTemplate(uiForm.getTemplateType(), uiForm.nodeTypeName_, null, false, name, new String[] { role }, new ByteArrayInputStream(content.getBytes("utf-8"))); } else { return; } node.save() ; if(isEnableVersioning) { node.checkin() ; node.checkout(); } } uiForm.refresh() ; uiForm.isAddNew_ = true ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; } } static public class ChangeActionListener extends EventListener<UITemplateContent> { public void execute(Event<UITemplateContent> event) throws Exception { UITemplateContent uiForm = event.getSource() ; UITemplatesManager uiManager = uiForm.getAncestorOfType(UITemplatesManager.class) ; String name = uiForm.getUIStringInput(FIELD_NAME).getValue() ; TemplateService templateService = uiForm.getApplicationComponent(TemplateService.class) ; Node node = templateService.getTemplateNode(uiForm.getTemplateType(), uiForm.nodeTypeName_, name, WCMCoreUtils.getSystemSessionProvider()) ; String version = uiForm.getUIFormSelectBox(FIELD_SELECT_VERSION).getValue() ; String path = node.getVersionHistory().getVersion(version).getPath() ; VersionNode versionNode = uiForm.getRootVersion(node).findVersionNode(path) ; Node frozenNode = versionNode.getNode(Utils.JCR_FROZEN) ; String content = templateService.getTemplate(frozenNode); uiForm.getUIFormTextAreaInput(FIELD_CONTENT).setValue(content) ; if (frozenNode.hasProperty(Utils.EXO_ROLES)) { StringBuilder rule = new StringBuilder() ; Value[] rules = frozenNode.getProperty(Utils.EXO_ROLES).getValues() ; for(int i = 0; i < rules.length; i++) { rule.append(rules[i].getString()); } uiForm.getUIStringInput(FIELD_VIEWPERMISSION).setValue(rule.toString()); } event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; } } static public class AddPermissionActionListener extends EventListener<UITemplateContent> { public void execute(Event<UITemplateContent> event) throws Exception { UITemplateContent uiTempContent = event.getSource() ; UITemplatesManager uiManager = uiTempContent.getAncestorOfType(UITemplatesManager.class) ; UIViewTemplate uiViewTemp = uiTempContent.getAncestorOfType(UIViewTemplate.class) ; String membership = uiTempContent.getUIStringInput(FIELD_VIEWPERMISSION).getValue() ; uiManager.initPopupPermission(uiTempContent.getId(), membership) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; if(uiTempContent.getId().equals(UIDialogTab.DIALOG_FORM_NAME)) { uiViewTemp.setSelectedTab(UIDialogTab.class.getSimpleName()) ; } else if(uiTempContent.getId().equals(UIViewTab.VIEW_FORM_NAME)) { uiViewTemp.setSelectedTab(UIViewTab.class.getSimpleName()) ; } else if(uiTempContent.getId().equals(UISkinTab.SKIN_FORM_NAME)) { uiViewTemp.setSelectedTab(UISkinTab.class.getSimpleName()) ; } UIPopupWindow uiPopup = uiManager.getChildById(UITemplateContent.TEMPLATE_PERMISSION); event.getRequestContext().addUIComponentToUpdateByAjax(uiPopup) ; } } static public class RemovePermissionActionListener extends EventListener<UITemplateContent> { public void execute(Event<UITemplateContent> event) throws Exception { UITemplateContent uiTemplateContent = event.getSource(); uiTemplateContent.getUIStringInput(FIELD_VIEWPERMISSION).setValue(null); event.getRequestContext().addUIComponentToUpdateByAjax(uiTemplateContent); } } static public class RefreshActionListener extends EventListener<UITemplateContent> { public void execute(Event<UITemplateContent> event) throws Exception { UITemplateContent uiForm = event.getSource() ; UITemplatesManager uiManager = uiForm.getAncestorOfType(UITemplatesManager.class) ; if(!uiForm.isAddNew_) { uiForm.update(uiForm.getUIStringInput(UITemplateContent.FIELD_NAME).getValue()) ; return ; } uiForm.update(null) ; uiForm.reset() ; uiForm.refresh() ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; } } static public class CancelActionListener extends EventListener<UITemplateContent> { public void execute(Event<UITemplateContent> event) throws Exception { UITemplateContent uiTemplateContent = event.getSource() ; UITemplatesManager uiManager = uiTemplateContent.getAncestorOfType(UITemplatesManager.class) ; uiManager.removeChildById(UIDialogTab.DIALOG_FORM_NAME + TEMPLATE_PERMISSION) ; uiManager.removeChildById(UIViewTab.VIEW_FORM_NAME + TEMPLATE_PERMISSION) ; uiManager.removeChildById(UISkinTab.SKIN_FORM_NAME + TEMPLATE_PERMISSION) ; uiTemplateContent.reset() ; UIPopupWindow uiPopupWindow = uiManager.getChildById(UITemplatesManager.POPUP_TEMPLATE_ID) ; uiPopupWindow.setShow(false) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; } } private static boolean areValidPermissions(String permissions, UITemplateContent uiTemplateContent) throws Exception { Boolean areValidPermissions = false; UIApplication uiApp = uiTemplateContent.getAncestorOfType(UIApplication.class); if (permissions == null || permissions.trim().length() == 0) { uiApp.addMessage(new ApplicationMessage("UIDriveForm.msg.permission-null", null, ApplicationMessage.WARNING)); areValidPermissions = false; return areValidPermissions; } OrganizationService oservice = WCMCoreUtils.getService(OrganizationService.class); String[] arrPermissions = permissions.split(","); for (String itemPermission : arrPermissions) { if (itemPermission.length() == 0) { uiApp.addMessage(new ApplicationMessage("UIDriveForm.msg.permission-path-invalid", null, ApplicationMessage.WARNING)); areValidPermissions = false; return areValidPermissions; } if (itemPermission.contains(":")) { String[] permission = itemPermission.split(":"); if ((permission[0] == null) || (permission[0].length() == 0)) { uiApp.addMessage(new ApplicationMessage("UIDriveForm.msg.permission-path-invalid", null, ApplicationMessage.WARNING)); areValidPermissions = false; return areValidPermissions; } else if (!permission[0].equals("*") && (oservice.getMembershipTypeHandler().findMembershipType(permission[0]) == null)) { uiApp.addMessage(new ApplicationMessage("UIDriveForm.msg.permission-path-invalid", null, ApplicationMessage.WARNING)); areValidPermissions = false; return areValidPermissions; } if ((permission[1] == null) || (permission[1].length() == 0)) { uiApp.addMessage(new ApplicationMessage("UIDriveForm.msg.permission-path-invalid", null, ApplicationMessage.WARNING)); areValidPermissions = false; return areValidPermissions; } else if (oservice.getGroupHandler().findGroupById(permission[1]) == null) { uiApp.addMessage(new ApplicationMessage("UIDriveForm.msg.permission-path-invalid", null, ApplicationMessage.WARNING)); areValidPermissions = false; return areValidPermissions; } } else { if (!itemPermission.equals("*")) { uiApp.addMessage(new ApplicationMessage("UIDriveForm.msg.permission-path-invalid", null, ApplicationMessage.WARNING)); areValidPermissions = false; return areValidPermissions; } } } areValidPermissions = true; return areValidPermissions; } }