File Source: comment.java

         /* 
    P/P   *  Method: net.sourceforge.pebble.domain.Comment__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.domain;
    33  
    34  import net.sourceforge.pebble.api.event.comment.CommentEvent;
    35  import net.sourceforge.pebble.util.StringUtils;
    36  
    37  import java.util.ArrayList;
    38  import java.util.Date;
    39  import java.util.List;
    40  
    41  /**
    42   * Represents a blog comment.
    43   *
    44   * @author    Simon Brown
    45   */
    46  public class Comment extends Response {
    47  
    48    /** the body of the comment */
    49    private String body;
    50  
    51    /** the name of the author */
    52    private String author;
    53  
    54    /** the author's e-mail address */
    55    private String email;
    56  
    57    /** the author's website */
    58    private String website;
    59  
    60    /** the parent comment, if applicable */
    61    private Comment parent;
    62  
    63    /** the collection of nested comments */
    64    private List comments = new ArrayList();
    65  
    66    /** a flag to indicate whether the user was authenticated when the comment was left */
    67    private boolean authenticated = false;
    68  
           /* 
    P/P     *  Method: void net.sourceforge.pebble.domain.Comment()
            * 
            *  Postconditions:
            *    this.authenticated == 0
            *    this.spamScore == 0
            *    this.comments == &new ArrayList(Comment#1)
            *    this.events == &new ArrayList(Content#1)
            *    init'ed(this.eventsEnabled)
            *    this.propertyChangeEvents == &new ArrayList(Content#3)
            *    this.propertyChangeSupport == &new PropertyChangeSupport(Content#2)
            *    new ArrayList(Comment#1) num objects == 1
            *    new ArrayList(Content#1) num objects == 1
            *    new ArrayList(Content#3) num objects == 1
            *    ...
            */
    69    public Comment() {
    70    }
    71  
    72    /**
    73     * Creates a new comment with the specified properties.
    74     *
    75     * @param title        the comment title
    76     * @param body        the comment body
    77     * @param author      the name of the author
    78     * @param website     the author's website
    79     * @param ipAddress the IP address of the author
    80     * @param date        the date that this comment was left
    81     * @param state       the state of the comment
    82     * @param blogEntry   the owning blog entry
    83     */
    84    Comment(String title, String body, String author, String email, String website, String ipAddress, Date date, State state, BlogEntry blogEntry) {
             /* 
    P/P       *  Method: void net.sourceforge.pebble.domain.Comment(String, String, String, String, String, String, Date, State, BlogEntry)
              * 
              *  Preconditions:
              *    blogEntry != null
              * 
              *  Postconditions:
              *    init'ed(this.authenticated)
              *    this.author == One-of{&"Anonymous", author}
              *    this.author != null
              *    this.blogEntry == blogEntry
              *    this.blogEntry != null
              *    this.body == One-of{null, body}
              *    init'ed(this.body)
              *    this.comments == &new ArrayList(Comment#1)
              *    init'ed(this.date)
              *    init'ed(this.email)
              *    ...
              */
    85      super(title, ipAddress, date, state, blogEntry);
    86  
    87      setBody(body);
    88      setAuthor(author);
    89      setEmail(email);
    90      setWebsite(website);
    91    }
    92  
    93    /**
    94     * Gets the body of this comment.
    95     *
    96     * @return    the body of this comment as a String
    97     */
    98    public String getBody() {
             /* 
    P/P       *  Method: String getBody()
              * 
              *  Preconditions:
              *    init'ed(this.body)
              * 
              *  Postconditions:
              *    return_value == this.body
              *    init'ed(return_value)
              */
    99      return body;
   100    }
   101  
   102    /**
   103     * Gets the content of this response.
   104     *
   105     * @return a String
   106     */
   107    public String getContent() {
             /* 
    P/P       *  Method: String getContent()
              * 
              *  Preconditions:
              *    init'ed(this.body)
              * 
              *  Postconditions:
              *    return_value == this.body
              *    init'ed(return_value)
              */
   108      return getBody();
   109    }
   110  
   111    /**
   112     * Gets the body of this comment, truncated and without HTML tags.
   113     *
   114     * @return    the body of this comment as a String
   115     */
   116    public String getTruncatedBody() {
             /* 
    P/P       *  Method: String getTruncatedBody()
              * 
              *  Preconditions:
              *    (soft) init'ed(this.body)
              *    (soft) init'ed(this.excerpt)
              * 
              *  Postconditions:
              *    init'ed(return_value)
              */
   117      return this.getTruncatedContent();
   118    }
   119  
   120    /**
   121     * Sets the title of this comment.
   122     *
   123     * @param   title    the title of this comment as a String
   124     */
   125    public void setTitle(String title) {
             /* 
    P/P       *  Method: void setTitle(String)
              * 
              *  Preconditions:
              *    (soft) init'ed(this.blogEntry)
              * 
              *  Postconditions:
              *    this.title != null
              * 
              *  Test Vectors:
              *    this.blogEntry: Addr_Set{null}, Inverse{null}
              *    title: Addr_Set{null}, Inverse{null}
              *    java.lang.String:length(...)@126: {1..232-1}, {0}
              */
   126      if (title == null || title.length() == 0) {
   127        if (blogEntry != null) {
   128          this.title = "Re: " + blogEntry.getTitle();
   129        } else {
   130          this.title = "Comment";
   131        }
   132      } else {
   133        this.title = title;
   134      }
   135    }
   136  
   137    /**
   138     * Sets the body of this comment.
   139     *
   140     * @param   body    the body of this comment as a String
   141     */
   142    public void setBody(String body) {
             /* 
    P/P       *  Method: void setBody(String)
              * 
              *  Postconditions:
              *    this.body == One-of{null, body}
              *    init'ed(this.body)
              * 
              *  Test Vectors:
              *    body: Addr_Set{null}, Inverse{null}
              *    java.lang.String:length(...)@143: {1..232-1}, {0}
              */
   143      if (body == null || body.length() == 0) {
   144        this.body = null;
   145      } else {
   146        this.body = body;
   147      }
   148    }
   149  
   150    /**
   151     * Gets the name of the author.
   152     *
   153     * @return    the name of the author as a String
   154     */
   155    public String getAuthor() {
             /* 
    P/P       *  Method: String getAuthor()
              * 
              *  Preconditions:
              *    init'ed(this.author)
              * 
              *  Postconditions:
              *    return_value == this.author
              *    init'ed(return_value)
              */
   156      return author;
   157    }
   158  
   159    /**
   160     * Gets the name of the source of this response.
   161     *
   162     * @return a String
   163     */
   164    public String getSourceName() {
             /* 
    P/P       *  Method: String getSourceName()
              * 
              *  Preconditions:
              *    init'ed(this.author)
              * 
              *  Postconditions:
              *    return_value == this.author
              *    init'ed(return_value)
              */
   165      return getAuthor();
   166    }
   167  
   168    /**
   169     * Sets the author of this blog comment. If an author isn't specified,
   170     * the author is set to be "Anonymous".
   171     *
   172     * @param author    the name of the author
   173     */
   174    public void setAuthor(String author) {
             /* 
    P/P       *  Method: void setAuthor(String)
              * 
              *  Postconditions:
              *    this.author == One-of{&"Anonymous", author}
              *    this.author != null
              * 
              *  Test Vectors:
              *    author: Addr_Set{null}, Inverse{null}
              *    java.lang.String:length(...)@175: {1..232-1}, {0}
              */
   175      if (author == null || author.length() == 0) {
   176        this.author = "Anonymous";
   177      } else {
   178        this.author = author;
   179      }
   180    }
   181  
   182    /**
   183     * Gets the author's e-mail address.
   184     *
   185     * @return    the author's e-mail address as a String
   186     */
   187    public String getEmail() {
             /* 
    P/P       *  Method: String getEmail()
              * 
              *  Preconditions:
              *    init'ed(this.email)
              * 
              *  Postconditions:
              *    return_value == this.email
              *    init'ed(return_value)
              */
   188      return email;
   189    }
   190  
   191    /**
   192     * Sets the author's e-mail address.
   193     *
   194     * @param email   the e-mail address
   195     */
   196    public void setEmail(String email) {
             /* 
    P/P       *  Method: void setEmail(String)
              * 
              *  Postconditions:
              *    init'ed(this.email)
              * 
              *  Test Vectors:
              *    email: Addr_Set{null}, Inverse{null}
              *    java.lang.String:length(...)@197: {1..232-1}, {0}
              */
   197      if (email == null || email.length() == 0) {
   198        this.email = null;
   199      } else {
   200        this.email = StringUtils.transformHTML(email);
   201      }
   202    }
   203  
   204    /**
   205     * Gets the author's website.
   206     *
   207     * @return    the author's website as a String
   208     */
   209    public String getWebsite() {
             /* 
    P/P       *  Method: String getWebsite()
              * 
              *  Preconditions:
              *    init'ed(this.website)
              * 
              *  Postconditions:
              *    return_value == this.website
              *    init'ed(return_value)
              */
   210      return website;
   211    }
   212  
   213    /**
   214     * Gets the link to the source of this response.
   215     *
   216     * @return a String
   217     */
   218    public String getSourceLink() {
             /* 
    P/P       *  Method: String getSourceLink()
              * 
              *  Preconditions:
              *    init'ed(this.website)
              * 
              *  Postconditions:
              *    return_value == this.website
              *    init'ed(return_value)
              */
   219      return getWebsite();
   220    }
   221  
   222    /**
   223     * Sets the author's website.
   224     *
   225     * @param website   the website url
   226     */
   227    public void setWebsite(String website) {
             /* 
    P/P       *  Method: void setWebsite(String)
              * 
              *  Postconditions:
              *    init'ed(this.website)
              * 
              *  Test Vectors:
              *    java.lang.String:length(...)@229: {1..232-1}, {0}
              *    java.lang.String:startsWith(...)@232: {1}, {0}
              *    java.lang.String:startsWith(...)@233: {1}, {0}
              *    java.lang.String:startsWith(...)@234: {1}, {0}
              *    java.lang.String:startsWith(...)@235: {1}, {0}
              *    net.sourceforge.pebble.util.StringUtils:filterHTML(...)@228: Addr_Set{null}, Inverse{null}
              */
   228      website = StringUtils.filterHTML(website);
   229      if (website == null || website.length() == 0) {
   230        this.website = null;
   231      } else if (
   232          !website.startsWith("http://") &&
   233          !website.startsWith("https://") &&
   234          !website.startsWith("ftp://") &&
   235          !website.startsWith("mailto:")) {
   236        this.website = "http://" + website;
   237      } else {
   238        this.website = website;
   239      }
   240    }
   241  
   242    /**
   243     * Gets the permalink for this comment.
   244     *
   245     * @return  a URL as a String
   246     */
   247    public String getPermalink() {
             /* 
    P/P       *  Method: String getPermalink()
              * 
              *  Preconditions:
              *    init'ed(this.blogEntry)
              *    (soft) init'ed(this.blogEntry.permalink)
              *    (soft) this.blogEntry.blog != null
              *    (soft) this.date != null
              * 
              *  Postconditions:
              *    return_value != null
              *    init'ed(this.blogEntry.permalink)
              * 
              *  Preconditions:
              *    (soft) net/sourceforge/pebble/domain/BlogManager.instance != null
              *    (soft) init'ed(net/sourceforge/pebble/domain/BlogManager.instance.multiBlog)
              *    (soft) init'ed(this.blogEntry.blog.id)
              *    (soft) this.blogEntry.blog.permalinkProvider != null
              * 
              *  Test Vectors:
              *    this.blogEntry: Addr_Set{null}, Inverse{null}
              */
   248      if (blogEntry != null) {
   249        return blogEntry.getLocalPermalink() + "#comment" + getId();
   250      } else {
   251        return "";
   252      }
   253    }
   254  
   255    /**
   256     * Gets the owning comment, if this comment is nested.
   257     *
   258     * @return    a Comment instance, or null if this comment isn't nested
   259     */
   260    public Comment getParent() {
             /* 
    P/P       *  Method: Comment getParent()
              * 
              *  Preconditions:
              *    init'ed(this.parent)
              * 
              *  Postconditions:
              *    return_value == this.parent
              *    init'ed(return_value)
              */
   261      return this.parent;
   262    }
   263  
   264    /**
   265     * Sets the owning comment.
   266     *
   267     * @param parent    the owning Comment instance
   268     */
   269    public void setParent(Comment parent) {
             /* 
    P/P       *  Method: void setParent(Comment)
              * 
              *  Postconditions:
              *    this.parent == parent
              *    init'ed(this.parent)
              */
   270      this.parent = parent;
   271    }
   272  
   273    /**
   274     * Gets the number of parents that this comment has.
   275     *
   276     * @return  the number of parents as an int
   277     */
   278    public int getNumberOfParents() {
             /* 
    P/P       *  Method: int getNumberOfParents()
              * 
              *  Preconditions:
              *    init'ed(this.parent)
              *    (soft) init'ed(this...parent)
              * 
              *  Postconditions:
              *    return_value >= 0
              */
   279      int count = 0;
   280      Comment c = getParent();
   281      while (c != null) {
   282        count++;
   283        c = c.getParent();
   284      }
   285  
   286      return count;
   287    }
   288  
   289    /**
   290     * Adds a child comment.
   291     *
   292     * @param comment   the Comment to add
   293     */
   294    void addComment(Comment comment) {
             /* 
    P/P       *  Method: void addComment(Comment)
              * 
              *  Preconditions:
              *    (soft) this.comments != null
              * 
              *  Postconditions:
              *    comment.parent == One-of{old comment.parent, this}
              * 
              *  Test Vectors:
              *    comment: Addr_Set{null}, Inverse{null}
              *    java.util.List:contains(...)@295: {1}, {0}
              */
   295      if (comment != null && !comments.contains(comment)) {
   296        comments.add(comment);
   297        comment.setParent(this);
   298      }
   299    }
   300  
   301    /**
   302     * Removes a child comment.
   303     *
   304     * @param comment   the Comment to be removed
   305     */
   306    void removeComment(Comment comment) {
             /* 
    P/P       *  Method: void removeComment(Comment)
              * 
              *  Preconditions:
              *    (soft) comment.blogEntry != null
              *    (soft) comment.comments != null
              *    (soft) init'ed(comment.eventsEnabled)
              *    (soft) this.blogEntry != null
              *    (soft) this.comments != null
              *    (soft) init'ed(this.eventsEnabled)
              * 
              *  Presumptions:
              *    child.blogEntry@309 != null
              *    child.comments@309 != null
              * 
              *  Postconditions:
              *    comment.parent == One-of{old comment.parent, null}
              * 
              *  Test Vectors:
              *    comment: Addr_Set{null}, Inverse{null}
              *    java.util.Iterator:hasNext(...)@309: {1}, {0}
              *    java.util.List:contains(...)@307: {0}, {1}
              */
   307      if (comment != null && comments.contains(comment)) {
   308        // remove all children
   309        for (Comment child : getComments()) {
   310          comment.removeComment(child);
   311        }
   312  
   313        // then remove the comment itself
   314        comments.remove(comment);
   315        comment.setParent(null);
   316  
   317        if (areEventsEnabled()) {
   318          getBlogEntry().addEvent(new CommentEvent(comment, CommentEvent.COMMENT_REMOVED));
   319        }
   320      }
   321    }
   322  
   323    /**
   324     * Gets a list of comments, in the order that they were left.
   325     *
   326     * @return  a List of Comment instances
   327     */
   328    public List<Comment> getComments() {
             /* 
    P/P       *  Method: List getComments()
              * 
              *  Preconditions:
              *    init'ed(this.comments)
              * 
              *  Postconditions:
              *    return_value == &new ArrayList(getComments#1)
              *    new ArrayList(getComments#1) num objects == 1
              */
   329      return new ArrayList<Comment>(comments);
   330    }
   331  
   332    /**
   333     * Creates and returns a copy of this object.
   334     *
   335     * @return a clone of this instance.
   336     * @see Cloneable
   337     */
   338    public Object clone() {
             /* 
    P/P       *  Method: Object clone()
              * 
              *  Preconditions:
              *    init'ed(this.authenticated)
              *    init'ed(this.author)
              *    this.blogEntry != null
              *    init'ed(this.body)
              *    init'ed(this.date)
              *    init'ed(this.email)
              *    init'ed(this.ipAddress)
              *    init'ed(this.parent)
              *    init'ed(this.state)
              *    init'ed(this.title)
              *    ...
              * 
              *  Postconditions:
              *    return_value == &new Comment(clone#1)
              *    new ArrayList(Comment#1) num objects == 1
              *    new ArrayList(Content#1) num objects == 1
              *    new ArrayList(Content#3) num objects == 1
              *    new Comment(clone#1) num objects == 1
              *    new PropertyChangeSupport(Content#2) num objects == 1
              *    return_value.authenticated == this.authenticated
              *    init'ed(return_value.authenticated)
              *    return_value.author == One-of{&"Anonymous", this.author}
              *    return_value.author != null
              *    ...
              */
   339      Comment comment = new Comment(title, body, author, email, website, ipAddress, date, getState(), blogEntry);
   340      comment.setParent(parent);
   341      comment.setAuthenticated(authenticated);
   342      return comment;
   343    }
   344  
   345    public boolean equals(Object o) {
             /* 
    P/P       *  Method: bool equals(Object)
              * 
              *  Preconditions:
              *    (soft) o.blogEntry != null
              *    (soft) o.date != null
              *    (soft) this.blogEntry != null
              *    (soft) this.date != null
              * 
              *  Presumptions:
              *    net.sourceforge.pebble.domain.BlogEntry:getId(...)@355 != null
              * 
              *  Postconditions:
              *    init'ed(return_value)
              * 
              *  Test Vectors:
              *    this == o: {0}, {1}
              *    java.lang.String:equals(...)@355: {0}, {1}
              */
   346      if (this == o) {
   347        return true;
   348      }
   349  
   350      if (!(o instanceof Comment)) {
   351        return false;
   352      }
   353  
   354      Comment comment = (Comment)o;
   355      return (getId() == comment.getId() && blogEntry.getId().equals(comment.getBlogEntry().getId()));
   356    }
   357  
   358    public int hashCode() {
             /* 
    P/P       *  Method: int hashCode()
              * 
              *  Preconditions:
              *    this.date != null
              * 
              *  Postconditions:
              *    init'ed(return_value)
              */
   359      return ("" + getId()).hashCode();
   360    }
   361  
   362    /**
   363     * Sets the state of this comment.
   364     */
   365    void setState(State s) {
             /* 
    P/P       *  Method: void setState(State)
              * 
              *  Preconditions:
              *    init'ed(this.state)
              *    init'ed(this.eventsEnabled)
              *    (soft) net.sourceforge.pebble.domain.State__static_init.new State(State__static_init#1).name != null
              *    (soft) net.sourceforge.pebble.domain.State__static_init.new State(State__static_init#2).name != null
              *    (soft) s != null
              *    (soft) init'ed(s.name)
              *    (soft) this.blogEntry != null
              * 
              *  Postconditions:
              *    this.state == s
              *    (soft) this.state != null
              * 
              *  Test Vectors:
              *    this.eventsEnabled: {0}, {1}
              */
   366      State previousState = getState();
   367      super.setState(s);
   368  
   369      if (areEventsEnabled()) {
   370        if (isApproved() && previousState != State.APPROVED) {
   371          getBlogEntry().addEvent(new CommentEvent(this, CommentEvent.COMMENT_APPROVED));
   372        } else if (isRejected() && previousState != State.REJECTED) {
   373          getBlogEntry().addEvent(new CommentEvent(this, CommentEvent.COMMENT_REJECTED));
   374        }
   375      }
   376    }
   377  
   378    public boolean isAuthenticated() {
             /* 
    P/P       *  Method: bool isAuthenticated()
              * 
              *  Preconditions:
              *    init'ed(this.authenticated)
              * 
              *  Postconditions:
              *    return_value == this.authenticated
              *    init'ed(return_value)
              */
   379      return authenticated;
   380    }
   381  
   382    public void setAuthenticated(boolean authenticated) {
             /* 
    P/P       *  Method: void setAuthenticated(bool)
              * 
              *  Postconditions:
              *    this.authenticated == authenticated
              *    init'ed(this.authenticated)
              */
   383      this.authenticated = authenticated;
   384    }
   385  
   386  }








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