abstractemailnotificationlistener.java

### File Source: abstractemailnotificationlistener.java

             /*
        P/P   *  Method: net.sourceforge.pebble.event.comment.AbstractEmailNotificationListener__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.event.comment;
        33
        34  import net.sourceforge.pebble.domain.Blog;
        35  import net.sourceforge.pebble.domain.Comment;
        36  import net.sourceforge.pebble.api.decorator.ContentDecoratorContext;
        37  import net.sourceforge.pebble.api.event.comment.CommentEvent;
        38  import net.sourceforge.pebble.util.MailUtils;
        39  import net.sourceforge.pebble.util.StringUtils;
        40
        41  import javax.mail.Session;
        42  import java.text.SimpleDateFormat;
        43  import java.util.Collection;
        44  import java.util.Iterator;
        45
        46  /**
        47   * Base class for listeners that send an e-mail notification when new
        48   * comments are added.
        49   *
        50   * @author Simon Brown
        51   */
             /*
        P/P   *  Method: void net.sourceforge.pebble.event.comment.AbstractEmailNotificationListener()
              */
        52  public abstract class AbstractEmailNotificationListener extends CommentListenerSupport {
        53
        54    /** a token to be replaced when sending e-mails */
        55    private static final String EMAIL_ADDRESS_TOKEN = "EMAIL_ADDRESS";
        56
        57    /**
        58     * Called when a comment has been added.
        59     *
        60     * @param event a CommentEvent instance
        61     */
        62    public void commentAdded(CommentEvent event) {
                 /*
        P/P       *  Method: void commentAdded(CommentEvent)
                  *
                  *  Preconditions:
                  *    event != null
                  *    (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#3).name != null
                  *    (soft) net/sourceforge/pebble/domain/BlogManager.instance != null
                  *    (soft) init'ed(net/sourceforge/pebble/domain/BlogManager.instance.multiBlog)
                  *
                  *  Presumptions:
                  *    comment.blogEntry.blog.decoratorChain.decorators@64 != null
                  *    comment.blogEntry.blog.decoratorChain@64 != null
                  *    comment.blogEntry.blog.permalinkProvider@64 != null
                  *    comment.blogEntry.blog.permalinkProvider@66 != null
                  *    comment.blogEntry.blog.properties@64 != null
                  *    ...
                  */
        63      Comment comment = event.getComment();
        64      if (comment.isApproved()) {
        65        sendNotification(comment);
        66      } else if (comment.isPending()) {
        67        sendApprovalRequest(comment);
        68      }
        69    }
        70
        71    /**
        72     * Called when a comment has been approved.
        73     *
        74     * @param event a CommentEvent instance
        75     */
        76    public void commentApproved(CommentEvent event) {
                 /*
        P/P       *  Method: void commentApproved(CommentEvent)
                  *
                  *  Preconditions:
                  *    event != null
                  *    (soft) net/sourceforge/pebble/domain/BlogManager.instance != null
                  *    (soft) init'ed(net/sourceforge/pebble/domain/BlogManager.instance.multiBlog)
                  *
                  *  Presumptions:
                  *    comment.blogEntry.blog.decoratorChain.decorators@77 != null
                  *    comment.blogEntry.blog.decoratorChain@77 != null
                  *    comment.blogEntry.blog.permalinkProvider@77 != null
                  *    comment.blogEntry.blog.properties@77 != null
                  *    comment.blogEntry.blog@77 != null
                  *    ...
                  */
        77      Comment comment = event.getComment();
        78      sendNotification(comment);
        79    }
        80
        81    private void sendNotification(Comment comment) {
                 /*
        P/P       *  Method: void sendNotification(Comment)
                  *
                  *  Preconditions:
                  *    comment != null
                  *    comment.blogEntry != null
                  *    comment.blogEntry.blog != null
                  *    comment.blogEntry.blog.decoratorChain != null
                  *    comment.blogEntry.blog.decoratorChain.decorators != null
                  *    comment.blogEntry.blog.properties != null
                  *    comment.blogEntry.comments != null
                  *    init'ed(comment.blogEntry.id)
                  *    init'ed(comment.blogEntry.title)
                  *    init'ed(comment.author)
                  *    ...
                  *
                  *  Presumptions:
                  *    java.util.Iterator:next(...)@112 != null
                  *
                  *  Postconditions:
                  *    init'ed(comment.author)
                  *    init'ed(comment.blogEntry.permalink)
                  *    possibly_updated(comment.blogEntry.user)
                  *    init'ed(comment.body)
                  *    possibly_updated(comment.email)
                  *    init'ed(comment.title)
                  *    init'ed(comment.website)
                  *
                  *  Test Vectors:
                  *    blogComment.email@112: Addr_Set{null}, Inverse{null}
                  *    java.lang.String:length(...)@113: {0}, {1..232-1}
                  *    java.util.Iterator:hasNext(...)@111: {1}, {0}
                  */
        82      Blog blog = comment.getBlogEntry().getBlog();
        83
        84      ContentDecoratorContext context = new ContentDecoratorContext();
        85      context.setView(ContentDecoratorContext.DETAIL_VIEW);
        86      context.setMedia(ContentDecoratorContext.EMAIL);
        87
        88      blog.getContentDecoratorChain().decorate(context, comment);
        89
        90      SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
        91      sdf.setTimeZone(blog.getTimeZone());
        92
        93      String subject = "[Comment] " + comment.getTitle();
        94      String author = StringUtils.transformHTML(comment.getAuthor());
        95      if (comment.getWebsite() != null) {
        96        author = "<a href=\"" + comment.getWebsite() + "\">" + author + "</a>";
        97      }
        98
        99      String message = "Comment from " + author + " on " + sdf.format(comment.getDate());
       100      message += " in response to " + comment.getBlogEntry().getTitle();
       101      message += "\n\n<br><br>";
       102      message += comment.getBody();
       103      message += "\n\n<br><br>";
       104      message += "<a href=\"" + comment.getPermalink() + "\">Permalink</a>";
       105      message += " | ";
       106      message += "<a href=\"" + blog.getUrl() + "removeEmailAddress.action?entry=" + comment.getBlogEntry().getId() + "&email=" + EMAIL_ADDRESS_TOKEN + "\">Opt-out</a>";
       107
       108      Collection to = getEmailAddresses(comment);
       109      Iterator it = comment.getBlogEntry().getComments().iterator();
       110      Comment blogComment;
       111      while (it.hasNext()) {
       112        blogComment = (Comment)it.next();
       113        if (blogComment.getEmail() != null && blogComment.getEmail().length() > 0) {
       114          to.add(blogComment.getEmail());
       115        }
       116      }
       117
       118      // now send personalized e-mails to the blog owner and everybody
       119      // that left a comment specifying their e-mail address
       120      try {
       121        Session session = MailUtils.createSession();
       122        Iterator emailAddresses = to.iterator();
       123        while (emailAddresses.hasNext()) {
       124          String emailAddress = (String)emailAddresses.next();
       125
       126          // customize the opt-out link and send the message
       127          MailUtils.sendMail(session, blog, emailAddress, subject,
       128              message.replaceAll(EMAIL_ADDRESS_TOKEN, emailAddress));
       129        }
       130      } catch (Exception e) {
       131        e.printStackTrace();
       132      }
       133    }
       134
       135    private void sendApprovalRequest(Comment comment) {
                 /*
        P/P       *  Method: void sendApprovalRequest(Comment)
                  *
                  *  Preconditions:
                  *    comment != null
                  *    init'ed(comment.author)
                  *    comment.blogEntry != null
                  *    comment.blogEntry.blog != null
                  *    comment.blogEntry.blog.properties != null
                  *    init'ed(comment.blogEntry.title)
                  *    init'ed(comment.body)
                  *    comment.date != null
                  *    comment.state != null
                  *    init'ed(comment.state.name)
                  *    ...
                  *
                  *  Postconditions:
                  *    init'ed(comment.blogEntry.permalink)
                  *    possibly_updated(comment.blogEntry.user)
                  *
                  *  Test Vectors:
                  *    comment.website: Addr_Set{null}, Inverse{null}
                  */
       136      Blog blog = comment.getBlogEntry().getBlog();
       137
       138      SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
       139      sdf.setTimeZone(blog.getTimeZone());
       140
       141      String subject = "[Comment-" + comment.getState().getName() + "] " + comment.getTitle();
       142      String author = StringUtils.transformHTML(comment.getAuthor());
       143      if (comment.getWebsite() != null) {
       144        author = "<a href=\"" + comment.getWebsite() + "\">" + author + "</a>";
       145      }
       146
       147      String message = "Comment from " + author + " on " + sdf.format(comment.getDate());
       148      message += " in response to " + comment.getBlogEntry().getTitle();
       149      message += "\n\n<br><br>";
       150      message += comment.getBody();
       151      message += "\n\n<br><br>";
       152      message += "<a href=\"" + comment.getPermalink() + "\">Permalink</a>";
       153      message += " | ";
       154      message += "<a href=\"" + blog.getUrl() + "manageResponses.secureaction?response=" + comment.getGuid() + "&submit=Approve" + "\">Approve</a>";
       155      message += " | ";
       156      message += "<a href=\"" + blog.getUrl() + "manageResponses.secureaction?response=" + comment.getGuid() + "&submit=Reject" + "\">Reject</a>";
       157      message += " | ";
       158      message += "<a href=\"" + blog.getUrl() + "manageResponses.secureaction?response=" + comment.getGuid() + "&submit=Remove" + "\">Remove</a>";
       159
       160      Collection to = getEmailAddresses(comment);
       161
       162      try {
       163        MailUtils.sendMail(MailUtils.createSession(), blog, to, subject, message);
       164      } catch (Exception e) {
       165        e.printStackTrace();
       166      }
       167    }
       168
       169    /**
       170     * Returns the collection of recipients.
       171     *
       172     * @param comment   the Comment from the event
       173     * @return  a Collection of e-mail addresses (Strings)
       174     */
       175    protected abstract Collection getEmailAddresses(Comment comment);
       176
       177  }

SofCheck Inspector Build Version : 2.22510

abstractemailnotificationlistener.java | 2010-Jun-25 19:40:32
abstractemailnotificationlistener.class | 2010-Jul-19 20:23:38
abstractemailnotificationlistener.class | 2010-Jul-16 19:33:50
abstractemailnotificationlistener.class | 2010-Jul-16 19:33:50
abstractemailnotificationlistener.class | 2010-Jul-19 20:23:38