/* * 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.webui.core; import java.io.Writer; import java.util.Set; import javax.portlet.ResourceRequest; import javax.portlet.WindowState; import org.exoplatform.commons.serialization.api.annotations.Serialized; import org.exoplatform.webui.application.WebuiApplication; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.application.portlet.PortletApplication; import org.exoplatform.webui.application.portlet.PortletApplicationController; import org.exoplatform.webui.application.portlet.PortletRequestContext; import org.exoplatform.webui.core.lifecycle.UIApplicationLifecycle; /** * Root UI component of portlets written using GateIn WebUI framework should extends this class <br/> * There are 3 WebUI lifecycle methods, that are called during JSR 286 portlet lifecycle : <br/> * - processDecode - decode and bind parameters from the request to WebUI component<br/> * - processAction - triggered when there is a request for portlet ActionURL, or a WebUI event<br/> * - processRender - mapped to JSR 286 render method<br/> * - serveResource - mapped to JSR 286 serveResource method<br/> * * Portlet request go through this class and then be delegated to child WebUI components with the help of UIApplicationLifecycle. * Use ComponentConfig annotation to config lifecycle class for WebUI component. <br/> * * This class also provides machanism to show a WebUI popup message * * @see UIApplicationLifecycle * @see PortletApplicationController * @see PortletApplication */ @Serialized public abstract class UIPortletApplication extends UIApplication { private int minWidth = 300; private int minHeight = 300; public static String VIEW_MODE = "ViewMode"; public static String EDIT_MODE = "EditMode"; public static String HELP_MODE = "HelpMode"; public static String CONFIG_MODE = "ConfigMode"; public UIPortletApplication() throws Exception { } @Override public UIPopupMessages getUIPopupMessages() { WebuiRequestContext context = PortletRequestContext.getCurrentInstance(); WebuiRequestContext portalContext = (WebuiRequestContext) context.getParentAppRequestContext(); return portalContext.getUIApplication().getUIPopupMessages(); } @Deprecated public int getMinWidth() { return minWidth; } @Deprecated public void setMinWidth(int minWidth) { this.minWidth = minWidth; } @Deprecated public int getMinHeight() { return minHeight; } @Deprecated public void setMinHeight(int minHeight) { this.minHeight = minHeight; } // @Override public void renderChildren() throws Exception { WebuiRequestContext context = WebuiRequestContext.getCurrentInstance(); super.renderChildren(context); } /** * The default processRender for an UIPortletApplication does nothing if the current WindowState in the render request is * MINIMIZED. Otherwise, it handles two cases: * * A. Ajax is used --------------- If Ajax is used and that the entire portal should not be re rendered, then an AJAX * fragment is generated with information such as the portlet id, the portlet title, the portlet modes, the window states as * well as the HTML for the block to render * * B. A full render is made ------------------------ a simple call to the method super.processRender(context) which will * delegate the call to all the Lifecycle components * */ public void processRender(WebuiApplication app, WebuiRequestContext context) throws Exception { // Do nothing if WindowState in the render request is MINIMIZED WindowState currentWindowState = ((PortletRequestContext) context).getRequest().getWindowState(); if (currentWindowState == WindowState.MINIMIZED) { return; } WebuiRequestContext pContext = (WebuiRequestContext) context.getParentAppRequestContext(); if (context.useAjax() && !pContext.getFullRender()) { Writer w = context.getWriter(); Set<UIComponent> list = context.getUIComponentToUpdateByAjax(); // if(list == null) list = app.getDefaultUIComponentToUpdateByAjax(context) ; if (list != null) { for (UIComponent uicomponent : list) { renderBlockToUpdate(uicomponent, context, w); } return; } } super.processRender(context); } /** * Root uicomponent of a portlet should override this method to leverage serveResource that JSR286 offers * * @param context - WebUI context */ public void serveResource(WebuiRequestContext context) throws Exception { if (!(context.getRequest() instanceof ResourceRequest)) { throw new IllegalStateException("serveSource can only be called in portlet context"); } } }