[jboss-cvs] jboss-seam/src/main/org/jboss/seam/servlet ...
Shane Bryzak
Shane_Bryzak at symantec.com
Thu Feb 8 11:13:50 EST 2007
User: sbryzak2
Date: 07/02/08 11:13:50
Modified: src/main/org/jboss/seam/servlet MultipartRequest.java
SeamFilter.java
Added: src/main/org/jboss/seam/servlet MultipartFilter.java
package-info.java
Removed: src/main/org/jboss/seam/servlet MultipartConfig.java
SeamMultipartFilter.java
Log:
JBSEAM-790
Revision Changes Path
1.8 +11 -6 jboss-seam/src/main/org/jboss/seam/servlet/MultipartRequest.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: MultipartRequest.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/servlet/MultipartRequest.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- MultipartRequest.java 7 Feb 2007 23:43:56 -0000 1.7
+++ MultipartRequest.java 8 Feb 2007 16:13:50 -0000 1.8
@@ -38,7 +38,10 @@
private static final int BUFFER_SIZE = 2048;
private static final int CHUNK_SIZE = 512;
- private MultipartConfig config;
+ private boolean createTempFiles;
+
+ private int maxRequestSize;
+
private String encoding = null;
private Map<String,Param> parameters = null;
@@ -228,15 +231,17 @@
private HttpServletRequest request;
- public MultipartRequest(HttpServletRequest request, MultipartConfig config)
+ public MultipartRequest(HttpServletRequest request, boolean createTempFiles,
+ int maxRequestSize)
{
super(request);
this.request = request;
- this.config = config;
+ this.createTempFiles = createTempFiles;
+ this.maxRequestSize = maxRequestSize;
String contentLength = request.getHeader("Content-Length");
- if (contentLength != null && config.getMaxRequestSize() > 0 &&
- Integer.parseInt(contentLength) > config.getMaxRequestSize())
+ if (contentLength != null && maxRequestSize > 0 &&
+ Integer.parseInt(contentLength) > maxRequestSize)
{
throw new RuntimeException("Multipart request is larger than allowed size");
}
@@ -301,7 +306,7 @@
if (headers.containsKey(PARAM_FILENAME))
{
FileParam fp = new FileParam(paramName);
- if (config.getCreateTempFiles()) fp.createTempFile();
+ if (createTempFiles) fp.createTempFile();
fp.setContentType(headers.get(PARAM_CONTENT_TYPE));
fp.setFilename(headers.get(PARAM_FILENAME));
p = fp;
1.2 +181 -8 jboss-seam/src/main/org/jboss/seam/servlet/SeamFilter.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: SeamFilter.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/servlet/SeamFilter.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- SeamFilter.java 4 Feb 2007 02:30:49 -0000 1.1
+++ SeamFilter.java 8 Feb 2007 16:13:50 -0000 1.2
@@ -1,25 +1,198 @@
package org.jboss.seam.servlet;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
import javax.servlet.Filter;
+import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
-public abstract class SeamFilter implements Filter
-{
+import org.jboss.seam.contexts.Context;
+import org.jboss.seam.contexts.WebApplicationContext;
+public class SeamFilter implements Filter
+{
private ServletContext servletContext;
- public void init(FilterConfig filterConfig) throws ServletException
+ private Set<Filter> filters = new HashSet<Filter>();
+
+ private boolean disabled = false;
+ private String urlPattern = null;
+
+ private class FilterChainImpl implements FilterChain
{
- servletContext = filterConfig.getServletContext();
+ private Iterator<Filter> iter;
+
+ private ServletRequest request;
+ private ServletResponse response;
+
+ public FilterChainImpl(Iterator<Filter> iter)
+ {
+ this.iter = iter;
}
- public void destroy() {}
+ public ServletRequest getRequest()
+ {
+ return request;
+ }
+
+ public ServletResponse getResponse()
+ {
+ return response;
+ }
+
+ public void doFilter(ServletRequest request, ServletResponse response)
+ throws IOException, ServletException
+ {
+ this.request = request;
+ this.response = response;
+
+ if (iter.hasNext())
+ {
+ Filter filter = iter.next();
+
+ if (filter instanceof SeamFilter)
+ {
+ SeamFilter sf = (SeamFilter) filter;
+ if (sf.getUrlPattern() == null || sf.matchesRequestPath(request))
+ {
+ filter.doFilter(request, response, this);
+ }
+ else
+ {
+ this.doFilter(request, response);
+ }
+ }
+ else
+ {
+ filter.doFilter(request, response, this);
+ }
+ }
+ }
+ }
protected ServletContext getServletContext()
{
return servletContext;
}
+ public void init(FilterConfig filterConfig)
+ throws ServletException
+ {
+ servletContext = filterConfig.getServletContext();
+ initFilters();
+ }
+
+ protected void initFilters()
+ {
+ if (getClass().equals(SeamFilter.class))
+ {
+ Context ctx = new WebApplicationContext(servletContext);
+
+ addFilter((Filter) ctx.get(MultipartFilter.class));
+ }
+ }
+
+ public void doFilter(ServletRequest request, ServletResponse response,
+ FilterChain chain)
+ throws IOException, ServletException
+ {
+ FilterChainImpl fc = new FilterChainImpl(filters.iterator());
+ fc.doFilter(request, response);
+ chain.doFilter(fc.getRequest(), fc.getResponse());
+ }
+
+ protected boolean addFilter(Filter filter)
+ {
+ if (filter instanceof SeamFilter && ((SeamFilter) filter).isDisabled())
+ return false;
+
+ return filters.add(filter);
+ }
+
+ public String getUrlPattern()
+ {
+ return urlPattern;
+ }
+
+ public void setUrlPattern(String urlPattern)
+ {
+ this.urlPattern = urlPattern;
+ }
+
+ public boolean isDisabled()
+ {
+ return disabled;
+ }
+
+ public void setDisabled(boolean disabled)
+ {
+ this.disabled = disabled;
+ }
+
+ /**
+ * Pattern matching code, adapted from Tomcat. This method checks to see if
+ * the specified path matches the specified pattern.
+ *
+ * @param request ServletRequest The request containing the path
+ * @return boolean True if the path matches the pattern, false otherwise
+ */
+ private boolean matchesRequestPath(ServletRequest request)
+ {
+ if (!(request instanceof HttpServletRequest))
+ return true;
+
+ String path = ((HttpServletRequest) request).getServletPath();
+ String pattern = getUrlPattern();
+
+ if (path == null || "".equals(path)) path = "/";
+ if (pattern == null || "".equals(pattern)) pattern = "/";
+
+ // Check for an exact match
+ if (path.equals(pattern)) return true;
+
+ // Check for path prefix matching
+ if (pattern.startsWith("/") && pattern.endsWith("/*"))
+ {
+ pattern = pattern.substring(0, pattern.length() - 2);
+ if (pattern.length() == 0) return true;
+
+ if (path.endsWith("/")) path = path.substring(0, path.length() - 1);
+
+ while (true)
+ {
+ if (pattern.equals(path)) return true;
+ int slash = path.lastIndexOf('/');
+ if (slash <= 0) break;
+ path = path.substring(0, slash);
+ }
+ return false;
+ }
+
+ // Check for suffix matching
+ if (pattern.startsWith("*."))
+ {
+ int slash = path.lastIndexOf('/');
+ int period = path.lastIndexOf('.');
+ if ((slash >= 0) && (period > slash) && path.endsWith(pattern.substring(1)))
+ {
+ return true;
+ }
+ return false;
+ }
+
+ // Check for universal mapping
+ if (pattern.equals("/")) return true;
+
+ return false;
+ }
+
+ public void destroy() {}
}
1.1 date: 2007/02/08 16:13:50; author: sbryzak2; state: Exp;jboss-seam/src/main/org/jboss/seam/servlet/MultipartFilter.java
Index: MultipartFilter.java
===================================================================
package org.jboss.seam.servlet;
import static org.jboss.seam.InterceptionType.NEVER;
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.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Startup;
@Startup
@Scope(APPLICATION)
@Name("org.jboss.seam.filter.multipartFilter")
@Install(precedence = BUILT_IN)
@Intercept(NEVER)
public class MultipartFilter extends SeamFilter
{
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;
}
@Override
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))
{
chain.doFilter(new MultipartRequest(httpRequest, createTempFiles,
maxRequestSize), 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;
}
}
1.1 date: 2007/02/08 16:13:50; author: sbryzak2; state: Exp;jboss-seam/src/main/org/jboss/seam/servlet/package-info.java
Index: package-info.java
===================================================================
@Namespace(value="http://jboss.com/products/seam/filter", prefix="org.jboss.seam.filter")
package org.jboss.seam.servlet;
import org.jboss.seam.annotations.*;
More information about the jboss-cvs-commits
mailing list