package org.jboss.seam.web;
import static org.jboss.seam.ScopeType.APPLICATION;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.annotations.web.Filter;
/**
* A filter for decoding multipart requests, for
* use with the file upload control.
*
* @author Shane Bryzak
*
*/
@Scope(APPLICATION)
@Name("org.jboss.seam.web.multipartFilter")
@Install(value=false,precedence = BUILT_IN)
@BypassInterceptors
@Filter(within={"org.jboss.seam.web.exceptionFilter"})
public class MultipartFilter extends AbstractFilter
{
public static final String MULTIPART = "multipart/";
/**
* Flag indicating whether a temporary file should be used to cache the uploaded file
*/
private boolean createTempFiles = false;
/**
* The maximum size of a file upload request. 0 means no limit.
*/
private int maxRequestSize = 0;
public boolean getCreateTempFiles()
{
return createTempFiles;
}
public void setCreateTempFiles(boolean createTempFiles)
{
this.createTempFiles = createTempFiles;
}
public int getMaxRequestSize()
{
return maxRequestSize;
}
public void setMaxRequestSize(int maxFileSize)
{
this.maxRequestSize = maxFileSize;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
if (!(response instanceof HttpServletResponse))
{
chain.doFilter(request, response);
return;
}
HttpServletRequest httpRequest = (HttpServletRequest) request;
if (isMultipartRequest(httpRequest))
{
MultipartRequest multipartRequest = new MultipartRequestImpl(httpRequest, createTempFiles,
maxRequestSize);
// Force the request to be parsed now
multipartRequest.getParameterNames();
chain.doFilter(multipartRequest, response);
}
else
{
chain.doFilter(request, response);
}
}
private boolean isMultipartRequest(HttpServletRequest request)
{
if (!"post".equals(request.getMethod().toLowerCase()))
{
return false;
}
String contentType = request.getContentType();
if (contentType == null)
{
return false;
}
if (contentType.toLowerCase().startsWith(MULTIPART))
{
return true;
}
return false;
}
}