1 | |
|
2 | |
|
3 | |
|
4 | |
|
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
|
11 | |
|
12 | |
|
13 | |
|
14 | |
|
15 | |
|
16 | |
|
17 | |
|
18 | |
|
19 | |
|
20 | |
|
21 | |
|
22 | |
|
23 | |
|
24 | |
|
25 | |
|
26 | |
|
27 | |
|
28 | |
|
29 | |
|
30 | |
|
31 | |
|
32 | |
package net.sourceforge.pebble.web.view.impl; |
33 | |
|
34 | |
import com.sun.syndication.feed.synd.*; |
35 | |
import net.sourceforge.pebble.Constants; |
36 | |
import net.sourceforge.pebble.api.decorator.FeedDecorator; |
37 | |
import net.sourceforge.pebble.domain.*; |
38 | |
import net.sourceforge.pebble.security.PebbleUserDetails; |
39 | |
|
40 | |
import java.util.*; |
41 | |
|
42 | |
|
43 | |
|
44 | |
|
45 | |
|
46 | |
|
47 | |
public class FeedView extends AbstractRomeFeedView { |
48 | |
|
49 | |
public FeedView(FeedType feedType) { |
50 | 12 | super(feedType); |
51 | 12 | } |
52 | |
|
53 | |
@SuppressWarnings("unchecked") |
54 | |
protected SyndFeed getFeed() { |
55 | 8 | AbstractBlog blog = (AbstractBlog) getModel().get(Constants.BLOG_KEY); |
56 | 8 | Collection<FeedDecorator> feedDecorators = Collections.emptyList(); |
57 | 8 | if (blog instanceof Blog) { |
58 | 8 | feedDecorators = ((Blog) blog).getFeedDecorators(); |
59 | |
} |
60 | 8 | Collection<BlogEntry> blogEntries = (Collection<BlogEntry>) getModel().get(Constants.BLOG_ENTRIES); |
61 | 8 | SyndFeed syndFeed = new SyndFeedImpl(); |
62 | |
|
63 | 8 | populateFeedInfo(blog, syndFeed); |
64 | |
|
65 | 8 | List<SyndEntry> feedEntries = new ArrayList<SyndEntry>(); |
66 | |
|
67 | 8 | for (BlogEntry entry : blogEntries) { |
68 | 8 | SyndEntry feedEntry = convertBlogEntry(blog, entry); |
69 | 8 | for (FeedDecorator feedDecorator : feedDecorators) { |
70 | 0 | feedDecorator.decorate(feedEntry, (Blog) blog, entry); |
71 | |
} |
72 | 8 | feedEntries.add(feedEntry); |
73 | 8 | } |
74 | 8 | syndFeed.setEntries(feedEntries); |
75 | 8 | for (FeedDecorator feedDecorator : feedDecorators) { |
76 | 0 | feedDecorator.decorate(syndFeed, (Blog) blog); |
77 | |
} |
78 | 8 | return syndFeed; |
79 | |
} |
80 | |
|
81 | |
private SyndEntry convertBlogEntry(AbstractBlog blog, BlogEntry entry) { |
82 | 8 | SyndEntry feedEntry = new SyndEntryImpl(); |
83 | 8 | feedEntry.setUri(generateId(blog, entry.getDate(), entry.getId())); |
84 | 8 | feedEntry.setTitle(entry.getTitle()); |
85 | 8 | feedEntry.setLink(entry.getPermalink()); |
86 | 8 | PebbleUserDetails entryUser = entry.getUser(); |
87 | 8 | if (entryUser == null) { |
88 | 8 | feedEntry.setAuthor(entry.getAuthor()); |
89 | |
} else { |
90 | 0 | SyndPerson entryAuthor = new SyndPersonImpl(); |
91 | 0 | entryAuthor.setName(entryUser.getName()); |
92 | 0 | entryAuthor.setUri(entryUser.getWebsite()); |
93 | 0 | feedEntry.setAuthors(Collections.singletonList(entryAuthor)); |
94 | |
} |
95 | 8 | feedEntry.setUpdatedDate(entry.getLastModified()); |
96 | 8 | feedEntry.setPublishedDate(entry.getDate()); |
97 | |
|
98 | 8 | List<SyndCategory> feedCategories = new ArrayList<SyndCategory>(); |
99 | 8 | for (Category cat : entry.getCategories()) { |
100 | 8 | SyndCategory feedCategory = new SyndCategoryImpl(); |
101 | 8 | feedCategory.setName(cat.getName()); |
102 | 8 | feedCategory.setTaxonomyUri(cat.getPermalink()); |
103 | 8 | feedCategories.add(feedCategory); |
104 | 8 | } |
105 | 8 | for (Tag entryTag : entry.getAllTags()) { |
106 | 0 | SyndCategory feedCategory = new SyndCategoryImpl(); |
107 | 0 | feedCategory.setName(entryTag.getName()); |
108 | 0 | feedCategory.setTaxonomyUri(entryTag.getPermalink()); |
109 | 0 | feedCategories.add(feedCategory); |
110 | 0 | } |
111 | 8 | feedEntry.setCategories(feedCategories); |
112 | |
|
113 | 8 | SyndContent content = new SyndContentImpl(); |
114 | 8 | content.setType("text/html"); |
115 | 8 | if (entry.getExcerpt() == null || entry.getExcerpt().length() == 0) { |
116 | 8 | content.setValue(entry.getBody()); |
117 | |
} else { |
118 | 0 | content.setValue(entry.getExcerpt()); |
119 | |
} |
120 | 8 | feedEntry.setContents(Collections.singletonList(content)); |
121 | |
|
122 | 8 | if (entry.getAttachment() != null) { |
123 | 0 | SyndEnclosure enclosure = new SyndEnclosureImpl(); |
124 | 0 | enclosure.setUrl(entry.getAttachment().getUrl()); |
125 | 0 | enclosure.setType(entry.getAttachment().getType()); |
126 | 0 | enclosure.setLength(entry.getAttachment().getSize()); |
127 | 0 | feedEntry.setEnclosures(Collections.singletonList(enclosure)); |
128 | |
} |
129 | 8 | return feedEntry; |
130 | |
} |
131 | |
|
132 | |
private void populateFeedInfo(AbstractBlog blog, SyndFeed syndFeed) { |
133 | 8 | String blogUrl = blog.getUrl(); |
134 | |
|
135 | 8 | Tag tag = (Tag) getModel().get("tag"); |
136 | 8 | Category category = (Category) getModel().get("category"); |
137 | 8 | String author = (String) getModel().get("author"); |
138 | |
|
139 | |
String permalink; |
140 | 8 | String feedAuthor = blog.getAuthor(); |
141 | 8 | String title = blog.getName(); |
142 | |
|
143 | 8 | if (tag != null) { |
144 | 0 | permalink = tag.getPermalink(); |
145 | 0 | title += tag.getName(); |
146 | 8 | } else if (category != null) { |
147 | 0 | permalink = category.getPermalink(); |
148 | 0 | title += category.getName(); |
149 | 8 | } else if (author != null) { |
150 | 0 | permalink = blogUrl + "authors/" + author; |
151 | 0 | title += author; |
152 | |
} else { |
153 | 8 | permalink = blogUrl; |
154 | 8 | syndFeed.setTitle(blog.getName()); |
155 | |
} |
156 | |
String xmlLink; |
157 | 8 | if (permalink.endsWith("/")) { |
158 | 8 | xmlLink = permalink + getFeedType().getFileName(); |
159 | |
} else { |
160 | 0 | xmlLink = permalink + "/" + getFeedType().getFileName(); |
161 | |
} |
162 | 8 | syndFeed.setUri(generateId(blog, null, null)); |
163 | 8 | syndFeed.setTitle(title); |
164 | 8 | syndFeed.setDescription(blog.getDescription()); |
165 | 8 | syndFeed.setLink(permalink); |
166 | |
|
167 | 8 | SyndLink alternate = new SyndLinkImpl(); |
168 | 8 | alternate.setHref(permalink); |
169 | 8 | alternate.setRel("alternate"); |
170 | 8 | alternate.setType("text/html"); |
171 | |
|
172 | 8 | SyndLink self = new SyndLinkImpl(); |
173 | 8 | self.setHref(xmlLink); |
174 | 8 | self.setRel("self"); |
175 | 8 | self.setType(getFeedType().getContentType()); |
176 | 8 | syndFeed.setLinks(Arrays.asList(alternate, self)); |
177 | |
|
178 | 8 | syndFeed.setPublishedDate(blog.getLastModified()); |
179 | 8 | syndFeed.setAuthor(feedAuthor); |
180 | |
|
181 | 8 | if (blog.getImage() != null) { |
182 | 8 | SyndImage syndImage = new SyndImageImpl(); |
183 | 8 | syndImage.setUrl(blog.getImage()); |
184 | 8 | syndImage.setTitle(title); |
185 | 8 | syndImage.setUrl(permalink); |
186 | 8 | syndFeed.setImage(syndImage); |
187 | |
|
188 | |
} |
189 | |
|
190 | 8 | syndFeed.setCopyright(feedAuthor); |
191 | 8 | syndFeed.setLanguage(blog.getLanguage()); |
192 | 8 | } |
193 | |
} |