/* * 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.wiki.webui; import java.util.HashMap; import java.util.Map; import javax.portlet.PortletMode; import javax.portlet.PortletPreferences; import org.exoplatform.container.PortalContainer; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.web.application.RequestContext; import org.exoplatform.webui.application.WebuiApplication; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.application.portlet.PortletRequestContext; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIPopupContainer; import org.exoplatform.webui.core.UIPopupMessages; import org.exoplatform.webui.core.UIPopupWindow; import org.exoplatform.webui.core.UIPortletApplication; import org.exoplatform.webui.core.lifecycle.UIApplicationLifecycle; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.ext.UIExtensionManager; import org.exoplatform.wiki.WikiPortletPreference; import org.exoplatform.wiki.commons.Utils; import org.exoplatform.wiki.mow.api.Page; import org.exoplatform.wiki.resolver.PageResolver; import org.exoplatform.wiki.resolver.TitleResolver; import org.exoplatform.wiki.service.WikiContext; import org.exoplatform.wiki.service.WikiPageParams; import org.exoplatform.wiki.tree.utils.TreeUtils; import org.exoplatform.wiki.webui.control.AddExtensionContainer; import org.exoplatform.wiki.webui.control.action.AddPageActionComponent; /** * Created by The eXo Platform SAS Author : eXoPlatform exo@exoplatform.com Nov * 5, 2009 */ @ComponentConfig( lifecycle = UIApplicationLifecycle.class, template = "app:/templates/wiki/webui/UIWikiPortlet.gtmpl", events = { @EventConfig(listeners = UIWikiPortlet.ViewPageActionListener.class), @EventConfig(listeners = UIWikiPortlet.ChangeModeActionListener.class), @EventConfig(listeners = UIWikiPortlet.RedirectActionListener.class) } ) public class UIWikiPortlet extends UIPortletApplication { private WikiMode mode = WikiMode.VIEW; private EditMode editmode = EditMode.ALL; private String sectionIndex = ""; private WikiMode previousMode; private WikiPortletPreference portletPreferences = new WikiPortletPreference(); public static String VIEW_PAGE_ACTION = "ViewPage"; public static String CHANGE_MODE_ACTION = "ChangeMode"; public static String REDIRECT_ACTION = "Redirect"; public static String WIKI_PORTLET_ACTION_PREFIX = "UIWikiPortlet_"; private String redirectURL = ""; public static enum PopupLevel { L1, L2 } public UIWikiPortlet() throws Exception { super(); try { addChild(UIWikiEmptyAjaxBlock.class, null, null); addChild(UIWikiPortletPreferences.class, null, null); addChild(UIWikiUpperArea.class, null, null); addChild(UIWikiMiddleArea.class, null, null); addChild(UIWikiMaskWorkspace.class, null, "UIWikiMaskWorkspace"); UIPopupContainer uiPopupContainer = addChild(UIPopupContainer.class, null, "UIWikiPopupContainer" + PopupLevel.L1); uiPopupContainer.getChild(UIPopupWindow.class).setId("UIWikiPopupWindow" + PopupLevel.L1); uiPopupContainer = uiPopupContainer.addChild(UIPopupContainer.class, null, "UIWikiPopupContainer" + PopupLevel.L2); uiPopupContainer.getChild(UIPopupWindow.class).setId("UIWikiPopupWindow" + PopupLevel.L2); loadPreferences(); } catch (Exception e) { log.error("An exception happens when init WikiPortlet", e); } } public WikiPortletPreference getPortletPreferences() { return portletPreferences; } public void setPortletPreferences(WikiPortletPreference portletPreferences) { this.portletPreferences = portletPreferences; } public void processRender(WebuiApplication app, WebuiRequestContext context) throws Exception { PortletRequestContext portletReqContext = (PortletRequestContext) context; redirectURL = this.url(this.REDIRECT_ACTION); loadPreferences(); if (portletReqContext.getApplicationMode() == PortletMode.VIEW) { if (mode.equals(WikiMode.PORTLETPREFERENCES)) { changeMode(WikiMode.VIEW); } getChild(UIWikiUpperArea.class).getChild(UIWikiApplicationControlArea.class) .getChild(UIWikiBreadCrumb.class) .setRendered(portletPreferences.isShowBreadcrumb()); String requestURL = Utils.getCurrentRequestURL(); PageResolver pageResolver = (PageResolver) PortalContainer.getComponent(PageResolver.class); Page page = pageResolver.resolve(requestURL, Util.getUIPortal().getSelectedUserNode()); if (page == null) { changeMode(WikiMode.PAGE_NOT_FOUND); super.processRender(app, context); return; } else { if (mode.equals(WikiMode.PAGE_NOT_FOUND)) { changeMode(WikiMode.VIEW); } } Page helpPage = Utils.isRenderFullHelpPage(); if (helpPage != null) { changeMode(WikiMode.HELP); page = helpPage; } WikiPageParams pageParams = Utils.getCurrentWikiPageParams(); if (WikiContext.ADDPAGE.equalsIgnoreCase(pageParams.getParameter(WikiContext.ACTION))) { UIExtensionManager manager = getApplicationComponent(UIExtensionManager.class); Map<String, Object> uiExtensionContext = new HashMap<String, Object>(); uiExtensionContext.put(UIWikiPortlet.class.getName(), this); uiExtensionContext.put(WikiContext.PAGETITLE, pageParams.getParameter(WikiContext.PAGETITLE)); if (manager.accept(AddExtensionContainer.EXTENSION_TYPE, WikiContext.ADDPAGE, uiExtensionContext)) { AddPageActionComponent.processAddPageAction(uiExtensionContext); } } try { // TODO: ignore request URL of resources context.setAttribute("wikiPage", page); ((UIWikiPageTitleControlArea) findComponentById(UIWikiPageControlArea.TITLE_CONTROL)).getUIFormInputInfo() .setValue(page.getTitle()); } catch (Exception e) { context.setAttribute("wikiPage", null); findFirstComponentOfType(UIWikiPageContentArea.class).setHtmlOutput(null); if (log.isWarnEnabled()) { log.warn("An exception happens when resolving URL: " + requestURL, e); } } super.processRender(app, context); if (getWikiMode() == WikiMode.HELP) { changeMode(previousMode); } } else if (portletReqContext.getApplicationMode() == PortletMode.EDIT) { changeMode(WikiMode.PORTLETPREFERENCES); super.processRender(app, context); } else { super.processRender(app, context); } } public UIPopupContainer getPopupContainer(PopupLevel level) { UIPopupContainer popupContainer = getChildById("UIWikiPopupContainer" + PopupLevel.L1); if (level == PopupLevel.L2) { popupContainer = popupContainer.getChildById("UIWikiPopupContainer" + PopupLevel.L2); } return popupContainer; } public WikiMode getWikiMode() { return mode; } public EditMode getEditMode() { return editmode; } public String getSectionIndex() { return sectionIndex; } public void setSectionIndex(String sectionIndex) { this.sectionIndex = sectionIndex; } public String getRedirectURL() { return redirectURL; } public void setRedirectURL(String redirectURL) { this.redirectURL = redirectURL; } public void changeMode(WikiMode newMode) { if (newMode== WikiMode.HELP) this.previousMode = mode; if (newMode.equals(WikiMode.VIEW)) { findFirstComponentOfType(UIWikiPageTitleControlArea.class).toInfoMode(); UIWikiBottomArea bottomArea = findFirstComponentOfType(UIWikiBottomArea.class).setRendered(true); bottomArea.getChild(UIWikiAttachmentArea.class).setRendered(false); bottomArea.getChild(UIWikiPageVersionsList.class).setRendered(false); } if (newMode.equals(WikiMode.EDITPAGE)||newMode.equals(WikiMode.ADDPAGE)) { findFirstComponentOfType(UIWikiSidePanelArea.class).setRendered(true); findFirstComponentOfType(UIWikiBottomArea.class).setRendered(true); findFirstComponentOfType(UIWikiAttachmentArea.class).setRendered(true); findFirstComponentOfType(UIWikiRichTextArea.class).setRendered(false); findFirstComponentOfType(UIWikiPageEditForm.class).getUIFormTextAreaInput(UIWikiPageEditForm.FIELD_CONTENT).setRendered(true); } mode = newMode; } public void changeEditMode(EditMode newEditMode) { editmode = newEditMode; } public void renderPopupMessages() throws Exception { UIPopupMessages popupMess = getUIPopupMessages(); if (popupMess == null) return; WebuiRequestContext context = RequestContext.getCurrentInstance(); popupMess.processRender(context); } private void loadPreferences() { PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance(); PortletPreferences portletPref = pcontext.getRequest().getPreferences(); try { portletPreferences.setShowBreadcrumb(Boolean.parseBoolean(portletPref.getValue(WikiPortletPreference.SHOW_BREADCRUMB, "true"))); portletPreferences.setShowNavigationTree(Boolean.parseBoolean(portletPref.getValue(WikiPortletPreference.SHOW_NAVIGATIONTREE, "true"))); } catch (Exception e) { log.error("Fail to load wiki portlet's preference: ", e); } } public static class ViewPageActionListener extends EventListener<UIWikiPortlet> { @Override public void execute(Event<UIWikiPortlet> event) throws Exception { UIWikiPortlet wikiPortlet = event.getSource(); WikiMode currentMode = wikiPortlet.getWikiMode(); if (currentMode.equals(WikiMode.VIEW)) { event.getRequestContext() .addUIComponentToUpdateByAjax(wikiPortlet.findFirstComponentOfType(UIWikiEmptyAjaxBlock.class)); } else { event.getSource().changeMode(WikiMode.VIEW); } } } public static class ChangeModeActionListener extends EventListener<UIWikiPortlet> { @Override public void execute(Event<UIWikiPortlet> event) throws Exception { UIWikiPortlet wikiPortlet = event.getSource(); String mode = event.getRequestContext().getRequestParameter("mode"); String currentModeName = (mode.equals("")) ? WikiMode.VIEW.toString() : mode; WikiMode currentMode = Utils.getModeFromAction(currentModeName); if (!currentMode.equals(wikiPortlet.mode)) { if (currentMode == null) currentMode = WikiMode.VIEW; event.getSource().changeMode(currentMode); } event.getRequestContext() .addUIComponentToUpdateByAjax(wikiPortlet.findFirstComponentOfType(UIWikiEmptyAjaxBlock.class)); } } public static class RedirectActionListener extends EventListener<UIWikiPortlet> { @Override public void execute(Event<UIWikiPortlet> event) throws Exception { String value = event.getRequestContext().getRequestParameter(OBJECTID); value = TitleResolver.getId(value, false); WikiPageParams params = TreeUtils.getPageParamsFromPath(value); Utils.redirect(params, WikiMode.VIEW); } } }