/* * 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.Collections; import java.util.Comparator; import java.util.List; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.nodetype.NodeType; import javax.jcr.nodetype.NodeTypeIterator; import javax.jcr.nodetype.NodeTypeManager; import org.exoplatform.ecm.webui.form.UIFormInputSetWithAction; import org.exoplatform.ecm.webui.selector.UISelectable; import org.exoplatform.services.cms.templates.TemplateService; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.wcm.publication.WCMComposer; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.exoplatform.wcm.webui.form.UIFormInputSetWithNoLabel; 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.UIFormSelectBox; import org.exoplatform.webui.form.UIFormStringInput; import org.exoplatform.webui.form.UIFormTabPane; 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 = "app:/groovy/webui/component/admin/template/UITemplateForm.gtmpl", events = { @EventConfig(listeners = UITemplateForm.SaveActionListener.class), @EventConfig(listeners = UITemplateForm.RefreshActionListener.class, phase=Phase.DECODE), @EventConfig(listeners = UITemplateForm.CancelActionListener.class, phase=Phase.DECODE), @EventConfig(listeners = UITemplateForm.AddPermissionActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UITemplateForm.OnChangeActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIViewTemplate.SelectTabActionListener.class) } ) public class UITemplateForm extends UIFormTabPane implements UISelectable { final static public String FIELD_NAME = "name" ; final static public String FIELD_LABEL = "label" ; final static public String FIELD_ISTEMPLATE = "isDocumentTemplate" ; final static public String FIELD_DIALOG = "dialog" ; final static public String FIELD_VIEW = "view" ; final static public String FIELD_SKIN = "skin"; final static public String FIELD_TAB_TEMPLATE = "UITemplateForm" ; final static public String FIELD_TAB_DIALOG = "UIDialogTab" ; final static public String FIELD_TAB_VIEW = "UIViewTab" ; final static public String FIELD_TAB_SKIN = "UISkinTab" ; final static public String FIELD_PERMISSION = "permission" ; final static public String POPUP_PERMISSION = "PopupViewPermission" ; public static final String DOCUMENTS_TEMPLATE_TYPE = "templates"; public static final String ACTIONS_TEMPLATE_TYPE = "actions"; public static final String OTHERS_TEMPLATE_TYPE = "others"; private String selectedTabId = ""; private String filter = ""; //DOCUMENTS_TEMPLATE_TYPE; public String getSelectedTabId() { return selectedTabId; } public void setSelectedTab(String renderTabId) { selectedTabId = renderTabId; } public String getFilter() { return filter; } public void setFilter(String filter) { this.filter = filter; } public void setSelectedTab(int index) { selectedTabId = getChild(index - 1).getId(); } public UITemplateForm() throws Exception { super("UITemplateForm") ; UIFormInputSetWithAction templateTab = new UIFormInputSetWithAction(FIELD_TAB_TEMPLATE); UIFormSelectBox uiSelectBox = new UIFormSelectBox(FIELD_NAME, FIELD_NAME, getOption()); uiSelectBox.setOnChange("OnChange"); templateTab.addUIFormInput(uiSelectBox); templateTab.addUIFormInput(new UIFormStringInput(FIELD_LABEL, FIELD_LABEL, null). addValidator(MandatoryValidator.class)) ; templateTab.addUIFormInput(new UICheckBoxInput(FIELD_ISTEMPLATE, FIELD_ISTEMPLATE, null).setChecked(true)); templateTab.addUIFormInput(new UIFormStringInput(FIELD_PERMISSION, FIELD_PERMISSION, null).setDisabled(true).addValidator(MandatoryValidator.class)); templateTab.setActionInfo(FIELD_PERMISSION, new String[] {"AddPermission"}) ; addUIComponentInput(templateTab) ; setSelectedTab(templateTab.getId()) ; UIFormInputSetWithNoLabel defaultDialogTab = new UIFormInputSetWithNoLabel(FIELD_TAB_DIALOG) ; defaultDialogTab.addUIFormInput(new UIFormTextAreaInput(FIELD_DIALOG, FIELD_DIALOG, null). addValidator(MandatoryValidator.class)) ; addUIFormInput(defaultDialogTab) ; UIFormInputSetWithNoLabel defaultViewTab = new UIFormInputSetWithNoLabel(FIELD_TAB_VIEW) ; defaultViewTab.addUIFormInput(new UIFormTextAreaInput(FIELD_VIEW, FIELD_VIEW, null). addValidator(MandatoryValidator.class)) ; addUIFormInput(defaultViewTab) ; UIFormInputSetWithNoLabel defaultSkinTab = new UIFormInputSetWithNoLabel(FIELD_TAB_SKIN) ; defaultSkinTab.addUIFormInput(new UIFormTextAreaInput(FIELD_SKIN, FIELD_SKIN, null)) ; addUIFormInput(defaultSkinTab) ; setActions(new String[]{"Save", "Refresh", "Cancel"}) ; setSelectedTab(FIELD_TAB_TEMPLATE); } public void refresh()throws Exception { getUIFormSelectBox(FIELD_NAME).setOptions(getOption()); String nodeType = getUIFormSelectBox(FIELD_NAME).getValue(); getUIStringInput(FIELD_LABEL).setValue(""); if(filter.equals(DOCUMENTS_TEMPLATE_TYPE)) getUICheckBoxInput(FIELD_ISTEMPLATE).setChecked(true); else getUICheckBoxInput(FIELD_ISTEMPLATE).setChecked(false); getUICheckBoxInput(FIELD_ISTEMPLATE).setDisabled(true); initTemplate(nodeType); getUIStringInput(FIELD_PERMISSION).setValue(""); } private void initTemplate(String nodeType)throws Exception { getUIFormTextAreaInput(FIELD_VIEW).setValue(getDefaultView(nodeType)); getUIFormTextAreaInput(FIELD_DIALOG).setValue(getDefaultDialog(nodeType)); getUIFormTextAreaInput(FIELD_SKIN).setValue(getDefaultStyleSheet(nodeType)); } private String getDefaultStyleSheet(String nodeType) throws Exception { TemplateService templateService = getApplicationComponent(TemplateService.class); return templateService.buildStyleSheet(nodeType); } private String getDefaultView(String nodeType) throws Exception { TemplateService templateService = getApplicationComponent(TemplateService.class); return templateService.buildViewForm(nodeType); } private String getDefaultDialog(String nodeType) throws Exception { TemplateService templateService = getApplicationComponent(TemplateService.class); return templateService.buildDialogForm(nodeType); } static public class TemplateNameComparator implements Comparator<SelectItemOption<String>> { public int compare(SelectItemOption<String> o1, SelectItemOption<String> o2) throws ClassCastException { try { String name1 = o1.getValue().toString() ; String name2 = o2.getValue().toString() ; return name1.compareToIgnoreCase(name2) ; } catch(Exception e) { return 0; } } } public List<SelectItemOption<String>> getOption() throws Exception { List<SelectItemOption<String>> options = new ArrayList<SelectItemOption<String>>() ; NodeTypeManager nodeTypeManager = getApplicationComponent(RepositoryService.class).getCurrentRepository().getNodeTypeManager() ; Node templatesHome = getApplicationComponent(TemplateService.class). getTemplatesHome(WCMCoreUtils.getUserSessionProvider()); if(templatesHome != null) { NodeIterator templateIter = templatesHome.getNodes() ; List<String> templates = new ArrayList<String>() ; while (templateIter.hasNext()) { templates.add(templateIter.nextNode().getName()) ; } NodeTypeIterator iter = nodeTypeManager.getAllNodeTypes() ; while (iter.hasNext()) { NodeType nodeType = iter.nextNodeType(); if (nodeType.isMixin()) continue; String nodeTypeName = nodeType.getName(); if (!templates.contains(nodeTypeName)) { if(filter.equals(ACTIONS_TEMPLATE_TYPE) && nodeTypeManager.getNodeType(nodeTypeName).isNodeType("exo:action")) { options.add(new SelectItemOption<String>(nodeTypeName, nodeTypeName)); } else { options.add(new SelectItemOption<String>(nodeTypeName, nodeTypeName)); } } } Collections.sort(options, new TemplateNameComparator()) ; } return options ; } public void doSelect(String selectField, Object value) { UIFormInputSetWithAction uiFormAction = getChildById(FIELD_TAB_TEMPLATE) ; uiFormAction.getUIStringInput(FIELD_PERMISSION).setValue(value.toString()) ; } static public class SaveActionListener extends EventListener<UITemplateForm> { public void execute(Event<UITemplateForm> event) throws Exception { UITemplateForm uiForm = event.getSource() ; UITemplatesManager uiManager = event.getSource().getAncestorOfType(UITemplatesManager.class) ; String name = uiForm.getUIFormSelectBox(FIELD_NAME).getValue().trim() ; String label = uiForm.getUIStringInput(FIELD_LABEL).getValue().trim() ; String dialog = uiForm.getUIFormTextAreaInput(FIELD_DIALOG).getValue() ; String view = uiForm.getUIFormTextAreaInput(FIELD_VIEW).getValue(); String skin = uiForm.getUIFormTextAreaInput(FIELD_SKIN).getValue(); if(skin == null) skin = ""; boolean isDocumentTemplate = uiForm.getUICheckBoxInput(FIELD_ISTEMPLATE).isChecked() ; UIFormInputSetWithAction permField = uiForm.getChildById(UITemplateForm.FIELD_TAB_TEMPLATE) ; String role = permField.getUIStringInput(FIELD_PERMISSION).getValue(); if ((role == null) || (role.trim().length() == 0)) { UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class); uiApp.addMessage(new ApplicationMessage("UITemplateForm.msg.role-require", null, ApplicationMessage.WARNING)); return; } String[] roles = {role} ; if (dialog == null) dialog = ""; if (view == null) view = ""; TemplateService templateService = uiForm.getApplicationComponent(TemplateService.class) ; templateService.addTemplate(TemplateService.DIALOGS, name, label, isDocumentTemplate, TemplateService.DEFAULT_DIALOG, roles, new ByteArrayInputStream(dialog.getBytes())) ; templateService.addTemplate(TemplateService.VIEWS, name, label, isDocumentTemplate, TemplateService.DEFAULT_VIEW, roles, new ByteArrayInputStream(view.getBytes())) ; templateService.addTemplate(TemplateService.SKINS, name, label, isDocumentTemplate, TemplateService.DEFAULT_SKIN, roles, new ByteArrayInputStream(skin.getBytes())) ; WCMComposer composer = WCMCoreUtils.getService(WCMComposer.class); composer.updateTemplatesSQLFilter(); uiManager.refresh() ; //uiForm.refresh() ; UIPopupWindow uiPopupWindow = uiManager.getChildById(UITemplatesManager.POPUP_TEMPLATE_ID) ; uiPopupWindow.setShow(false) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; } } static public class CancelActionListener extends EventListener<UITemplateForm> { public void execute(Event<UITemplateForm> event) throws Exception { UITemplatesManager uiManager = event.getSource().getAncestorOfType(UITemplatesManager.class) ; UIPopupWindow uiPopupWindow = uiManager.getChildById(UITemplatesManager.POPUP_TEMPLATE_ID) ; uiPopupWindow.setShow(false) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; } } static public class RefreshActionListener extends EventListener<UITemplateForm> { public void execute(Event<UITemplateForm> event) throws Exception { UITemplateForm uiForm = event.getSource() ; uiForm.refresh() ; event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent()) ; } } static public class OnChangeActionListener extends EventListener<UITemplateForm> { public void execute(Event<UITemplateForm> event) throws Exception { UITemplateForm uiFormTabPane = event.getSource() ; String nodeType = uiFormTabPane.getUIFormSelectBox(FIELD_NAME).getValue(); uiFormTabPane.getUIStringInput(FIELD_LABEL).setValue(""); uiFormTabPane.initTemplate(nodeType); uiFormTabPane.getUIStringInput(FIELD_PERMISSION).setValue(""); event.getRequestContext().addUIComponentToUpdateByAjax(uiFormTabPane.getParent()) ; } } static public class AddPermissionActionListener extends EventListener<UITemplateForm> { public void execute(Event<UITemplateForm> event) throws Exception { UITemplateForm uiTemplateForm = event.getSource() ; UITemplatesManager uiManager = uiTemplateForm.getAncestorOfType(UITemplatesManager.class) ; String membership = uiTemplateForm.getUIStringInput(FIELD_PERMISSION).getValue() ; uiManager.initPopupPermission("AddNew", membership) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; UIPopupWindow uiPopup = uiManager.getChildById(UITemplateContent.TEMPLATE_PERMISSION); event.getRequestContext().addUIComponentToUpdateByAjax(uiPopup) ; } } }