File Source: responsefeedaction.java
/*
P/P * Method: net.sourceforge.pebble.web.action.ResponseFeedAction__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.web.action;
33
34 import net.sourceforge.pebble.Constants;
35 import net.sourceforge.pebble.domain.*;
36 import net.sourceforge.pebble.web.view.NotModifiedView;
37 import net.sourceforge.pebble.web.view.View;
38 import net.sourceforge.pebble.web.view.impl.*;
39
/*
P/P * Method: void net.sourceforge.pebble.web.action.ResponseFeedAction()
*/
40 import javax.servlet.ServletException;
41 import javax.servlet.http.HttpServletRequest;
42 import javax.servlet.http.HttpServletResponse;
43 import java.text.SimpleDateFormat;
44 import java.util.*;
45
46 /**
47 * Gets a feed (RSS or Atom) for blog entry responses.
48 *
49 * @author Simon Brown
50 */
51 public class ResponseFeedAction extends Action {
52
53 /**
54 * Peforms the processing associated with this action.
55 *
56 * @param request the HttpServletRequest instance
57 * @param response the HttpServletResponse instance
58 * @return the name of the next view
59 */
60 public View process(HttpServletRequest request, HttpServletResponse response) throws ServletException {
/*
P/P * Method: View process(HttpServletRequest, HttpServletResponse)
*
* Preconditions:
* request != null
* response != null
* this.model != null
* this.model.data != null
*
* Presumptions:
* java.util.HashMap:get(...)@63 != null
* java.util.Iterator:next(...)@98 != null
* init'ed(java.util.Locale.ENGLISH)
* net.sourceforge.pebble.domain.Blog:getLastModified(...)@76 != null
* net.sourceforge.pebble.domain.BlogEntry:getResponses(...)@98 != null
*
* Postconditions:
* return_value in Addr_Set{&new NotModifiedView(process#5),&new NotModifiedView(process#7),&new AtomResponsesView(process#12),&new RssResponsesView(process#13)}
* new AtomResponsesView(process#12) num objects <= 1
* new NotModifiedView(process#5) num objects <= 1
* new NotModifiedView(process#7) num objects <= 1
* new RssResponsesView(process#13) num objects <= 1
*
* Test Vectors:
* java.lang.String:equals(...)@80: {0}, {1}
* java.lang.String:equals(...)@82: {0}, {1}
* java.lang.String:equalsIgnoreCase(...)@122: {0}, {1}
* java.lang.String:equalsIgnoreCase(...)@70: {0}, {1}
* javax.servlet.http.HttpServletRequest:getHeader(...)@67: Addr_Set{null}, Inverse{null}
* javax.servlet.http.HttpServletRequest:getHeader(...)@68: Addr_Set{null}, Inverse{null}
* javax.servlet.http.HttpServletRequest:getParameter(...)@62: Addr_Set{null}, Inverse{null}
* javax.servlet.http.HttpServletRequest:getParameter(...)@87: Addr_Set{null}, Inverse{null}
* net.sourceforge.pebble.domain.BlogEntry:isPublished(...)@96: {0}, {1}
* net.sourceforge.pebble.domain.BlogService:getBlogEntry(...)@92: Addr_Set{null}, Inverse{null}
* ...
*/
61 Blog blog = (Blog)getModel().get(Constants.BLOG_KEY);
62 String flavor = request.getParameter("flavor");
63
64 SimpleDateFormat httpFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");
65 httpFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
66
67 String ifModifiedSince = request.getHeader("If-Modified-Since");
68 String ifNoneMatch = request.getHeader("If-None-Match");
69
70 if (flavor != null && flavor.equalsIgnoreCase("atom")) {
71 response.setContentType("application/atom+xml; charset=" + blog.getCharacterEncoding());
72 } else {
73 response.setContentType("application/xml; charset=" + blog.getCharacterEncoding());
74 }
75
76 Date lastModified = blog.getLastModified();
77 response.setDateHeader("Last-Modified", lastModified.getTime());
78 response.setHeader("ETag", "\"" + httpFormat.format(lastModified) + "\"");
79
80 if (ifModifiedSince != null && ifModifiedSince.equals(httpFormat.format(lastModified))) {
81 return new NotModifiedView();
82 } else if (ifNoneMatch != null && ifNoneMatch.equals("\"" + httpFormat.format(lastModified) + "\"")) {
83 return new NotModifiedView();
84 } else {
85 List responses = new ArrayList();
86
87 String entryId = request.getParameter("entry");
88 if (entryId != null) {
89 BlogService service = new BlogService();
90 BlogEntry blogEntry = null;
91 try {
92 blogEntry = service.getBlogEntry(blog, entryId);
93 } catch (BlogServiceException e) {
94 throw new ServletException(e);
95 }
96 if (blogEntry != null && blogEntry.isPublished()) {
97 getModel().put(Constants.BLOG_ENTRY_KEY, blogEntry);
98 for (Response r : blogEntry.getResponses()) {
99 if (r.isApproved()) {
100 responses.add(r);
101 }
102 }
103 }
104 } else {
105 responses = new ArrayList(blog.getRecentApprovedResponses());
106 }
107
108 int numberOfResponses = blog.getRecentResponsesOnHomePage();
109
110 if (responses.size() > numberOfResponses) {
111 responses = responses.subList(0, numberOfResponses);
112 }
113
114 getModel().put(Constants.RESPONSES, responses);
115
116 // set the locale of this feed request to be English
117 javax.servlet.jsp.jstl.core.Config.set(
118 request,
119 javax.servlet.jsp.jstl.core.Config.FMT_LOCALE,
120 Locale.ENGLISH);
121
122 if (flavor != null && flavor.equalsIgnoreCase("atom")) {
123 return new AtomResponsesView();
124 } else {
125 return new RssResponsesView();
126 }
127 }
128 }
129
130 /**
131 * Helper method to find a named tag from a request parameter.
132 *
133 * @param abstractBlog the blog for which the feed is for
134 * @param request the HTTP request containing the tag parameter
135 * @return a Tag instance, or null if the tag isn't
136 * specified or can't be found
137 */
138 private Tag getTag(AbstractBlog abstractBlog, HttpServletRequest request) {
/*
P/P * Method: Tag getTag(AbstractBlog, HttpServletRequest)
*
* Preconditions:
* (soft) request != null
*
* Postconditions:
* return_value in Addr_Set{null,&new Tag(getTag#1)}
* new Tag(getTag#1) num objects <= 1
*
* Test Vectors:
* javax.servlet.http.HttpServletRequest:getParameter(...)@145: Addr_Set{null}, Inverse{null}
*/
139 if (abstractBlog instanceof MultiBlog) {
140 // getting tag based, aggregated feed isn't supported
141 return null;
142 } else {
143 Blog blog = (Blog)abstractBlog;
144
145 String tag = request.getParameter("tag");
146 if (tag != null) {
147 return new Tag(tag, blog);
148 } else {
149 return null;
150 }
151 }
152 }
153
154 /**
155 * Helper method to find a named category from a request parameter.
156 *
157 * @param abstractBlog the blog for which the feed is for
158 * @param request the HTTP request containing the category parameter
159 * @return a Category instance, or null if the category isn't
160 * specified or can't be found
161 */
162 private Category getCategory(AbstractBlog abstractBlog, HttpServletRequest request) {
/*
P/P * Method: Category getCategory(AbstractBlog, HttpServletRequest)
*
* Preconditions:
* (soft) abstractBlog != null
* (soft) request != null
*
* Postconditions:
* init'ed(return_value)
*
* Test Vectors:
* javax.servlet.http.HttpServletRequest:getParameter(...)@169: Addr_Set{null}, Inverse{null}
*/
163 if (abstractBlog instanceof MultiBlog) {
164 // getting Category based, aggregated feed isn't supported
165 return null;
166 } else {
167 Blog blog = (Blog)abstractBlog;
168
169 String categoryId = request.getParameter("category");
170 if (categoryId != null) {
171 return blog.getCategory(categoryId);
172 } else {
173 return null;
174 }
175 }
176 }
177
178 }
SofCheck Inspector Build Version : 2.22510
| responsefeedaction.java |
2010-Jun-25 19:40:34 |
| responsefeedaction.class |
2010-Jul-19 20:23:38 |