File Source: request.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.logging;
    33  
    34  import net.sourceforge.pebble.api.permalink.PermalinkProvider;
    35  import net.sourceforge.pebble.domain.Blog;
    36  import net.sourceforge.pebble.domain.BlogEntry;
    37  import net.sourceforge.pebble.domain.Month;
    38  import net.sourceforge.pebble.domain.Day;
    39  import net.sourceforge.pebble.permalink.DefaultPermalinkProvider;
    40  
    41  import java.text.SimpleDateFormat;
    42  import java.util.regex.Pattern;
    43  
    44  
    45  /**
    46   * Represents a requested URL along with a count of how many times it
    47   * has been accessed.
    48   *
    49   * @author    Simon Brown
    50   */
    51  public class Request extends CountedUrl {
    52  
           /* 
    P/P     *  Method: net.sourceforge.pebble.logging.Request__static_init
            * 
            *  Postconditions:
            *    init'ed(AUTHOR_FEED_REGEX)
            *    init'ed(CATEGORY_FEED_REGEX)
            *    init'ed(RESPONSES_FEED_REGEX)
            *    init'ed(TAG_FEED_REGEX)
            */
    53    private static final Pattern RESPONSES_FEED_REGEX = Pattern.compile("\\/responses\\/.*.xml");
    54    private static final Pattern CATEGORY_FEED_REGEX = Pattern.compile("\\/categories\\/.*\\/.*.xml");
    55    private static final Pattern TAG_FEED_REGEX = Pattern.compile("\\/tags\\/.*\\/.*.xml");
    56    private static final Pattern AUTHOR_FEED_REGEX = Pattern.compile("\\/authors\\/.*\\/.*.xml");
    57  
    58    /**
    59     * Creates a new instance representing the specified url.
    60     *
    61     * @param url   the url as a String
    62     */
    63    public Request(String url) {
             /* 
    P/P       *  Method: void net.sourceforge.pebble.logging.Request(String)
              * 
              *  Postconditions:
              *    init'ed(this.blog)
              *    init'ed(this.fileDownload)
              *    this.logEntries == &new LinkedList(CountedUrl#1)
              *    possibly_updated(this.name)
              *    init'ed(this.newsFeed)
              *    init'ed(this.pageView)
              *    init'ed(this.url)
              *    new LinkedList(CountedUrl#1) num objects == 1
              */
    64      super(url);
    65    }
    66  
    67    /**
    68     * Creates a new instance representing the specified url.
    69     *
    70     * @param url     the url as a String
    71     * @param blog    the owning Blog
    72     */
    73    public Request(String url, Blog blog) {
             /* 
    P/P       *  Method: void net.sourceforge.pebble.logging.Request(String, Blog)
              * 
              *  Postconditions:
              *    this.blog == blog
              *    init'ed(this.blog)
              *    init'ed(this.fileDownload)
              *    this.logEntries == &new LinkedList(CountedUrl#1)
              *    possibly_updated(this.name)
              *    init'ed(this.newsFeed)
              *    init'ed(this.pageView)
              *    init'ed(this.url)
              *    new LinkedList(CountedUrl#1) num objects == 1
              */
    74      super(url, blog);
    75    }
    76  
    77    protected void setUrl(String url) {
             /* 
    P/P       *  Method: void setUrl(String)
              * 
              *  Presumptions:
              *    net.sourceforge.pebble.domain.Blog:getPermalinkProvider(...)@163 != null
              * 
              *  Preconditions:
              *    (soft) init'ed(this.name)
              *    (soft) init'ed(this.blog)
              * 
              *  Presumptions:
              *    java.util.regex.Pattern:compile(...)@53 != null
              *    java.util.regex.Pattern:compile(...)@54 != null
              *    java.util.regex.Pattern:compile(...)@55 != null
              *    java.util.regex.Pattern:compile(...)@56 != null
              *    java.util.regex.Pattern:matcher(...)@82 != null
              *    ...
              * 
              *  Postconditions:
              *    possibly_updated(this.fileDownload)
              *    init'ed(this.name)
              *    possibly_updated(this.newsFeed)
              *    possibly_updated(this.pageView)
              *    this.url == url
              *    init'ed(this.url)
              * 
              *  Test Vectors:
              *    this.blog: Addr_Set{null}, Inverse{null}
              *    url: Addr_Set{null}, Inverse{null}
              *    java.lang.String:endsWith(...)@115: {0}, {1}
              *    java.lang.String:endsWith(...)@120: {0}, {1}
              *    java.lang.String:endsWith(...)@127: {0}, {1}
              *    java.lang.String:endsWith(...)@134: {0}, {1}
              *    java.lang.String:endsWith(...)@141: {0}, {1}
              *    java.lang.String:equals(...)@106: {0}, {1}
              *    java.lang.String:equals(...)@109: {1}, {0}
              *    java.lang.String:equals(...)@109: {0}, {1}
              *    ...
              */
    78      super.setUrl(url);
    79  
    80      if (url == null || url.length() == 0) {
    81        setName("None");
    82      } else if (RESPONSES_FEED_REGEX.matcher(url).matches()) {
    83        setName("Feed : Responses");
    84        setNewsFeed(true);
    85      } else if (CATEGORY_FEED_REGEX.matcher(url).matches()) {
    86        String categoryName = url.substring("/categories/".length(), url.lastIndexOf("/"));
    87        setName("Feed : category=" + categoryName);
    88        setNewsFeed(true);
    89      } else if (TAG_FEED_REGEX.matcher(url).matches()) {
    90        String tagName = url.substring("/tags/".length(), url.lastIndexOf("/"));
    91        setName("Feed : tag=" + tagName);
    92        setNewsFeed(true);
    93      } else if (AUTHOR_FEED_REGEX.matcher(url).matches()) {
    94        String authorName = url.substring("/authors/".length(), url.lastIndexOf("/"));
    95        setName("Feed : author=" + authorName);
    96        setNewsFeed(true);
    97      } else if (url.indexOf("rss.xml") > -1 ||
    98          url.indexOf("feed.xml") > -1 ||
    99          url.indexOf("feed.action") > -1 ||
   100          url.indexOf("rdf.xml") > -1 ||
   101          url.indexOf("atom.xml") > -1
   102          ) {
   103        setName("Feed : Blog Entries");
   104        setNewsFeed(true);
   105      } else if (blog != null) {
   106        if (url.equals("/")) {
   107          setName("Home");
   108          setPageView(true);
   109        } else if (url.equals("/categories/") || url.equals("/categories")) {
   110          setName("Categories");
   111          setPageView(true);
   112        } else if (url.equals("/tags/") || url.equals("/tags")) {
   113          setName("Tags");
   114          setPageView(true);
   115        } else if (url.equals("/files") || (url.startsWith("/files/") && url.endsWith("/"))) {
   116          setName("Files");
   117          setPageView(true);
   118        } else if (url.startsWith("/categories/")) {
   119          String categoryName = url.substring("/categories/".length());
   120          if (categoryName.endsWith("/")) {
   121            categoryName = categoryName.substring(0, categoryName.length()-1);
   122          }
   123          setName("Category : " + categoryName);
   124          setPageView(true);
   125        } else if (url.startsWith("/tags/")) {
   126          String tagName = url.substring("/tags/".length());
   127          if (tagName.endsWith("/")) {
   128            tagName = tagName.substring(0, tagName.length()-1);
   129          }
   130          setName("Tag : " + tagName);
   131          setPageView(true);
   132        } else if (url.startsWith("/authors/")) {
   133          String authorName = url.substring("/authors/".length());
   134          if (authorName.endsWith("/")) {
   135            authorName = authorName.substring(0, authorName.length()-1);
   136          }
   137          setName("Author : " + authorName);
   138          setPageView(true);
   139        } else if (url.startsWith("/files/")) {
   140          String fileName = url.substring("/files/".length());
   141          if (fileName.endsWith("/")) {
   142            fileName = fileName.substring(0, fileName.length()-1);
   143          }
   144          setName("File : " + fileName);
   145          setFileDownload(true);
   146        } else if (url.startsWith("/pages/")) {
   147          String pageName = url.substring("/pages/".length());
   148          setName("Static Page : " + pageName);
   149          setPageView(true);
   150        } else if (url.startsWith("/search.action")) {
   151          setName("Search");
   152          setPageView(true);
   153        } else if (url.startsWith("/blogentries/")) {
   154          String pageNumber = url.substring("/blogentries/".length());
   155          if (pageNumber.indexOf(".") > -1) {
   156  	        pageNumber = pageNumber.substring(0, pageNumber.indexOf("."));
   157  		} else {
   158  			pageNumber = "1";
   159  		}
   160          setName("Blog Entries : Page " + pageNumber);
   161          setPageView(true);
   162        } else {
   163          matchOnPermalinkProvider(url, blog.getPermalinkProvider());
   164  
   165          if (getName() == null) {
   166            // try with the default permalink provider
   167            DefaultPermalinkProvider defaultPermalinkProvider = new DefaultPermalinkProvider();
   168            defaultPermalinkProvider.setBlog(blog);
   169            matchOnPermalinkProvider(url, defaultPermalinkProvider);
   170          }
   171        }
   172      }
   173  
   174      if (getName() == null) {
   175        setName(url);
   176        setPageView(true);
   177      }
   178    }
   179  
   180    private void matchOnPermalinkProvider(String url,
   181        PermalinkProvider permalinkProvider) {
   182      try {
               /* 
    P/P         *  Method: void matchOnPermalinkProvider(String, PermalinkProvider)
                * 
                *  Test Vectors:
                *    net.sourceforge.pebble.api.permalink.PermalinkProvider:getBlogEntry(...)@184: Addr_Set{null}, Inverse{null}
                *    net.sourceforge.pebble.api.permalink.PermalinkProvider:getDay(...)@200: Addr_Set{null}, Inverse{null}
                *    net.sourceforge.pebble.api.permalink.PermalinkProvider:getMonth(...)@190: Addr_Set{null}, Inverse{null}
                *    net.sourceforge.pebble.api.permalink.PermalinkProvider:isBlogEntryPermalink(...)@183: {0}, {1}
                *    net.sourceforge.pebble.api.permalink.PermalinkProvider:isDayPermalink(...)@198: {0}, {1}
                *    net.sourceforge.pebble.api.permalink.PermalinkProvider:isMonthPermalink(...)@189: {0}, {1}
                * 
                *  Preconditions:
                *    (soft) permalinkProvider != null
                *    (soft) this.blog != null
                * 
                *  Postconditions:
                *    possibly_updated(this.name)
                *    possibly_updated(this.pageView)
                */
   183        if (permalinkProvider.isBlogEntryPermalink(url)) {
   184          BlogEntry blogEntry = permalinkProvider.getBlogEntry(url);
   185          if (blogEntry != null) {
   186            setName("Blog Entry : " + blogEntry.getTitle());
   187            setPageView(true);
   188          }
   189        } else if (permalinkProvider.isMonthPermalink(url)) {
   190          Month month = permalinkProvider.getMonth(url);
   191          SimpleDateFormat formatter = new SimpleDateFormat("MMMM yyyy", blog
   192              .getLocale());
   193          formatter.setTimeZone(blog.getTimeZone());
   194          if (month != null) {
   195            setName("Month : " + formatter.format(month.getDate()));
   196            setPageView(true);
   197          }
   198        } else if (permalinkProvider.isDayPermalink(url)) {
   199          Day day = null;
   200          day = permalinkProvider.getDay(url);
   201          SimpleDateFormat formatter = new SimpleDateFormat("dd MMMM yyyy", blog
   202              .getLocale());
   203          formatter.setTimeZone(blog.getTimeZone());
   204          if (day != null) {
   205            setName("Day : " + formatter.format(day.getDate()));
   206            setPageView(true);
   207          }
   208        }
   209      } catch (IllegalArgumentException e) {
   210        setName("Error: " + url);
   211        setPageView(false);
   212      }
   213    }
   214  
   215  }








SofCheck Inspector Build Version : 2.22510
request.java 2010-Jun-25 19:40:32
request.class 2010-Jul-19 20:23:38