/*
* 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 javax.servlet;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;
/**
* Provides a convenient implementation of the ServletRequest interface that can
* be subclassed by developers wishing to adapt the request to a Servlet. This
* class implements the Wrapper or Decorator pattern. Methods default to calling
* through to the wrapped request object.
*
* @since Servlet 2.3
* @see javax.servlet.ServletRequest
*/
public class ServletRequestWrapper implements ServletRequest {
private ServletRequest request;
/**
* Creates a ServletRequest adaptor wrapping the given request object.
*
* @param request The request to wrap
*
* @throws IllegalArgumentException if the request is null
*/
public ServletRequestWrapper(ServletRequest request) {
if (request == null) {
throw new IllegalArgumentException("Request cannot be null");
}
this.request = request;
}
/**
* Get the wrapped request.
* @return the wrapped request object
*/
public ServletRequest getRequest() {
return this.request;
}
/**
* Sets the request object being wrapped.
* @param request The new wrapped request.
*
* @throws IllegalArgumentException if the request is null.
*/
public void setRequest(ServletRequest request) {
if (request == null) {
throw new IllegalArgumentException("Request cannot be null");
}
this.request = request;
}
/**
* The default behavior of this method is to call getAttribute(String name)
* on the wrapped request object.
*/
@Override
public Object getAttribute(String name) {
return this.request.getAttribute(name);
}
/**
* The default behavior of this method is to return getAttributeNames() on
* the wrapped request object.
*/
@Override
public Enumeration<String> getAttributeNames() {
return this.request.getAttributeNames();
}
/**
* The default behavior of this method is to return getCharacterEncoding()
* on the wrapped request object.
*/
@Override
public String getCharacterEncoding() {
return this.request.getCharacterEncoding();
}
/**
* The default behavior of this method is to set the character encoding on
* the wrapped request object.
*/
@Override
public void setCharacterEncoding(String enc)
throws java.io.UnsupportedEncodingException {
this.request.setCharacterEncoding(enc);
}
/**
* The default behavior of this method is to return getContentLength() on
* the wrapped request object.
*/
@Override
public int getContentLength() {
return this.request.getContentLength();
}
/**
* The default behavior of this method is to return getContentLengthLong()
* on the wrapped request object.
*
* @since Servlet 3.1
*/
@Override
public long getContentLengthLong() {
return this.request.getContentLengthLong();
}
/**
* The default behavior of this method is to return getContentType() on the
* wrapped request object.
*/
@Override
public String getContentType() {
return this.request.getContentType();
}
/**
* The default behavior of this method is to return getInputStream() on the
* wrapped request object.
*/
@Override
public ServletInputStream getInputStream() throws IOException {
return this.request.getInputStream();
}
/**
* The default behavior of this method is to return getParameter(String
* name) on the wrapped request object.
*/
@Override
public String getParameter(String name) {
return this.request.getParameter(name);
}
/**
* The default behavior of this method is to return getParameterMap() on the
* wrapped request object.
*/
@Override
public Map<String, String[]> getParameterMap() {
return this.request.getParameterMap();
}
/**
* The default behavior of this method is to return getParameterNames() on
* the wrapped request object.
*/
@Override
public Enumeration<String> getParameterNames() {
return this.request.getParameterNames();
}
/**
* The default behavior of this method is to return
* getParameterValues(String name) on the wrapped request object.
*/
@Override
public String[] getParameterValues(String name) {
return this.request.getParameterValues(name);
}
/**
* The default behavior of this method is to return getProtocol() on the
* wrapped request object.
*/
@Override
public String getProtocol() {
return this.request.getProtocol();
}
/**
* The default behavior of this method is to return getScheme() on the
* wrapped request object.
*/
@Override
public String getScheme() {
return this.request.getScheme();
}
/**
* The default behavior of this method is to return getServerName() on the
* wrapped request object.
*/
@Override
public String getServerName() {
return this.request.getServerName();
}
/**
* The default behavior of this method is to return getServerPort() on the
* wrapped request object.
*/
@Override
public int getServerPort() {
return this.request.getServerPort();
}
/**
* The default behavior of this method is to return getReader() on the
* wrapped request object.
*/
@Override
public BufferedReader getReader() throws IOException {
return this.request.getReader();
}
/**
* The default behavior of this method is to return getRemoteAddr() on the
* wrapped request object.
*/
@Override
public String getRemoteAddr() {
return this.request.getRemoteAddr();
}
/**
* The default behavior of this method is to return getRemoteHost() on the
* wrapped request object.
*/
@Override
public String getRemoteHost() {
return this.request.getRemoteHost();
}
/**
* The default behavior of this method is to return setAttribute(String
* name, Object o) on the wrapped request object.
*/
@Override
public void setAttribute(String name, Object o) {
this.request.setAttribute(name, o);
}
/**
* The default behavior of this method is to call removeAttribute(String
* name) on the wrapped request object.
*/
@Override
public void removeAttribute(String name) {
this.request.removeAttribute(name);
}
/**
* The default behavior of this method is to return getLocale() on the
* wrapped request object.
*/
@Override
public Locale getLocale() {
return this.request.getLocale();
}
/**
* The default behavior of this method is to return getLocales() on the
* wrapped request object.
*/
@Override
public Enumeration<Locale> getLocales() {
return this.request.getLocales();
}
/**
* The default behavior of this method is to return isSecure() on the
* wrapped request object.
*/
@Override
public boolean isSecure() {
return this.request.isSecure();
}
/**
* The default behavior of this method is to return
* getRequestDispatcher(String path) on the wrapped request object.
*/
@Override
public RequestDispatcher getRequestDispatcher(String path) {
return this.request.getRequestDispatcher(path);
}
/**
* The default behavior of this method is to return getRealPath(String path)
* on the wrapped request object.
*
* @deprecated As of Version 3.0 of the Java Servlet API
*/
@Override
@Deprecated
public String getRealPath(String path) {
return this.request.getRealPath(path);
}
/**
* The default behavior of this method is to return getRemotePort() on the
* wrapped request object.
*
* @since Servlet 2.4
*/
@Override
public int getRemotePort() {
return this.request.getRemotePort();
}
/**
* The default behavior of this method is to return getLocalName() on the
* wrapped request object.
*
* @since Servlet 2.4
*/
@Override
public String getLocalName() {
return this.request.getLocalName();
}
/**
* The default behavior of this method is to return getLocalAddr() on the
* wrapped request object.
*
* @since Servlet 2.4
*/
@Override
public String getLocalAddr() {
return this.request.getLocalAddr();
}
/**
* The default behavior of this method is to return getLocalPort() on the
* wrapped request object.
*
* @since Servlet 2.4
*/
@Override
public int getLocalPort() {
return this.request.getLocalPort();
}
/**
* The default behavior of this method is to return getServletContext() on
* the wrapped request object.
*
* @since Servlet 3.0
*/
@Override
public ServletContext getServletContext() {
return request.getServletContext();
}
/**
* The default behavior of this method is to return startAsync() on the
* wrapped request object.
*
* @throws IllegalStateException If asynchronous processing is not supported
* for this request or if the request is already in asynchronous
* mode
* @since Servlet 3.0
*/
@Override
public AsyncContext startAsync() throws IllegalStateException {
return request.startAsync();
}
/**
* The default behavior of this method is to return startAsync(Runnable) on
* the wrapped request object.
*
* @param servletRequest The ServletRequest with which to initialise the
* asynchronous context
* @param servletResponse The ServletResponse with which to initialise the
* asynchronous context
* @throws IllegalStateException If asynchronous processing is not supported
* for this request or if the request is already in asynchronous
* mode
* @since Servlet 3.0
*/
@Override
public AsyncContext startAsync(ServletRequest servletRequest,
ServletResponse servletResponse) throws IllegalStateException {
return request.startAsync(servletRequest, servletResponse);
}
/**
* The default behavior of this method is to return isAsyncStarted() on the
* wrapped request object.
*
* @since Servlet 3.0
*/
@Override
public boolean isAsyncStarted() {
return request.isAsyncStarted();
}
/**
* The default behavior of this method is to return isAsyncSupported() on
* the wrapped request object.
*
* @since Servlet 3.0
*/
@Override
public boolean isAsyncSupported() {
return request.isAsyncSupported();
}
/**
* The default behavior of this method is to return getAsyncContext() on the
* wrapped request object.
*
* @since Servlet 3.0
*/
@Override
public AsyncContext getAsyncContext() {
return request.getAsyncContext();
}
/**
* TODO SERVLET3 - Add comments
* @param wrapped The request to compare to the wrapped request
* @return <code>true</code> if the request wrapped by this wrapper (or
* series of wrappers) is the same as the supplied request,
* otherwise <code>false</code>
* @since Servlet 3.0
*/
public boolean isWrapperFor(ServletRequest wrapped) {
if (request == wrapped) {
return true;
}
if (request instanceof ServletRequestWrapper) {
return ((ServletRequestWrapper) request).isWrapperFor(wrapped);
}
return false;
}
/**
* TODO SERVLET3 - Add comments
* @param wrappedType The class to compare to the class of the wrapped
* request
* @return <code>true</code> if the request wrapped by this wrapper (or
* series of wrappers) is the same type as the supplied type,
* otherwise <code>false</code>
* @since Servlet 3.0
*/
public boolean isWrapperFor(Class<?> wrappedType) {
if (wrappedType.isAssignableFrom(request.getClass())) {
return true;
}
if (request instanceof ServletRequestWrapper) {
return ((ServletRequestWrapper) request).isWrapperFor(wrappedType);
}
return false;
}
/**
* The default behavior of this method is to call getDispatcherType() on the
* wrapped request object.
*
* @since Servlet 3.0
*/
@Override
public DispatcherType getDispatcherType() {
return this.request.getDispatcherType();
}
}