1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.mortbay.servlet;
16
17 import java.io.File;
18 import java.io.FileOutputStream;
19 import java.io.IOException;
20
21 import javax.servlet.Filter;
22 import javax.servlet.FilterChain;
23 import javax.servlet.FilterConfig;
24 import javax.servlet.ServletException;
25 import javax.servlet.ServletRequest;
26 import javax.servlet.ServletResponse;
27 import javax.servlet.UnavailableException;
28 import javax.servlet.http.HttpServletRequest;
29 import javax.servlet.http.HttpServletResponse;
30
31 import org.mortbay.util.IO;
32 import org.mortbay.util.URIUtil;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 public class RestFilter implements Filter
53 {
54 private static final String HTTP_METHOD_PUT="PUT";
55 private static final String HTTP_METHOD_GET="GET";
56 private static final String HTTP_METHOD_DELETE="DELETE";
57
58 private FilterConfig filterConfig;
59 private long _maxPutSize;
60
61
62
63
64
65 public void init(FilterConfig filterConfig) throws UnavailableException
66 {
67 this.filterConfig=filterConfig;
68 String tmp = filterConfig.getInitParameter("maxPutSize");
69 if (tmp!=null)
70 _maxPutSize=Long.parseLong(tmp);
71 }
72
73
74
75
76
77
78 private File locateFile(HttpServletRequest request)
79 {
80 return new File(filterConfig.getServletContext().getRealPath(URIUtil.addPaths(request.getServletPath(),request.getPathInfo())));
81 }
82
83
84
85
86
87 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
88 {
89 if (!(request instanceof HttpServletRequest&&response instanceof HttpServletResponse))
90 {
91 chain.doFilter(request,response);
92 return;
93 }
94
95 HttpServletRequest httpRequest=(HttpServletRequest)request;
96 HttpServletResponse httpResponse=(HttpServletResponse)response;
97
98 if (httpRequest.getMethod().equals(HTTP_METHOD_GET))
99 {
100 chain.doFilter(httpRequest,httpResponse);
101 }
102 else if (httpRequest.getMethod().equals(HTTP_METHOD_PUT))
103 {
104 doPut(httpRequest,httpResponse);
105 }
106 else if (httpRequest.getMethod().equals(HTTP_METHOD_DELETE))
107 {
108 doDelete(httpRequest,httpResponse);
109 }
110 else
111 {
112 chain.doFilter(httpRequest,httpResponse);
113 }
114 }
115
116
117
118
119
120
121
122 protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
123 {
124 File file=locateFile(request);
125
126 if (file.exists())
127 {
128 boolean success=file.delete();
129 if (!success)
130 {
131 response.sendError(HttpServletResponse.SC_FORBIDDEN);
132 return;
133 }
134 }
135
136 FileOutputStream out=new FileOutputStream(file);
137 try
138 {
139 if (_maxPutSize>0)
140 {
141 int length=request.getContentLength();
142 if (length>_maxPutSize)
143 {
144 response.sendError(HttpServletResponse.SC_FORBIDDEN);
145 return;
146 }
147 IO.copy(request.getInputStream(),out,_maxPutSize);
148 }
149 else
150 IO.copy(request.getInputStream(),out);
151 }
152 finally
153 {
154 out.close();
155 }
156
157 response.setStatus(HttpServletResponse.SC_NO_CONTENT);
158 }
159
160
161
162
163
164
165
166
167 protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
168 {
169 File file=locateFile(request);
170
171 if (!file.exists())
172 {
173 response.sendError(HttpServletResponse.SC_NOT_FOUND);
174 return;
175 }
176
177 boolean success=IO.delete(file);
178
179 if (success)
180 {
181 response.setStatus(HttpServletResponse.SC_NO_CONTENT);
182 }
183 else
184 {
185 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
186 }
187 }
188
189 public void destroy()
190 {
191
192 }
193 }