1 package org.unitedfront2.web.controller.blog;
2
3 import com.sun.syndication.feed.synd.SyndContent;
4 import com.sun.syndication.feed.synd.SyndContentImpl;
5 import com.sun.syndication.feed.synd.SyndEntry;
6 import com.sun.syndication.feed.synd.SyndEntryImpl;
7 import com.sun.syndication.feed.synd.SyndFeed;
8 import com.sun.syndication.feed.synd.SyndFeedImpl;
9
10 import java.util.ArrayList;
11 import java.util.List;
12 import java.util.Locale;
13
14 import javax.servlet.http.HttpServletRequest;
15 import javax.servlet.http.HttpServletResponse;
16
17 import org.springframework.beans.factory.annotation.Autowired;
18 import org.springframework.stereotype.Repository;
19 import org.springframework.web.bind.ServletRequestBindingException;
20 import org.springframework.web.bind.ServletRequestUtils;
21 import org.springframework.web.servlet.ModelAndView;
22 import org.springframework.web.servlet.mvc.AbstractController;
23 import org.springframework.web.util.HtmlUtils;
24 import org.unitedfront2.domain.SimpleUser;
25 import org.unitedfront2.domain.accesscontrol.AccessDeniedException;
26 import org.unitedfront2.domain.communication.Blog;
27 import org.unitedfront2.domain.communication.BlogEntry;
28 import org.unitedfront2.domain.communication.BlogTable;
29 import org.unitedfront2.web.PageNotFoundException;
30 import org.unitedfront2.web.WebUtils;
31 import org.unitedfront2.web.view.RssView;
32
33 /**
34 * ブログの RSS 表示用のコントローラです。
35 *
36 * @author kurokkie
37 *
38 */
39 @Repository(value = "blog.rssController")
40 public class RssController extends AbstractController {
41
42 /** ブログ記事の表示件数 (20) */
43 public static final int DISPLAY_NUM = 20;
44
45 /** ブログテーブル */
46 @Autowired private BlogTable blogTable;
47
48 @Override
49 protected ModelAndView handleRequestInternal(HttpServletRequest request,
50 HttpServletResponse response)
51 throws ServletRequestBindingException, PageNotFoundException,
52 org.unitedfront2.web.AccessDeniedException {
53 Blog blog = getBlog(request);
54 SyndFeed feed = toFeed(blog, WebUtils.getLocale(request));
55 ModelAndView mav = new ModelAndView(new RssView());
56 mav.addObject(RssView.FEED_PARAM_NAME, feed);
57 return mav;
58 }
59
60 private Blog getBlog(HttpServletRequest request)
61 throws ServletRequestBindingException, PageNotFoundException,
62 org.unitedfront2.web.AccessDeniedException {
63 String code = ServletRequestUtils.getRequiredStringParameter(request,
64 "code");
65 Blog blog = blogTable.findByCode(code);
66 if (blog == null) {
67 String message = "The blog [code='" + code + "'] not found.";
68 logger.warn(message);
69 throw new PageNotFoundException(message);
70 }
71 SimpleUser user = WebUtils.findUser(request.getSession(false));
72 try {
73 blog.readAccess(user);
74 } catch (AccessDeniedException e) {
75 String message = "The user '" + user
76 + "' cannot access to the blog '" + blog + "'.";
77 logger.warn(message);
78 throw new org.unitedfront2.web.AccessDeniedException(message, e);
79 }
80 blog.retrieveEntries(0, DISPLAY_NUM);
81 blog.retrieveOwner();
82 return blog;
83 }
84
85 private SyndFeed toFeed(Blog blog, Locale locale) {
86 SyndFeed feed = new SyndFeedImpl();
87
88
89 feed.setTitle(blog.getOverview().getSubject(locale));
90 feed.setLink("/blog/" + blog.getCode() + "/index.html");
91 feed.setDescription(blog.getOverview().getBody(locale));
92 feed.setAuthor(HtmlUtils.htmlEscape(blog.getOwner().getName()));
93
94
95 List<SyndEntry> entries = new ArrayList<SyndEntry>(blog.getEntries()
96 .size());
97 for (BlogEntry be : blog.getEntries()) {
98 SyndEntry entry = new SyndEntryImpl();
99 entry.setTitle(be.getEntry().getSubject(locale));
100 entry.setLink("/blog/" + blog.getCode() + "/entry-"
101 + be.getCode() + ".html");
102 SyndContent description = new SyndContentImpl();
103 description.setType("text/html");
104 description.setValue(be.getEntry().getBody(locale));
105 entry.setDescription(description);
106 entry.setPublishedDate(be.getEntry().getRegistrationDate());
107 entry.setUpdatedDate(be.getEntry().getLastUpdateDate());
108 entries.add(entry);
109 }
110 feed.setEntries(entries);
111 return feed;
112 }
113 }