Clover Coverage Report - Pebble 2.5-SNAPSHOT
Coverage timestamp: Sat Jun 12 2010 09:39:29 EST
../../../../../img/srcFileCovDistChart0.png 48% of files have more coverage
52   178   21   17,33
24   96   0,4   3
3     7  
1    
This report was generated with an evaluation server license. Purchase Clover or configure your license.
 
  ResponseFeedAction       Line # 51 52 0% 21 79 0% 0.0
 
No Tests
 
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   
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  0 toggle public View process(HttpServletRequest request, HttpServletResponse response) throws ServletException {
61  0 Blog blog = (Blog)getModel().get(Constants.BLOG_KEY);
62  0 String flavor = request.getParameter("flavor");
63   
64  0 SimpleDateFormat httpFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");
65  0 httpFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
66   
67  0 String ifModifiedSince = request.getHeader("If-Modified-Since");
68  0 String ifNoneMatch = request.getHeader("If-None-Match");
69   
70  0 if (flavor != null && flavor.equalsIgnoreCase("atom")) {
71  0 response.setContentType("application/atom+xml; charset=" + blog.getCharacterEncoding());
72    } else {
73  0 response.setContentType("application/xml; charset=" + blog.getCharacterEncoding());
74    }
75   
76  0 Date lastModified = blog.getLastModified();
77  0 response.setDateHeader("Last-Modified", lastModified.getTime());
78  0 response.setHeader("ETag", "\"" + httpFormat.format(lastModified) + "\"");
79   
80  0 if (ifModifiedSince != null && ifModifiedSince.equals(httpFormat.format(lastModified))) {
81  0 return new NotModifiedView();
82  0 } else if (ifNoneMatch != null && ifNoneMatch.equals("\"" + httpFormat.format(lastModified) + "\"")) {
83  0 return new NotModifiedView();
84    } else {
85  0 List responses = new ArrayList();
86   
87  0 String entryId = request.getParameter("entry");
88  0 if (entryId != null) {
89  0 BlogService service = new BlogService();
90  0 BlogEntry blogEntry = null;
91  0 try {
92  0 blogEntry = service.getBlogEntry(blog, entryId);
93    } catch (BlogServiceException e) {
94  0 throw new ServletException(e);
95    }
96  0 if (blogEntry != null && blogEntry.isPublished()) {
97  0 getModel().put(Constants.BLOG_ENTRY_KEY, blogEntry);
98  0 for (Response r : blogEntry.getResponses()) {
99  0 if (r.isApproved()) {
100  0 responses.add(r);
101    }
102    }
103    }
104    } else {
105  0 responses = new ArrayList(blog.getRecentApprovedResponses());
106    }
107   
108  0 int numberOfResponses = blog.getRecentResponsesOnHomePage();
109   
110  0 if (responses.size() > numberOfResponses) {
111  0 responses = responses.subList(0, numberOfResponses);
112    }
113   
114  0 getModel().put(Constants.RESPONSES, responses);
115   
116    // set the locale of this feed request to be English
117  0 javax.servlet.jsp.jstl.core.Config.set(
118    request,
119    javax.servlet.jsp.jstl.core.Config.FMT_LOCALE,
120    Locale.ENGLISH);
121   
122  0 if (flavor != null && flavor.equalsIgnoreCase("atom")) {
123  0 return new AtomResponsesView();
124    } else {
125  0 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  0 toggle private Tag getTag(AbstractBlog abstractBlog, HttpServletRequest request) {
139  0 if (abstractBlog instanceof MultiBlog) {
140    // getting tag based, aggregated feed isn't supported
141  0 return null;
142    } else {
143  0 Blog blog = (Blog)abstractBlog;
144   
145  0 String tag = request.getParameter("tag");
146  0 if (tag != null) {
147  0 return new Tag(tag, blog);
148    } else {
149  0 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  0 toggle private Category getCategory(AbstractBlog abstractBlog, HttpServletRequest request) {
163  0 if (abstractBlog instanceof MultiBlog) {
164    // getting Category based, aggregated feed isn't supported
165  0 return null;
166    } else {
167  0 Blog blog = (Blog)abstractBlog;
168   
169  0 String categoryId = request.getParameter("category");
170  0 if (categoryId != null) {
171  0 return blog.getCategory(categoryId);
172    } else {
173  0 return null;
174    }
175    }
176    }
177   
178    }