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