saveblogentryaction.java

### File Source: saveblogentryaction.java

             /*
        P/P   *  Method: net.sourceforge.pebble.web.action.SaveBlogEntryAction__static_init
              *
              *  Postconditions:
              *    init'ed(log)
              */
         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.action;
        33
        34  import net.sourceforge.pebble.Constants;
        35  import net.sourceforge.pebble.domain.*;
        36  import net.sourceforge.pebble.util.SecurityUtils;
        37  import net.sourceforge.pebble.util.StringUtils;
        38  import net.sourceforge.pebble.web.security.RequireSecurityToken;
        39  import net.sourceforge.pebble.web.validation.ValidationContext;
        40  import net.sourceforge.pebble.web.view.RedirectView;
        41  import net.sourceforge.pebble.web.view.View;
        42  import net.sourceforge.pebble.web.view.impl.BlogEntryFormView;
             /*
        P/P   *  Method: void net.sourceforge.pebble.web.action.SaveBlogEntryAction()
              */
        43  import org.apache.commons.httpclient.Header;
        44  import org.apache.commons.httpclient.HttpClient;
        45  import org.apache.commons.httpclient.methods.HeadMethod;
        46  import org.apache.commons.logging.Log;
        47  import org.apache.commons.logging.LogFactory;
        48
        49  import javax.servlet.ServletException;
        50  import javax.servlet.http.HttpServletRequest;
        51  import javax.servlet.http.HttpServletResponse;
        52  import java.io.IOException;
        53  import java.text.DateFormat;
        54  import java.text.ParseException;
        55  import java.util.Date;
        56  import java.util.HashSet;
        57  import java.util.Set;
        58
        59  /**
        60   * Saves a blog entry.
        61   *
        62   * @author    Simon Brown
        63   */
        64  @RequireSecurityToken
        65  public class SaveBlogEntryAction extends SecureAction {
        66
        67    /** the log used by this class */
        68    private static Log log = LogFactory.getLog(SaveBlogEntryAction.class);
        69
        70    /** the value used if the blog entry is being previewed rather than added */
        71    private static final String PREVIEW = "Preview";
        72
        73    /**
        74     * Peforms the processing associated with this action.
        75     *
        76     * @param request  the HttpServletRequest instance
        77     * @param response the HttpServletResponse instance
        78     * @return the name of the next view
        79     */
        80    public View process(HttpServletRequest request, HttpServletResponse response) throws ServletException {
                 /*
        P/P       *  Method: View process(HttpServletRequest, HttpServletResponse)
                  *
                  *  Preconditions:
                  *    request != null
                  *    this.model != null
                  *    this.model.data != null
                  *    (soft) log != null
                  *
                  *  Postconditions:
                  *    return_value in Addr_Set{&new BlogEntryFormView(previewBlogEntry#2),&new BlogEntryFormView(saveBlogEntry#2),&new RedirectView(saveBlogEntry#5),&new BlogEntryFormView(saveBlogEntry#6)}
                  *    new BlogEntryFormView(previewBlogEntry#2) num objects <= 1
                  *    new BlogEntryFormView(saveBlogEntry#2) num objects <= 1
                  *    new BlogEntryFormView(saveBlogEntry#6) num objects <= 1
                  *    new RedirectView(saveBlogEntry#5) num objects <= 1
                  *
                  *  Test Vectors:
                  *    java.lang.String:equalsIgnoreCase(...)@83: {0}, {1}
                  *    javax.servlet.http.HttpServletRequest:getParameter(...)@81: Addr_Set{null}, Inverse{null}
                  */
        81      String submitType = request.getParameter("submit");
        82
        83      if (submitType != null && submitType.equalsIgnoreCase(PREVIEW)) {
        84        return previewBlogEntry(request);
        85      } else {
        86        return saveBlogEntry(request);
        87      }
        88    }
        89
        90    private View previewBlogEntry(HttpServletRequest request) throws ServletException {
                 /*
        P/P       *  Method: View previewBlogEntry(HttpServletRequest)
                  *
                  *  Preconditions:
                  *    request != null
                  *    this.model != null
                  *    this.model.data != null
                  *    (soft) log != null
                  *
                  *  Postconditions:
                  *    return_value == &new BlogEntryFormView(previewBlogEntry#2)
                  *    new BlogEntryFormView(previewBlogEntry#2) num objects == 1
                  */
        91      BlogEntry blogEntry = getBlogEntry(request);
        92
    +   93      populateBlogEntry(blogEntry, request);
        94
        95      ValidationContext validationContext = new ValidationContext();
        96      blogEntry.validate(validationContext);
        97      getModel().put("validationContext", validationContext);
        98      getModel().put(Constants.BLOG_ENTRY_KEY, blogEntry);
        99
       100      return new BlogEntryFormView();
       101    }
       102
       103    private View saveBlogEntry(HttpServletRequest request) throws ServletException {
                 /*
        P/P       *  Method: View saveBlogEntry(HttpServletRequest)
                  *
                  *  Preconditions:
                  *    request != null
                  *    this.model != null
                  *    this.model.data != null
                  *    (soft) log != null
                  *
                  *  Presumptions:
                  *    net.sourceforge.pebble.domain.BlogEntry:getBlog(...)@105 != null
                  *
                  *  Postconditions:
                  *    return_value in Addr_Set{&new RedirectView(saveBlogEntry#5),&new BlogEntryFormView(saveBlogEntry#6),&new BlogEntryFormView(saveBlogEntry#2)}
                  *    new BlogEntryFormView(saveBlogEntry#2) num objects <= 1
                  *    new BlogEntryFormView(saveBlogEntry#6) num objects <= 1
                  *    new RedirectView(saveBlogEntry#5) num objects <= 1
                  */
       104      BlogEntry blogEntry = getBlogEntry(request);
    +  105      Blog blog = blogEntry.getBlog();
       106
       107      populateBlogEntry(blogEntry, request);
       108
       109      ValidationContext context = new ValidationContext();
       110      blogEntry.validate(context);
       111
       112      getModel().put("validationContext", context);
       113      getModel().put(Constants.BLOG_ENTRY_KEY, blogEntry);
       114
       115      if (context.hasErrors())  {
       116        return new BlogEntryFormView();
       117      } else {
       118        BlogService service = new BlogService();
       119        try {
       120          service.putBlogEntry(blogEntry);
       121          blog.info("Blog entry <a href=\"" + blogEntry.getLocalPermalink() + "\">" + blogEntry.getTitle() + "</a> saved.");
       122          getModel().put(Constants.BLOG_ENTRY_KEY, blogEntry);
       123          return new RedirectView(blogEntry.getLocalPermalink());
       124        } catch (BlogServiceException be) {
       125          log.error(be.getMessage(), be);
       126          context.addError(be.getMessage());
       127          be.printStackTrace();
       128          return new BlogEntryFormView();
       129        }
       130      }
       131    }
       132
       133    private BlogEntry getBlogEntry(HttpServletRequest request) throws ServletException {
                 /*
        P/P       *  Method: BlogEntry getBlogEntry(HttpServletRequest)
                  *
                  *  Preconditions:
                  *    request != null
                  *    this.model != null
                  *    this.model.data != null
                  *
                  *  Postconditions:
                  *    init'ed(return_value)
                  *    new BlogEntry(getBlogEntry#3) num objects <= 1
                  *
                  *  Test Vectors:
                  *    java.lang.String:equalsIgnoreCase(...)@138: {0}, {1}
                  *    javax.servlet.http.HttpServletRequest:getParameter(...)@136: Addr_Set{null}, Inverse{null}
                  */
       134      Blog blog = (Blog)getModel().get(Constants.BLOG_KEY);
       135      String id = request.getParameter("entry");
       136      String persistent = request.getParameter("persistent");
       137
       138      if (persistent != null && persistent.equalsIgnoreCase("true")) {
       139        BlogService service = new BlogService();
       140        try {
       141          return service.getBlogEntry(blog, id);
       142        } catch (BlogServiceException e) {
       143          throw new ServletException(e);
       144        }
       145      } else {
       146        BlogEntry blogEntry = new BlogEntry(blog);
       147        blogEntry.setAuthor(SecurityUtils.getUsername());
       148        return blogEntry;
       149      }
       150    }
       151
       152    private void populateBlogEntry(BlogEntry blogEntry, HttpServletRequest request) {
                 /*
        P/P       *  Method: void populateBlogEntry(BlogEntry, HttpServletRequest)
                  *
                  *  Preconditions:
                  *    blogEntry != null
                  *    request != null
                  *    (soft) log != null
                  *
                  *  Presumptions:
                  *    category.length@162 <= 232-1
                  *    java.text.DateFormat:getDateTimeInstance(...)@167 != null
                  *    java.text.DateFormat:parse(...)@175 != null
                  *    javax.servlet.http.HttpServletRequest:getAttribute(...)@153 != null
                  *
                  *  Test Vectors:
                  *    java.lang.String:equalsIgnoreCase(...)@204: {0}, {1}
                  *    java.lang.String:equalsIgnoreCase(...)@209: {0}, {1}
                  *    java.lang.String:length(...)@173: {0}, {1..232-1}
                  *    java.lang.String:length(...)@218: {0}, {1..232-1}
                  *    java.util.Date:after(...)@176: {0}, {1}
                  *    javax.servlet.http.HttpServletRequest:getParameter(...)@160: Addr_Set{null}, Inverse{null}
                  *    javax.servlet.http.HttpServletRequest:getParameter(...)@161: Addr_Set{null}, Inverse{null}
                  *    javax.servlet.http.HttpServletRequest:getParameter(...)@172: Addr_Set{null}, Inverse{null}
                  *    javax.servlet.http.HttpServletRequest:getParameter(...)@215: Addr_Set{null}, Inverse{null}
                  *    javax.servlet.http.HttpServletRequest:getParameterValues(...)@162: Addr_Set{null}, Inverse{null}
                  *    ...
                  */
       153      Blog blog = (Blog)request.getAttribute(Constants.BLOG_KEY);
       154      String title = StringUtils.stripScriptTags(request.getParameter("title"));
       155      String subtitle = StringUtils.stripScriptTags(request.getParameter("subtitle"));
       156      String body = StringUtils.filterNewlines(request.getParameter("body"));
       157      String excerpt = StringUtils.filterNewlines(request.getParameter("excerpt"));
       158      String originalPermalink = request.getParameter("originalPermalink");
       159      String tags = request.getParameter("tags");
       160      String commentsEnabled = request.getParameter("commentsEnabled");
       161      String trackBacksEnabled = request.getParameter("trackBacksEnabled");
       162      String category[] = request.getParameterValues("category");
       163      String timeZone = request.getParameter("timeZone");
       164
       165      // the date can only set on those entries that have not yet been persisted
       166      if (!blogEntry.isPersistent()) {
       167        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, blog.getLocale());
       168        dateFormat.setTimeZone(blog.getTimeZone());
       169        dateFormat.setLenient(false);
       170
       171        Date now = new Date();
       172        String dateAsString = request.getParameter("date");
       173        if (dateAsString != null && dateAsString.length() > 0) {
       174          try {
       175            Date date = dateFormat.parse(dateAsString);
       176            if (date.after(now)) {
       177              date = now;
       178            }
       179            blogEntry.setDate(date);
       180          } catch (ParseException pe) {
       181            log.warn(pe);
       182            blogEntry.setDate(now);
       183          }
       184        } else {
       185          // the date has been blanked out, so reset to "now"
       186          blogEntry.setDate(now);
       187        }
       188      }
       189
       190      blogEntry.setTimeZoneId(timeZone);
       191      blogEntry.setTitle(title);
       192      blogEntry.setSubtitle(subtitle);
       193      blogEntry.setBody(body);
       194      blogEntry.setExcerpt(excerpt);
       195      Set categories = new HashSet();
       196      if (category != null) {
       197        for (int i = 0; i < category.length; i++) {
       198          categories.add(blog.getCategory(category[i]));
       199        }
       200      }
       201      blogEntry.setCategories(categories);
       202      blogEntry.setTags(tags);
       203      blogEntry.setOriginalPermalink(originalPermalink);
       204      if (commentsEnabled != null && commentsEnabled.equalsIgnoreCase("true")) {
       205        blogEntry.setCommentsEnabled(true);
       206      } else {
       207        blogEntry.setCommentsEnabled(false);
       208      }
       209      if (trackBacksEnabled != null && trackBacksEnabled.equalsIgnoreCase("true")) {
       210        blogEntry.setTrackBacksEnabled(true);
       211      } else {
       212        blogEntry.setTrackBacksEnabled(false);
       213      }
       214
       215      String attachmentUrl = request.getParameter("attachmentUrl");
       216      String attachmentSize = request.getParameter("attachmentSize");
       217      String attachmentType = request.getParameter("attachmentType");
       218      if (attachmentUrl != null && attachmentUrl.length() > 0) {
       219        Attachment attachment = populateAttachment(blogEntry, attachmentUrl, attachmentSize, attachmentType);
       220        blogEntry.setAttachment(attachment);
       221      } else {
       222        blogEntry.setAttachment(null);
       223      }
       224    }
       225
       226    private Attachment populateAttachment(BlogEntry blogEntry, String attachmentUrl, String attachmentSize, String attachmentType) {
       227      if (attachmentSize == null || attachmentSize.length() == 0) {
       228        String absoluteAttachmentUrl =  attachmentUrl;
       229        try {
                     /*
        P/P           *  Method: Attachment populateAttachment(BlogEntry, String, String, String)
                      *
                      *  Preconditions:
                      *    (soft) attachmentUrl != null
                      *    (soft) blogEntry != null
                      *    (soft) log != null
                      *
                      *  Presumptions:
                      *    net.sourceforge.pebble.domain.BlogEntry:getBlog(...)@232 != null
                      *
                      *  Postconditions:
                      *    return_value == &new Attachment(populateAttachment#5)
                      *    new Attachment(populateAttachment#5) num objects == 1
                      *
                      *  Test Vectors:
                      *    attachmentSize: Addr_Set{null}, Inverse{null}
                      *    java.lang.String:length(...)@227: {1..232-1}, {0}
                      *    java.lang.String:length(...)@254: {0}, {1..232-1}
                      *    java.lang.String:startsWith(...)@231: {0}, {1}
                      *    org.apache.commons.httpclient.HttpClient:executeMethod(...)@236: {-231..199, 201..232-1}, {200}
                      *    org.apache.commons.httpclient.methods.HeadMethod:getResponseHeader(...)@238: Addr_Set{null}, Inverse{null}
                      *    org.apache.commons.httpclient.methods.HeadMethod:getResponseHeader(...)@242: Addr_Set{null}, Inverse{null}
                      */
       230          HttpClient httpClient = new HttpClient();
       231          if (absoluteAttachmentUrl.startsWith("./")) {
       232            absoluteAttachmentUrl = blogEntry.getBlog().getUrl() + absoluteAttachmentUrl.substring(2);
       233          }
       234
       235          HeadMethod headMethod = new HeadMethod(absoluteAttachmentUrl);
       236          int status = httpClient.executeMethod(headMethod);
       237          if (status == 200) {
       238            Header attachmentSizeHeader = headMethod.getResponseHeader("Content-Length");
       239            if (attachmentSizeHeader != null) {
       240              attachmentSize = attachmentSizeHeader.getValue();
       241            }
       242            Header attachmentTypeHeader = headMethod.getResponseHeader("Content-Type");
       243            if (attachmentTypeHeader != null) {
       244              attachmentType = attachmentTypeHeader.getValue();
       245            }
       246          }
       247        } catch (IOException e) {
       248          log.warn("Could not get details for attachment located at " + absoluteAttachmentUrl + " : " + e.getMessage());
       249        }
       250      }
       251
       252      Attachment attachment = new Attachment();
       253      attachment.setUrl(attachmentUrl);
       254      if (attachmentSize != null && attachmentSize.length() > 0) {
       255        attachment.setSize(Long.parseLong(attachmentSize));
       256      }
       257      attachment.setType(attachmentType);
       258
       259      return attachment;
       260    }
       261
       262    /**
       263     * Gets a list of all roles that are allowed to access this action.
       264     *
       265     * @return  an array of Strings representing role names
       266     * @param request
       267     */
       268    public String[] getRoles(HttpServletRequest request) {
                 /*
        P/P       *  Method: String[] getRoles(HttpServletRequest)
                  *
                  *  Presumptions:
                  *    init'ed(net.sourceforge.pebble.Constants.BLOG_CONTRIBUTOR_ROLE)
                  *
                  *  Postconditions:
                  *    return_value == &new String[](getRoles#1)
                  *    new String[](getRoles#1) num objects == 1
                  *    return_value.length == 1
                  *    return_value[0] == net.sourceforge.pebble.Constants.BLOG_CONTRIBUTOR_ROLE
                  *    (soft) init'ed(return_value[0])
                  */
       269      return new String[]{Constants.BLOG_CONTRIBUTOR_ROLE};
       270    }
       271
       272  }

SofCheck Inspector Build Version : 2.22510

saveblogentryaction.java | 2010-Jun-25 19:40:34
saveblogentryaction.class | 2010-Jul-19 20:23:38