/** * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright ownership. Apereo * licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use * this file except in compliance with the License. You may obtain a copy of the License at the * following location: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing permissions and * limitations under the License. */ package org.apereo.portal.portlet.container; import java.util.Collections; import java.util.Enumeration; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; import javax.portlet.PortletConfig; import javax.portlet.PortletRequest; import javax.servlet.ServletContext; import javax.servlet.ServletRequest; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.pluto.container.PortletContainer; import org.apache.pluto.container.PortletRequestContext; import org.apache.pluto.container.driver.PortletServlet; import org.apache.pluto.container.impl.HttpServletPortletRequestWrapper; import org.apereo.portal.portlet.container.properties.IRequestPropertiesManager; import org.apereo.portal.portlet.container.services.IPortletCookieService; import org.apereo.portal.portlet.container.services.RequestAttributeService; import org.apereo.portal.portlet.om.IPortletWindow; import org.apereo.portal.portlet.om.IPortletWindowId; import org.apereo.portal.portlet.rendering.IPortletRenderer; import org.apereo.portal.url.IPortalRequestInfo; import org.apereo.portal.url.IPortletRequestInfo; import org.apereo.portal.url.ParameterMap; import org.apereo.portal.url.UrlType; import org.apereo.portal.utils.MultivaluedMapPopulator; import org.apereo.portal.utils.web.AbstractHttpServletRequestWrapper; import org.springframework.util.Assert; /** * Backs the {@link PortletRequest} impl provided by Pluto * */ public class PortletRequestContextImpl extends AbstractPortletContextImpl implements PortletRequestContext { private final Map<String, Object> attributes = new LinkedHashMap<String, Object>(); protected final IRequestPropertiesManager requestPropertiesManager; protected final IPortalRequestInfo portalRequestInfo; protected final IPortletRequestInfo portletRequestInfo; protected final RequestAttributeService requestAttributeService; //Objects provided by the PortletServlet via the init method //The servlet objects are from the scope of the cross-context dispatch protected PortletConfig portletConfig; protected ServletContext servletContext; public PortletRequestContextImpl( PortletContainer portletContainer, IPortletWindow portletWindow, HttpServletRequest containerRequest, HttpServletResponse containerResponse, IRequestPropertiesManager requestPropertiesManager, IPortalRequestInfo portalRequestInfo, IPortletCookieService portletCookieService, RequestAttributeService requestAttributeService) { super( portletContainer, portletWindow, containerRequest, containerResponse, portletCookieService); Assert.notNull(requestPropertiesManager, "requestPropertiesManager cannot be null"); Assert.notNull(portalRequestInfo, "portalRequestInfo cannot be null"); this.requestPropertiesManager = requestPropertiesManager; this.portalRequestInfo = portalRequestInfo; this.requestAttributeService = requestAttributeService; final IPortletWindowId portletWindowId = this.portletWindow.getPortletWindowId(); final Map<IPortletWindowId, ? extends IPortletRequestInfo> portletRequestInfoMap = this.portalRequestInfo.getPortletRequestInfoMap(); this.portletRequestInfo = portletRequestInfoMap.get(portletWindowId); } /** * Called by {@link PortletServlet} after the cross context dispatch but before the portlet * invocation * * @see org.apache.pluto.container.PortletRequestContext#init(javax.portlet.PortletConfig, * javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse) */ @Override public void init( PortletConfig portletConfig, ServletContext servletContext, HttpServletRequest servletRequest, HttpServletResponse servletResponse) { Assert.notNull(portletConfig, "portletConfig cannot be null"); Assert.notNull(servletContext, "servletContext cannot be null"); super.init(servletRequest, servletResponse); this.portletConfig = portletConfig; this.servletContext = servletContext; } /* (non-Javadoc) * @see org.apache.pluto.container.PortletRequestContext#getPortletConfig() */ @Override public PortletConfig getPortletConfig() { return this.portletConfig; } /* (non-Javadoc) * @see org.apache.pluto.container.PortletRequestContext#getServletContext() */ @Override public ServletContext getServletContext() { return this.servletContext; } /* (non-Javadoc) * @see org.apache.pluto.container.PortletRequestContext#getAttribute(java.lang.String) */ @Override public Object getAttribute(String name) { if (name.startsWith(IPortletRenderer.RENDERER_ATTRIBUTE_PREFIX)) { return null; } final Object attribute = this.attributes.get(name); if (attribute != null) { return attribute; } if (name.startsWith(AbstractHttpServletRequestWrapper.PORTAL_ATTRIBUTE_PREFIX)) { Object result = this.servletRequest.getAttribute(name); return result; } if (name.equals(PortletRequest.RENDER_PART)) { Object result = this.servletRequest.getAttribute(name); return result; } return this.requestAttributeService.getAttribute( this.servletRequest, portletWindow.getPlutoPortletWindow(), name); } /* (non-Javadoc) * @see org.apache.pluto.container.PortletRequestContext#getAttributeNames() */ @Override public Enumeration<String> getAttributeNames() { return Collections.enumeration(this.attributes.keySet()); } /* (non-Javadoc) * @see org.apache.pluto.container.PortletRequestContext#setAttribute(java.lang.String, java.lang.Object) */ @Override public void setAttribute(String name, Object value) { if (name.startsWith(IPortletRenderer.RENDERER_ATTRIBUTE_PREFIX)) { throw new IllegalArgumentException( "Portlets cannot set attributes that start with: " + IPortletRenderer.RENDERER_ATTRIBUTE_PREFIX); } this.attributes.put(name, value); } /* (non-Javadoc) * @see org.apache.pluto.container.PortletRequestContext#getCookies() */ @Override public Cookie[] getCookies() { final IPortletWindowId portletWindowId = this.portletWindow.getPortletWindowId(); return this.portletCookieService.getAllPortletCookies(this.servletRequest, portletWindowId); } /* (non-Javadoc) * @see org.apache.pluto.container.PortletRequestContext#getPreferredLocale() */ @Override public Locale getPreferredLocale() { return this.servletRequest.getLocale(); } /* (non-Javadoc) * @see org.apache.pluto.container.PortletRequestContext#getPrivateParameterMap() */ @Override public Map<String, String[]> getPrivateParameterMap() { if (this.portletRequestInfo != null) { final Map<String, List<String>> portletParameters = this.portletRequestInfo.getPortletParameters(); return ParameterMap.convertListMap(portletParameters); } //Only re-use render parameters on a render request if (this.portalRequestInfo.getUrlType() == UrlType.RENDER) { return this.portletWindow.getRenderParameters(); } return Collections.emptyMap(); } /* (non-Javadoc) * @see org.apache.pluto.container.PortletRequestContext#getProperties() */ @Override public final Map<String, String[]> getProperties() { final MultivaluedMapPopulator<String, String> populator = new MultivaluedMapPopulator<String, String>(); this.requestPropertiesManager.populateRequestProperties( this.servletRequest, portletWindow, populator); final Map<String, List<String>> map = populator.getMap(); return ParameterMap.convertListMap(map); } /* (non-Javadoc) * @see org.apache.pluto.container.PortletRequestContext#getPublicParameterMap() */ @Override public Map<String, String[]> getPublicParameterMap() { //Only re-use render parameters on a render request if (this.portalRequestInfo.getUrlType() == UrlType.RENDER) { return this.portletWindow.getPublicRenderParameters(); } return Collections.emptyMap(); } /* * (non-Javadoc) * @see org.apache.pluto.container.PortletRequestContext#getAttribute(java.lang.String, javax.servlet.ServletRequest) */ @Override public Object getAttribute(String name, ServletRequest request) { if (this.isServletContainerManagedAttribute(name)) { return request.getAttribute(name); } return null; } private boolean isServletContainerManagedAttribute(String name) { return PropertyExposingHttpServletPortletRequestWrapper .getServletContainerManagedAttributes() .contains(name); } /** Exists to expose some protected properties on HttpServletPortletRequestWrapper */ private static class PropertyExposingHttpServletPortletRequestWrapper extends HttpServletPortletRequestWrapper { public static HashSet<String> getServletContainerManagedAttributes() { return servletContainerManagedAttributes; } private PropertyExposingHttpServletPortletRequestWrapper( HttpServletRequest request, ServletContext servletContext, HttpSession session, PortletRequest portletRequest, boolean included, boolean namedDispatch) { super(request, servletContext, session, portletRequest, included, namedDispatch); throw new UnsupportedOperationException( PropertyExposingHttpServletPortletRequestWrapper.class + " should never be created"); } } }