| /* |
| * 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.environment.http; |
| |
| import java.io.BufferedReader; |
| import java.io.IOException; |
| import java.io.UnsupportedEncodingException; |
| import java.lang.ref.WeakReference; |
| import java.util.Collections; |
| import java.util.Enumeration; |
| import java.util.HashMap; |
| import java.util.Locale; |
| import java.util.Map; |
| import java.util.Vector; |
| import java.util.WeakHashMap; |
| |
| import javax.servlet.RequestDispatcher; |
| import javax.servlet.ServletInputStream; |
| import javax.servlet.http.HttpServletRequest; |
| |
| import org.apache.avalon.framework.CascadingRuntimeException; |
| import org.apache.cocoon.environment.Cookie; |
| import org.apache.cocoon.environment.Request; |
| import org.apache.cocoon.environment.Session; |
| import org.apache.cocoon.environment.http.HttpSession; |
| import org.apache.cocoon.servlet.multipart.MultipartHttpServletRequest; |
| |
| /** |
| * Implements the {@link org.apache.cocoon.environment.Request} interface |
| * to provide request information in the HTTP servlets environment. |
| * |
| * @author <a href="mailto:giacomo@apache.org">Giacomo Pati</a> |
| * @version $Id$ |
| */ |
| public final class HttpRequest implements Request { |
| |
| /** The real HttpServletRequest object */ |
| private final HttpServletRequest req; |
| |
| /** The HttpEnvironment object */ |
| private final HttpEnvironment env; |
| |
| /** The character encoding of parameters */ |
| private String form_encoding; |
| |
| /** The default form encoding of the servlet container */ |
| private String container_encoding; |
| |
| /** The map to assure 1:1-mapping of server sessions and Cocoon session wrappers */ |
| private static final Map sessions = new WeakHashMap(); |
| |
| /** |
| * Creates a HttpRequest based on a real HttpServletRequest object |
| */ |
| protected HttpRequest(HttpServletRequest req, HttpEnvironment env) { |
| super(); |
| this.req = req; |
| this.env = env; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.cocoon.environment.Request#get(java.lang.String) |
| */ |
| public Object get(String name) { |
| // if the request has been wrapped then access its method |
| if (req instanceof MultipartHttpServletRequest) { |
| return ((MultipartHttpServletRequest) req).get(name); |
| } else { |
| String[] values = req.getParameterValues(name); |
| if (values == null) { |
| return null; |
| } |
| if (values.length == 1) { |
| return values[0]; |
| } |
| if (values.length > 1) { |
| Vector vect = new Vector(values.length); |
| for (int i = 0; i < values.length; i++) { |
| vect.add(values[i]); |
| } |
| return vect; |
| } |
| } |
| return null; |
| } |
| |
| /* The HttpServletRequest interface methods */ |
| |
| public String getAuthType() { |
| return this.req.getAuthType(); |
| } |
| |
| private Cookie[] wrappedCookies = null; |
| private Map wrappedCookieMap = null; |
| |
| public Cookie[] getCookies() { |
| if (this.wrappedCookieMap == null) { |
| wrapCookies(); |
| } |
| return this.wrappedCookies; |
| } |
| |
| public Map getCookieMap() { |
| if (this.wrappedCookieMap == null) { |
| wrapCookies(); |
| } |
| return this.wrappedCookieMap; |
| } |
| |
| private synchronized void wrapCookies() { |
| this.wrappedCookieMap = new HashMap(); |
| javax.servlet.http.Cookie[] cookies = this.req.getCookies(); |
| if (cookies != null) { |
| this.wrappedCookies = new Cookie[cookies.length]; |
| for(int i=0; i<cookies.length;i++) { |
| HttpCookie cookie = new HttpCookie(cookies[i]); |
| this.wrappedCookies[i] = cookie; |
| this.wrappedCookieMap.put(cookie.getName(),cookie); |
| } |
| } |
| this.wrappedCookieMap = Collections.unmodifiableMap(this.wrappedCookieMap); |
| } |
| |
| public long getDateHeader(String name) { |
| return this.req.getDateHeader(name); |
| } |
| |
| public String getHeader(String name) { |
| return this.req.getHeader(name); |
| } |
| |
| public Enumeration getHeaders(String name) { |
| return this.req.getHeaders(name); |
| } |
| |
| public Enumeration getHeaderNames() { |
| return this.req.getHeaderNames(); |
| } |
| |
| public int getIntHeader(String name) { |
| return this.req.getIntHeader(name); |
| } |
| |
| public String getMethod() { |
| return this.req.getMethod(); |
| } |
| |
| public String getPathInfo() { |
| return this.req.getPathInfo(); |
| } |
| |
| public String getPathTranslated() { |
| return this.req.getPathTranslated(); |
| } |
| |
| public String getContextPath() { |
| return this.req.getContextPath(); |
| } |
| |
| public String getQueryString() { |
| return this.req.getQueryString(); |
| } |
| |
| public String getRemoteUser() { |
| return this.req.getRemoteUser(); |
| } |
| |
| public boolean isUserInRole(String role) { |
| return this.req.isUserInRole(role); |
| } |
| |
| public java.security.Principal getUserPrincipal() { |
| return this.req.getUserPrincipal(); |
| } |
| |
| public String getRequestedSessionId() { |
| return this.req.getRequestedSessionId(); |
| } |
| |
| protected String reqURI; |
| |
| public String getRequestURI() { |
| if (this.reqURI == null) { |
| this.reqURI = this.req.getRequestURI(); |
| if ( this.reqURI.equals("/") ) { |
| String s = this.req.getServletPath(); |
| final StringBuffer buffer = new StringBuffer(); |
| if ( null != s ) buffer.append(s); |
| s = this.req.getPathInfo(); |
| if ( null != s ) buffer.append(s); |
| this.reqURI = buffer.toString(); |
| } |
| } |
| return this.reqURI; |
| } |
| |
| public String getSitemapURI() { |
| return this.env.getURI(); |
| } |
| |
| public String getSitemapURIPrefix() { |
| return this.env.getURIPrefix(); |
| } |
| |
| public String getServletPath() { |
| return this.req.getServletPath(); |
| } |
| |
| /** |
| * Creates a wrapper implementing {@link Session} for |
| * {@link javax.servlet.http.HttpSession}. |
| * The method must assure 1:1-mapping of |
| * {@link javax.servlet.http.HttpSession}s to Cocoon's session wrappers. |
| * |
| * @see org.apache.cocoon.environment.Request#getSession(boolean) |
| */ |
| public Session getSession(boolean create) { |
| javax.servlet.http.HttpSession serverSession = this.req.getSession(create); |
| HttpSession session; |
| if (serverSession != null) { |
| synchronized (sessions) { |
| // retrieve existing wrapper |
| WeakReference ref = (WeakReference)sessions.get(serverSession); |
| if (ref == null || (session = (HttpSession)ref.get()) == null) { |
| // create new wrapper |
| session = new HttpSession(serverSession); |
| sessions.put(serverSession, new WeakReference(session)); |
| } |
| } |
| } else { |
| // invalidate |
| session = null; |
| } |
| return session; |
| } |
| |
| public Session getSession() { |
| return this.getSession(true); |
| } |
| |
| public Session getCocoonSession(boolean create) { |
| return this.getSession(create); |
| } |
| |
| public Session getCocoonSession() { |
| return this.getSession(true); |
| } |
| |
| public boolean isRequestedSessionIdValid() { |
| return this.req.isRequestedSessionIdValid(); |
| } |
| |
| public boolean isRequestedSessionIdFromCookie() { |
| return this.req.isRequestedSessionIdFromCookie(); |
| } |
| |
| public boolean isRequestedSessionIdFromURL() { |
| return this.req.isRequestedSessionIdFromURL(); |
| } |
| |
| /** |
| * @deprecated As of Version 2.1 of the Java Servlet API, use |
| * {@link #isRequestedSessionIdFromURL()} instead. |
| */ |
| public boolean isRequestedSessionIdFromUrl() { |
| return this.req.isRequestedSessionIdFromURL(); |
| } |
| |
| /* The ServletRequest interface methods */ |
| |
| public Object getAttribute(String name) { |
| return this.req.getAttribute(name); |
| } |
| |
| public Enumeration getAttributeNames() { |
| return this.req.getAttributeNames(); |
| } |
| |
| public String getCharacterEncoding() { |
| if (this.form_encoding == null) { |
| return this.req.getCharacterEncoding(); |
| } else { |
| return this.form_encoding; |
| } |
| } |
| |
| public void setCharacterEncoding(String form_encoding) |
| throws java.io.UnsupportedEncodingException { |
| this.form_encoding = form_encoding; |
| } |
| |
| /** |
| * Sets the default encoding of the servlet container. |
| */ |
| public void setContainerEncoding(String container_encoding) { |
| this.container_encoding = container_encoding; |
| } |
| |
| public int getContentLength() { |
| return this.req.getContentLength(); |
| } |
| |
| public String getContentType() { |
| return this.req.getContentType(); |
| } |
| |
| public ServletInputStream getInputStream() throws IOException { |
| return this.req.getInputStream(); |
| } |
| |
| public String getParameter(String name) { |
| String value = this.req.getParameter(name); |
| if (!this.container_encoding.equals(this.form_encoding)) { |
| value = decode(value); |
| } |
| return value; |
| } |
| |
| private String decode(String str) { |
| if (str == null) return null; |
| try { |
| byte[] bytes = str.getBytes(this.container_encoding); |
| return new String(bytes, this.form_encoding); |
| } catch (UnsupportedEncodingException uee) { |
| throw new CascadingRuntimeException("Unsupported Encoding Exception", uee); |
| } |
| } |
| |
| public Enumeration getParameterNames() { |
| return this.req.getParameterNames(); |
| } |
| |
| public String[] getParameterValues(String name) { |
| String[] values = this.req.getParameterValues(name); |
| if (values == null) return null; |
| if (this.container_encoding.equals(this.form_encoding)) { |
| return values; |
| } |
| String[] decoded_values = new String[values.length]; |
| for (int i = 0; i < values.length; ++i) { |
| decoded_values[i] = decode(values[i]); |
| } |
| return decoded_values; |
| } |
| |
| public String getProtocol() { |
| return this.req.getProtocol(); |
| } |
| |
| public String getScheme() { |
| return this.req.getScheme(); |
| } |
| |
| public String getServerName() { |
| return this.req.getServerName(); |
| } |
| |
| public int getServerPort() { |
| return this.req.getServerPort(); |
| } |
| |
| public BufferedReader getReader() throws IOException { |
| return this.req.getReader(); |
| } |
| |
| public String getRemoteAddr() { |
| return this.req.getRemoteAddr(); |
| } |
| |
| public String getRemoteHost() { |
| return this.req.getRemoteHost(); |
| } |
| |
| public void setAttribute(String name, Object o) { |
| this.req.setAttribute(name, o); |
| } |
| |
| public void removeAttribute(String name) { |
| this.req.removeAttribute(name); |
| } |
| |
| public Locale getLocale() { |
| return this.req.getLocale(); |
| } |
| |
| public Enumeration getLocales() { |
| return this.req.getLocales(); |
| } |
| |
| public boolean isSecure() { |
| return this.req.isSecure(); |
| } |
| |
| public RequestDispatcher getRequestDispatcher(String path) { |
| return this.req.getRequestDispatcher(path); |
| } |
| |
| /** |
| * @deprecated As of Version 2.1 of the Java Servlet API, use |
| * {@link javax.servlet.ServletContext#getRealPath(java.lang.String)}instead. |
| */ |
| public String getRealPath(String path) { |
| return this.req.getRealPath(path); |
| } |
| } |