/*************************************************************************** * Copyright (C) 2003-2009 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.clv; import org.apache.commons.lang.StringUtils; import org.exoplatform.ecm.webui.form.validator.ECMNameValidator; import org.exoplatform.ecm.webui.utils.Utils; import org.exoplatform.services.cms.templates.TemplateService; import org.exoplatform.services.cms.views.ApplicationTemplateManagerService; import org.exoplatform.services.wcm.core.NodetypeConstant; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.web.application.RequestContext; 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.validator.MandatoryValidator; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; /** * Created by The eXo Platform SARL * Author : Dang Van Minh * minh.dang@exoplatform.com * Jan 22, 2013 * 9:55:24 AM */ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "system:/groovy/webui/form/UIForm.gtmpl", events = { @EventConfig(listeners = UICLVTemplateForm.SaveActionListener.class), @EventConfig(listeners = UICLVTemplateForm.ResetActionListener.class, phase=Phase.DECODE), @EventConfig(listeners = UICLVTemplateForm.CancelActionListener.class, phase=Phase.DECODE) } ) public class UICLVTemplateForm extends UIForm { final static public String FIELD_TITLE = "title" ; final static public String FIELD_TEMPLATE_NAME = "template" ; final static public String FIELD_CONTENT = "content" ; final static public String FIELD_CONTENT_TYPE = "type" ; private boolean isAddNew; private String selectedCategory; public UICLVTemplateForm() throws Exception { UIFormTextAreaInput contentInput = new UIFormTextAreaInput(FIELD_CONTENT, FIELD_CONTENT, null); addUIFormInput(contentInput); UIFormStringInput nameInput = new UIFormStringInput(FIELD_TITLE, FIELD_TITLE, null); nameInput.addValidator(ECMNameValidator.class); addUIFormInput(nameInput); UIFormStringInput tempateNameInput = new UIFormStringInput(FIELD_TEMPLATE_NAME, FIELD_TEMPLATE_NAME, null); tempateNameInput.addValidator(MandatoryValidator.class).addValidator(ECMNameValidator.class); addUIFormInput(tempateNameInput); List<SelectItemOption<String>> templateOptions = new ArrayList<SelectItemOption<String>>(); RequestContext context = RequestContext.getCurrentInstance(); ResourceBundle res = context.getApplicationResourceBundle(); templateOptions.add(new SelectItemOption<String>( res.getString("UICLVTemplateForm.label." + ApplicationTemplateManagerService.CLV_LIST_TEMPLATE_CATEGORY), ApplicationTemplateManagerService.CLV_LIST_TEMPLATE_CATEGORY)); templateOptions.add(new SelectItemOption<String>( res.getString("UICLVTemplateForm.label." + ApplicationTemplateManagerService.CLV_NAVIGATION_TEMPLATE_CATEGORY), ApplicationTemplateManagerService.CLV_NAVIGATION_TEMPLATE_CATEGORY)); templateOptions.add(new SelectItemOption<String>( res.getString("UICLVTemplateForm.label." + ApplicationTemplateManagerService.CLV_PAGINATOR_TEMPLATE_CATEGORY), ApplicationTemplateManagerService.CLV_PAGINATOR_TEMPLATE_CATEGORY )); UIFormSelectBox templateType = new UIFormSelectBox(FIELD_CONTENT_TYPE, FIELD_CONTENT_TYPE, templateOptions); addUIFormInput(templateType); } public void refresh(String category) throws Exception { isAddNew = true; selectedCategory = category; setActions(new String[] {"Save", "Reset", "Cancel"}); getUIStringInput(FIELD_TITLE).setValue(StringUtils.EMPTY); getUIStringInput(FIELD_TEMPLATE_NAME).setValue(StringUtils.EMPTY); getUIStringInput(FIELD_TEMPLATE_NAME).setDisabled(false); getUIFormTextAreaInput(FIELD_CONTENT).setValue(StringUtils.EMPTY); getUIFormSelectBox(FIELD_CONTENT_TYPE).setValue(selectedCategory); } public void update(String category, String name) throws Exception { this.isAddNew = false; selectedCategory = category; setActions(new String[] {"Save", "Cancel"}); ApplicationTemplateManagerService templateManager = WCMCoreUtils.getService(ApplicationTemplateManagerService.class); Node templateNode = templateManager.getTemplateByName(ApplicationTemplateManagerService.CLV_TEMPLATE_STORAGE_FOLDER, category, name, WCMCoreUtils.getUserSessionProvider()); Node content = templateNode.getNode(Utils.JCR_CONTENT); try { getUIStringInput(FIELD_TITLE).setValue(content.getProperty(NodetypeConstant.DC_TITLE).getValues()[0].getString()); } catch(PathNotFoundException pne) { getUIStringInput(FIELD_TITLE).setValue(templateNode.getName()); } catch(ArrayIndexOutOfBoundsException aoe) { getUIStringInput(FIELD_TITLE).setValue(templateNode.getName()); } getUIStringInput(FIELD_TEMPLATE_NAME).setValue(templateNode.getName()); getUIStringInput(FIELD_TEMPLATE_NAME).setDisabled(true); getUIFormTextAreaInput(FIELD_CONTENT).setValue(content.getProperty(Utils.JCR_DATA).getString()); getUIFormSelectBox(FIELD_CONTENT_TYPE).setValue(category); } private void addTemplate(String category, String title, String template, String content) throws Exception { TemplateService templateService = WCMCoreUtils.getService(TemplateService.class); ApplicationTemplateManagerService appTemplateManager = WCMCoreUtils.getService(ApplicationTemplateManagerService.class); if(content == null) content = StringUtils.EMPTY; if(isAddNew) { if(!template.contains(".gtmpl")) template = template + ".gtmpl"; if(title == null || title.length() == 0) title = template; templateService.createTemplate(getCategoryByName(category), title, template, new ByteArrayInputStream(content.getBytes()), new String[] { "*" }); } else { if(hasTemplate(category, template)) { if(!selectedCategory.equals(category)) { UIApplication uiApp = getAncestorOfType(UIApplication.class); uiApp.addMessage(new ApplicationMessage("UICLVTemplateForm.msg.template-existing", null, ApplicationMessage.WARNING)); return; } else { Node templateNode = getCategoryByName(category).getNode(template); Node contentNode = templateNode.getNode(NodetypeConstant.JCR_CONTENT); contentNode.setProperty(NodetypeConstant.JCR_DATA, new ByteArrayInputStream(content.getBytes())); if(title == null || title.length() == 0) title = templateNode.getName(); contentNode.setProperty(NodetypeConstant.DC_TITLE, new String[] { title }); templateNode.save(); } } else { templateService.createTemplate(getCategoryByName(category), title, template, new ByteArrayInputStream(content.getBytes()), new String[] { "*" }); appTemplateManager.removeTemplate(ApplicationTemplateManagerService.CLV_TEMPLATE_STORAGE_FOLDER, selectedCategory, template, WCMCoreUtils.getUserSessionProvider()); } } } private boolean hasTemplate(String category, String template) throws Exception { if(!template.contains(".gtmpl")) template = template + ".gtmpl"; return getCategoryByName(category).hasNode(template); } private Node getCategoryByName(String category) throws Exception { ApplicationTemplateManagerService templateManager = WCMCoreUtils.getService(ApplicationTemplateManagerService.class); Node templateHome = templateManager.getApplicationTemplateHome( ApplicationTemplateManagerService.CLV_TEMPLATE_STORAGE_FOLDER, WCMCoreUtils.getUserSessionProvider()); return templateHome.getNode(category); } static public class SaveActionListener extends EventListener<UICLVTemplateForm> { public void execute(Event<UICLVTemplateForm> event) throws Exception { UICLVTemplateForm uiForm = event.getSource() ; UICLVTemplatesManager uiManager = uiForm.getAncestorOfType(UICLVTemplatesManager.class); String title = uiForm.getUIStringInput(FIELD_TITLE).getValue(); if(title != null) title = title.trim(); String template = uiForm.getUIStringInput(FIELD_TEMPLATE_NAME).getValue(); if(template != null) template = template.trim(); String category = uiForm.getUIFormSelectBox(FIELD_CONTENT_TYPE).getValue(); String content = uiForm.getUIFormTextAreaInput(FIELD_CONTENT).getValue(); if(content != null) content = content.trim(); if(uiForm.isAddNew & uiForm.hasTemplate(category, template)) { UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class); uiApp.addMessage(new ApplicationMessage("UICLVTemplateForm.msg.template-existing", null, ApplicationMessage.WARNING)); return; } uiForm.addTemplate(category, title, template, content); uiManager.refresh(); UIPopupWindow uiPopup = uiForm.getParent(); uiPopup.setRendered(false); uiPopup.setShow(false); event.getRequestContext().addUIComponentToUpdateByAjax(uiManager); } } static public class ResetActionListener extends EventListener<UICLVTemplateForm> { public void execute(Event<UICLVTemplateForm> event) throws Exception { UICLVTemplateForm uiForm = event.getSource() ; uiForm.refresh(uiForm.selectedCategory); event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent()); } } static public class CancelActionListener extends EventListener<UICLVTemplateForm> { public void execute(Event<UICLVTemplateForm> event) throws Exception { UICLVTemplateForm uiForm = event.getSource() ; UICLVTemplatesManager uiManager = uiForm.getAncestorOfType(UICLVTemplatesManager.class); UIPopupWindow uiPopup = uiForm.getParent(); uiPopup.setRendered(false); uiPopup.setShow(false); event.getRequestContext().addUIComponentToUpdateByAjax(uiManager); } } }