[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