View Javadoc

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 }