KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mortbay > servlet > PostFileFilter


1 //========================================================================
2
//$Id: PostFileFilter.java,v 1.1 2005/10/05 11:54:37 gregwilkins Exp $
3
//Copyright 2004 Mort Bay Consulting Pty. Ltd.
4
//------------------------------------------------------------------------
5
//Licensed under the Apache License, Version 2.0 (the "License");
6
//you may not use this file except in compliance with the License.
7
//You may obtain a copy of the License at
8
//http://www.apache.org/licenses/LICENSE-2.0
9
//Unless required by applicable law or agreed to in writing, software
10
//distributed under the License is distributed on an "AS IS" BASIS,
11
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
//See the License for the specific language governing permissions and
13
//limitations under the License.
14
//========================================================================
15

16 package org.mortbay.servlet;
17
18 import java.io.File JavaDoc;
19 import java.io.FileOutputStream JavaDoc;
20 import java.io.IOException JavaDoc;
21 import java.io.InputStream JavaDoc;
22
23 import javax.servlet.Filter JavaDoc;
24 import javax.servlet.FilterChain JavaDoc;
25 import javax.servlet.FilterConfig JavaDoc;
26 import javax.servlet.ServletContext JavaDoc;
27 import javax.servlet.ServletException JavaDoc;
28 import javax.servlet.ServletRequest JavaDoc;
29 import javax.servlet.ServletResponse JavaDoc;
30 import javax.servlet.http.HttpServletRequest JavaDoc;
31 import javax.servlet.http.HttpServletResponse JavaDoc;
32
33 import sun.reflect.ReflectionFactory.GetReflectionFactoryAction;
34
35 /* ------------------------------------------------------------ */
36 /** PostFileFilter.
37  *
38  * Filter to accept file content from a POST request.
39  * The translated path is used as the file name to store the content from POST requests.
40  *
41  * Configuration init parameters:<ul>
42  * <li>bufferSize - The size of the buffer used to copy content
43  * <li>response - The response after the file is received:<ul>
44  * <li>ok - an empty response with an OK status
45  * <li>nocontent - an empty response with a NO_CONTENT status (the default)
46  * <li>chain - pass the request down the filter chain for normal response.
47  * <li>redirect - redirect for a GET request to the same URI
48  * </ul>
49  * </ul>
50  *
51  * @author gregw@mortbay.com
52  *
53  */

54 public class PostFileFilter implements Filter JavaDoc
55 {
56     ServletContext JavaDoc _context;
57     int _bufferSize=8092;
58     String JavaDoc _response="nocontent";
59     
60     public void init(FilterConfig JavaDoc filterConfig)
61         throws ServletException JavaDoc
62     {
63         _context=filterConfig.getServletContext();
64         String JavaDoc tmp=filterConfig.getInitParameter("bufferSize");
65         if (tmp!=null)
66             _bufferSize=Integer.parseInt(tmp);
67         tmp=filterConfig.getInitParameter("response");
68         if (tmp!=null)
69             _response=tmp;
70     }
71
72     public void doFilter(ServletRequest JavaDoc request, ServletResponse JavaDoc response, FilterChain JavaDoc chain)
73         throws IOException JavaDoc, ServletException JavaDoc
74     {
75         HttpServletRequest JavaDoc srequest = (HttpServletRequest JavaDoc)request;
76         HttpServletResponse JavaDoc sresponse = (HttpServletResponse JavaDoc)response;
77         
78         if ("POST".equalsIgnoreCase(srequest.getMethod()))
79         {
80             String JavaDoc filename = srequest.getPathTranslated();
81             if (filename==null)
82             {
83                 if (srequest.getPathInfo()==null)
84                     filename=_context.getRealPath(srequest.getServletPath());
85                 else
86                     filename=_context.getRealPath(srequest.getServletPath()+srequest.getPathInfo());
87             }
88             if (filename==null)
89             {
90                 sresponse.sendError(HttpServletResponse.SC_NOT_FOUND);
91                 return;
92             }
93             
94             if (srequest.getContentLength()==0)
95             {
96                 sresponse.sendError(HttpServletResponse.SC_LENGTH_REQUIRED);
97                 return;
98             }
99             
100             File JavaDoc file = new File JavaDoc(filename);
101             
102             if (file.exists() && (!file.canWrite() ||
103                                   file.isDirectory()) ||
104                !file.exists() && ( !file.getParentFile().exists() ||
105                                    !file.getParentFile().isDirectory() ||
106                                    !file.getParentFile().canWrite()))
107             {
108                 sresponse.sendError(HttpServletResponse.SC_FORBIDDEN, "No write permission");
109                 return;
110             }
111             
112             InputStream JavaDoc in = srequest.getInputStream();
113             FileOutputStream JavaDoc out = new FileOutputStream JavaDoc(file,false);
114             byte[] buf = new byte[_bufferSize];
115             while (true)
116             {
117                 int len=in.read(buf);
118                 if (len<0)
119                     break;
120                 out.write(buf,0,len);
121             }
122             out.close();
123             
124             if ("redirect".equalsIgnoreCase(_response))
125                 sresponse.sendRedirect(srequest.getRequestURI());
126             else if ("chain".equalsIgnoreCase(_response))
127                 chain.doFilter(request, response);
128             else if ("ok".equalsIgnoreCase(_response))
129                 sresponse.setStatus(HttpServletResponse.SC_OK);
130             else
131                 sresponse.setStatus(HttpServletResponse.SC_NO_CONTENT);
132         }
133         else
134             chain.doFilter(request, response);
135        
136     }
137
138     public void destroy()
139     {}
140
141 }
142
Popular Tags