uritransformer.java

### File Source: uritransformer.java

         1  /*
         2   * Copyright (c) 2003-2006, Simon Brown
         3   * All rights reserved.
         4   *
         5   * Redistribution and use in source and binary forms, with or without
         6   * modification, are permitted provided that the following conditions are met:
         7   *
         8   *   - Redistributions of source code must retain the above copyright
         9   *     notice, this list of conditions and the following disclaimer.
        10   *
        11   *   - Redistributions in binary form must reproduce the above copyright
        12   *     notice, this list of conditions and the following disclaimer in
        13   *     the documentation and/or other materials provided with the
        14   *     distribution.
        15   *
        16   *   - Neither the name of Pebble nor the names of its contributors may
        17   *     be used to endorse or promote products derived from this software
        18   *     without specific prior written permission.
        19   *
        20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
        21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
        24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
        28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
        29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        30   * POSSIBILITY OF SUCH DAMAGE.
        31   */
        32  package net.sourceforge.pebble.web.filter;
        33
        34  import net.sourceforge.pebble.domain.*;
        35  import net.sourceforge.pebble.permalink.DefaultPermalinkProvider;
        36  import net.sourceforge.pebble.api.permalink.PermalinkProvider;
        37  import org.apache.commons.logging.Log;
        38  import org.apache.commons.logging.LogFactory;
        39
        40  /**
        41   * Responsible for converting an incoming URI to a real URI used by Pebble.
        42   *
        43   * @author    Simon Brown
        44   */
             /*
        P/P   *  Method: void net.sourceforge.pebble.web.filter.UriTransformer()
              */
        45  public class UriTransformer {
        46
        47    /** literal used at the start of category URIs */
        48    private static final String CATEGORIES = "/categories";
        49
        50    /** literal used at the start of category URIs, in regex form */
        51    private static final String CATEGORIES_REGEX = "\\/categories\\/";
        52
        53    /** literal used at the start of tag URIs */
        54    private static final String TAGS = "/tags/";
        55
        56    /** literal used at the start of tag URIs, in regex form */
        57    private static final String TAGS_REGEX = "\\/tags\\/";
        58
        59    /** literal used at the start of author URIs */
        60    private static final String AUTHORS = "/authors/";
        61
        62    /** literal used at the start of tag URIs, in regex form */
        63    private static final String AUTHORS_REGEX = "\\/authors\\/";
        64
        65    /** the log used by this class */
               /*
        P/P     *  Method: net.sourceforge.pebble.web.filter.UriTransformer__static_init
                *
                *  Postconditions:
                *    init'ed(log)
                */
        66    private static Log log = LogFactory.getLog(UriTransformer.class);
        67
        68    /**
        69     * Checks for URI patterns and converts them to the appropriate action.
        70     *
        71     * @param uri     the initial URI
        72     * @param blog    the current Blog instance
        73     *
        74     * @return    the URI to used to service the original request (could be
        75     *            the same)
        76     */
        77    public String getUri(String uri, Blog blog) {
                 /*
        P/P       *  Method: String getUri(String, Blog)
                  *
                  *  Preconditions:
                  *    blog != null
                  *    log != null
                  *
                  *  Presumptions:
                  *    net.sourceforge.pebble.domain.Blog:getPermalinkProvider(...)@78 != null
                  *
                  *  Postconditions:
                  *    return_value != null
                  *
                  *  Test Vectors:
                  *    uri: Addr_Set{null}, Inverse{null}
                  *    java.lang.String:endsWith(...)@105: {0}, {1}
                  *    java.lang.String:endsWith(...)@107: {0}, {1}
                  *    java.lang.String:endsWith(...)@115: {0}, {1}
                  *    java.lang.String:endsWith(...)@127: {0}, {1}
                  *    java.lang.String:endsWith(...)@129: {0}, {1}
                  *    java.lang.String:endsWith(...)@139: {0}, {1}
                  *    java.lang.String:endsWith(...)@141: {0}, {1}
                  *    java.lang.String:endsWith(...)@149: {0}, {1}
                  *    java.lang.String:endsWith(...)@156: {0}, {1}
                  *    ...
                  */
        78      PermalinkProvider permalinkProvider = blog.getPermalinkProvider();
        79      DefaultPermalinkProvider defaultPermalinkProvider = new DefaultPermalinkProvider();
        80      defaultPermalinkProvider.setBlog(permalinkProvider.getBlog());
        81
        82      log.trace("URI before transformation : " + uri);
        83
        84      if (uri == null || uri.trim().equals("")) {
        85        uri = "/";
        86      }
        87
        88      // try to transform the URI with the permalink provider in use
        89      String result = getUri(uri, permalinkProvider);
        90      if (result == null) {
        91        // for backwards compatibility, try the default permalink provider
        92        result = getUri(uri, defaultPermalinkProvider);
        93      }
        94
        95      // if the result is still null, try the other URL patterns to transform the URI
        96      if (result == null) {
        97        if (uri.equals("/categories") || uri.equals("/categories/")) {
        98          // URI of the form /categories/
        99          result = "/viewCategories.action";
       100        } else if (uri.matches(CATEGORIES_REGEX + ".*\\/.*xml")) {
       101            // URI of the form /category[/subcategories]/[rss|rdf|atom].xml
       102            int indexOfLastSlash = uri.lastIndexOf("/");
       103            String categoryId = uri.substring(CATEGORIES.length(), indexOfLastSlash);
       104
       105            if (uri.endsWith("rdf.xml")) {
       106              result = "/feed.action?category=" + categoryId + "&flavor=rdf";
       107            } else if (uri.endsWith("atom.xml")) {
       108              result = "/feed.action?category=" + categoryId + "&flavor=atom";
       109            } else {
       110              result = "/feed.action?category=" + categoryId + "&flavor=rss20";
       111            }
       112        } else if (uri.startsWith(CATEGORIES)) {
       113          // URI of the form /categories/category/
       114          String category = uri.substring(CATEGORIES.length(), uri.length());
       115          if (category.endsWith("/")) {
       116            category = category.substring(0, category.length()-1);
       117          }
       118          result = "/viewCategory.action?category=" + category;
       119        } else if (uri.equals("/tags") || uri.equals("/tags/")) {
       120            // URI of the form /tags/
       121            result = "/viewTags.action";
       122        } else if (uri.matches(TAGS_REGEX + ".*\\/.*xml")) {
       123          // URI of the form /tags/tag/[rss|rdf|atom].xml
       124          int indexOfLastSlash = uri.lastIndexOf("/");
       125          String tag = uri.substring(TAGS.length(), indexOfLastSlash);
       126
       127          if (uri.endsWith("rdf.xml")) {
       128            result = "/feed.action?tag=" + tag + "&flavor=rdf";
       129          } else if (uri.endsWith("atom.xml")) {
       130            result = "/feed.action?tag=" + tag + "&flavor=atom";
       131          } else {
       132            result = "/feed.action?tag=" + tag + "&flavor=rss20";
       133          }
       134        } else if (uri.matches(AUTHORS_REGEX + ".*\\/.*xml")) {
       135          // URI of the form /authors/username/[rss|rdf|atom].xml
       136          int indexOfLastSlash = uri.lastIndexOf("/");
       137          String author = uri.substring(AUTHORS.length(), indexOfLastSlash);
       138
       139          if (uri.endsWith("rdf.xml")) {
       140            result = "/feed.action?author=" + author + "&flavor=rdf";
       141          } else if (uri.endsWith("atom.xml")) {
       142            result = "/feed.action?author=" + author + "&flavor=atom";
       143          } else {
       144            result = "/feed.action?author=" + author + "&flavor=rss20";
       145          }
       146        } else if (uri.startsWith(TAGS)) {
       147          // URI of the form /tags/tag/
       148          String tag = uri.substring(TAGS.length(), uri.length());
       149          if (tag.endsWith("/")) {
       150            tag = tag.substring(0, tag.length()-1);
       151          }
       152          result = "/viewTag.action?tag=" + Tag.encode(tag);
       153        } else if (uri.startsWith(AUTHORS)) {
       154          // URI of the form /authors/usename/
       155          String author = uri.substring(AUTHORS.length(), uri.length());
       156          if (author.endsWith("/")) {
       157            author = author.substring(0, author.length()-1);
       158          }
       159          result = "/aboutAuthor.action?user=" + author;
       160        } else if (uri.equals("/pages/") || uri.equals("/pages")) {
       161          result = "/viewStaticPage.action?name=index";
       162        } else if (uri.startsWith("/pages/")) {
       163          // url matches /pages/xyz.html
       164          String name = uri.substring(7, uri.length()-5);
       165
       166          result = "/viewStaticPage.action?name=";
       167          result += name;
       168        } else if (uri.startsWith("/images/")) {
       169          // url matches /images/xyz.xyz
       170          String name = uri.substring(7, uri.length());
       171
       172          result = "/file.action?type=" + FileMetaData.BLOG_IMAGE + "&name=";
       173          result += name;
       174        } else if (uri.startsWith("/files/")) {
       175          // url matches /files/xyz.xyz
       176          String name = uri.substring(6, uri.length());
       177
       178          result = "/file.action?type=" + FileMetaData.BLOG_FILE + "&name=";
       179          result += name;
       180        } else if (uri.startsWith("/theme/")) {
       181          // url matches /files/xyz.xyz
       182          String name = uri.substring(6, uri.length());
       183
       184          result = "/file.action?type=" + FileMetaData.THEME_FILE + "&name=";
       185          result += name;
       186        } else if (uri.matches("\\/help\\/\\w*\\.html")) {
       187          // url matches /help/xyz.html
       188          String name = uri.substring(6, uri.length());
       189
       190          result = "/viewHelp.secureaction?name=";
       191          result += name.substring(0, name.length()-5);
       192        } else if (uri.equals("/help") || uri.equals("/help/")) {
       193          // url matches /help/
       194          result = "/viewHelp.secureaction?name=index";
       195        } else if (uri.equals("/responses/rss.xml")) {
       196          // url is for a response feed
       197          result = "/responseFeed.action?flavor=rss20";
       198        } else if (uri.startsWith("/responses/rss.xml?entry=")) {
       199          // url is for a response feed
       200          result = "/responseFeed.action?flavor=rss20&" + uri.substring("/responses/rss.xml?".length());
       201        } else if (uri.startsWith("/rss.xml")) {
       202          // url matches rss.xml
       203          result = "/feed.action?flavor=rss20";
       204        } else if (uri.startsWith("/feed.xml")) {
       205          // url matches feed.xml
       206          result = "/feed.action?flavor=rss20";
       207        } else if (uri.startsWith("/rdf.xml")) {
       208          // url matches rdf.xml
       209          result = "/feed.action?flavor=rdf";
       210        } else if (uri.startsWith("/responses/atom.xml")) {
       211          // url is for a response feed
       212          result = "/responseFeed.action?flavor=atom";
       213        } else if (uri.startsWith("/atom.xml")) {
       214          // url matches atom.xml
       215          result = "/feed.action?flavor=atom";
       216        } else if (uri.equals("/today.html")) {
       217          // URI of the form /today.html
       218          result = "/viewDay.action";
       219        } else if (uri.equals("/about.html")) {
       220          // URI of the form /about.html
       221          result = "/about.action";
       222        } else if (uri.startsWith("/blogentries/")) {
       223          // view blog entries by page /blogentries/1.html
       224          String page = uri.substring(13, uri.length()-5);
       225          result = "/viewBlogEntriesByPage.action?page=" + page;
       226        } else if (uri.equals("/") || uri.equals("/index.jsp") || uri.equals("/index.html")) {
       227            result = "/viewHomePage.action";
       228        } else {
       229          result = uri;
       230        }
       231      }
       232
       233      log.trace("URI after transformation : " + result);
       234
       235      return result;
       236    }
       237
       238    /**
       239     * Checks for URI patterns and converts them to the appropriate action.
       240     *
       241     * @param uri     the initial URI
       242     * @param blog    the current Blog instance
       243     *
       244     * @return    the URI to used to service the original request (could be
       245     *            the same)
       246     */
       247    public String getUri(String uri, MultiBlog blog) {
       248      String result;
       249
                 /*
        P/P       *  Method: String getUri(String, MultiBlog)
                  *
                  *  Preconditions:
                  *    log != null
                  *
                  *  Postconditions:
                  *    return_value != null
                  *
                  *  Test Vectors:
                  *    uri: Addr_Set{null}, Inverse{null}
                  *    java.lang.String:equals(...)@252: {0}, {1}
                  *    java.lang.String:equals(...)@268: {1}, {0}
                  *    java.lang.String:equals(...)@268: {0}, {1}
                  *    java.lang.String:matches(...)@270: {0}, {1}
                  *    java.lang.String:startsWith(...)@256: {0}, {1}
                  *    java.lang.String:startsWith(...)@259: {0}, {1}
                  *    java.lang.String:startsWith(...)@262: {0}, {1}
                  *    java.lang.String:startsWith(...)@265: {0}, {1}
                  */
       250      log.trace("URI before transformation : " + uri);
       251
       252      if (uri == null || uri.trim().equals("")) {
       253        uri = "/";
       254      }
       255
       256      if (uri.startsWith("/rss.xml")) {
       257        // url matches rss.xml
       258        result = "/feed.action?flavor=rss20";
       259      } else if (uri.startsWith("/feed.xml")) {
       260        // url matches feed.xml
       261        result = "/feed.action?flavor=rss20";
       262      } else if (uri.startsWith("/rdf.xml")) {
       263        // url matches rdf.xml
       264        result = "/feed.action?flavor=rdf";
       265      } else if (uri.startsWith("/atom.xml")) {
       266        // url matches atom.xml
       267        result = "/feed.action?flavor=atom";
       268      } else if (uri.equals("/") || uri.equals("/index.jsp") || uri.equals("/index.html")) {
       269          result = "/viewHomePage.action";
       270      } else if (uri.matches("\\/help\\/\\w*\\.html")) {
       271        // url matches /help/xyz.html
       272        String name = uri.substring(6, uri.length());
       273
       274        result = "/viewHelp.secureaction?name=";
       275        result += name.substring(0, name.length()-5);
       276      } else {
       277        result = uri;
       278      }
       279
       280      log.trace("URI after transformation : " + result);
       281
       282      return result;
       283    }
       284
       285    /**
       286     * Checks for URI patterns and converts them to the appropriate action, using
       287     * the specified permalink provider.
       288     *
       289     * @param uri   the initial URI
       290     * @param permalinkProvider   a PermalinkProvider instance to try and
       291     *                            transform the URI with
       292     *
       293     * @return    the URI to used to service the original request (could be
       294     *            the same)
       295     */
       296    private String getUri(String uri, PermalinkProvider permalinkProvider) {
                 /*
        P/P       *  Method: String getUri(String, PermalinkProvider)
                  *
                  *  Preconditions:
                  *    permalinkProvider != null
                  *
                  *  Presumptions:
                  *    net.sourceforge.pebble.domain.Day:getMonth(...)@308 != null
                  *    net.sourceforge.pebble.domain.Day:getMonth(...)@309 != null
                  *    net.sourceforge.pebble.domain.Month:getYear(...)@308 != null
                  *    net.sourceforge.pebble.domain.Month:getYear(...)@316 != null
                  *
                  *  Postconditions:
                  *    init'ed(return_value)
                  *
                  *  Test Vectors:
                  *    net.sourceforge.pebble.api.permalink.PermalinkProvider:getBlogEntry(...)@300: Addr_Set{null}, Inverse{null}
                  *    net.sourceforge.pebble.api.permalink.PermalinkProvider:getDay(...)@305: Addr_Set{null}, Inverse{null}
                  *    net.sourceforge.pebble.api.permalink.PermalinkProvider:getMonth(...)@313: Addr_Set{null}, Inverse{null}
                  *    net.sourceforge.pebble.api.permalink.PermalinkProvider:isBlogEntryPermalink(...)@299: {0}, {1}
                  *    net.sourceforge.pebble.api.permalink.PermalinkProvider:isDayPermalink(...)@304: {0}, {1}
                  *    net.sourceforge.pebble.api.permalink.PermalinkProvider:isMonthPermalink(...)@312: {0}, {1}
                  */
       297      String result = null;
       298
       299      if (permalinkProvider.isBlogEntryPermalink(uri)) {
       300        BlogEntry blogEntry = permalinkProvider.getBlogEntry(uri);
       301        if (blogEntry != null) {
       302          result = "/viewBlogEntry.action?entry=" + blogEntry.getId();
       303        }
       304      } else if (permalinkProvider.isDayPermalink(uri)) {
       305        Day day = permalinkProvider.getDay(uri);
       306        if (day != null) {
       307          result = "/viewDay.action";
       308          result += "?year=" + day.getMonth().getYear().getYear();
       309          result += "&month=" + day.getMonth().getMonth();
       310          result += "&day=" + day.getDay();
       311        }
       312      } else if (permalinkProvider.isMonthPermalink(uri)) {
       313        Month month = permalinkProvider.getMonth(uri);
       314        if (month != null) {
       315          result = "/viewMonth.action";
       316          result += "?year=" + month.getYear().getYear();
       317          result += "&month=" + month.getMonth();
       318        }
       319      }
       320
       321      return result;
       322    }
       323
       324  }

SofCheck Inspector Build Version : 2.22510

uritransformer.java | 2010-Jun-25 19:40:32
uritransformer.class | 2010-Jul-19 20:23:38