/* * 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.cocoon.portal.pluto.servlet; import java.io.UnsupportedEncodingException; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import org.apache.cocoon.portal.coplet.CopletInstanceData; import org.apache.cocoon.portal.pluto.PortletURLProviderImpl; import org.apache.cocoon.portal.pluto.om.PortletWindowImpl; import org.apache.pluto.om.window.PortletWindow; /** * Our request wrapper. * * @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a> * @version CVS $Id$ */ public class ServletRequestImpl extends HttpServletRequestWrapper { /** Cache the parameter map. */ protected Map portletParameterMap; /** Request object used for {@link #portletParameterMap}. */ protected HttpServletRequest cachedRequest; /** Original Request. */ final protected HttpServletRequest originalRequest; final protected PortletURLProviderImpl provider; final protected PortletWindow window; public ServletRequestImpl(HttpServletRequest request, PortletURLProviderImpl provider) { this(request, provider, null); } private ServletRequestImpl(HttpServletRequest request, PortletURLProviderImpl provider, PortletWindow window) { super(request); this.provider = provider; this.window = window; this.originalRequest = request; } public ServletRequestImpl getRequest(PortletWindow window) { return new ServletRequestImpl((HttpServletRequest)this.getRequest(), provider, window); } /** * @see javax.servlet.ServletRequest#setCharacterEncoding(java.lang.String) */ public void setCharacterEncoding(String arg0) throws UnsupportedEncodingException { //this.request.setCharacterEncoding(arg0); } /** * @see javax.servlet.ServletRequest#getContentType() */ public String getContentType() { String contentType = "text/html"; if (getCharacterEncoding() != null) { contentType += ";" + getCharacterEncoding(); } return contentType; } /** * @see javax.servlet.ServletRequest#getParameter(java.lang.String) */ public String getParameter(String name) { final String[] values = (String[])this.getParameterMap().get(name); if ( values != null && values.length > 0 ) { return values[0]; } return null; } /** * @see javax.servlet.ServletRequest#getParameterMap() */ public Map getParameterMap() { HttpServletRequest currentRequest = (HttpServletRequest)this.getRequest(); if ( this.portletParameterMap == null || currentRequest != this.cachedRequest ) { this.cachedRequest = currentRequest; // get control params if (this.provider != null && this.provider.getPortletWindow().equals(this.window)) { this.portletParameterMap = new HashMap(); // get render parameters Iterator i = this.provider.getParameters().entrySet().iterator(); while (i.hasNext()) { Map.Entry entry = (Map.Entry) i.next(); // convert simple values to string arrays if (entry.getValue() instanceof String) { this.portletParameterMap.put( entry.getKey(), new String[] {(String) entry.getValue()}); } else { this.portletParameterMap.put( entry.getKey(), entry.getValue()); } } // get request params from the original Cocoon request // but filter all cocoon portal request parameters. Enumeration parameters = currentRequest.getParameterNames(); while (parameters.hasMoreElements()) { String paramName = (String) parameters.nextElement(); String[] paramValues = this.getRequest().getParameterValues(paramName); String[] values = (String[]) this.portletParameterMap.get(paramName); if ( !paramName.startsWith("cocoon-") ) { if (values != null) { String[] temp = new String[paramValues.length + values.length]; System.arraycopy(paramValues, 0, temp, 0, paramValues.length); System.arraycopy(values, 0, temp, paramValues.length, values.length); paramValues = temp; } this.portletParameterMap.put(paramName, paramValues); } } } else { // provider is null or different window, use stored render parameters // first do NP check if ( this.window != null && ((PortletWindowImpl)this.window).getLayout() != null ) { final CopletInstanceData cid = ((PortletWindowImpl)this.window).getLayout().getCopletInstanceData(); this.portletParameterMap = (Map)cid.getTemporaryAttribute("render-parameters"); } } if ( this.portletParameterMap == null ) { this.portletParameterMap = Collections.EMPTY_MAP; } } return this.portletParameterMap; } /** * @see javax.servlet.ServletRequest#getParameterNames() */ public Enumeration getParameterNames() { return Collections.enumeration(this.getParameterMap().keySet()); } /** * @see javax.servlet.ServletRequest#getParameterValues(java.lang.String) */ public String[] getParameterValues(String name) { return (String[]) this.getParameterMap().get(name); } /** * JST-168 PLT.16.3.3 cxxix * @see javax.servlet.ServletRequest#getProtocol() */ public String getProtocol() { return null; } /** * JST-168 PLT.16.3.3 cxxix * @see javax.servlet.ServletRequest#getRemoteAddr() */ public String getRemoteAddr() { return null; } /** * JST-168 PLT.16.3.3 cxxix * @see javax.servlet.ServletRequest#getRemoteHost() */ public String getRemoteHost() { return null; } /** * JST-168 PLT.16.3.3 cxxix * @see javax.servlet.http.HttpServletRequest#getRequestURL() */ public StringBuffer getRequestURL() { return null; } /** * JST-168 PLT.16.3.3 cxxx * @see javax.servlet.http.HttpServletRequest#getPathInfo() */ public String getPathInfo() { String attr = (String)super.getAttribute("javax.servlet.include.path_info"); return (attr != null) ? attr : super.getPathInfo(); } /** * JST-168 PLT.16.3.3 cxxx * @see javax.servlet.http.HttpServletRequest#getPathTranslated() */ public String getPathTranslated() { // TODO: Don't know yet how to implement this. // A null value is a valid value. return null; } /** * JST-168 PLT.16.3.3 cxxx * @see javax.servlet.http.HttpServletRequest#getQueryString() */ public String getQueryString() { String attr = (String)super.getAttribute("javax.servlet.include.query_string"); return (attr != null) ? attr : super.getQueryString(); } /** * JST-168 PLT.16.3.3 cxxx * @see javax.servlet.http.HttpServletRequest#getRequestURI() */ public String getRequestURI() { String attr = (String)super.getAttribute("javax.servlet.include.request_uri"); return (attr != null) ? attr : super.getRequestURI(); } /** * JST-168 PLT.16.3.3 cxxx * @see javax.servlet.http.HttpServletRequest#getServletPath() */ public String getServletPath() { String attr = (String)super.getAttribute("javax.servlet.include.servlet_path"); return (attr != null) ? attr : super.getServletPath(); } /** * JST-168 PLT.16.3.3 cxxxi * @see javax.servlet.http.HttpServletRequest#getContextPath() */ public String getContextPath() { String attr = (String)super.getAttribute("javax.servlet.include.context_path"); return (attr != null) ? attr : super.getContextPath(); } }