From f9e8be7a90b2f5ea463799ec1d9cb417cb96748d Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Mon, 12 Dec 2011 14:57:08 +0200 Subject: Refactor to use different WrappedRequests for Portal specific hacks Also move the code for updating WebBrowser to that class instead of the duplicated code for Servlet and Portlet. --- src/com/vaadin/terminal/CombinedRequest.java | 37 +- src/com/vaadin/terminal/WrappedRequest.java | 9 + .../gwt/server/AbstractApplicationPortlet.java | 387 +++++++++------------ .../gwt/server/AbstractApplicationServlet.java | 19 +- src/com/vaadin/terminal/gwt/server/WebBrowser.java | 35 +- .../gwt/server/WrappedHttpServletRequest.java | 21 +- .../terminal/gwt/server/WrappedPortletRequest.java | 66 ++-- 7 files changed, 287 insertions(+), 287 deletions(-) diff --git a/src/com/vaadin/terminal/CombinedRequest.java b/src/com/vaadin/terminal/CombinedRequest.java index 35c2f2cd90..1eeb5aba90 100644 --- a/src/com/vaadin/terminal/CombinedRequest.java +++ b/src/com/vaadin/terminal/CombinedRequest.java @@ -7,11 +7,12 @@ package com.vaadin.terminal; import java.io.IOException; import java.io.InputStream; import java.util.Collections; +import java.util.Locale; import java.util.Map; /** * A {@link WrappedRequest} with path and parameters from one request and - * {@link BrowserDetails} extracted from another request. + * {@link WrappedRequest.BrowserDetails} extracted from another request. * * This class is intended to be used for a two request initialization where the * first request fetches the actual application page and the second request @@ -24,6 +25,18 @@ public class CombinedRequest implements WrappedRequest { private final Map parameterMap; private final String pathInfo; + /** + * Creates a new combined request based on the second request and some + * details from the first request. + * + * @param secondRequest + * the second request which will be used as the foundation of the + * combined request + * @param parameterMap + * the parameter map from the first request + * @param pathInfo + * the path info from string the first request + */ public CombinedRequest(WrappedRequest secondRequest, Map parameterMap, String pathInfo) { this.secondRequest = secondRequest; @@ -102,7 +115,29 @@ public class CombinedRequest implements WrappedRequest { }; } + /** + * Gets the original second request. This can be used e.g. if a request + * parameter from the second request is required. + * + * @return the original second wrapped request + */ public WrappedRequest getSecondRequest() { return secondRequest; } + + public Locale getLocale() { + return secondRequest.getLocale(); + } + + public String getRemoteAddr() { + return secondRequest.getRemoteAddr(); + } + + public boolean isSecure() { + return secondRequest.isSecure(); + } + + public String getHeader(String name) { + return secondRequest.getHeader(name); + } } diff --git a/src/com/vaadin/terminal/WrappedRequest.java b/src/com/vaadin/terminal/WrappedRequest.java index c43250f874..eb08453816 100644 --- a/src/com/vaadin/terminal/WrappedRequest.java +++ b/src/com/vaadin/terminal/WrappedRequest.java @@ -7,6 +7,7 @@ package com.vaadin.terminal; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; +import java.util.Locale; import java.util.Map; import com.vaadin.Application; @@ -212,4 +213,12 @@ public interface WrappedRequest extends Serializable { */ public BrowserDetails getBrowserDetails(); + public Locale getLocale(); + + public String getRemoteAddr(); + + public boolean isSecure(); + + public String getHeader(String headerName); + } diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java index f9268292eb..c0b90c5a68 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java @@ -30,7 +30,6 @@ import javax.portlet.EventRequest; import javax.portlet.EventResponse; import javax.portlet.GenericPortlet; import javax.portlet.MimeResponse; -import javax.portlet.PortalContext; import javax.portlet.PortletConfig; import javax.portlet.PortletContext; import javax.portlet.PortletException; @@ -73,6 +72,105 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet private static final Logger logger = Logger .getLogger(AbstractApplicationPortlet.class.getName()); + private static class WrappedHttpAndPortletRequest extends + WrappedPortletRequest { + + public WrappedHttpAndPortletRequest(PortletRequest request, + HttpServletRequest originalRequest) { + super(request); + this.originalRequest = originalRequest; + } + + private final HttpServletRequest originalRequest; + + @Override + public String getParameter(String name) { + String parameter = super.getParameter(name); + if (parameter == null) { + parameter = originalRequest.getParameter(name); + } + return parameter; + } + + @Override + public String getRemoteAddr() { + return originalRequest.getRemoteAddr(); + } + + @Override + public String getHeader(String name) { + String header = super.getHeader(name); + if (header == null) { + header = originalRequest.getHeader(name); + } + return header; + } + + @Override + public Map getParameterMap() { + Map parameterMap = super.getParameterMap(); + if (parameterMap == null) { + parameterMap = originalRequest.getParameterMap(); + } + return parameterMap; + } + } + + private static class WrappedGateinRequest extends + WrappedHttpAndPortletRequest { + public WrappedGateinRequest(PortletRequest request) { + super(request, getOriginalRequest(request)); + } + + private static final HttpServletRequest getOriginalRequest( + PortletRequest request) { + try { + Method getRealReq = request.getClass().getMethod( + "getRealRequest"); + HttpServletRequestWrapper origRequest = (HttpServletRequestWrapper) getRealReq + .invoke(request); + return origRequest; + } catch (Exception e) { + throw new IllegalStateException("GateIn request not detected", + e); + } + } + } + + private static class WrappedLiferayRequest extends + WrappedHttpAndPortletRequest { + + public WrappedLiferayRequest(PortletRequest request) { + super(request, getOriginalRequest(request)); + } + + @Override + public String getPortalProperty(String name) { + return PropsUtil.get(name); + } + + private static HttpServletRequest getOriginalRequest( + PortletRequest request) { + try { + // httpRequest = PortalUtil.getHttpServletRequest(request); + HttpServletRequest httpRequest = (HttpServletRequest) PortalClassInvoker + .invoke("com.liferay.portal.util.PortalUtil", + "getHttpServletRequest", request); + + // httpRequest = + // PortalUtil.getOriginalServletRequest(httpRequest); + httpRequest = (HttpServletRequest) PortalClassInvoker.invoke( + "com.liferay.portal.util.PortalUtil", + "getOriginalServletRequest", httpRequest); + return httpRequest; + } catch (Exception e) { + throw new IllegalStateException("Liferay request not detected", + e); + } + } + + } + private static class AbstractApplicationPortletWrapper implements Callback { private final AbstractApplicationPortlet portlet; @@ -165,12 +263,12 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet * * @param request */ - private void checkWidgetsetVersion(PortletRequest request) { - if (!AbstractApplicationServlet.VERSION.equals(getHTTPRequestParameter( - request, "wsver"))) { + private void checkWidgetsetVersion(WrappedRequest request) { + if (!AbstractApplicationServlet.VERSION.equals(request + .getParameter("wsver"))) { logger.warning(String.format(WIDGETSET_MISMATCH_INFO, AbstractApplicationServlet.VERSION, - getHTTPRequestParameter(request, "wsver"))); + request.getParameter("wsver"))); } } @@ -278,11 +376,10 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet * @return The location of static resources (inside which there should be a * VAADIN directory). Does not end with a slash (/). */ - protected String getStaticFilesLocation(PortletRequest request) { + protected String getStaticFilesLocation(WrappedPortletRequest request) { // TODO allow overriding on portlet level? - String staticFileLocation = getPortalProperty( - Constants.PORTAL_PARAMETER_VAADIN_RESOURCE_PATH, - request.getPortalContext()); + String staticFileLocation = request + .getPortalProperty(Constants.PORTAL_PARAMETER_VAADIN_RESOURCE_PATH); if (staticFileLocation != null) { // remove trailing slash if any while (staticFileLocation.endsWith(".")) { @@ -356,8 +453,19 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet PortletResponse response) throws PortletException, IOException { AbstractApplicationPortletWrapper portletWrapper = new AbstractApplicationPortletWrapper( this); - WrappedPortletRequest wrappedRequest = new WrappedPortletRequest( - request); + + WrappedPortletRequest wrappedRequest; + + String portalInfo = request.getPortalContext().getPortalInfo() + .toLowerCase(); + if (portalInfo.contains("liferay")) { + wrappedRequest = new WrappedLiferayRequest(request); + } else if (portalInfo.contains("gatein")) { + wrappedRequest = new WrappedGateinRequest(request); + } else { + wrappedRequest = new WrappedPortletRequest(request); + } + WrappedPortletResponse wrappedResponse = new WrappedPortletResponse( response); @@ -390,7 +498,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet // TODO What about PARAM_UNLOADBURST & redirectToApplication?? /* Find out which application this request is related to */ - application = findApplicationInstance(request, requestType); + application = findApplicationInstance(wrappedRequest, + requestType); if (application == null) { return; } @@ -409,8 +518,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet .getApplicationManager(application); /* Update browser information from request */ - updateBrowserProperties(applicationContext.getBrowser(), - request); + applicationContext.getBrowser().updateRequestDetails( + wrappedRequest); /* * Call application requestStart before Application.init() is @@ -483,7 +592,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet // Handles AJAX UIDL requests if (isRepaintAll(request)) { // warn if versions do not match - checkWidgetsetVersion(request); + checkWidgetsetVersion(wrappedRequest); } applicationManager.handleUidlRequest(wrappedRequest, wrappedResponse, portletWrapper, root); @@ -556,7 +665,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet * @throws IOException * @throws MalformedURLException */ - private void handleOtherRequest(WrappedRequest request, + private void handleOtherRequest(WrappedPortletRequest request, WrappedResponse response, RequestType requestType, Application application, Root root, PortletApplicationContext2 applicationContext, @@ -571,12 +680,10 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet response.setStatus(404); } } else if (requestType == RequestType.RENDER) { - PortletRequest portletRequest = ((WrappedPortletRequest) request) - .getPortletRequest(); PortletResponse portletResponse = ((WrappedPortletResponse) response) .getPortletResponse(); - writeAjaxPage((RenderRequest) portletRequest, - (RenderResponse) portletResponse, root, application); + writeAjaxPage(request, (RenderResponse) portletResponse, root, + application); } else if (requestType == RequestType.EVENT) { // nothing to do, listeners do all the work } else if (requestType == RequestType.ACTION) { @@ -587,24 +694,6 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet } } - private void updateBrowserProperties(WebBrowser browser, - PortletRequest request) { - String userAgent = getHTTPHeader(request, "user-agent"); - browser.updateRequestDetails(request.getLocale(), null, - request.isSecure(), userAgent); - if (getHTTPRequestParameter(request, "repaintAll") != null) { - browser.updateClientSideDetails( - getHTTPRequestParameter(request, "sw"), - getHTTPRequestParameter(request, "sh"), - getHTTPRequestParameter(request, "tzo"), - getHTTPRequestParameter(request, "rtzo"), - getHTTPRequestParameter(request, "dstd"), - getHTTPRequestParameter(request, "dstActive"), - getHTTPRequestParameter(request, "curdate"), - getHTTPRequestParameter(request, "td") != null); - } - } - @Override public void processEvent(EventRequest request, EventResponse response) throws PortletException, IOException { @@ -714,9 +803,11 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet // Do not send any redirects when running inside a portlet. } - private Application findApplicationInstance(PortletRequest request, - RequestType requestType) throws PortletException, - SessionExpiredException, MalformedURLException { + private Application findApplicationInstance( + WrappedPortletRequest wrappedRequest, RequestType requestType) + throws PortletException, SessionExpiredException, + MalformedURLException { + PortletRequest request = wrappedRequest.getPortletRequest(); boolean requestCanCreateApplication = requestCanCreateApplication( request, requestType); @@ -731,10 +822,10 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet * user not specifically requested to close or restart it. */ - final boolean restartApplication = (getHTTPRequestParameter( - request, URL_PARAMETER_RESTART_APPLICATION) != null); - final boolean closeApplication = (getHTTPRequestParameter(request, - URL_PARAMETER_CLOSE_APPLICATION) != null); + final boolean restartApplication = (wrappedRequest + .getParameter(URL_PARAMETER_RESTART_APPLICATION) != null); + final boolean closeApplication = (wrappedRequest + .getParameter(URL_PARAMETER_CLOSE_APPLICATION) != null); if (restartApplication) { closeApplication(application, request.getPortletSession(false)); @@ -811,7 +902,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet * @param request * @return */ - protected String getWidgetsetURL(String widgetset, PortletRequest request) { + protected String getWidgetsetURL(String widgetset, + WrappedPortletRequest request) { return getStaticFilesLocation(request) + "/" + WIDGETSET_DIRECTORY_PATH + widgetset + "/" + widgetset + ".nocache.js?" + new Date().getTime(); @@ -828,7 +920,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet * @param request * @return */ - protected String getThemeURI(String themeName, PortletRequest request) { + protected String getThemeURI(String themeName, WrappedPortletRequest request) { return getStaticFilesLocation(request) + "/" + THEME_DIRECTORY_PATH + themeName; } @@ -861,7 +953,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet * represented by the given URL. * @throws PortletException */ - protected void writeAjaxPage(RenderRequest request, + protected void writeAjaxPage(WrappedPortletRequest request, RenderResponse response, Root root, Application application) throws IOException, MalformedURLException, PortletException { @@ -902,7 +994,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet } writeAjaxPageHtmlMainDiv(request, response, page, - getApplicationDomId(request), classNames, divStyle); + getApplicationDomId(request.getPortletRequest()), classNames, + divStyle); page.close(); } @@ -933,16 +1026,16 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet * @throws IOException * @throws PortletException */ - protected void writeAjaxPageHtmlVaadinScripts(RenderRequest request, - RenderResponse response, final BufferedWriter writer, - Application application, String themeName) throws IOException, - PortletException { + protected void writeAjaxPageHtmlVaadinScripts( + WrappedPortletRequest request, RenderResponse response, + final BufferedWriter writer, Application application, + String themeName) throws IOException, PortletException { String themeURI = getThemeURI(themeName, request); // fixed base theme to use - all portal pages with Vaadin // applications will load this exactly once - String portalTheme = getPortalProperty(PORTAL_PARAMETER_VAADIN_THEME, - request.getPortalContext()); + String portalTheme = request + .getPortalProperty(PORTAL_PARAMETER_VAADIN_THEME); writer.write("