package sagan.blog.support;
import sagan.blog.Post;
import sagan.blog.PostCategory;
import sagan.support.DateFactory;
import sagan.support.nav.PageableFactory;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import static org.springframework.web.bind.annotation.RequestMethod.*;
/**
* Controller that handles requests for Atom feeds of blog content. All requests return a
* single {@link Page} of content, the size of which is defined by
* {@link PageableFactory#forFeeds()}.
*
* @see AtomFeedView
*/
@Controller
class AtomFeedController {
private final BlogService blogService;
private final AtomFeedView atomFeedView;
@Autowired
public AtomFeedController(BlogService blogService, SiteUrl siteUrl, DateFactory dateFactory) {
this.blogService = blogService;
this.atomFeedView = new AtomFeedView(siteUrl, dateFactory);
}
@RequestMapping(value = "/blog.atom", method = { GET, HEAD })
public AtomFeedView listPublishedPosts(Model model, HttpServletResponse response) {
Page<Post> page = blogService.getPublishedPosts(PageableFactory.forFeeds());
prepareResponse(model, response, page, "", "");
return atomFeedView;
}
@RequestMapping(value = "/blog/category/{category}.atom", method = { GET, HEAD })
public AtomFeedView listPublishedPostsForCategory(@PathVariable PostCategory category, Model model,
HttpServletResponse response) {
Page<Post> page = blogService.getPublishedPosts(category, PageableFactory.forFeeds());
prepareResponse(model, response, page, category.getDisplayName(), "/category/" + category.getUrlSlug());
return atomFeedView;
}
@RequestMapping(value = "/blog/broadcasts.atom", method = { GET, HEAD })
public AtomFeedView listPublishedBroadcastPosts(Model model, HttpServletResponse response) {
Page<Post> page = blogService.getPublishedBroadcastPosts(PageableFactory.forFeeds());
prepareResponse(model, response, page, "Broadcasts", "/broadcasts");
return atomFeedView;
}
private void prepareResponse(Model model, HttpServletResponse response, Page<Post> page,
String category, String subPath) {
response.setCharacterEncoding("utf-8");
model.addAttribute("posts", page.getContent());
model.addAttribute("feed-title", ("Spring " + category).trim());
String blogPath = "/blog" + subPath;
model.addAttribute("blog-path", blogPath);
model.addAttribute("feed-path", blogPath + ".atom");
}
}