blob: b092d51cd6687743f1e18be2015715e773e21f96 [file] [log] [blame]
/*
* 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.pluto.driver.services.container;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.portlet.ActionParameters;
import javax.portlet.PortletConfig;
import javax.portlet.RenderParameters;
import javax.servlet.DispatcherType;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.pluto.container.PortletContainer;
import org.apache.pluto.container.PortletRequestContext;
import org.apache.pluto.container.PortletURLProvider;
import org.apache.pluto.container.PortletWindow;
import org.apache.pluto.container.impl.ActionParametersImpl;
import org.apache.pluto.container.impl.MutableActionParametersImpl;
import org.apache.pluto.container.impl.MutableRenderParametersImpl;
import org.apache.pluto.container.impl.MutableResourceParametersImpl;
import org.apache.pluto.container.impl.PortletURLImpl;
import org.apache.pluto.container.impl.RenderParametersImpl;
import org.apache.pluto.container.impl.ResourceParametersImpl;
import org.apache.pluto.driver.core.PortalRequestContext;
import org.apache.pluto.driver.url.PortalURL;
import org.apache.pluto.driver.url.PortletParameterFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @version $Id$
*
*/
public class PortletRequestContextImpl implements PortletRequestContext {
private static final Logger LOG = LoggerFactory.getLogger(PortletRequestContextImpl.class);
private static final boolean isTrace = LOG.isTraceEnabled();
private PortletContainer container;
private HttpServletRequest containerRequest;
private HttpServletResponse containerResponse;
private HttpServletRequest servletRequest;
private HttpServletResponse servletResponse;
private PortalURL url;
private PortletConfig portletConfig;
private ServletContext servletContext;
private Cookie cookies[];
private String renderHeaders = null;
private boolean executingRequestBody = false;
// make sure these classes are loaded first by the container classloader
// so that the logs from these classes land in the Pluto log file.
static {
PortletURLProviderImpl.load();
PortletURLImpl.load();
RenderParametersImpl.load();
ActionParametersImpl.load();
ResourceParametersImpl.load();
MutableRenderParametersImpl.load();
MutableActionParametersImpl.load();
MutableResourceParametersImpl.load();
}
protected PortletWindow window;
protected String windowId;
protected PortletURLProvider urlProvider;
protected PortletParameterFactory paramFactory;
public PortletRequestContextImpl(PortletContainer container,
HttpServletRequest containerRequest,
HttpServletResponse containerResponse, PortletWindow window,
boolean useRequestParameters) {
this.container = container;
this.containerRequest = containerRequest;
this.containerResponse = containerResponse;
this.window = window;
this.windowId = window.getId().getStringId();
this.url = PortalRequestContext.getContext(containerRequest).createPortalURL();
this.urlProvider = new PortletURLProviderImpl(url, window);
this.paramFactory = url.getPortletParameterFactory();
}
@Override
public String getRenderHeaders() {
return renderHeaders;
}
@Override
public void setRenderHeaders(String renderHeaders) {
this.renderHeaders = renderHeaders;
}
protected boolean isReservedAttributeName(String name) {
return name.startsWith("javax.servlet.");
}
protected String encodeAttributeName(String name) {
if (isReservedAttributeName(name)) {
return name;
}
return container.getContainerServices().getNamespaceMapper()
.encode(window.getId(), name);
}
protected String decodeAttributeName(String name) {
if (isReservedAttributeName(name)) {
return name;
}
String result = container.getContainerServices().getNamespaceMapper()
.decode(window.getId(), name);
return result != null ? result : name;
}
protected PortalURL getPortalURL() {
return url;
}
public void init(PortletConfig portletConfig, ServletContext servletContext,
HttpServletRequest servletRequest, HttpServletResponse servletResponse) {
this.portletConfig = portletConfig;
this.servletContext = servletContext;
this.servletRequest = servletRequest;
this.servletResponse = servletResponse;
}
public Object getAttribute(String name) {
Object value = servletRequest.getAttribute(encodeAttributeName(name));
return value != null ? value : servletRequest.getAttribute(name);
}
public Object getAttribute(String name, ServletRequest servletRequest) {
return servletRequest.getAttribute(name);
}
public Enumeration<String> getAttributeNames() {
ArrayList<String> names = new ArrayList<String>();
for (Enumeration<String> e = servletRequest.getAttributeNames(); e
.hasMoreElements();) {
names.add(decodeAttributeName(e.nextElement()));
}
return Collections.enumeration(names);
}
public void setAttribute(String name, Object value) {
if (value == null) {
servletRequest.removeAttribute(encodeAttributeName(name));
} else {
servletRequest.setAttribute(encodeAttributeName(name), value);
}
}
public PortletContainer getContainer() {
return container;
}
public Cookie[] getCookies() {
if (cookies == null) {
cookies = servletRequest.getCookies();
if (cookies == null) {
cookies = new Cookie[0];
}
}
return cookies.length > 0 ? cookies.clone() : null;
}
public PortletConfig getPortletConfig() {
return portletConfig;
}
public ServletContext getServletContext() {
return servletContext;
}
public PortletWindow getPortletWindow() {
return window;
}
public Locale getPreferredLocale() {
return servletRequest.getLocale();
}
public Map<String, String[]> getPrivateParameterMap() {
return paramFactory.getPrivateParameterMap(window.getId().getStringId());
}
public Map<String, String[]> getProperties() {
HashMap<String, String[]> properties = new HashMap<String, String[]>();
for (Enumeration<String> names = servletRequest.getHeaderNames(); names
.hasMoreElements();) {
String name = names.nextElement();
ArrayList<String> values = new ArrayList<String>();
for (Enumeration<String> headers = servletRequest.getHeaders(name); headers
.hasMoreElements();) {
values.add(headers.nextElement());
}
int size = values.size();
if (size > 0) {
properties.put(name, values.toArray(new String[size]));
}
}
return properties;
}
public Map<String, String[]> getPublicParameterMap() {
return paramFactory.getPublicParameterMap(window.getId().getStringId());
}
public HttpServletRequest getContainerRequest() {
return containerRequest;
}
public HttpServletResponse getContainerResponse() {
return containerResponse;
}
public HttpServletRequest getServletRequest() {
return servletRequest;
}
public HttpServletResponse getServletResponse() {
return servletResponse;
}
public RenderParameters getRenderParameters() {
return new RenderParametersImpl(urlProvider, windowId);
}
public ActionParameters getActionParameters() {
return new ActionParametersImpl(urlProvider, windowId);
}
/**
* Make it look like request type while the portlet request body is executing.
*/
@Override
public DispatcherType getDispatcherType() {
DispatcherType type = getServletRequest().getDispatcherType();
if (isTrace) {
StringBuilder txt = new StringBuilder();
txt.append("Dispatcher type: ").append(type);
txt.append(", executing request body: ").append(executingRequestBody);
LOG.trace(txt.toString());
}
if (executingRequestBody && (type != DispatcherType.ASYNC)) {
type = DispatcherType.REQUEST;
}
return type;
}
/**
* @return the executingRequestBody
*/
@Override
public boolean isExecutingRequestBody() {
return executingRequestBody;
}
/**
* @param executingRequestBody the executingRequestBody to set
*/
@Override
public void setExecutingRequestBody(boolean executingRequestBody) {
this.executingRequestBody = executingRequestBody;
}
}