/* * $Id: PortletServletRequest.java 590812 2007-10-31 20:32:54Z apetrelli $ * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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.apache.struts2.portlet.servlet; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.security.Principal; import java.util.Collections; import java.util.Enumeration; import java.util.Locale; import java.util.Map; import javax.portlet.ActionRequest; import javax.portlet.PortletContext; import javax.portlet.PortletRequest; import javax.portlet.PortletRequestDispatcher; import javax.portlet.PortletSession; import javax.servlet.RequestDispatcher; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import static org.apache.struts2.portlet.PortletConstants.*; /** * Wrapper object exposing a {@link PortletRequest} as a * {@link HttpServletRequest} instance. Clients accessing this request object * will in fact operate on the {@link PortletRequest} object wrapped by this * request object. */ public class PortletServletRequest implements HttpServletRequest { private PortletRequest portletRequest; private PortletContext portletContext; private Map<String, String[]> extraParams; public PortletServletRequest(PortletRequest portletRequest, PortletContext portletContext) { this(portletRequest, portletContext, Collections.EMPTY_MAP); } public PortletServletRequest(PortletRequest portletRequest, PortletContext portletContext, Map<String, String[]> extraParams) { this.portletContext = portletContext; this.portletRequest = portletRequest; this.extraParams = extraParams; } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletRequest#getAuthType() */ public String getAuthType() { return portletRequest.getAuthType(); } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletRequest#getContextPath() */ public String getContextPath() { return portletRequest.getContextPath(); } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public Cookie[] getCookies() { if (portletRequest instanceof HttpServletRequest) { return ((HttpServletRequest) portletRequest).getCookies(); } throw new IllegalStateException("Not allowed in a portlet"); } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public long getDateHeader(String name) { throw new IllegalStateException("Not allowed in a portlet"); } /** * Gets a property from the {@link PortletRequest}. Note that a * {@link PortletRequest} is not guaranteed to map properties to headers. * * @see PortletRequest#getProperty(String) * @see javax.servlet.http.HttpServletRequest#getHeader(java.lang.String) */ public String getHeader(String name) { return portletRequest.getProperty(name); } /** * Gets the property names from the {@link PortletRequest}. Note that a * {@link PortletRequest} is not guaranteed to map properties to headers. * * @see PortletRequest#getPropertyNames() * @see javax.servlet.http.HttpServletRequest#getHeaderNames() */ public Enumeration getHeaderNames() { return portletRequest.getPropertyNames(); } /** * Gets the values for the specified property from the * {@link PortletRequest}. Note that a {@link PortletRequest} is not * guaranteed to map properties to headers. * * @see PortletRequest#getProperties(String) * @see HttpServletRequest#getHeaders(String) */ public Enumeration getHeaders(String name) { return portletRequest.getProperties(name); } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public int getIntHeader(String name) { throw new IllegalStateException("Not allowed in a portlet"); } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletRequest#getMethod() */ public String getMethod() { return null; } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletRequest#getPathInfo() */ public String getPathInfo() { return null; } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletRequest#getPathTranslated() */ public String getPathTranslated() { return null; } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletRequest#getQueryString() */ public String getQueryString() { return null; } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletRequest#getRemoteUser() */ public String getRemoteUser() { return portletRequest.getRemoteUser(); } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public String getRequestURI() { throw new IllegalStateException("Not allowed in a portlet"); } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public StringBuffer getRequestURL() { throw new IllegalStateException("Not allowed in a portlet"); } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletRequest#getRequestedSessionId() */ public String getRequestedSessionId() { return portletRequest.getRequestedSessionId(); } /** * A {@link PortletRequest} has no servlet path. But for compatibility with * Struts 2 components and interceptors, the action parameter on the request * is mapped to the servlet path. * * @see javax.servlet.http.HttpServletRequest#getServletPath() */ public String getServletPath() { String actionPath = getParameter(ACTION_PARAM); if (actionPath != null && !actionPath.endsWith(".action")) { actionPath += ".action"; } return actionPath; } /** * Get the {@link PortletSession} as a {@link PortletHttpSession} instance. * * @see javax.servlet.http.HttpServletRequest#getSession() */ public HttpSession getSession() { return new PortletHttpSession(portletRequest.getPortletSession()); } /** * Get the {@link PortletSession} as a {@link PortletHttpSession} instance. * * @see javax.servlet.http.HttpServletRequest#getSession(boolean) */ public HttpSession getSession(boolean create) { return new PortletHttpSession(portletRequest.getPortletSession(create)); } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletRequest#getUserPrincipal() */ public Principal getUserPrincipal() { return portletRequest.getUserPrincipal(); } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public boolean isRequestedSessionIdFromCookie() { throw new IllegalStateException("Not allowed in a portlet"); } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public boolean isRequestedSessionIdFromURL() { throw new IllegalStateException("Not allowed in a portlet"); } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public boolean isRequestedSessionIdFromUrl() { throw new IllegalStateException("Not allowed in a portlet"); } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdValid() */ public boolean isRequestedSessionIdValid() { return portletRequest.isRequestedSessionIdValid(); } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletRequest#isUserInRole(java.lang.String) */ public boolean isUserInRole(String role) { return portletRequest.isUserInRole(role); } /** * Gets an attribute value on the {@link PortletRequest}. If the attribute * name is <tt>javax.servlet.include.servlet_path</tt>, it returns the * same as {@link PortletServletRequest#getServletPath()} * * @see javax.servlet.ServletRequest#getAttribute(java.lang.String) */ public Object getAttribute(String name) { if ("javax.servlet.include.servlet_path".equals(name)) { return getServletPath(); } else { return portletRequest.getAttribute(name); } } /* * (non-Javadoc) * * @see javax.servlet.ServletRequest#getAttributeNames() */ public Enumeration getAttributeNames() { return portletRequest.getAttributeNames(); } /** * Can only be invoked in the event phase. * * @see ServletRequest#getCharacterEncoding() * @throws IllegalStateException * If the portlet is not in the event phase. */ public String getCharacterEncoding() { if (portletRequest instanceof ActionRequest) { return ((ActionRequest) portletRequest).getCharacterEncoding(); } else { throw new IllegalStateException("Not allowed in render phase"); } } /** * Can only be invoked in the event phase. * * @see ServletRequest#getContentLength() * @throws IllegalStateException * If the portlet is not in the event phase. */ public int getContentLength() { if (portletRequest instanceof ActionRequest) { return ((ActionRequest) portletRequest).getContentLength(); } else { throw new IllegalStateException("Not allowed in render phase"); } } /** * Can only be invoked in the event phase. * * @see ServletRequest#getContentType() * @throws IllegalStateException * If the portlet is not in the event phase. */ public String getContentType() { if (portletRequest instanceof ActionRequest) { return ((ActionRequest) portletRequest).getContentType(); } else { throw new IllegalStateException("Not allowed in render phase"); } } /** * Can only be invoked in the event phase. When invoked in the event phase, * it will wrap the portlet's {@link InputStream} as a * {@link PortletServletInputStream}. * * @see ServletRequest#getInputStream() * @throws IllegalStateException * If the portlet is not in the event phase. */ public ServletInputStream getInputStream() throws IOException { if (portletRequest instanceof ActionRequest) { return new PortletServletInputStream( ((ActionRequest) portletRequest).getPortletInputStream()); } else { throw new IllegalStateException("Not allowed in render phase"); } } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public String getLocalAddr() { if (portletRequest instanceof HttpServletRequest) { return ((HttpServletRequest) portletRequest).getLocalAddr(); } throw new IllegalStateException("Not allowed in a portlet"); } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public String getLocalName() { if (portletRequest instanceof HttpServletRequest) { return ((HttpServletRequest) portletRequest).getLocalName(); } throw new IllegalStateException("Not allowed in a portlet"); } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public int getLocalPort() { if (portletRequest instanceof HttpServletRequest) { return ((HttpServletRequest) portletRequest).getLocalPort(); } throw new IllegalStateException("Not allowed in a portlet"); } /* * (non-Javadoc) * * @see javax.servlet.ServletRequest#getLocale() */ public Locale getLocale() { return portletRequest.getLocale(); } /* * (non-Javadoc) * * @see javax.servlet.ServletRequest#getLocales() */ public Enumeration getLocales() { return portletRequest.getLocales(); } /* * (non-Javadoc) * * @see javax.servlet.ServletRequest#getParameter(java.lang.String) */ public String getParameter(String name) { // Check if the parameter is overriden in the extra params if (extraParams.containsKey(name)) { String[] values = extraParams.get(name); if (values != null && values.length > 0) { return values[0]; } } return portletRequest.getParameter(name); } /* * (non-Javadoc) * * @see javax.servlet.ServletRequest#getParameterMap() */ public Map getParameterMap() { return portletRequest.getParameterMap(); } /* * (non-Javadoc) * * @see javax.servlet.ServletRequest#getParameterNames() */ public Enumeration getParameterNames() { return portletRequest.getParameterNames(); } /* * (non-Javadoc) * * @see javax.servlet.ServletRequest#getParameterValues(java.lang.String) */ public String[] getParameterValues(String name) { return portletRequest.getParameterValues(name); } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public String getProtocol() { if (portletRequest instanceof HttpServletRequest) { return ((HttpServletRequest) portletRequest).getProtocol(); } throw new IllegalStateException("Not allowed in a portlet"); } /** * Can only be invoked in the event phase. * * @see ServletRequest#getReader() * @throws IllegalStateException * If the portlet is not in the event phase. */ public BufferedReader getReader() throws IOException { if (portletRequest instanceof ActionRequest) { return ((ActionRequest) portletRequest).getReader(); } else { throw new IllegalStateException("Not allowed in render phase"); } } /* * (non-Javadoc) * * @see javax.servlet.ServletRequest#getRealPath(java.lang.String) */ public String getRealPath(String path) { return portletContext.getRealPath(path); } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public String getRemoteAddr() { if (portletRequest instanceof HttpServletRequest) { return ((HttpServletRequest) portletRequest).getRemoteAddr(); } throw new IllegalStateException("Not allowed in a portlet"); } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public String getRemoteHost() { if (portletRequest instanceof HttpServletRequest) { return ((HttpServletRequest) portletRequest).getRemoteHost(); } throw new IllegalStateException("Not allowed in a portlet"); } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public int getRemotePort() { if (portletRequest instanceof HttpServletRequest) { return ((HttpServletRequest) portletRequest).getRemotePort(); } throw new IllegalStateException("Not allowed in a portlet"); } /** * Get the {@link PortletRequestDispatcher} as a * {@link PortletServletRequestDispatcher} instance. * * @see javax.servlet.ServletRequest#getRequestDispatcher(java.lang.String) */ public RequestDispatcher getRequestDispatcher(String path) { return new PortletServletRequestDispatcher(portletContext .getRequestDispatcher(path)); } /* * (non-Javadoc) * * @see javax.servlet.ServletRequest#getScheme() */ public String getScheme() { return portletRequest.getScheme(); } /* * (non-Javadoc) * * @see javax.servlet.ServletRequest#getServerName() */ public String getServerName() { return portletRequest.getServerName(); } /** * Not allowed in a portlet. * * @throws IllegalStateException * Not allowed in a portlet. */ public int getServerPort() { if (portletRequest instanceof HttpServletRequest) { return ((HttpServletRequest) portletRequest).getServerPort(); } throw new IllegalStateException("Not allowed in a portlet"); } /* * (non-Javadoc) * * @see javax.servlet.ServletRequest#isSecure() */ public boolean isSecure() { return portletRequest.isSecure(); } /* * (non-Javadoc) * * @see javax.servlet.ServletRequest#removeAttribute(java.lang.String) */ public void removeAttribute(String name) { portletRequest.removeAttribute(name); } /* * (non-Javadoc) * * @see javax.servlet.ServletRequest#setAttribute(java.lang.String, * java.lang.Object) */ public void setAttribute(String name, Object o) { portletRequest.setAttribute(name, o); } /** * Can only be invoked in the event phase. * * @see ServletRequest#setCharacterEncoding(String) * @throws IllegalStateException * If the portlet is not in the event phase. */ public void setCharacterEncoding(String env) throws UnsupportedEncodingException { if (portletRequest instanceof ActionRequest) { ((ActionRequest) portletRequest).setCharacterEncoding(env); } else { throw new IllegalStateException("Not allowed in render phase"); } } /** * Get the wrapped {@link PortletRequest} instance. * * @return The wrapped {@link PortletRequest} instance. */ public PortletRequest getPortletRequest() { return portletRequest; } }