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
33
34 package info.magnolia.module.rssaggregator.generator;
35
36 import static java.lang.String.format;
37
38 import info.magnolia.cms.beans.config.ServerConfiguration;
39 import info.magnolia.jcr.util.NodeTypes;
40 import info.magnolia.jcr.util.PropertyUtil;
41 import info.magnolia.jcr.util.SessionUtil;
42 import info.magnolia.jcr.wrapper.JCRMgnlPropertiesFilteringNodeWrapper;
43 import info.magnolia.module.rssaggregator.RSSAggregatorConstants;
44 import info.magnolia.module.rssaggregator.util.ContentMapper;
45 import info.magnolia.module.rssaggregator.util.MagnoliaTemplate;
46 import info.magnolia.objectfactory.Components;
47
48 import java.util.ArrayList;
49 import java.util.List;
50
51 import javax.jcr.Node;
52 import javax.jcr.Property;
53 import javax.jcr.PropertyIterator;
54 import javax.jcr.RepositoryException;
55
56 import com.rometools.rome.feed.synd.SyndCategory;
57 import com.rometools.rome.feed.synd.SyndCategoryImpl;
58 import com.rometools.rome.feed.synd.SyndContent;
59 import com.rometools.rome.feed.synd.SyndContentImpl;
60 import com.rometools.rome.feed.synd.SyndEntry;
61 import com.rometools.rome.feed.synd.SyndEntryImpl;
62 import com.rometools.rome.feed.synd.SyndFeed;
63
64
65
66
67 public class RSSModuleFeedGenerator extends AbstractSyndFeedGenerator implements Cloneable {
68
69 private static final ContentMapper<SyndEntry> MAPPER = new FeedEntryMapper();
70
71 private MagnoliaTemplate magnoliaTemplate;
72
73 private String feedPath;
74
75
76
77
78
79 public RSSModuleFeedGenerator() {
80 this.magnoliaTemplate = new MagnoliaTemplate();
81 }
82
83
84
85
86 public void setFeedPath(String feedPath) {
87 this.feedPath = feedPath;
88 }
89
90 @Override
91 public void setFeedInfo(SyndFeed feed) {
92
93
94 String link = Components.getComponent(ServerConfiguration.class).getDefaultBaseUrl();
95 Node feedDescr = SessionUtil.getNode(RSSAggregatorConstants.WORKSPACE, feedPath);
96 if (feedDescr != null) {
97 feed.setTitle(PropertyUtil.getString(feedDescr, "title", ""));
98 feed.setDescription(PropertyUtil.getString(feedDescr, "description", ""));
99 } else {
100 feed.setTitle("");
101 feed.setDescription("");
102 }
103 feed.setLink(link);
104 }
105
106 @Override
107 public List<SyndEntry> loadFeedEntries() {
108 String entriesQuery = format("/jcr:root%s/data[1]/*/* order by @pubDate descending", feedPath);
109 return magnoliaTemplate.xpathQueryForList(RSSAggregatorConstants.WORKSPACE, entriesQuery, NodeTypes.Content.NAME, MAPPER);
110 }
111
112 @Override
113 public Object clone() throws CloneNotSupportedException {
114 return super.clone();
115 }
116
117 private static class FeedEntryMapper implements ContentMapper<SyndEntry> {
118
119 @Override
120 public SyndEntry map(Node content) throws RepositoryException {
121 SyndEntry entry = new SyndEntryImpl();
122 entry.setAuthor(PropertyUtil.getString(content, "author"));
123 entry.setTitle(PropertyUtil.getString(content, "title"));
124 entry.setLink(PropertyUtil.getString(content, "link"));
125 if (content.hasProperty("pubDate")) {
126 entry.setPublishedDate(PropertyUtil.getProperty(content, "pubDate").getDate().getTime());
127 }
128 SyndContent description = new SyndContentImpl();
129 description.setType("text/html");
130 description.setValue(PropertyUtil.getString(content, "description"));
131 entry.setDescription(description);
132 List<SyndCategory> categories = new ArrayList<SyndCategory>();
133 if (content.hasNode("categories")) {
134 PropertyIterator categoriesNodeData = new JCRMgnlPropertiesFilteringNodeWrapper(content.getNode("categories")).getProperties();
135 while (categoriesNodeData.hasNext()) {
136 Property property = categoriesNodeData.nextProperty();
137 SyndCategory category = new SyndCategoryImpl();
138 category.setName(property.getString());
139 categories.add(category);
140 }
141 }
142 entry.setCategories(categories);
143 return entry;
144 }
145
146 }
147
148 }