/** * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.portal.webui.portal; import java.util.List; import java.util.ResourceBundle; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.container.component.RequestLifeCycle; import org.exoplatform.portal.Constants; import org.exoplatform.portal.application.PortalRequestContext; import org.exoplatform.portal.config.DataStorage; import org.exoplatform.portal.config.StaleModelException; import org.exoplatform.portal.config.UserACL; import org.exoplatform.portal.config.UserPortalConfig; import org.exoplatform.portal.config.UserPortalConfigService; import org.exoplatform.portal.config.model.Page; import org.exoplatform.portal.config.model.PortalConfig; import org.exoplatform.portal.config.model.PortalProperties; import org.exoplatform.portal.mop.SiteKey; import org.exoplatform.portal.mop.SiteType; import org.exoplatform.portal.mop.management.operations.page.PageUtils; import org.exoplatform.portal.mop.page.PageContext; import org.exoplatform.portal.mop.page.PageKey; import org.exoplatform.portal.mop.page.PageService; import org.exoplatform.portal.mop.page.PageState; import org.exoplatform.portal.mop.user.UserNode; import org.exoplatform.portal.resource.SkinService; import org.exoplatform.portal.webui.page.UIPage; import org.exoplatform.portal.webui.page.UIPageCreationWizard; import org.exoplatform.portal.webui.page.UIPageForm; import org.exoplatform.portal.webui.page.UIPagePreview; import org.exoplatform.portal.webui.page.UISiteBody; import org.exoplatform.portal.webui.util.PortalDataMapper; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.portal.webui.workspace.UIEditInlineWorkspace; import org.exoplatform.portal.webui.workspace.UIMaskWorkspace; import org.exoplatform.portal.webui.workspace.UIPortalApplication; import org.exoplatform.portal.webui.workspace.UIPortalApplication.EditLevel; import org.exoplatform.portal.webui.workspace.UIPortalToolPanel; import org.exoplatform.portal.webui.workspace.UIWorkingWorkspace; import org.exoplatform.services.organization.OrganizationService; import org.exoplatform.services.organization.UserProfile; import org.exoplatform.services.resources.LocaleConfig; import org.exoplatform.services.resources.LocaleConfigService; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.web.application.JavascriptManager; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.ComponentConfigs; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIApplication; import org.exoplatform.webui.core.UIComponent; import org.exoplatform.webui.core.UIContainer; import org.exoplatform.webui.core.UITabPane; import org.exoplatform.webui.core.UIWizard; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.Event.Phase; import org.exoplatform.webui.event.EventListener; /** Created by The eXo Platform SAS Author : Pham Thanh Tung thanhtungty@gmail.com Jun 10, 2009 */ @ComponentConfigs({ @ComponentConfig(template = "app:/groovy/portal/webui/portal/UIPortalComposer.gtmpl", events = { @EventConfig(name = "ViewProperties", listeners = UIPortalComposer.ViewSitePropertiesActionListener.class), @EventConfig(listeners = UIPortalComposer.CloseComposerActionListener.class), @EventConfig(name = "Abort", listeners = UIPortalComposer.AbortSiteEditionActionListener.class), @EventConfig(name = "Finish", listeners = UIPortalComposer.FinishSiteEditionActionListener.class), @EventConfig(listeners = UIPortalComposer.SwitchModeActionListener.class), @EventConfig(listeners = UIPortalComposer.ChangeEdittedStateActionListener.class), @EventConfig(listeners = UIPortalComposer.ToggleActionListener.class) }), @ComponentConfig(id = UIPortalComposer.UIPAGE_EDITOR, template = "app:/groovy/portal/webui/portal/UIPortalComposer.gtmpl", events = { @EventConfig(name = "ViewProperties", listeners = UIPortalComposer.ViewPagePropertiesActionListener.class), @EventConfig(listeners = UIPortalComposer.CloseComposerActionListener.class), @EventConfig(name = "Abort", listeners = UIPortalComposer.AbortPageEditionActionListener.class), @EventConfig(name = "Finish", listeners = UIPortalComposer.FinishPageEditionActionListener.class), @EventConfig(name = "Back", listeners = UIPortalComposer.BackActionListener.class), @EventConfig(listeners = UIPortalComposer.SwitchModeActionListener.class), @EventConfig(listeners = UIPortalComposer.ChangeEdittedStateActionListener.class), @EventConfig(listeners = UIPortalComposer.ToggleActionListener.class) }), @ComponentConfig(id = "UIPortalComposerTab", type = UITabPane.class, template = "app:/groovy/portal/webui/portal/UIPortalComposerContent.gtmpl", events = { @EventConfig(listeners = UIPortalComposer.SelectTabActionListener.class) }) }) public class UIPortalComposer extends UIContainer { public static final String UIPORTAL_COMPOSER = "UIPortalComposer"; public static final String UIPAGE_EDITOR = "UIPageEditor"; public static final String LOGOUT_ONLY = "eXo.logoutOnly"; private boolean isEditted = false; private boolean isCollapsed = false; private boolean isShowControl = true; public UIPortalComposer() throws Exception { UITabPane uiTabPane = addChild(UITabPane.class, "UIPortalComposerTab", null); uiTabPane.addChild(UIApplicationList.class, null, null).setRendered(true); uiTabPane.addChild(UIContainerList.class, null, null); uiTabPane.setSelectedTab(1); } public int getPortalMode() { return getAncestorOfType(UIPortalApplication.class).getModeState(); } /** * Returns <code>true</code> there was at least one change has been done in this edition time. * * <p> * This value is used in the template of this component to notice the user if there was something has been changed * * @return */ public boolean isEditted() { return isEditted; } public void setEditted(boolean b) { isEditted = b; } /** * Return a value of <code>boolean</code> to tell current state of the composer * * @return <code>true</code> if the composer is collapsed currently */ public boolean isCollapse() { return isCollapsed; } public void setCollapse(boolean isCollapse) { this.isCollapsed = isCollapse; } public boolean isShowControl() { return isShowControl; } public void setShowControl(boolean state) { isShowControl = state; } /** * Return true if the edition is in the page creation wizard * * @return */ private boolean isUsedInWizard() { UIWorkingWorkspace uiWorkingWS = getAncestorOfType(UIWorkingWorkspace.class); UIPortalToolPanel uiToolPanel = uiWorkingWS.findFirstComponentOfType(UIPortalToolPanel.class); UIComponent uicomponent = uiToolPanel.getUIComponent(); if (uicomponent != null && uicomponent instanceof UIWizard) { return true; } return false; } /** * Perform saving changes of the edition of SiteConfig into database * * @throws Exception if there is anything wrong in saving process */ public void saveSite() throws Exception { PortalRequestContext prContext = Util.getPortalRequestContext(); UIPortalApplication uiPortalApp = (UIPortalApplication) prContext.getUIApplication(); UIWorkingWorkspace uiWorkingWS = uiPortalApp.findFirstComponentOfType(UIWorkingWorkspace.class); UIEditInlineWorkspace uiEditWS = uiWorkingWS.getChild(UIEditInlineWorkspace.class); UIPortal editPortal = (UIPortal) uiEditWS.getUIComponent(); UIPortal uiPortal = Util.getUIPortal(); String remoteUser = prContext.getRemoteUser(); PortalConfig portalConfig = (PortalConfig) PortalDataMapper.buildModelObject(editPortal); DataStorage dataStorage = getApplicationComponent(DataStorage.class); UserACL acl = getApplicationComponent(UserACL.class); setEditted(false); // Reset tab pane state UITabPane tabPane = getChild(UITabPane.class); tabPane.setSelectedTab(1); uiPortalApp.setSessionOpen(PortalProperties.SESSION_ALWAYS.equals(uiPortal.getSessionAlive())); uiPortalApp.setModeState(UIPortalApplication.NORMAL_MODE); uiWorkingWS.setRenderedChild(UIPortalApplication.UI_VIEWING_WS_ID); prContext.ignoreAJAXUpdateOnPortlets(true); if (isPortalExist(editPortal)) { SkinService skinService = getApplicationComponent(SkinService.class); skinService.invalidatePortalSkinCache(editPortal.getName(), editPortal.getSkin()); try { dataStorage.save(portalConfig); } catch (StaleModelException ex) { // Temporary solution for concurrency-related issue. The StaleModelException should be // caught in the ApplicationLifecycle rebuildUIPortal(uiPortalApp, editPortal, dataStorage); } prContext.getUserPortalConfig().setPortalConfig(portalConfig); PortalConfig pConfig = dataStorage.getPortalConfig(uiPortal.getSiteKey().getTypeName(), uiPortal.getSiteKey() .getName()); if (pConfig != null) { editPortal.setModifiable(acl.hasEditPermission(pConfig)); prContext.getUserPortalConfig().setPortalConfig(pConfig); } else { editPortal.setModifiable(false); } LocaleConfigService localeConfigService = uiPortalApp.getApplicationComponent(LocaleConfigService.class); LocaleConfig localeConfig = localeConfigService.getLocaleConfig(portalConfig.getLocale()); if (localeConfig == null) { localeConfig = localeConfigService.getDefaultLocaleConfig(); } // TODO dang.tung - change layout when portal get language from UIPortal // (user and browser not support) // ---------------------------------------------------------------------------------------------------- String portalAppLanguage = prContext.getLocale().getLanguage(); OrganizationService orgService = getApplicationComponent(OrganizationService.class); UserProfile userProfile = orgService.getUserProfileHandler().findUserProfileByName(remoteUser); String userLanguage = userProfile != null ? userProfile.getUserInfoMap().get(Constants.USER_LANGUAGE) : null; String browserLanguage = prContext.getRequest().getLocale().getLanguage(); // in case: edit current portal, set skin and language for uiPortalApp if (uiPortal == null) { if (!portalAppLanguage.equals(userLanguage) && !portalAppLanguage.equals(browserLanguage)) { prContext.setLocale(localeConfig.getLocale()); } uiPortalApp.setSkin(editPortal.getSkin()); } prContext.refreshResourceBundle(); UISiteBody siteBody = uiWorkingWS.findFirstComponentOfType(UISiteBody.class); uiPortal = (UIPortal) siteBody.getUIComponent(); if (uiPortal == null) { siteBody.setUIComponent(editPortal); } uiEditWS.setRendered(false); uiEditWS.setUIComponent(null); uiPortal = (UIPortal) siteBody.getUIComponent(); // Update the cache of UIPortal from UIPortalApplication uiPortalApp.refreshCachedUI(); UserNode currentNode = uiPortal.getSelectedUserNode(); SiteKey siteKey = currentNode.getNavigation().getKey(); PageNodeEvent<UIPortalApplication> pnevent = new PageNodeEvent<UIPortalApplication>(uiPortalApp, PageNodeEvent.CHANGE_NODE, siteKey, currentNode.getURI()); uiPortalApp.broadcast(pnevent, Event.Phase.PROCESS); if (!acl.hasPermission(portalConfig) && editPortal.getName().equals(prContext.getPortalOwner())) { logout(prContext); } else { prContext.addUIComponentToUpdateByAjax(uiWorkingWS); Util.updatePortalMode(); } } else { if (editPortal.getName().equals(prContext.getPortalOwner())) { logout(prContext); } else { UIApplication uiApp = prContext.getUIApplication(); uiApp.addMessage(new ApplicationMessage("UIPortalForm.msg.notExistAnymore", null)); prContext.addUIComponentToUpdateByAjax(uiWorkingWS); } } } private void logout(PortalRequestContext prContext) throws Exception { UIPortal uiPortal = Util.getUIPortal(); Event<UIComponent> event = uiPortal.createEvent("Logout", Phase.PROCESS, prContext); prContext.setAttribute(LOGOUT_ONLY, true); event.broadcast(); JavascriptManager jsManager = prContext.getJavascriptManager(); jsManager.addJavascript("window.location.reload();"); } private void rebuildUIPortal(UIPortalApplication uiPortalApp, UIPortal uiPortal, DataStorage storage) throws Exception { PortalConfig portalConfig = storage.getPortalConfig(uiPortal.getSiteType().getName(), uiPortal.getName()); UserPortalConfig userPortalConfig = Util.getPortalRequestContext().getUserPortalConfig(); userPortalConfig.setPortalConfig(portalConfig); uiPortal.getChildren().clear(); PortalDataMapper.toUIPortal(uiPortal, userPortalConfig.getPortalConfig()); uiPortalApp.putCachedUIPortal(uiPortal); } /** * Check the <code>editPortal</code> whether it is existing in database or not * * @param editPortal * @return * @throws Exception */ private boolean isPortalExist(UIPortal editPortal) throws Exception { String remoteUser = Util.getPortalRequestContext().getRemoteUser(); String portalOwner = null; if (editPortal.getSiteType().equals(SiteType.PORTAL)) { portalOwner = editPortal.getName(); } else { portalOwner = Util.getPortalRequestContext().getPortalOwner(); } UserPortalConfigService configService = getApplicationComponent(UserPortalConfigService.class); return configService.getUserPortalConfig(portalOwner, remoteUser) != null; } /** * Updates the availability children of the UIEditInlineWorkspace except to the UIPortalComposer * * @throws Exception */ public void updateWorkspaceComponent() throws Exception { UIPortalApplication uiApp = Util.getUIPortalApplication(); WebuiRequestContext rcontext = WebuiRequestContext.getCurrentInstance(); UIEditInlineWorkspace uiEditWS = uiApp.findFirstComponentOfType(UIEditInlineWorkspace.class); List<UIComponent> children = uiEditWS.getChildren(); for (UIComponent child : children) { if (!child.isRendered() || child.getClass().equals(UIPortalComposer.class)) { continue; } rcontext.addUIComponentToUpdateByAjax(child); } int portalMode = uiApp.getModeState(); if (portalMode != UIPortalApplication.NORMAL_MODE) { switch (portalMode) { case UIPortalApplication.APP_BLOCK_EDIT_MODE: case UIPortalApplication.CONTAINER_BLOCK_EDIT_MODE: Util.showComponentEditInBlockMode(); break; case UIPortalApplication.APP_VIEW_EDIT_MODE: case UIPortalApplication.CONTAINER_VIEW_EDIT_MODE: Util.showComponentEditInViewMode(); break; } } } public void processRender(WebuiRequestContext context) throws Exception { UIPortalApplication uiPortalApp = Util.getUIPortalApplication(); int portalMode = uiPortalApp.getModeState(); if (portalMode != UIPortalApplication.NORMAL_MODE) { /* ppalaga is quite sure that changing UIPortalApplication.modeState during render is * not a good idea because there might have happened other state changes in event * handlers that those handlers rely on as not changing again during the same request. * Moreover, ppalaga could not find an execution path where this piece of code was * important, therefore, he bravely commented it out. * * If you decide that this code is missing, please test New Page Wizard with distinct * gatein.portal.pageEditor.defaultEditMode and gatein.portal.pageEditor.fullPreview values * and do not forget to check going back and forward in the wizard. * * The original code: * * UITabPane uiTabPane = this.getChild(UITabPane.class); * UIComponent uiComponent = uiTabPane.getChildById(uiTabPane.getSelectedTabId()); * if (uiComponent instanceof UIApplicationList) { * uiPortalApp.setDefaultEditMode(ComponentTab.APPLICATIONS, uiPortalApp.getEditLevel()); * } else if (uiComponent instanceof UIContainerList) { * uiPortalApp.setDefaultEditMode(ComponentTab.CONTAINERS, uiPortalApp.getEditLevel()); * } */ switch (portalMode) { case UIPortalApplication.APP_VIEW_EDIT_MODE: case UIPortalApplication.CONTAINER_VIEW_EDIT_MODE: Util.showComponentEditInViewMode(); break; case UIPortalApplication.APP_BLOCK_EDIT_MODE: case UIPortalApplication.CONTAINER_BLOCK_EDIT_MODE: Util.showComponentEditInBlockMode(); break; default: break; } } super.processRender(context); } public static class ViewSitePropertiesActionListener extends EventListener<UIPortalComposer> { public void execute(Event<UIPortalComposer> event) throws Exception { UIComponent temp = null; UIPortal uiPortal = null; String portalOwner = null; UIEditInlineWorkspace uiEditWS = event.getSource().getAncestorOfType(UIEditInlineWorkspace.class); temp = uiEditWS.getUIComponent(); if (temp != null && (temp instanceof UIPortal)) { uiPortal = (UIPortal) temp; if (uiPortal.getSiteType().equals(SiteType.PORTAL)) { portalOwner = uiPortal.getName(); } else { portalOwner = Util.getPortalRequestContext().getPortalOwner(); } } else { uiPortal = Util.getUIPortal(); portalOwner = Util.getPortalRequestContext().getPortalOwner(); } UIPortalApplication uiApp = uiPortal.getAncestorOfType(UIPortalApplication.class); UIMaskWorkspace uiMaskWS = uiApp.getChildById(UIPortalApplication.UI_MASK_WS_ID); UIPortalForm portalForm = uiMaskWS.createUIComponent(UIPortalForm.class, null, "UIPortalForm"); portalForm.setPortalOwner(portalOwner); portalForm.setBindingBean(); if (SiteType.USER.equals(uiPortal.getSiteType())) { portalForm.removeChildById("PermissionSetting"); } uiMaskWS.setWindowSize(700, -1); event.getRequestContext().addUIComponentToUpdateByAjax(uiMaskWS); } } public static class AbortSiteEditionActionListener extends EventListener<UIPortalComposer> { protected void closeComposer(UIPortalApplication uiPortalApp, UIWorkingWorkspace uiWorkingWS) { uiPortalApp.setModeState(UIPortalApplication.NORMAL_MODE); uiWorkingWS.setRenderedChild(UIPortalApplication.UI_VIEWING_WS_ID); PortalRequestContext prContext = Util.getPortalRequestContext(); prContext.ignoreAJAXUpdateOnPortlets(true); UIEditInlineWorkspace uiEditWS = uiWorkingWS.getChild(UIEditInlineWorkspace.class); uiEditWS.getComposer().setEditted(false); uiEditWS.setRendered(false); uiEditWS.setUIComponent(null); UITabPane tabPane = uiEditWS.getComposer().getChild(UITabPane.class); tabPane.setSelectedTab(1); } protected void fireChangeNode(WebuiRequestContext prContext, UIPortalApplication uiPortalApp, UIPortal uiPortal) throws Exception { UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID); UserNode currentNode = uiPortal.getSelectedUserNode(); SiteKey siteKey = currentNode.getNavigation().getKey(); PageNodeEvent<UIPortalApplication> pnevent = new PageNodeEvent<UIPortalApplication>(uiPortalApp, PageNodeEvent.CHANGE_NODE, siteKey, currentNode.getURI()); uiPortalApp.broadcast(pnevent, Event.Phase.PROCESS); prContext.addUIComponentToUpdateByAjax(uiWorkingWS); Util.updatePortalMode(); } public void execute(Event<UIPortalComposer> event) throws Exception { PortalRequestContext prContext = Util.getPortalRequestContext(); UIPortalApplication uiPortalApp = (UIPortalApplication) prContext.getUIApplication(); UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID); UIPortal currentPortal = uiWorkingWS.restoreUIPortal(); uiPortalApp.refreshCachedUI(); closeComposer(uiPortalApp, uiWorkingWS); fireChangeNode(prContext, uiPortalApp, currentPortal); } } /** * Listens the <code>save</code> action of the composer while editing SiteConfig * * @author <a href="trong.tran@exoplatform.com">Trong Tran</a> * @version $Revision$ */ public static class FinishSiteEditionActionListener extends EventListener<UIPortalComposer> { public void execute(Event<UIPortalComposer> event) throws Exception { UIPortalComposer uiComposer = event.getSource(); PortalRequestContext prContext = Util.getPortalRequestContext(); UIPortalApplication uiPortalApp = (UIPortalApplication) prContext.getUIApplication(); UIWorkingWorkspace uiWorkingWS = uiPortalApp.findFirstComponentOfType(UIWorkingWorkspace.class); UIEditInlineWorkspace uiEditWS = uiWorkingWS.getChild(UIEditInlineWorkspace.class); UIPortal editPortal = (UIPortal) uiEditWS.getUIComponent(); PortalConfig portalConfig = (PortalConfig) PortalDataMapper.buildModelObject(editPortal); UserACL acl = uiComposer.getApplicationComponent(UserACL.class); if (!acl.hasPermission(portalConfig)) { uiEditWS.createActionConfirm("UIEditInlineWorkspace.confirm.finish.site", "ConfirmFinish", "AbortClose"); } else { uiComposer.saveSite(); } } } public static class SelectTabActionListener extends UITabPane.SelectTabActionListener { public void execute(Event<UITabPane> event) throws Exception { super.execute(event); UITabPane uiTabPane = event.getSource(); UIComponent uiComponent = uiTabPane.getChildById(uiTabPane.getSelectedTabId()); UIPortalApplication uiPortalApp = Util.getUIPortalApplication(); int portalMode = uiPortalApp.getModeState(); if (uiComponent instanceof UIApplicationList) { // Swicth to Porlets Tab if (portalMode % 2 == 0) { uiPortalApp.setModeState(UIPortalApplication.APP_VIEW_EDIT_MODE); } else { uiPortalApp.setModeState(UIPortalApplication.APP_BLOCK_EDIT_MODE); } } else if (uiComponent instanceof UIContainerList) { // Swicth to // Containers Tab if (portalMode % 2 == 0) { uiPortalApp.setModeState(UIPortalApplication.CONTAINER_VIEW_EDIT_MODE); } else { uiPortalApp.setModeState(UIPortalApplication.CONTAINER_BLOCK_EDIT_MODE); } } } } public static class SwitchModeActionListener extends EventListener<UIPortalComposer> { public void execute(Event<UIPortalComposer> event) throws Exception { UIPortalApplication uiPortalApp = Util.getUIPortalApplication(); int portalMode = uiPortalApp.getModeState(); switch (portalMode) { case UIPortalApplication.APP_BLOCK_EDIT_MODE: uiPortalApp.setModeState(UIPortalApplication.APP_VIEW_EDIT_MODE); break; case UIPortalApplication.APP_VIEW_EDIT_MODE: uiPortalApp.setModeState(UIPortalApplication.APP_BLOCK_EDIT_MODE); break; case UIPortalApplication.CONTAINER_BLOCK_EDIT_MODE: uiPortalApp.setModeState(UIPortalApplication.CONTAINER_VIEW_EDIT_MODE); break; case UIPortalApplication.CONTAINER_VIEW_EDIT_MODE: uiPortalApp.setModeState(UIPortalApplication.CONTAINER_BLOCK_EDIT_MODE); break; default: uiPortalApp.setModeState(UIPortalApplication.NORMAL_MODE); return; } UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID); UIEditInlineWorkspace uiEditWS = uiWorkingWS.getChild(UIEditInlineWorkspace.class); UIComponent editComponent = uiEditWS.getUIComponent(); UIPortal editPortal = null; if (editComponent instanceof UIPortal) { editPortal = (UIPortal) uiEditWS.getUIComponent(); } else if (editComponent instanceof UIPageCreationWizard) { UIPageCreationWizard uiWizard = (UIPageCreationWizard) uiEditWS.getUIComponent(); UIPagePreview uiPagePreview = uiWizard.getChild(UIPagePreview.class); UIComponent uiPreviewComponent = uiPagePreview.getUIComponent(); if (uiPreviewComponent instanceof UIPortal) { editPortal = (UIPortal) uiPreviewComponent; } } if (editPortal != null) { editPortal.setHeaderAndFooterRendered(UIPage.isFullPreviewInPageEditor() || uiPortalApp.getEditLevel() == EditLevel.EDIT_SITE); } event.getSource().updateWorkspaceComponent(); Util.getPortalRequestContext().ignoreAJAXUpdateOnPortlets(true); } } public static class ChangeEdittedStateActionListener extends EventListener<UIPortalComposer> { public void execute(Event<UIPortalComposer> event) { UIPortalComposer uiComposer = event.getSource(); uiComposer.setEditted(true); } } public static class ToggleActionListener extends EventListener<UIPortalComposer> { public void execute(Event<UIPortalComposer> event) throws Exception { UIPortalComposer uiComposer = event.getSource(); uiComposer.setCollapse(!uiComposer.isCollapse()); event.getRequestContext().addUIComponentToUpdateByAjax(uiComposer); } } public static class ViewPagePropertiesActionListener extends EventListener<UIPortalComposer> { public void execute(Event<UIPortalComposer> event) throws Exception { UIEditInlineWorkspace editInlineWS = event.getSource().getParent(); UIWorkingWorkspace uiWorkingWS = editInlineWS.getParent(); UIPortalToolPanel uiToolPanel = uiWorkingWS.findFirstComponentOfType(UIPortalToolPanel.class); UIPortalApplication uiPortalApp = Util.getUIPortalApplication(); UIMaskWorkspace uiMaskWS = uiPortalApp.getChildById(UIPortalApplication.UI_MASK_WS_ID); UIPageForm uiPageForm = uiPortalApp.createUIComponent(UIPageForm.class, null, null); UIPage uiPage = uiToolPanel.findFirstComponentOfType(UIPage.class); uiPageForm.buildForm(uiPage); uiMaskWS.setUIComponent(uiPageForm); event.getRequestContext().addUIComponentToUpdateByAjax(uiMaskWS); } } public static class CloseComposerActionListener extends EventListener<UIPortalComposer> { public void execute(Event<UIPortalComposer> event) throws Exception { UIPortalComposer uiPortalComposer = event.getSource(); UIEditInlineWorkspace uiEditInlineWorkspace = uiPortalComposer.getAncestorOfType(UIEditInlineWorkspace.class); if (uiPortalComposer.isEditted()) { ResourceBundle resourceBundle = event.getRequestContext().getApplicationResourceBundle(); String closeMessage = resourceBundle.getString("UIEditInlineWorkspace.confirm.close"); uiEditInlineWorkspace.showConfirmWindow(closeMessage); } else { Event<UIComponent> abortEvent = uiPortalComposer.createEvent("Abort", event.getExecutionPhase(), event.getRequestContext()); abortEvent.broadcast(); } } } public static class AbortPageEditionActionListener extends AbortSiteEditionActionListener { public void execute(Event<UIPortalComposer> event) throws Exception { PortalRequestContext prContext = Util.getPortalRequestContext(); UIPortalApplication uiPortalApp = (UIPortalApplication) prContext.getUIApplication(); UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID); try { uiWorkingWS.restoreUIPortal(); } catch (IllegalStateException e) { /* It is expected that in some cases, there will be nothing to restore. */ } UIPortalToolPanel uiToolPanel = uiWorkingWS.findFirstComponentOfType(UIPortalToolPanel.class); uiToolPanel.setUIComponent(null); UIPortal uiPortal = uiPortalApp.getCurrentSite(); uiPortal.setRenderSibling(UIPortal.class); uiPortalApp.refreshCachedUI(); closeComposer(uiPortalApp, uiWorkingWS); fireChangeNode(prContext, uiPortalApp, uiPortal); } } /** * This action listener is for the page edition * * @author <a href="trong.tran@exoplatform.com">Trong Tran</a> * @version $Revision$ */ public static class FinishPageEditionActionListener extends EventListener<UIPortalComposer> { public void execute(Event<UIPortalComposer> event) throws Exception { UIPortalApplication uiPortalApp = Util.getUIPortalApplication(); UIEditInlineWorkspace editInlineWS = event.getSource().getParent(); UIWorkingWorkspace uiWorkingWS = editInlineWS.getParent(); //Reset tab pane state UITabPane tabPane = event.getSource().getChild(UITabPane.class); tabPane.setSelectedTab(1); UIPortal uiPortal = uiPortalApp.getCurrentSite(); UIPortalToolPanel uiToolPanel = uiWorkingWS.findFirstComponentOfType(UIPortalToolPanel.class); UIPage uiPage = uiToolPanel.findFirstComponentOfType(UIPage.class); Page page = (Page) PortalDataMapper.buildModelObject(uiPage); String pageId = page.getPageId(); UserPortalConfigService portalConfigService = uiWorkingWS.getApplicationComponent(UserPortalConfigService.class); /* Put the portal back in place as we have removed it in * org.exoplatform.portal.webui.workspace.UIMainActionListener.EditInlineActionListener.execute(Event<UIWorkingWorkspace>) */ UISiteBody siteBody = uiWorkingWS.findFirstComponentOfType(UISiteBody.class); UIEditInlineWorkspace uiEditWS = uiWorkingWS.getChild(UIEditInlineWorkspace.class); UIComponent editComponent = uiEditWS.getUIComponent(); if (editComponent instanceof UIPortal) { UIPortal editPortal = (UIPortal) editComponent; editPortal.setHeaderAndFooterRendered(true); siteBody.setUIComponent(editPortal); } /* * if it is a edition of the current page and it is not available to current remote user anymore. */ PageKey pageKey = PageKey.parse(pageId); if (page.getStorageId() != null && portalConfigService.getPageService().loadPage(pageKey) == null) { uiPortalApp.addMessage(new ApplicationMessage("UIPageBrowser.msg.PageNotExist", new String[] { pageId }, ApplicationMessage.WARNING)); uiPortalApp.setModeState(UIPortalApplication.NORMAL_MODE); uiWorkingWS.setRenderedChild(UIPortalApplication.UI_VIEWING_WS_ID); Util.getPortalRequestContext().ignoreAJAXUpdateOnPortlets(true); UserNode currentNode = uiPortal.getSelectedUserNode(); SiteKey siteKey = currentNode.getNavigation().getKey(); PageNodeEvent<UIPortalApplication> pnevent = new PageNodeEvent<UIPortalApplication>(uiPortalApp, PageNodeEvent.CHANGE_NODE, siteKey, currentNode.getURI()); uiPortalApp.broadcast(pnevent, Event.Phase.PROCESS); Util.updatePortalMode(); return; } UIPortalComposer composer = uiWorkingWS.findFirstComponentOfType(UIPortalComposer.class).setRendered(false); // If it is a page creation wizard if (composer.isUsedInWizard()) { UIWizard wizard = (UIWizard) uiToolPanel.getUIComponent(); int step = wizard.getCurrentStep(); step++; Event<UIComponent> uiEvent = wizard.createEvent("ViewStep" + step, Phase.PROCESS, event.getRequestContext()); uiEvent.broadcast(); return; } // Perform model update PageState pageState = PageUtils.toPageState(page); PageContext pageContext = new PageContext(pageKey, pageState); try { if (!portalConfigService.getUserACL().hasPermission(pageContext)) { editInlineWS.createActionConfirm("UIEditInlineWorkspace.confirm.finish.page", "ConfirmFinish", "AbortClose"); return; } else { composer.savePage(editInlineWS, event); RequestLifeCycle.end(); RequestLifeCycle.begin(ExoContainerContext.getCurrentContainer()); } } catch (StaleModelException ex) { // Temporary solution to concurrency-related issue // This catch block should be put in an appropriate ApplicationLifecyclec } } } public void savePage(UIEditInlineWorkspace editInlineWS, Event<?> event) throws Exception { UIWorkingWorkspace uiWorkingWS = editInlineWS.getParent(); UIPortalToolPanel uiToolPanel = uiWorkingWS.findFirstComponentOfType(UIPortalToolPanel.class); UIPortalComposer composer = uiWorkingWS.findFirstComponentOfType(UIPortalComposer.class); UIPortalApplication uiPortalApp = Util.getUIPortalApplication(); UIPortal uiPortal = uiPortalApp.getCurrentSite(); DataStorage dataService = uiWorkingWS.getApplicationComponent(DataStorage.class); PageService pageService = uiWorkingWS.getApplicationComponent(PageService.class); UIPage uiPage; if (!UIPage.isFullPreview()) { uiPage = uiToolPanel.findFirstComponentOfType(UIPage.class); } else { uiPage = uiWorkingWS.findFirstComponentOfType(UIPage.class); } Page page = (Page) PortalDataMapper.buildModelObject(uiPage); String pageId = page.getPageId(); PageKey pageKey = PageKey.parse(pageId); PageState pageState = PageUtils.toPageState(page); PageContext pageContext = new PageContext(pageKey, pageState); pageService.savePage(pageContext); dataService.save(page); composer.setEditted(false); // uiToolPanel.setUIComponent(null); // Invalidate UI cached uiPortalApp.refreshCachedUI(); if (PortalProperties.SESSION_ALWAYS.equals(uiPortal.getSessionAlive())) { uiPortalApp.setSessionOpen(true); } else { uiPortalApp.setSessionOpen(false); } uiPortalApp.setModeState(UIPortalApplication.NORMAL_MODE); uiWorkingWS.setRenderedChild(UIPortalApplication.UI_VIEWING_WS_ID); Util.getPortalRequestContext().ignoreAJAXUpdateOnPortlets(true); UserNode currentNode = uiPortal.getSelectedUserNode(); PageNodeEvent<UIPortalApplication> pnevent = new PageNodeEvent<UIPortalApplication>(uiPortalApp, PageNodeEvent.CHANGE_NODE, currentNode.getNavigation().getKey(), currentNode.getURI()); uiPortalApp.broadcast(pnevent, Event.Phase.PROCESS); Util.updatePortalMode(); } public static class BackActionListener extends EventListener<UIPortalComposer> { public void execute(Event<UIPortalComposer> event) throws Exception { UIPortalComposer composer = event.getSource(); if (composer.isUsedInWizard()) { UIWorkingWorkspace uiWorkingWS = composer.getAncestorOfType(UIWorkingWorkspace.class); UIPortalToolPanel uiToolPanel = uiWorkingWS.findFirstComponentOfType(UIPortalToolPanel.class); UIWizard wizard = (UIWizard) uiToolPanel.getUIComponent(); int step = wizard.getCurrentStep(); step--; Event<UIComponent> uiEvent = wizard.createEvent("ViewStep" + step, Phase.PROCESS, event.getRequestContext()); uiEvent.broadcast(); } } } }