File Source: titlepermalinkprovider.java

         /* 
    P/P   *  Method: net.sourceforge.pebble.permalink.TitlePermalinkProvider__static_init
          */
     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.permalink;
    33  
    34  import net.sourceforge.pebble.domain.*;
    35  
    36  import java.text.DateFormat;
    37  import java.text.SimpleDateFormat;
    38  import java.util.Date;
    39  import java.util.Iterator;
    40  import java.util.List;
    41  
    42  /**
    43   * Generates permalinks based upon the blog entry title. This implementation
    44   * only uses the following characters from the title:
    45   * <ul>
    46   * <li>a-z</li>
    47   * <li>A-Z</li>
    48   * <li>0-9</li>
    49   * <li>_ (underscore)</li>
    50   * </ul>
    51   * For titles without these characters (e.g. those using an extended character
    52   * set) the blog entry ID is used for the permalink instead.
    53   *
    54   * @author Simon Brown
    55   */
         /* 
    P/P   *  Method: void net.sourceforge.pebble.permalink.TitlePermalinkProvider()
          */
    56  public class TitlePermalinkProvider extends PermalinkProviderSupport {
    57  
    58    /** the regex used to check for a blog entry permalink */
    59    private static final String BLOG_ENTRY_PERMALINK_REGEX = "/\\d\\d\\d\\d/\\d\\d/\\d\\d/[\\w]*.html";
    60  
    61    /**
    62     * Gets the permalink for a blog entry.
    63     *
    64     * @return  a URI as a String
    65     */
    66    public synchronized String getPermalink(BlogEntry blogEntry) {
             /* 
    P/P       *  Method: String getPermalink(BlogEntry)
              * 
              *  Presumptions:
              *    net.sourceforge.pebble.domain.Blog:getBlogForDay(...)@71 != null
              *    net.sourceforge.pebble.domain.BlogEntry:getTitle(...)@67 != null
              *    net.sourceforge.pebble.domain.BlogEntry:getTitle(...)@77 != null
              *    net.sourceforge.pebble.domain.BlogService:getBlogEntry(...)@76 != null
              *    net.sourceforge.pebble.domain.Day:getBlogEntries(...)@72 != null
              * 
              *  Preconditions:
              *    blogEntry != null
              *    (soft) this.blog != null
              * 
              *  Test Vectors:
              *    net.sourceforge.pebble.domain.BlogEntry:getTitle(...)@67: Addr_Set{null}, Inverse{null}
              * 
              *  Presumptions:
              *    java.util.List:indexOf(...)@74 - java.util.List:size(...)@74 in -232..6_442_450_942
              *    java.util.List:size(...)@74 >= -231+1
              * 
              *  Postconditions:
              *    return_value != null
              * 
              *  Test Vectors:
              *    java.lang.String:equals(...)@77: {0}, {1}
              *    java.lang.String:length(...)@67: {1..232-1}, {0}
              */
    67      if (blogEntry.getTitle() == null || blogEntry.getTitle().length() == 0) {
    68        return buildPermalink(blogEntry) + ".html";
    69      } else {
    70        BlogService service = new BlogService();
    71        Day day = getBlog().getBlogForDay(blogEntry.getDate());
    72        List entries = day.getBlogEntries();
    73        int count = 0;
    74        for (int i = entries.size()-1; i > entries.indexOf(blogEntry.getId()); i--) {
    75          try {
    76            BlogEntry entry = service.getBlogEntry(getBlog(), (String)entries.get(i));
    77            if (entry.getTitle().equals(blogEntry.getTitle())) {
    78              count++;
    79            }
    80          } catch (BlogServiceException e) {
    81            // do nothing
    82          }
    83        }
    84  
    85        if (count == 0) {
    86          return buildPermalink(blogEntry) + ".html";
    87        } else {
    88          return buildPermalink(blogEntry) + "_" + blogEntry.getId() + ".html";
    89        }
    90      }
    91    }
    92  
    93    private String buildPermalink(BlogEntry blogEntry) {
             /* 
    P/P       *  Method: String buildPermalink(BlogEntry)
              * 
              *  Presumptions:
              *    net.sourceforge.pebble.domain.BlogEntry:getBlog(...)@111 != null
              * 
              *  Test Vectors:
              *    net.sourceforge.pebble.domain.BlogEntry:getTitle(...)@94: Addr_Set{null}, Inverse{null}
              * 
              *  Preconditions:
              *    blogEntry != null
              * 
              *  Postconditions:
              *    return_value != null
              * 
              *  Test Vectors:
              *    java.lang.String:length(...)@107: {1..232-1}, {0}
              *    java.lang.String:length(...)@95: {1..232-1}, {0}
              */
    94      String title = blogEntry.getTitle();
    95      if (title == null || title.length() == 0) {
    96        title = "" + blogEntry.getId();
    97      } else {
    98        title = title.toLowerCase();
    99        title = title.replaceAll("[\\. ,;/\\\\-]", "_");
   100        title = title.replaceAll("[^a-z0-9_]", "");
   101        title = title.replaceAll("_+", "_");
   102        title = title.replaceAll("^_*", "");
   103        title = title.replaceAll("_*$", "");
   104      }
   105  
   106      // if the title has been blanked out, use the blog entry instead
   107      if (title == null || title.length() == 0) {
   108        title = "" + blogEntry.getId();
   109      }
   110  
   111      Blog blog = blogEntry.getBlog();
   112      Date date = blogEntry.getDate();
   113      DateFormat year = new SimpleDateFormat("yyyy");
   114      year.setTimeZone(blog.getTimeZone());
   115      DateFormat month = new SimpleDateFormat("MM");
   116      month.setTimeZone(blog.getTimeZone());
   117      DateFormat day = new SimpleDateFormat("dd");
   118      day.setTimeZone(blog.getTimeZone());
   119  
   120      StringBuffer buf = new StringBuffer();
   121      buf.append("/");
   122      buf.append(year.format(date));
   123      buf.append("/");
   124      buf.append(month.format(date));
   125      buf.append("/");
   126      buf.append(day.format(date));
   127      buf.append("/");
   128      buf.append(title);
   129  
   130      return buf.toString();
   131    }
   132  
   133    /**
   134     * Determines whether the specified URI is a blog entry permalink.
   135     *
   136     * @param uri   a relative URI
   137     * @return      true if the URI represents a permalink to a blog entry,
   138     *              false otherwise
   139     */
   140    public boolean isBlogEntryPermalink(String uri) {
             /* 
    P/P       *  Method: bool isBlogEntryPermalink(String)
              * 
              *  Postconditions:
              *    init'ed(return_value)
              * 
              *  Test Vectors:
              *    uri: Addr_Set{null}, Inverse{null}
              */
   141      if (uri != null) {
   142        return uri.matches(BLOG_ENTRY_PERMALINK_REGEX);
   143      } else {
   144        return false;
   145      }
   146    }
   147  
   148    /**
   149     * Gets the blog entry referred to by the specified URI.
   150     *
   151     * @param uri   a relative URI
   152     * @return  a BlogEntry instance, or null if one can't be found
   153     */
   154    public BlogEntry getBlogEntry(String uri) {
             /* 
    P/P       *  Method: BlogEntry getBlogEntry(String)
              * 
              *  Presumptions:
              *    net.sourceforge.pebble.domain.Blog:getBlogForDay(...)@154 != null
              *    net.sourceforge.pebble.domain.BlogEntry:getLocalPermalink(...)@164 != null
              *    net.sourceforge.pebble.domain.BlogService:getBlogEntry(...)@161 != null
              *    net.sourceforge.pebble.domain.Day:getBlogEntries(...)@158 != null
              * 
              *  Preconditions:
              *    this.blog != null
              *    uri != null
              * 
              *  Postconditions:
              *    init'ed(return_value)
              * 
              *  Test Vectors:
              *    java.lang.String:endsWith(...)@164: {0}, {1}
              *    java.util.Iterator:hasNext(...)@159: {1}, {0}
              */
   155      BlogService service = new BlogService();
   156      Day day = getDay(uri);
   157  
   158      Iterator it = day.getBlogEntries().iterator();
   159      while (it.hasNext()) {
   160        try {
   161          BlogEntry blogEntry = service.getBlogEntry(getBlog(), (String)it.next());
   162          // use the local permalink, just in case the entry has been aggregated
   163          // and an original permalink assigned
   164          if (blogEntry.getLocalPermalink().endsWith(uri)) {
   165            return blogEntry;
   166          }
   167        } catch (BlogServiceException e) {
   168          // do nothing
   169        }
   170      }
   171  
   172      return null;
   173    }
   174  
   175  }








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