/*
* $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;
}
}