/*
* Copyright 2001-2008 Geert Bevin <gbevin[remove] at uwyn dot com>
* Licensed under the Apache License, Version 2.0 (the "License")
* $Id: HttpRequest.java 3918 2008-04-14 17:35:35Z gbevin $
*/
package com.uwyn.rife.servlet;
import com.uwyn.rife.config.RifeConfig;
import com.uwyn.rife.engine.Request;
import com.uwyn.rife.engine.RequestMethod;
import com.uwyn.rife.engine.StateStore;
import com.uwyn.rife.engine.UploadedFile;
import com.uwyn.rife.engine.exceptions.EngineException;
import com.uwyn.rife.servlet.MultipartRequest;
import com.uwyn.rife.tools.StringUtils;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class HttpRequest implements Request
{
private HttpServletRequest mHttpServletRequest = null;
private Map<String, String[]> mParameters = null;
private Map<String, UploadedFile[]> mFiles = null;
public HttpRequest(HttpServletRequest request)
throws EngineException
{
assert request != null;
mHttpServletRequest = request;
}
public void init(StateStore stateStore)
{
assert stateStore != null;
if (MultipartRequest.isValidContentType(mHttpServletRequest.getContentType()))
{
MultipartRequest multipart_request = new MultipartRequest(mHttpServletRequest);
mParameters = multipart_request.getParameterMap();
mFiles = multipart_request.getFileMap();
}
else
{
mParameters = new HashMap<String, String[]>();
try
{
mHttpServletRequest.setCharacterEncoding(RifeConfig.Engine.getRequestEncoding());
}
catch (UnsupportedEncodingException e)
{
// should never happen
}
Enumeration<String> parameter_names = mHttpServletRequest.getParameterNames();
String parameter_name = null;
String[] parameter_values = null;
while (parameter_names.hasMoreElements())
{
parameter_name = parameter_names.nextElement();
if (StringUtils.doesUrlValueNeedDecoding(parameter_name))
{
parameter_name = StringUtils.decodeUrlValue(parameter_name);
}
parameter_values = mHttpServletRequest.getParameterValues(parameter_name);
for (int i = 0; i < parameter_values.length; i++)
{
if (StringUtils.doesUrlValueNeedDecoding(parameter_values[i]))
{
parameter_values[i] = StringUtils.decodeUrlValue(parameter_values[i]);
}
}
mParameters.put(parameter_name, parameter_values);
}
}
Map<String, String[]> parameters = stateStore.restoreParameters(this);
if (parameters != null)
{
mParameters = parameters;
}
}
public RequestMethod getMethod()
{
return RequestMethod.getMethod(mHttpServletRequest.getMethod());
}
public Map<String, String[]> getParameters()
{
return mParameters;
}
public Map<String, UploadedFile[]> getFiles()
{
return mFiles;
}
public boolean hasFile(String name)
{
assert name != null;
assert name.length() > 0;
if (null == getFiles())
{
return false;
}
if (!getFiles().containsKey(name))
{
return false;
}
UploadedFile[] uploaded_files = getFiles().get(name);
if (0 == uploaded_files.length)
{
return false;
}
for (UploadedFile uploaded_file : uploaded_files)
{
if (uploaded_file != null &&
uploaded_file.getName() != null)
{
return true;
}
}
return false;
}
public UploadedFile getFile(String name)
{
assert name != null;
assert name.length() > 0;
if (null == getFiles())
{
return null;
}
UploadedFile[] files = getFiles().get(name);
if (null == files)
{
return null;
}
return files[0];
}
public UploadedFile[] getFiles(String name)
{
assert name != null;
assert name.length() > 0;
if (null == getFiles())
{
return null;
}
return getFiles().get(name);
}
public boolean hasCookie(String name)
{
assert name != null;
assert name.length() > 0;
Cookie[] cookies = mHttpServletRequest.getCookies();
if (null == cookies)
{
return false;
}
for (Cookie cookie : cookies)
{
if (cookie.getName().equals(name))
{
return true;
}
}
return false;
}
public Cookie getCookie(String name)
{
assert name != null;
assert name.length() > 0;
Cookie[] cookies = mHttpServletRequest.getCookies();
if (null == cookies)
{
return null;
}
for (Cookie cookie : cookies)
{
if (cookie.getName().equals(name))
{
return cookie;
}
}
return null;
}
public Cookie[] getCookies()
{
return mHttpServletRequest.getCookies();
}
// simply wrapped methods
public Object getAttribute(String name)
{
return mHttpServletRequest.getAttribute(name);
}
public boolean hasAttribute(String name)
{
return getAttribute(name) != null;
}
public Enumeration getAttributeNames()
{
return mHttpServletRequest.getAttributeNames();
}
public String getCharacterEncoding()
{
return mHttpServletRequest.getCharacterEncoding();
}
public String getContentType()
{
return mHttpServletRequest.getContentType();
}
public long getDateHeader(String name)
{
return mHttpServletRequest.getDateHeader(name);
}
public String getHeader(String name)
{
return mHttpServletRequest.getHeader(name);
}
public Enumeration getHeaderNames()
{
return mHttpServletRequest.getHeaderNames();
}
public Enumeration getHeaders(String name)
{
return mHttpServletRequest.getHeaders(name);
}
public int getIntHeader(String name)
{
return mHttpServletRequest.getIntHeader(name);
}
public Locale getLocale()
{
return mHttpServletRequest.getLocale();
}
public Enumeration getLocales()
{
return mHttpServletRequest.getLocales();
}
public String getProtocol()
{
return mHttpServletRequest.getProtocol();
}
public String getRemoteAddr()
{
return mHttpServletRequest.getRemoteAddr();
}
public String getRemoteUser()
{
return mHttpServletRequest.getRemoteUser();
}
public String getRemoteHost()
{
return mHttpServletRequest.getRemoteHost();
}
public RequestDispatcher getRequestDispatcher(String url)
{
return mHttpServletRequest.getRequestDispatcher(url);
}
public HttpSession getSession()
{
return mHttpServletRequest.getSession();
}
public HttpSession getSession(boolean create)
{
return mHttpServletRequest.getSession(create);
}
public int getServerPort()
{
if (null == mHttpServletRequest ||
null == mHttpServletRequest)
{
return -1;
}
return mHttpServletRequest.getServerPort();
}
public String getScheme()
{
return mHttpServletRequest.getScheme();
}
public String getServerName()
{
if (null == mHttpServletRequest ||
null == mHttpServletRequest)
{
return null;
}
return mHttpServletRequest.getServerName();
}
public String getContextPath()
{
if (null == mHttpServletRequest ||
null == mHttpServletRequest)
{
return null;
}
return mHttpServletRequest.getContextPath();
}
public boolean isSecure()
{
return mHttpServletRequest.isSecure();
}
public void removeAttribute(String name)
{
mHttpServletRequest.removeAttribute(name);
}
public void setAttribute(String name, Object object)
{
mHttpServletRequest.setAttribute(name, object);
}
public String getServerRootUrl(int port)
{
StringBuilder server_root = new StringBuilder();
server_root.append(getScheme());
server_root.append("://");
server_root.append(getServerName());
if (port <= -1)
{
port = getServerPort();
}
if (port != 80)
{
server_root.append(":");
server_root.append(port);
}
return server_root.toString();
}
public HttpServletRequest getHttpServletRequest()
{
return mHttpServletRequest;
}
}