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.templates.components;
35
36 import info.magnolia.cms.util.QueryUtil;
37 import info.magnolia.context.MgnlContext;
38 import info.magnolia.jcr.iterator.FilteringNodeIterator;
39 import info.magnolia.jcr.predicate.NodeTypePredicate;
40 import info.magnolia.jcr.util.NodeUtil;
41 import info.magnolia.module.data.DataConsts;
42 import info.magnolia.rendering.model.RenderingModel;
43 import info.magnolia.rendering.model.RenderingModelImpl;
44 import info.magnolia.rendering.template.RenderableDefinition;
45 import info.magnolia.templating.functions.TemplatingFunctions;
46
47 import java.util.Date;
48
49 import javax.inject.Inject;
50 import javax.jcr.LoginException;
51 import javax.jcr.Node;
52 import javax.jcr.NodeIterator;
53 import javax.jcr.RepositoryException;
54 import javax.jcr.query.Query;
55 import javax.jcr.query.QueryManager;
56 import javax.jcr.query.QueryResult;
57
58 import org.apache.commons.lang.StringUtils;
59 import org.slf4j.Logger;
60 import org.slf4j.LoggerFactory;
61
62
63
64
65
66
67
68
69 public abstract class AbstractFeedModel<RD extends RenderableDefinition> extends RenderingModelImpl<RD> implements RenderingModel<RD> {
70 protected final static Logger log = LoggerFactory.getLogger(AbstractFeedModel.class);
71
72 public static final String ORDER_BY_PUBLICATION_DATE = "@pubDate";
73 public static final String ORDER_BY_TITLE_NAME = "@title";
74 public static final String SORT_ASCENDING = "ascending";
75 public static final String SORT_DESCENDING = "descending";
76
77 protected static final String AGGREGATOR_NODE = "/rssaggregator";
78 protected static final String DATA_WORKSPACE = "data";
79 protected static final String FEEDS_NODE = "feeds";
80
81 protected static final int MAX_RESULTS = 20;
82
83 protected final TemplatingFunctions templatingFunctions;
84
85 @Inject
86 public AbstractFeedModel(Node content, RD definition, RenderingModel<?> parent, TemplatingFunctions templatingFunctions) {
87 super(content, definition, parent);
88 this.templatingFunctions = templatingFunctions;
89 }
90
91
92
93
94
95 public Date convertPubDate(Object timestamp) {
96 if (timestamp == null) {
97 return null;
98 }
99 if (timestamp instanceof String) {
100 if (StringUtils.isEmpty((String) timestamp)) {
101 return null;
102 }
103 return new Date(Long.parseLong((String) timestamp));
104 }
105
106 return new Date((Long) timestamp);
107 }
108
109
110
111
112
113
114
115
116
117
118 public String getFeedProperty(Node parentNode, String subNode, String searchProperty, String searchValue, String resultProperty) {
119 String propertyValue = null;
120 try {
121 if (parentNode != null) {
122 String searchNode = AGGREGATOR_NODE + "/" + parentNode.getName() + "/" + subNode;
123 String sql = "select * from [nt:base] as t where ISDESCENDANTNODE([" + searchNode + "]) "
124 + "and t." + searchProperty + "='" + searchValue + "'";
125
126
127 NodeIterator nit = QueryUtil.search(DATA_WORKSPACE, sql);
128
129 if (nit != null && nit.hasNext()) {
130 Node fsn = nit.nextNode();
131
132 if (NodeUtil.getCollectionFromNodeIterator(nit).size() == 0) {
133 if (fsn.hasProperty(resultProperty)) {
134 propertyValue = fsn.getProperty(resultProperty).getString();
135 }
136 }
137 }
138 }
139 } catch (RepositoryException e) {
140 log.error("Problem while getting node property: " + e.getMessage());
141 }
142 return propertyValue;
143 }
144
145 public String getContextPath() {
146 return MgnlContext.getContextPath();
147 }
148
149 protected NodeIterator runQuery(String queryString) throws LoginException, RepositoryException {
150
151 QueryManager qm = MgnlContext.getJCRSession("data").getWorkspace().getQueryManager();
152 log.debug(queryString);
153 Query q = qm.createQuery(queryString, "xpath");
154 QueryResult res = q.execute();
155 NodeIterator feeds = res.getNodes();
156 FilteringNodeIterator iterator = new FilteringNodeIterator(feeds, new NodeTypePredicate(DataConsts.MODULE_DATA_CONTENT_NODE_TYPE));
157 return iterator;
158 }
159 }