File Source: RedirectServlet.java
1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. The ASF licenses this file to You
4 * under the Apache License, Version 2.0 (the "License"); you may not
5 * use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License. For additional information regarding
15 * copyright in this work, please see the NOTICE file in the top level
16 * directory of this distribution.
17 */
18
19 package org.apache.roller.weblogger.ui.rendering.velocity.deprecated;
20
21 import java.io.IOException;
22 import java.util.HashMap;
23 import java.util.Map;
24 import javax.servlet.ServletException;
25 import javax.servlet.http.HttpServlet;
26 import javax.servlet.http.HttpServletRequest;
27 import javax.servlet.http.HttpServletResponse;
28 import org.apache.commons.logging.Log;
29 import org.apache.commons.logging.LogFactory;
30 import org.apache.roller.weblogger.business.WebloggerFactory;
31 import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
32 import org.apache.roller.weblogger.util.URLUtilities;
33
34
35 /**
36 * Redirect pre-3.0 urls to new location using 301 redirects.
37 *
38 * @web.servlet name="RedirectServlet" load-on-startup="9"
39 * @web.servlet-mapping url-pattern="/language/*"
40 * @web.servlet-mapping url-pattern="/comments/*"
41 * @web.servlet-mapping url-pattern="/resources/*"
42 * @web.servlet-mapping url-pattern="/rsd/*"
43 * @web.servlet-mapping url-pattern="/flavor/*"
44 * @web.servlet-mapping url-pattern="/rss/*"
45 * @web.servlet-mapping url-pattern="/atom/*"
46 * @web.servlet-mapping url-pattern="/page/*"
47 * @web.servlet-mapping url-pattern="/search/*"
48 * @web.servlet-mapping url-pattern="/xmlrpc/*"
49 * @web.servlet-mapping url-pattern="/editor/*"
50 * @web.servlet-mapping url-pattern="/admin/*"
51 */
/*
P/P * Method: void org.apache.roller.weblogger.ui.rendering.velocity.deprecated.RedirectServlet()
*/
52 public class RedirectServlet extends HttpServlet {
53
/*
P/P * Method: org.apache.roller.weblogger.ui.rendering.velocity.deprecated.RedirectServlet__static_init
*
* Postconditions:
* init'ed(log)
*/
54 private static Log log = LogFactory.getLog(RedirectServlet.class);
55
56 public static final String LanguageServlet = "language";
57 public static final String CommentsServlet = "comments";
58 public static final String ResourceServlet = "resources";
59 public static final String RsdServlet = "rsd";
60 public static final String FlavorServlet = "flavor";
61 public static final String RssServlet = "rss";
62 public static final String AtomServlet = "atom";
63 public static final String PageServlet = "page";
64 public static final String SearchServlet = "search";
65 public static final String XmlrpcServlet = "xmlrpc";
66 public static final String EditorUI = "editor";
67 public static final String AdminUI = "admin";
68
69
70 /**
71 * Handle GET requests.
72 *
73 * All we are doing is calculating the new url for the given resource and
74 * sending a 301 redirect to it's new location.
75 */
76 public void doGet(HttpServletRequest request, HttpServletResponse response)
77 throws ServletException, IOException {
78
/*
P/P * Method: void doGet(HttpServletRequest, HttpServletResponse)
*
* Preconditions:
* log != null
* request != null
* response != null
* (soft) org/apache/roller/weblogger/ui/rendering/velocity/deprecated/OldCommentsRequest.log != null
* (soft) org/apache/roller/weblogger/ui/rendering/velocity/deprecated/OldFeedRequest.feedServlets != null
* (soft) org/apache/roller/weblogger/ui/rendering/velocity/deprecated/OldFeedRequest.mLogger != null
* (soft) org/apache/roller/weblogger/ui/rendering/velocity/deprecated/OldPageRequest.mLogger != null
*
* Test Vectors:
* java.lang.String:endsWith(...)@89: {0}, {1}
* java.lang.String:equals(...)@101: {0}, {1}
* java.lang.String:equals(...)@105: {0}, {1}
* java.lang.String:equals(...)@109: {0}, {1}
* java.lang.String:equals(...)@113: {0}, {1}
* java.lang.String:equals(...)@117: {0}, {1}
* java.lang.String:equals(...)@121: {0}, {1}
* java.lang.String:equals(...)@125: {0}, {1}
* java.lang.String:equals(...)@129: {0}, {1}
* java.lang.String:equals(...)@133: {0}, {1}
* ...
*/
79 String redirectUrl = null;
80
81 // figure out what servlet the request was destined for and parse
82 String servlet = request.getServletPath();
83 if(servlet != null && servlet.trim().length() > 1) {
84
85 // strip off the leading slash
86 servlet = servlet.substring(1);
87
88 // strip off trailing slash if needed
89 if(servlet.endsWith("/")) {
90 servlet = servlet.substring(0, servlet.length() - 1);
91 }
92 } else {
93 // bad request, 404
94 }
95
96 log.debug("uri = "+request.getRequestURI());
97 log.debug("path info = "+request.getPathInfo());
98
99
100 // language servlet
101 if(LanguageServlet.equals(servlet)) {
102 redirectUrl = figureLanguageRedirect(request);
103
104 // comments servlet
105 } else if(CommentsServlet.equals(servlet)) {
106 redirectUrl = figureCommentsRedirect(request);
107
108 // resource servlet
109 } else if(ResourceServlet.equals(servlet)) {
110 redirectUrl = figureResourceRedirect(request);
111
112 // rsd servlet
113 } else if(RsdServlet.equals(servlet)) {
114 redirectUrl = figureRsdRedirect(request);
115
116 // flavor servlet
117 } else if(FlavorServlet.equals(servlet)) {
118 redirectUrl = figureFeedRedirect(request);
119
120 // rss servlet
121 } else if(RssServlet.equals(servlet)) {
122 redirectUrl = figureFeedRedirect(request);
123
124 // atom servlet
125 } else if(AtomServlet.equals(servlet)) {
126 redirectUrl = figureFeedRedirect(request);
127
128 // page servlet
129 } else if(PageServlet.equals(servlet)) {
130 redirectUrl = figurePageRedirect(request);
131
132 // search servlet
133 } else if(SearchServlet.equals(servlet)) {
134 redirectUrl = figureSearchRedirect(request);
135
136 // xmlrpc servlet
137 } else if(XmlrpcServlet.equals(servlet)) {
138 redirectUrl = figureXmlrpcRedirect(request);
139
140 // editor UI
141 } else if(EditorUI.equals(servlet)) {
142 redirectUrl = figureEditorRedirect(request);
143
144 // admin UI
145 } else if(AdminUI.equals(servlet)) {
146 redirectUrl = figureAdminRedirect(request);
147 }
148
149 if(redirectUrl != null) {
150 log.debug("redirecting to "+redirectUrl);
151
152 // send an HTTP 301 response
153 response.setStatus(response.SC_MOVED_PERMANENTLY);
+ 154 response.setHeader("Location", redirectUrl);
155 } else {
156 // no redirect, send 404
157 response.sendError(response.SC_NOT_FOUND);
158 }
159 }
160
161
162 // language servlet has no new equivalent, so just redirect to weblog homepage
163 private String figureLanguageRedirect(HttpServletRequest request) {
164
/*
P/P * Method: String figureLanguageRedirect(HttpServletRequest)
*
* Preconditions:
* request != null
*
* Postconditions:
* java.lang.StringBuilder:toString(...)._tainted == 0
* return_value == One-of{null, &java.lang.StringBuilder:toString(...)}
* return_value in Addr_Set{null,&java.lang.StringBuilder:toString(...)}
*
* Test Vectors:
* javax.servlet.http.HttpServletRequest:getPathInfo(...)@167: Inverse{null}, Addr_Set{null}
*/
165 String newUrl = WebloggerRuntimeConfig.getRelativeContextURL();
166
167 String pathInfo = request.getPathInfo();
168 if(pathInfo == null) {
169 return null;
170 } else {
171 pathInfo = pathInfo.substring(1);
172 }
173
174 String[] pathElements = pathInfo.split("/", 2);
+ 175 return newUrl+"/"+pathElements[0]+"/";
176 }
177
178
179 // old comments were a form of permalink, so redirect to new permalinks
180 private String figureCommentsRedirect(HttpServletRequest request) {
181
/*
P/P * Method: String figureCommentsRedirect(HttpServletRequest)
*
* Preconditions:
* (soft) org/apache/roller/weblogger/ui/rendering/velocity/deprecated/OldCommentsRequest.log != null
* (soft) request != null
*
* Postconditions:
* init'ed(java.lang.StringBuffer:toString(...)._tainted)
* return_value in Addr_Set{null,&java.lang.StringBuffer:toString(...)}
*/
182 OldCommentsRequest commentsRequest = null;
183 try {
184 // get parsed version of old page request
185 commentsRequest = new OldCommentsRequest(request);
186 } catch (Exception ex) {
187 return null;
188 }
189
190 StringBuffer url = new StringBuffer();
191
192 url.append(WebloggerRuntimeConfig.getRelativeContextURL());
193 url.append("/").append(commentsRequest.getWeblogHandle()).append("/");
194
195 if(commentsRequest.getWeblogAnchor() != null) {
196
197 // permalink url
198 url.append("entry/").append(URLUtilities.encode(commentsRequest.getWeblogAnchor()));
199
200 } else {
201 return null;
202 }
203
204 return url.toString();
205 }
206
207
208 // redirect to new weblog resource location
209 private String figureResourceRedirect(HttpServletRequest request) {
210
/*
P/P * Method: String figureResourceRedirect(HttpServletRequest)
*
* Preconditions:
* request != null
*
* Postconditions:
* java.lang.StringBuilder:toString(...)._tainted == 0
* return_value == null
*
* Test Vectors:
* javax.servlet.http.HttpServletRequest:getPathInfo(...)@213: Inverse{null}, Addr_Set{null}
*/
211 String newUrl = WebloggerRuntimeConfig.getRelativeContextURL();
212
213 String pathInfo = request.getPathInfo();
214 if(pathInfo == null) {
215 return null;
216 } else {
217 pathInfo = pathInfo.substring(1);
218 }
219
220 String[] pathElements = pathInfo.split("/", 2);
+ 221 if(pathElements.length != 2) {
222 return null;
223 }
224
+ 225 return newUrl+"/"+pathElements[0]+"/resource/"+pathElements[1];
226 }
227
228
229 // redirect to new weblog rsd location
230 private String figureRsdRedirect(HttpServletRequest request) {
231
/*
P/P * Method: String figureRsdRedirect(HttpServletRequest)
*
* Preconditions:
* request != null
*
* Postconditions:
* java.lang.StringBuilder:toString(...)._tainted == 0
* return_value == One-of{null, &java.lang.StringBuilder:toString(...)}
* return_value in Addr_Set{null,&java.lang.StringBuilder:toString(...)}
*
* Test Vectors:
* javax.servlet.http.HttpServletRequest:getPathInfo(...)@234: Inverse{null}, Addr_Set{null}
*/
232 String newUrl = WebloggerRuntimeConfig.getRelativeContextURL();
233
234 String pathInfo = request.getPathInfo();
235 if(pathInfo == null) {
236 return null;
237 } else {
238 pathInfo = pathInfo.substring(1);
239 }
240
241 String[] pathElements = pathInfo.split("/", 2);
+ 242 return newUrl+"/"+pathElements[0]+"/rsd";
243 }
244
245
246 // redirect to new weblog feed location
247 private String figureFeedRedirect(HttpServletRequest request) {
248
/*
P/P * Method: String figureFeedRedirect(HttpServletRequest)
*
* Preconditions:
* (soft) org/apache/roller/weblogger/ui/rendering/velocity/deprecated/OldFeedRequest.feedServlets != null
* (soft) org/apache/roller/weblogger/ui/rendering/velocity/deprecated/OldFeedRequest.mLogger != null
* (soft) request != null
*
* Postconditions:
* init'ed(java.lang.StringBuilder:toString(...)._tainted)
* return_value in Addr_Set{null,&java.lang.StringBuilder:toString(...)}
*/
249 OldFeedRequest feedRequest = null;
250 try {
251 // get parsed version of old feed request
252 feedRequest = new OldFeedRequest(request);
253 } catch (Exception ex) {
254 return null;
255 }
256
257 String weblog = feedRequest.getWeblogHandle();
+ 258 if(weblog == null) {
259 // must be site-wide feed
260 weblog = WebloggerRuntimeConfig.getProperty("site.frontpage.weblog.handle");
261 }
262
263 String newUrl = WebloggerRuntimeConfig.getRelativeContextURL();
264 newUrl += "/"+weblog+"/feed/entries/"+feedRequest.getFlavor();
265
266 Map params = new HashMap();
267 if(feedRequest.getWeblogCategory() != null) {
268 params.put("cat", URLUtilities.encode(feedRequest.getWeblogCategory()));
269 }
270 if(feedRequest.isExcerpts()) {
271 params.put("excerpts", "true");
272 }
273
274 return newUrl + URLUtilities.getQueryString(params);
275 }
276
277
278 // redirect to new weblog page location
279 private String figurePageRedirect(HttpServletRequest request) {
280
/*
P/P * Method: String figurePageRedirect(HttpServletRequest)
*
* Preconditions:
* (soft) org/apache/roller/weblogger/ui/rendering/velocity/deprecated/OldPageRequest.mLogger != null
* (soft) request != null
*
* Postconditions:
* init'ed(java.lang.StringBuilder:toString(...)._tainted)
* return_value in Addr_Set{null,&java.lang.StringBuilder:toString(...)}
*
* Test Vectors:
* java.lang.String:startsWith(...)@319: {0}, {1}
*/
281 OldPageRequest pageRequest = null;
282 try {
283 // get parsed version of old page request
284 pageRequest = new OldPageRequest(request);
285 } catch (Exception ex) {
286 return null;
287 }
288
289 StringBuffer url = new StringBuffer();
290 Map params = new HashMap();
291
292 url.append(WebloggerRuntimeConfig.getRelativeContextURL());
293 url.append("/").append(pageRequest.getWeblogHandle()).append("/");
294
+ 295 if(pageRequest.getWeblogPage() != null &&
296 !"Weblog".equals(pageRequest.getWeblogPage())) {
297
298 // a custom page name, so they get the new /weblog/page/name url
299 url.append("page/").append(pageRequest.getWeblogPage());
300
301 // we also allow for params on custom pages
302 if(pageRequest.getWeblogDate() != null) {
303 params.put("date", pageRequest.getWeblogDate());
304 }
305 if(pageRequest.getWeblogCategory() != null) {
306 params.put("cat", URLUtilities.encode(pageRequest.getWeblogCategory()));
307 }
308 if(pageRequest.getWeblogAnchor() != null) {
309 params.put("entry", URLUtilities.encode(pageRequest.getWeblogAnchor()));
310 }
311
312 } else if(pageRequest.getWeblogAnchor() != null) {
313
314 // permalink url
315 url.append("entry/").append(URLUtilities.encode(pageRequest.getWeblogAnchor()));
316
+ 317 } else if(pageRequest.getWeblogCategory() != null && pageRequest.getWeblogDate() == null) {
318 String cat = pageRequest.getWeblogCategory();
319 if(pageRequest.getWeblogCategory().startsWith("/")) {
320 cat = pageRequest.getWeblogCategory().substring(1);
321 }
322
323 url.append("category/").append(URLUtilities.encode(cat));
324
+ 325 } else if(pageRequest.getWeblogDate() != null && pageRequest.getWeblogCategory() == null) {
326 url.append("date/").append(pageRequest.getWeblogDate());
327
328 } else {
+ 329 if(pageRequest.getWeblogDate() != null) {
+ 330 params.put("date", pageRequest.getWeblogDate());
331 }
+ 332 if(pageRequest.getWeblogCategory() != null) {
+ 333 params.put("cat", URLUtilities.encode(pageRequest.getWeblogCategory()));
334 }
335 }
336
337 return url.toString() + URLUtilities.getQueryString(params);
338 }
339
340
341 // redirect to new search servlet
342 private String figureSearchRedirect(HttpServletRequest request) {
343
/*
P/P * Method: String figureSearchRedirect(HttpServletRequest)
*
* Preconditions:
* request != null
*
* Presumptions:
* javax.servlet.http.HttpServletRequest:getParameter(...)@358 != null
* javax.servlet.http.HttpServletRequest:getParameter(...)@363 != null
*
* Postconditions:
* init'ed(java.lang.StringBuilder:toString(...)._tainted)
* return_value in Addr_Set{null,&java.lang.StringBuilder:toString(...)}
*
* Test Vectors:
* java.lang.String:length(...)@358: {0}, {1..232-1}
* java.lang.String:length(...)@363: {0}, {1..232-1}
* javax.servlet.http.HttpServletRequest:getParameter(...)@358: Addr_Set{null}, Inverse{null}
* javax.servlet.http.HttpServletRequest:getParameter(...)@363: Addr_Set{null}, Inverse{null}
* javax.servlet.http.HttpServletRequest:getPathInfo(...)@346: Inverse{null}, Addr_Set{null}
*/
344 String newUrl = WebloggerRuntimeConfig.getRelativeContextURL();
345
346 String pathInfo = request.getPathInfo();
347 if(pathInfo == null) {
348 return null;
349 } else {
350 pathInfo = pathInfo.substring(1);
351 }
352
353 String[] pathElements = pathInfo.split("/", 2);
+ 354 newUrl += "/"+pathElements[0]+"/search";
355
356 // query params
357 Map params = new HashMap();
358 if(request.getParameter("q") != null &&
359 request.getParameter("q").trim().length() > 0) {
360
361 params.put("q", request.getParameter("q"));
362
363 if(request.getParameter("c") != null &&
364 request.getParameter("c").trim().length() > 0) {
365 params.put("cat", request.getParameter("c"));
366 }
367 }
368
369 return newUrl + URLUtilities.getQueryString(params);
370 }
371
372
373 // redirect to new xmlrpc location
374 private String figureXmlrpcRedirect(HttpServletRequest request) {
375
/*
P/P * Method: String figureXmlrpcRedirect(HttpServletRequest)
*
* Presumptions:
* org.apache.roller.weblogger.business.Weblogger:getUrlStrategy(...)@376 != null
* org.apache.roller.weblogger.business.WebloggerFactory:getWeblogger(...)@376 != null
*
* Postconditions:
* init'ed(return_value)
*/
376 return WebloggerFactory.getWeblogger().getUrlStrategy().getXmlrpcURL(true);
377 }
378
379
380 // redirect to new editor UI location
381 private String figureEditorRedirect(HttpServletRequest request) {
382
/*
P/P * Method: String figureEditorRedirect(HttpServletRequest)
*
* Postconditions:
* java.lang.StringBuilder:toString(...)._tainted == 0
* return_value == &java.lang.StringBuilder:toString(...)
*/
383 return WebloggerRuntimeConfig.getRelativeContextURL()+"/roller-ui/";
384 }
385
386
387 // redirect to new admin UI location
388 private String figureAdminRedirect(HttpServletRequest request) {
389
/*
P/P * Method: String figureAdminRedirect(HttpServletRequest)
*
* Postconditions:
* java.lang.StringBuilder:toString(...)._tainted == 0
* return_value == &java.lang.StringBuilder:toString(...)
*/
390 return WebloggerRuntimeConfig.getRelativeContextURL()+"/roller-ui/";
391 }
392
393 }
SofCheck Inspector Build Version : 2.18479
| RedirectServlet.java |
2009-Jan-02 14:25:40 |
| RedirectServlet.class |
2009-Sep-04 03:12:45 |