/* * 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.wcm.webui.fastcontentcreator.config; import org.exoplatform.ecm.webui.selector.UISelectable; import org.exoplatform.ecm.webui.tree.selectone.UIOneNodePathSelector; import org.exoplatform.services.cms.templates.TemplateService; import org.exoplatform.services.jcr.config.RepositoryConfigurationException; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.wcm.core.NodeLocation; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.exoplatform.wcm.webui.Utils; import org.exoplatform.wcm.webui.container.UIFormFieldSet; import org.exoplatform.wcm.webui.fastcontentcreator.UIFCCUtils; import org.exoplatform.wcm.webui.fastcontentcreator.config.action.UIFCCActionList; import org.exoplatform.wcm.webui.fastcontentcreator.UIFCCConstant; 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.UIGrid; 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.UIFormInputSet; 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.ext.UIFormInputSetWithAction; import org.exoplatform.webui.form.input.UICheckBoxInput; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.nodetype.NodeDefinition; import javax.jcr.nodetype.NodeType; import javax.jcr.nodetype.NodeTypeManager; import javax.portlet.PortletPreferences; import java.util.ArrayList; import java.util.List; /** * Created by The eXo Platform SAS * Author : eXoPlatform * chuong.phan@exoplatform.com, phan.le.thanh.chuong@gmail.com * Jun 25, 2009 */ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "system:/groovy/FastContentCreatorPortlet/UIFormWithFieldSet.gtmpl", events = { @EventConfig(listeners = UIFCCConfig.SaveActionListener.class), @EventConfig(listeners = UIFCCConfig.SelectPathActionListener.class, phase=Phase.DECODE), @EventConfig(listeners = UIFCCConfig.ChangeWorkspaceActionListener.class, phase=Phase.DECODE) } ) public class UIFCCConfig extends UIFormTabPane implements UISelectable { /** The log. */ private static final Log LOG = ExoLogger.getLogger(UIFCCConfig.class.getName()); /** Basic Mode */ private static final String BASIC_MODE = "basic"; /** The saved location node. */ private NodeLocation savedLocationNode; /** * Instantiates a new uIFCC config. * * @throws Exception the exception */ public UIFCCConfig() throws Exception { super("UIFCCConfig"); PortletPreferences portletPreferences = UIFCCUtils.getPortletPreferences(); String preferenceMode = portletPreferences.getValue(UIFCCConstant.PREFERENCE_MODE, ""); String preferenceWorkspace = portletPreferences.getValue(UIFCCConstant.PREFERENCE_WORKSPACE, ""); String preferencePath = portletPreferences.getValue(UIFCCConstant.PREFERENCE_PATH, ""); List<SelectItemOption<String>> options = new ArrayList<SelectItemOption<String>>() ; UIFormInputSetWithAction saveLocationField = new UIFormInputSetWithAction(UIFCCConstant.SAVE_LOCATION_FIELD); if (!BASIC_MODE.equals(preferenceMode)) { UIFormSelectBox workspaceSelectBox = new UIFormSelectBox(UIFCCConstant.WORKSPACE_FORM_SELECTBOX, UIFCCConstant.WORKSPACE_FORM_SELECTBOX, options); workspaceSelectBox.setOnChange("ChangeWorkspace") ; saveLocationField.addChild(workspaceSelectBox) ; } UIFormInputSetWithAction folderSelectorInput = new UIFormInputSetWithAction(UIFCCConstant.LOCATION_FORM_INPUT_ACTION); folderSelectorInput.addUIFormInput(new UIFormStringInput(UIFCCConstant.LOCATION_FORM_STRING_INPUT, UIFCCConstant.LOCATION_FORM_STRING_INPUT, null).setReadOnly(true)); folderSelectorInput.setActionInfo(UIFCCConstant.LOCATION_FORM_STRING_INPUT, new String[] {"SelectPath"}) ; saveLocationField.addUIFormInput((UIFormInputSet)folderSelectorInput); addChild(saveLocationField); setSelectedTab(UIFCCConstant.SAVE_LOCATION_FIELD); UIFormInputSetWithAction templateField = new UIFormInputSetWithAction(UIFCCConstant.TEMPLATE_FIELD); templateField.addChild(new UIFormSelectBox(UIFCCConstant.TEMPLATE_FORM_SELECTBOX, UIFCCConstant.TEMPLATE_FORM_SELECTBOX, options)); templateField.addChild(new UIFormStringInput(UIFCCConstant.SAVE_FORM_STRING_INPUT, UIFCCConstant.SAVE_FORM_STRING_INPUT, null)); templateField.addChild(new UIFormTextAreaInput(UIFCCConstant.MESSAGE_FORM_TEXTAREA_INPUT, UIFCCConstant.MESSAGE_FORM_TEXTAREA_INPUT, null)); templateField.addChild(new UICheckBoxInput(UIFCCConstant.REDIRECT_FORM_CHECKBOX_INPUT, UIFCCConstant.REDIRECT_FORM_CHECKBOX_INPUT, false)); templateField.addChild(new UIFormStringInput(UIFCCConstant.REDIRECT_PATH_FORM_STRING_INPUT, UIFCCConstant.REDIRECT_PATH_FORM_STRING_INPUT, null)); addChild(templateField); if (!BASIC_MODE.equals(preferenceMode)) { UIFormInputSetWithAction actionField = new UIFormInputSetWithAction(UIFCCConstant.ACTION_FIELD); UIFCCActionList fastContentCreatorActionList = actionField.addChild(UIFCCActionList.class, null, "UIFCCActionList"); fastContentCreatorActionList.init(preferenceMode); Session session = WCMCoreUtils.getUserSessionProvider().getSession(preferenceWorkspace, WCMCoreUtils.getRepository()); fastContentCreatorActionList.updateGrid((Node) session.getItem(preferencePath), fastContentCreatorActionList.getChild(UIGrid.class) .getUIPageIterator() .getCurrentPage()); addChild(actionField); } setActions(new String[] {"Save"}) ; } /** * Inits the edit mode. * * @throws Exception the exception */ public void initEditMode() throws Exception { PortletPreferences preferences = UIFCCUtils.getPortletPreferences(); String preferenceMode = preferences.getValue(UIFCCConstant.PREFERENCE_MODE, ""); String preferenceWorkspace = preferences.getValue(UIFCCConstant.PREFERENCE_WORKSPACE, "") ; String preferencePath = preferences.getValue(UIFCCConstant.PREFERENCE_PATH, "") ; boolean isDefaultWorkspace = false ; if (!BASIC_MODE.equals(preferenceMode)) { ManageableRepository repository = WCMCoreUtils.getRepository(); String[] workspaceNames = repository.getWorkspaceNames(); String systemWsName = repository.getConfiguration().getSystemWorkspaceName(); List<SelectItemOption<String>> workspace = new ArrayList<SelectItemOption<String>>(); for (String workspaceName : workspaceNames) { if (!workspaceName.equals(systemWsName)) { if (workspaceName.equals(preferenceWorkspace)) isDefaultWorkspace = true; workspace.add(new SelectItemOption<String>(workspaceName)); } } UIFormSelectBox uiWorkspaceList = getUIFormSelectBox(UIFCCConstant.WORKSPACE_FORM_SELECTBOX); uiWorkspaceList.setOptions(workspace); if (isDefaultWorkspace) { uiWorkspaceList.setValue(preferenceWorkspace); } else if (workspace.size() > 0) { uiWorkspaceList.setValue(workspace.get(0).getValue()); } } getUIStringInput(UIFCCConstant.LOCATION_FORM_STRING_INPUT).setValue(preferencePath) ; setTemplateOptions(preferencePath, preferenceWorkspace) ; getUIStringInput(UIFCCConstant.SAVE_FORM_STRING_INPUT).setValue(preferences. getValue(UIFCCConstant.PREFERENCE_SAVE_BUTTON, "")); getUIFormTextAreaInput(UIFCCConstant.MESSAGE_FORM_TEXTAREA_INPUT).setValue(preferences. getValue(UIFCCConstant.PREFERENCE_SAVE_MESSAGE, "")); getUICheckBoxInput(UIFCCConstant.REDIRECT_FORM_CHECKBOX_INPUT). setChecked(Boolean.parseBoolean(preferences.getValue(UIFCCConstant.PREFERENCE_IS_REDIRECT, ""))); getUIStringInput(UIFCCConstant.REDIRECT_PATH_FORM_STRING_INPUT).setValue(preferences. getValue(UIFCCConstant.PREFERENCE_REDIRECT_PATH, "")); } /** * Sets the template options. * * @param nodePath the node path * @param workspaceName the workspace name * * @throws Exception the exception */ private void setTemplateOptions(String nodePath, String workspaceName) throws Exception { try { Session session = WCMCoreUtils.getUserSessionProvider().getSession(workspaceName, WCMCoreUtils.getRepository()); Node currentNode = null ; UIFormSelectBox uiSelectTemplate = getUIFormSelectBox(UIFCCConstant.TEMPLATE_FORM_SELECTBOX); List<SelectItemOption<String>> options = new ArrayList<SelectItemOption<String>>(); boolean hasDefaultDoc = false ; String defaultValue = UIFCCUtils.getPreferenceType(); try { currentNode = (Node)session.getItem(nodePath) ; setSavedLocationNode(currentNode); } catch(PathNotFoundException ex) { UIApplication uiApp = getAncestorOfType(UIApplication.class) ; uiApp.addMessage(new ApplicationMessage("UIFCCConfig.msg.item-not-found", null, ApplicationMessage.WARNING)); return ; } NodeTypeManager ntManager = session.getWorkspace().getNodeTypeManager() ; NodeType currentNodeType = currentNode.getPrimaryNodeType() ; NodeDefinition[] childDefs = currentNodeType.getChildNodeDefinitions() ; TemplateService templateService = getApplicationComponent(TemplateService.class) ; List<String> templates = templateService.getDocumentTemplates() ; List<String> labels = new ArrayList<String>() ; try { for(int i = 0; i < templates.size(); i ++){ String nodeTypeName = templates.get(i).toString() ; NodeType nodeType = ntManager.getNodeType(nodeTypeName) ; NodeType[] superTypes = nodeType.getSupertypes() ; boolean isCanCreateDocument = false ; for(NodeDefinition childDef : childDefs){ NodeType[] requiredChilds = childDef.getRequiredPrimaryTypes() ; for(NodeType requiredChild : requiredChilds) { if(nodeTypeName.equals(requiredChild.getName())){ isCanCreateDocument = true ; break ; } } if(nodeTypeName.equals(childDef.getName()) || isCanCreateDocument) { if(!hasDefaultDoc && nodeTypeName.equals(defaultValue)) hasDefaultDoc = true ; String label = templateService.getTemplateLabel(nodeTypeName) ; if(!labels.contains(label)) { options.add(new SelectItemOption<String>(label, nodeTypeName)); } labels.add(label) ; isCanCreateDocument = true ; } } if(!isCanCreateDocument){ for(NodeType superType:superTypes) { for(NodeDefinition childDef : childDefs){ for(NodeType requiredType : childDef.getRequiredPrimaryTypes()) { if (superType.getName().equals(requiredType.getName())) { if(!hasDefaultDoc && nodeTypeName.equals(defaultValue)) { hasDefaultDoc = true ; } String label = templateService.getTemplateLabel(nodeTypeName) ; if(!labels.contains(label)) { options.add(new SelectItemOption<String>(label, nodeTypeName)); } labels.add(label) ; isCanCreateDocument = true ; break; } } if(isCanCreateDocument) break ; } if(isCanCreateDocument) break ; } } } uiSelectTemplate.setOptions(options) ; if(hasDefaultDoc) { uiSelectTemplate.setValue(defaultValue); } else if(options.size() > 0) { defaultValue = options.get(0).getValue() ; uiSelectTemplate.setValue(defaultValue); } } catch(Exception e) { Utils.createPopupMessage(this, "UIFCCConfig.msg.get-template", null, ApplicationMessage.ERROR); } } catch(Exception ex) { Utils.createPopupMessage(this, "UIFCCConfig.msg.set-template-option", null, ApplicationMessage.ERROR); } } /* (non-Javadoc) * @see org.exoplatform.ecm.webui.selector.UISelectable#doSelect(java.lang.String, java.lang.Object) */ public void doSelect(String selectField, Object value) { getUIStringInput(selectField).setValue(value.toString()) ; PortletPreferences preferences = UIFCCUtils.getPortletPreferences(); String preferenceMode = preferences.getValue(UIFCCConstant.PREFERENCE_MODE, ""); String preferenceWorkspace = preferences.getValue(UIFCCConstant.PREFERENCE_WORKSPACE, "") ; if (!BASIC_MODE.equals(preferenceMode)) { preferenceWorkspace = getUIFormSelectBox(UIFCCConstant.WORKSPACE_FORM_SELECTBOX).getValue() ; } String savedLocationPath = value.toString(); try { setTemplateOptions(savedLocationPath, preferenceWorkspace) ; } catch(Exception ex) { Utils.createPopupMessage(this, "UIFCCConfig.msg.do-select", null, ApplicationMessage.ERROR); } try { Session session = WCMCoreUtils.getUserSessionProvider().getSession(preferenceWorkspace, WCMCoreUtils.getRepository()); UIFCCActionList uiFCCActionList = ((UIFormFieldSet) getChildById("UIFCCActionField")).getChild(UIFCCActionList.class); uiFCCActionList.updateGrid((Node) session.getItem(savedLocationPath), uiFCCActionList.getChild(UIGrid.class) .getUIPageIterator() .getCurrentPage()); } catch (RepositoryConfigurationException e) { if (LOG.isWarnEnabled()) { LOG.warn(e.getMessage()); } } catch (RepositoryException e) { if (LOG.isWarnEnabled()) { LOG.warn(e.getMessage()); } } catch (Exception e) { if (LOG.isWarnEnabled()) { LOG.warn(e.getMessage()); } } Utils.closePopupWindow(this, UIFCCConstant.SELECTOR_POPUP_WINDOW); } /** * Gets the saved location node. * * @return the saved location node */ public Node getSavedLocationNode() { return NodeLocation.getNodeByLocation(savedLocationNode); } /** * Sets the saved location node. * * @param savedLocationNode the new saved location node */ public void setSavedLocationNode(Node savedLocationNode) { this.savedLocationNode = NodeLocation.getNodeLocationByNode(savedLocationNode); } /** * Get PREFERENCE_MODE. * * @return */ public String getPreferenceMode() { PortletPreferences portletPreferences = UIFCCUtils.getPortletPreferences(); return portletPreferences.getValue(UIFCCConstant.PREFERENCE_MODE, ""); } /** * The listener interface for receiving selectPathAction events. * The class that is interested in processing a selectPathAction * event implements this interface, and the object created * with that class is registered with a component using the * component's <code>addSelectPathActionListener</code> method. When * the selectPathAction event occurs, that object's appropriate * method is invoked. */ static public class SelectPathActionListener extends EventListener<UIFCCConfig> { /* (non-Javadoc) * @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event) */ public void execute(Event<UIFCCConfig> event) throws Exception { UIFCCConfig fastContentCreatorConfig = event.getSource() ; PortletPreferences preferences = UIFCCUtils.getPortletPreferences(); String preferenceMode = preferences.getValue(UIFCCConstant.PREFERENCE_MODE, ""); String preferenceRepository = WCMCoreUtils.getRepository().getConfiguration().getName(); String preferenceWorkspace = preferences.getValue(UIFCCConstant.PREFERENCE_WORKSPACE, "") ; if (!BASIC_MODE.equals(preferenceMode)) { preferenceWorkspace = fastContentCreatorConfig.getUIFormSelectBox(UIFCCConstant.WORKSPACE_FORM_SELECTBOX) .getValue(); } UIOneNodePathSelector uiOneNodePathSelector = fastContentCreatorConfig.createUIComponent(UIOneNodePathSelector.class, null, null); uiOneNodePathSelector.setIsDisable(preferenceWorkspace, true) ; uiOneNodePathSelector.setShowRootPathSelect(true) ; uiOneNodePathSelector.setRootNodeLocation(preferenceRepository, preferenceWorkspace, "/"); uiOneNodePathSelector.init(WCMCoreUtils.getUserSessionProvider()) ; uiOneNodePathSelector.setSourceComponent(fastContentCreatorConfig, new String[] { UIFCCConstant.LOCATION_FORM_STRING_INPUT }); Utils.createPopupWindow(fastContentCreatorConfig, uiOneNodePathSelector, UIFCCConstant.SELECTOR_POPUP_WINDOW, 610); fastContentCreatorConfig.setSelectedTab(UIFCCConstant.SAVE_LOCATION_FIELD); } } /** * The listener interface for receiving changeWorkspaceAction events. * The class that is interested in processing a changeWorkspaceAction * event implements this interface, and the object created * with that class is registered with a component using the * component's <code>addChangeWorkspaceActionListener</code> method. When * the changeWorkspaceAction event occurs, that object's appropriate * method is invoked. */ static public class ChangeWorkspaceActionListener extends EventListener<UIFCCConfig> { /* (non-Javadoc) * @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event) */ public void execute(Event<UIFCCConfig> event) throws Exception { UIFCCConfig uiFCCConfig = event.getSource(); uiFCCConfig.getUIStringInput(UIFCCConstant.LOCATION_FORM_STRING_INPUT).setValue("/"); String wsName = uiFCCConfig.getUIFormSelectBox(UIFCCConstant.WORKSPACE_FORM_SELECTBOX).getValue(); uiFCCConfig.setTemplateOptions(uiFCCConfig.getUIStringInput(UIFCCConstant.LOCATION_FORM_STRING_INPUT) .getValue(), wsName); event.getRequestContext().addUIComponentToUpdateByAjax(uiFCCConfig); } } /** * The listener interface for receiving saveAction events. * The class that is interested in processing a saveAction * event implements this interface, and the object created * with that class is registered with a component using the * component's <code>addSaveActionListener</code> method. When * the saveAction event occurs, that object's appropriate * method is invoked. */ static public class SaveActionListener extends EventListener<UIFCCConfig> { /* (non-Javadoc) * @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event) */ public void execute(Event<UIFCCConfig> event) throws Exception { UIFCCConfig fastContentCreatorConfig = event.getSource() ; UIApplication uiApp = fastContentCreatorConfig.getAncestorOfType(UIApplication.class) ; PortletPreferences portletPreferences = UIFCCUtils.getPortletPreferences(); String preferenceMode = portletPreferences.getValue(UIFCCConstant.PREFERENCE_MODE, ""); boolean preferenceIsActionNeeded = Boolean.parseBoolean(portletPreferences. getValue(UIFCCConstant.PREFERENCE_IS_ACTION_NEEDED, "false")); String type = fastContentCreatorConfig.getUIFormSelectBox(UIFCCConstant.TEMPLATE_FORM_SELECTBOX) .getValue(); String path = fastContentCreatorConfig.getUIStringInput(UIFCCConstant.LOCATION_FORM_STRING_INPUT) .getValue(); String saveButton = fastContentCreatorConfig.getUIStringInput(UIFCCConstant.SAVE_FORM_STRING_INPUT) .getValue(); String saveMessage = fastContentCreatorConfig.getUIFormTextAreaInput(UIFCCConstant.MESSAGE_FORM_TEXTAREA_INPUT) .getValue(); String isRedirect = String.valueOf(fastContentCreatorConfig. getUICheckBoxInput(UIFCCConstant.REDIRECT_FORM_CHECKBOX_INPUT) .isChecked()); String redirectPath = fastContentCreatorConfig.getUIStringInput(UIFCCConstant.REDIRECT_PATH_FORM_STRING_INPUT) .getValue(); if (("false".equals(isRedirect) || redirectPath == null) && saveMessage == null) { Utils.createPopupMessage(fastContentCreatorConfig, "UIFCCConfig.msg.message-empty", null, ApplicationMessage.WARNING); } String workspaceName = null; if (BASIC_MODE.equals(preferenceMode) && preferenceIsActionNeeded) workspaceName = portletPreferences.getValue(UIFCCConstant.PREFERENCE_WORKSPACE, ""); else workspaceName = fastContentCreatorConfig.getUIFormSelectBox(UIFCCConstant.WORKSPACE_FORM_SELECTBOX) .getValue(); if (workspaceName == null || workspaceName.trim().length() == 0) { uiApp.addMessage(new ApplicationMessage("UIFCCConfig.msg.ws-empty", null, ApplicationMessage.WARNING)); return; } if (type == null || type.trim().length() == 0) { uiApp.addMessage(new ApplicationMessage("UIFCCConfig.msg.fileType-empty", null, ApplicationMessage.WARNING)); return; } portletPreferences.setValue(UIFCCConstant.PREFERENCE_WORKSPACE, workspaceName); portletPreferences.setValue(UIFCCConstant.PREFERENCE_PATH, path); portletPreferences.setValue(UIFCCConstant.PREFERENCE_TYPE, type); portletPreferences.setValue(UIFCCConstant.PREFERENCE_SAVE_BUTTON, saveButton); portletPreferences.setValue(UIFCCConstant.PREFERENCE_SAVE_MESSAGE, saveMessage); portletPreferences.setValue(UIFCCConstant.PREFERENCE_IS_REDIRECT, isRedirect); portletPreferences.setValue(UIFCCConstant.PREFERENCE_REDIRECT_PATH, redirectPath); portletPreferences.store(); uiApp.addMessage(new ApplicationMessage("UIFCCConfig.msg.save-successfully", null)); } } }