/* * 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.HashMap; import java.util.List; import java.util.Map; import java.util.MissingResourceException; import java.util.ResourceBundle; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.version.VersionHistory; import org.apache.commons.lang.StringUtils; import org.exoplatform.ecm.jcr.model.VersionNode; import org.exoplatform.ecm.webui.form.validator.ECMNameValidator; import org.exoplatform.ecm.webui.selector.UISelectable; import org.exoplatform.ecm.webui.utils.JCRExceptionManager; import org.exoplatform.ecm.webui.utils.Utils; import org.exoplatform.services.cms.BasePath; import org.exoplatform.services.cms.views.ManageViewService; import org.exoplatform.services.cms.views.ViewConfig; import org.exoplatform.services.cms.views.ViewConfig.Tab; import org.exoplatform.services.wcm.core.NodeLocation; 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.application.WebuiRequestContext; import org.exoplatform.webui.core.UIApplication; import org.exoplatform.webui.core.UIPopupWindow; import org.exoplatform.webui.core.model.SelectItemOption; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.exception.MessageException; import org.exoplatform.webui.form.UIForm; import org.exoplatform.webui.form.UIFormSelectBox; import org.exoplatform.webui.form.UIFormStringInput; 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@yahoo.com * Jun 28, 2006 */ public class UIViewForm extends UIForm implements UISelectable { final static public String FIELD_VERSION = "version" ; final static public String FIELD_NAME = "viewName" ; final static public String FIELD_TABS = "tabs" ; final static public String FIELD_TEMPLATE = "template" ; final static public String FIELD_ENABLEVERSION = "enableVersion" ; final static public String FIELD_PERMISSION = "permission" ; final static public String FIELD_HIDE_EXPLORER_PANEL = "hideExplorerPanel" ; private boolean isView_ = true ; private NodeLocation views_; private HashMap<String, Tab> tabMap_ = new HashMap<String, Tab>() ; private ManageViewService vservice_ = null ; private String viewName_ = null; private String permission = StringUtils.EMPTY; private List<String> listVersion = new ArrayList<String>() ; private String baseVersionName_; private VersionNode selectedVersion_; private VersionNode rootVersionNode; Map<String, String> templateMap = new HashMap<String, String>(); Map<String, String> tempMap = new HashMap<String, String>(); public String getViewName() { return viewName_; } public void setViewName(String viewName) { this.viewName_ = viewName; } public String getPermission() { return permission; } public String[] getActions() { return new String[] {}; } public void setPermission(String permission) { this.permission = permission; } public UIViewForm() throws Exception { this("UIViewForm"); } public UIViewForm(String name) throws Exception { setComponentConfig(getClass(), null) ; List<SelectItemOption<String>> options = new ArrayList<SelectItemOption<String>>() ; UIFormSelectBox versions = new UIFormSelectBox(FIELD_VERSION , FIELD_VERSION, options) ; versions.setOnChange("ChangeVersion"); versions.setRendered(false) ; addUIFormInput(versions) ; addUIFormInput(new UIFormStringInput(FIELD_NAME, FIELD_NAME, null).addValidator(MandatoryValidator.class) .addValidator(ECMNameValidator.class)) ; vservice_ = getApplicationComponent(ManageViewService.class) ; Node ecmTemplateHome = vservice_.getTemplateHome(BasePath.ECM_EXPLORER_TEMPLATES, WCMCoreUtils.getUserSessionProvider()); List<SelectItemOption<String>> temp = new ArrayList<SelectItemOption<String>>() ; if(ecmTemplateHome != null) { NodeIterator iter = ecmTemplateHome.getNodes() ; while(iter.hasNext()) { Node tempNode = iter.nextNode() ; temp.add(new SelectItemOption<String>(tempNode.getName(),tempNode.getName())) ; templateMap.put(tempNode.getName(), tempNode.getPath()); tempMap.put(tempNode.getPath(), tempNode.getName()); } } addUIFormInput(new UIFormSelectBox(FIELD_TEMPLATE,FIELD_TEMPLATE, temp)) ; UICheckBoxInput enableVersion = new UICheckBoxInput(FIELD_ENABLEVERSION, FIELD_ENABLEVERSION, null) ; enableVersion.setRendered(true) ; addUIFormInput(enableVersion) ; //prefernce: is show side bar UICheckBoxInput hideExplorerPanel = new UICheckBoxInput(FIELD_HIDE_EXPLORER_PANEL, FIELD_HIDE_EXPLORER_PANEL, false); hideExplorerPanel.setRendered(false); addUIFormInput(hideExplorerPanel); } public void processRender(WebuiRequestContext context) throws Exception { super.processRender(context) ; } public void doSelect(String selectField, Object value) { UIFormStringInput uiStringInput = getUIStringInput(selectField); uiStringInput.setValue(value.toString()); } public boolean isView() { return isView_ ; } public Node getViews() { return NodeLocation.getNodeByLocation(views_); } 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() ; 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 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 HashMap<String, Tab> getTabMap() { return tabMap_; } public void addTab(String tabName, String buttons){ Tab tab = new Tab() ; tab.setTabName(tabName) ; tab.setButtons(buttons) ; tab.setLocalizeButtons(getLocalizationButtons(buttons)); tabMap_.put(tabName, tab) ; } public String getLocalizationButtons(String buttons) { StringBuilder localizationButtons = new StringBuilder(); RequestContext context = RequestContext.getCurrentInstance(); ResourceBundle res = context.getApplicationResourceBundle(); if(buttons.contains(";")) { String[] arrButtons = buttons.split(";"); for(int i = 0; i < arrButtons.length; i++) { try { localizationButtons.append(res.getString("UITabForm.label." + arrButtons[i].trim())); } catch(MissingResourceException mre) { localizationButtons.append(arrButtons[i]); } if(i < arrButtons.length - 1) { localizationButtons.append(", "); } } } else { try { localizationButtons.append(res.getString("UITabForm.label." + buttons.trim())); } catch(MissingResourceException mre) { localizationButtons.append(buttons.trim()); } } return localizationButtons.toString(); } public String getTabList() throws Exception { StringBuilder result = new StringBuilder() ; List<Tab> tabList = new ArrayList<Tab>(tabMap_.values()); if(result != null) { for(Tab tab : tabList) { if(result.length() > 0) result.append(",") ; result.append(tab.getTabName()) ; } } return result.toString() ; } public List<Tab> getTabs() throws Exception { return new ArrayList<Tab>(tabMap_.values()); } public void refresh(boolean isAddNew) throws Exception { getUIFormSelectBox(FIELD_VERSION).setRendered(!isAddNew) ; getUIFormSelectBox(FIELD_VERSION).setDisabled(!isAddNew) ; getUIStringInput(FIELD_NAME).setDisabled(!isAddNew).setValue(null) ; getUIFormSelectBox(FIELD_TEMPLATE).setValue(null) ; getUIFormSelectBox(FIELD_TEMPLATE).setDisabled(!isAddNew) ; getUICheckBoxInput(FIELD_ENABLEVERSION).setRendered(!isAddNew) ; getUICheckBoxInput(FIELD_HIDE_EXPLORER_PANEL).setRendered(!isAddNew); setViewName(""); if(isAddNew) { tabMap_.clear() ; views_ = null ; getUICheckBoxInput(FIELD_HIDE_EXPLORER_PANEL).setValue(false); } selectedVersion_ = null ; baseVersionName_ = null ; } public void update(Node viewNode, boolean isView, VersionNode selectedVersion) throws Exception { isView_ = isView ; if(viewNode != null) { setPermission(viewNode.getProperty("exo:accessPermissions").getString()); views_ = NodeLocation.getNodeLocationByNode(viewNode); if(isVersioned(viewNode)) baseVersionName_ = viewNode.getBaseVersion().getName(); tabMap_.clear() ; for(NodeIterator iter = viewNode.getNodes(); iter.hasNext(); ) { Node tab = iter.nextNode() ; String buttons = tab.getProperty("exo:buttons").getString() ; Tab tabObj = new Tab() ; tabObj.setTabName(tab.getName()) ; tabObj.setButtons(buttons) ; tabObj.setLocalizeButtons(getLocalizationButtons(buttons)); tabMap_.put(tab.getName(), tabObj) ; } getUICheckBoxInput(FIELD_ENABLEVERSION).setRendered(true) ; if (isVersioned(viewNode)) { rootVersionNode = getRootVersion(viewNode); getUIFormSelectBox(FIELD_VERSION).setOptions(getVersionValues(viewNode)).setRendered(true) ; getUIFormSelectBox(FIELD_VERSION).setValue(baseVersionName_) ; getUICheckBoxInput(FIELD_ENABLEVERSION).setChecked(true) ; getUICheckBoxInput(FIELD_ENABLEVERSION).setDisabled(false); } else if (!isVersioned(viewNode)) { getUIFormSelectBox(FIELD_VERSION).setRendered(false) ; getUICheckBoxInput(FIELD_ENABLEVERSION).setChecked(false) ; getUICheckBoxInput(FIELD_ENABLEVERSION).setDisabled(false); } //pref is show side bar getUICheckBoxInput(FIELD_HIDE_EXPLORER_PANEL).setRendered(true); getUICheckBoxInput(FIELD_HIDE_EXPLORER_PANEL).setValue( viewNode.getProperty(NodetypeConstant.EXO_HIDE_EXPLORER_PANEL).getBoolean()); } //--------------------- Node viewsNode = NodeLocation.getNodeByLocation(views_); if (selectedVersion != null) { viewsNode.restore(selectedVersion.getName(), false) ; viewsNode.checkout() ; tabMap_.clear() ; for(NodeIterator iter = viewsNode.getNodes(); iter.hasNext(); ) { Node tab = iter.nextNode() ; String buttons = tab.getProperty("exo:buttons").getString() ; Tab tabObj = new Tab() ; tabObj.setTabName(tab.getName()) ; tabObj.setButtons(buttons) ; tabMap_.put(tab.getName(), tabObj) ; } selectedVersion_ = selectedVersion; } if(viewsNode != null) { getUIStringInput(FIELD_NAME).setDisabled(true).setValue(viewsNode.getName()) ; getUIFormSelectBox(FIELD_TEMPLATE).setValue(tempMap.get(viewsNode.getProperty("exo:template").getString())); } } public void save() throws Exception { String viewName = getUIStringInput(FIELD_NAME).getValue(); ApplicationMessage message ; if(viewName == null || viewName.trim().length() == 0){ throw new MessageException(new ApplicationMessage("UIViewForm.msg.view-name-invalid", null, ApplicationMessage.WARNING)) ; } viewName = viewName.trim(); boolean isEnableVersioning = getUICheckBoxInput(FIELD_ENABLEVERSION).isChecked() ; boolean hideExplorerPanel = getUICheckBoxInput(FIELD_HIDE_EXPLORER_PANEL).isChecked(); List<ViewConfig> viewList = vservice_.getAllViews() ; UIPopupWindow uiPopup = getAncestorOfType(UIPopupWindow.class) ; uiPopup.setShowMask(true); if(uiPopup.getId().equals(UIViewList.ST_ADD)) { for(ViewConfig view : viewList) { if(view.getName().equals(viewName) && !isEnableVersioning) { message = new ApplicationMessage("UIViewForm.msg.view-exist", null, ApplicationMessage.WARNING) ; throw new MessageException(message) ; } } } if(tabMap_.size() < 1 ){ message = new ApplicationMessage("UIViewForm.msg.mustbe-add-tab", null, ApplicationMessage.WARNING) ; throw new MessageException(message) ; } if(permission == null || permission.length() == 0){ message = new ApplicationMessage("UIViewForm.msg.mustbe-add-permission", null, ApplicationMessage.WARNING) ; throw new MessageException(message) ; } String template = templateMap.get(getUIFormSelectBox(FIELD_TEMPLATE).getValue()); List<Tab> tabList = new ArrayList<Tab>(tabMap_.values()); Node viewNode = NodeLocation.getNodeByLocation(views_); if(views_ == null || !isEnableVersioning) { vservice_.addView(viewName, permission, hideExplorerPanel, template, tabList) ; if(viewNode != null) { for(NodeIterator iter = viewNode.getNodes(); iter.hasNext(); ) { Node tab = iter.nextNode() ; if(!tabMap_.containsKey(tab.getName())) tab.remove() ; } viewNode.save() ; } } else { if (!isVersioned(viewNode)) { viewNode.addMixin(Utils.MIX_VERSIONABLE); viewNode.save(); } else { viewNode.checkout() ; } for(NodeIterator iter = viewNode.getNodes(); iter.hasNext(); ) { Node tab = iter.nextNode() ; if(!tabMap_.containsKey(tab.getName())) tab.remove() ; } vservice_.addView(viewName, permission, hideExplorerPanel, template, tabList) ; try { viewNode.save() ; viewNode.checkin(); } catch (Exception e) { UIApplication uiApp = getAncestorOfType(UIApplication.class) ; JCRExceptionManager.process(uiApp, e); return ; } } UIViewList uiViewList = getAncestorOfType(UIViewContainer.class).getChild(UIViewList.class); uiViewList.refresh(uiViewList.getUIPageIterator().getCurrentPage()); refresh(true) ; } public void editTab(String tabName) throws Exception { UIViewFormTabPane viewTabPane = getParent() ; UITabForm tabForm = viewTabPane.getChild(UITabForm.class) ; tabForm.update(tabMap_.get(tabName), isView_) ; viewTabPane.setSelectedTab(tabForm.getId()) ; } public void deleteTab(String tabName) throws Exception { UIViewFormTabPane viewTabPane = getParent() ; //String permLastest = viewTabPane.getUIStringInput(UIViewForm.FIELD_PERMISSION).getValue(); tabMap_.remove(tabName) ; update(null, false, null) ; UIViewContainer uiViewContainer = getAncestorOfType(UIViewContainer.class) ; UIViewList uiViewList = uiViewContainer.getChild(UIViewList.class) ; uiViewList.refresh(uiViewList.getUIPageIterator().getCurrentPage()); UIViewForm uiViewForm = viewTabPane.getChild(UIViewForm.class) ; viewTabPane.setSelectedTab(uiViewForm.getId()) ; } public void changeVersion() throws Exception { String path = NodeLocation.getNodeByLocation(views_) .getVersionHistory() .getVersion(getUIFormSelectBox(FIELD_VERSION).getValue()) .getPath(); VersionNode selectedVesion = rootVersionNode.findVersionNode(path); update(null, false, selectedVesion) ; } public void revertVersion() throws Exception { if (selectedVersion_ != null && !selectedVersion_.getName().equals(baseVersionName_)) { NodeLocation.getNodeByLocation(views_).restore(baseVersionName_, true); } } static public class ChangeVersionActionListener extends EventListener<UIViewForm> { public void execute(Event<UIViewForm> event) throws Exception { UIViewFormTabPane uiFormTab = event.getSource().getParent(); UIViewForm uiForm = uiFormTab.getChild(UIViewForm.class); uiForm.changeVersion(); UIViewContainer uiViewContainer = uiFormTab.getAncestorOfType(UIViewContainer.class) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiViewContainer) ; } } }