/** * 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.url; import javax.portlet.PortletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apereo.portal.utils.web.PortletHttpServletRequestWrapper; import org.springframework.stereotype.Service; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.request.WebRequest; import org.springframework.web.portlet.context.PortletRequestAttributes; /** * Provides access to the original portal and portlet requests using the {@link * PortalHttpServletRequestWrapper#ATTRIBUTE__HTTP_SERVLET_REQUEST} and {@link * PortletHttpServletRequestWrapper#ATTRIBUTE__HTTP_SERVLET_REQUEST} * */ @Service("portalRequestUtils") public class PortalRequestUtilsImpl implements IPortalRequestUtils { /* (non-Javadoc) * @see org.apereo.portal.url.IPortalRequestUtils#getOriginalPortalRequest(javax.portlet.PortletRequest) */ @Override public HttpServletRequest getPortletHttpRequest(PortletRequest portletRequest) { final HttpServletRequest portalRequest = (HttpServletRequest) portletRequest.getAttribute( PortletHttpServletRequestWrapper.ATTRIBUTE__HTTP_SERVLET_REQUEST); if (portalRequest != null) { return portalRequest; } throw new IllegalArgumentException( "The orginal portlet HttpServletRequest is not available from the PortletRequest using attribute '" + PortletHttpServletRequestWrapper.ATTRIBUTE__HTTP_SERVLET_REQUEST + "'"); } /* (non-Javadoc) * @see org.apereo.portal.url.IPortalRequestUtils#getOriginalPortalRequest(javax.servlet.http.HttpServletRequest) */ @Override public HttpServletRequest getOriginalPortalRequest(HttpServletRequest portletRequest) { final HttpServletRequest portalRequest = (HttpServletRequest) portletRequest.getAttribute( PortalHttpServletRequestWrapper.ATTRIBUTE__HTTP_SERVLET_REQUEST); if (portalRequest != null) { return portalRequest; } return portletRequest; } @Override public HttpServletRequest getOriginalPortletOrPortalRequest(HttpServletRequest request) { final HttpServletRequest portletRequest = (HttpServletRequest) request.getAttribute( PortletHttpServletRequestWrapper.ATTRIBUTE__HTTP_SERVLET_REQUEST); if (portletRequest != null) { return portletRequest; } return this.getOriginalPortalRequest(request); } @Override public HttpServletRequest getOriginalPortalRequest(WebRequest request) { final HttpServletRequest portalRequest = (HttpServletRequest) request.getAttribute( PortalHttpServletRequestWrapper.ATTRIBUTE__HTTP_SERVLET_REQUEST, WebRequest.SCOPE_REQUEST); if (portalRequest != null) { return portalRequest; } if (request instanceof NativeWebRequest) { final NativeWebRequest nativeWebRequest = (NativeWebRequest) request; final Object nativeRequest = nativeWebRequest.getNativeRequest(); if (nativeRequest instanceof HttpServletRequest) { return (HttpServletRequest) nativeRequest; } } throw new IllegalArgumentException( "The orginal portal HttpServletRequest is not available from the WebRequest using attribute '" + PortalHttpServletRequestWrapper.ATTRIBUTE__HTTP_SERVLET_REQUEST + "'"); } @Override public HttpServletResponse getOriginalPortalResponse(PortletRequest portletRequest) { final HttpServletResponse portalResponse = (HttpServletResponse) portletRequest.getAttribute( PortalHttpServletRequestWrapper.ATTRIBUTE__HTTP_SERVLET_RESPONSE); if (portalResponse != null) { return portalResponse; } throw new IllegalArgumentException( "The orginal portal HttpServletResponse is not available from the PortletRequest using attribute '" + PortalHttpServletRequestWrapper.ATTRIBUTE__HTTP_SERVLET_RESPONSE + "'"); } @Override public HttpServletResponse getOriginalPortalResponse(HttpServletRequest portletRequest) { final HttpServletResponse portalResponse = (HttpServletResponse) portletRequest.getAttribute( PortalHttpServletRequestWrapper.ATTRIBUTE__HTTP_SERVLET_RESPONSE); if (portalResponse != null) { return portalResponse; } throw new IllegalArgumentException( "The orginal portal HttpServletResponse is not available from the HttpServletRequest using attribute '" + PortalHttpServletRequestWrapper.ATTRIBUTE__HTTP_SERVLET_RESPONSE + "'"); } /* (non-Javadoc) * @see org.apereo.portal.url.IPortalRequestUtils#getCurrentPortalRequest() */ @Override public HttpServletRequest getCurrentPortalRequest() { final RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); if (requestAttributes instanceof ServletRequestAttributes) { final HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); try { return this.getOriginalPortalRequest(request); } catch (IllegalArgumentException iae) { return request; } } else if (requestAttributes instanceof PortletRequestAttributes) { final PortletRequest request = ((PortletRequestAttributes) requestAttributes).getRequest(); return this.getPortletHttpRequest(request); } else { throw new IllegalStateException( "No ServletRequestAttributes or PortletRequestAttributes available from the RequestContextHolder. " + (requestAttributes == null ? null : requestAttributes.getClass().getName())); } } }