001
014
015 package com.liferay.portlet.assetpublisher.action;
016
017 import com.liferay.portal.kernel.language.LanguageUtil;
018 import com.liferay.portal.kernel.portlet.LiferayPortletRequest;
019 import com.liferay.portal.kernel.portlet.LiferayPortletResponse;
020 import com.liferay.portal.kernel.search.Field;
021 import com.liferay.portal.kernel.util.GetterUtil;
022 import com.liferay.portal.kernel.util.Http;
023 import com.liferay.portal.kernel.util.StringBundler;
024 import com.liferay.portal.kernel.util.StringPool;
025 import com.liferay.portal.kernel.util.Validator;
026 import com.liferay.portal.model.Layout;
027 import com.liferay.portal.theme.PortletDisplay;
028 import com.liferay.portal.theme.ThemeDisplay;
029 import com.liferay.portal.util.Portal;
030 import com.liferay.portal.util.PortalUtil;
031 import com.liferay.portal.util.PropsValues;
032 import com.liferay.portal.util.WebKeys;
033 import com.liferay.portlet.asset.AssetRendererFactoryRegistryUtil;
034 import com.liferay.portlet.asset.model.AssetEntry;
035 import com.liferay.portlet.asset.model.AssetRenderer;
036 import com.liferay.portlet.asset.model.AssetRendererFactory;
037 import com.liferay.portlet.assetpublisher.util.AssetPublisherUtil;
038 import com.liferay.util.RSSUtil;
039
040 import com.sun.syndication.feed.synd.SyndContent;
041 import com.sun.syndication.feed.synd.SyndContentImpl;
042 import com.sun.syndication.feed.synd.SyndEntry;
043 import com.sun.syndication.feed.synd.SyndEntryImpl;
044 import com.sun.syndication.feed.synd.SyndFeed;
045 import com.sun.syndication.feed.synd.SyndFeedImpl;
046 import com.sun.syndication.feed.synd.SyndLink;
047 import com.sun.syndication.feed.synd.SyndLinkImpl;
048
049 import java.util.ArrayList;
050 import java.util.Date;
051 import java.util.HashSet;
052 import java.util.List;
053 import java.util.Set;
054
055 import javax.portlet.PortletPreferences;
056 import javax.portlet.PortletRequest;
057 import javax.portlet.PortletResponse;
058 import javax.portlet.ResourceRequest;
059 import javax.portlet.ResourceResponse;
060
061
065 public class RSSAction extends com.liferay.portal.struts.RSSAction {
066
067 protected String exportToRSS(
068 PortletRequest portletRequest, PortletResponse portletResponse,
069 String name, String description, String format, double version,
070 String displayStyle, String linkBehavior,
071 List<AssetEntry> assetEntries)
072 throws Exception {
073
074 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
075 WebKeys.THEME_DISPLAY);
076
077 SyndFeed syndFeed = new SyndFeedImpl();
078
079 syndFeed.setDescription(GetterUtil.getString(description, name));
080
081 List<SyndEntry> syndEntries = new ArrayList<SyndEntry>();
082
083 syndFeed.setEntries(syndEntries);
084
085 for (AssetEntry assetEntry : assetEntries) {
086 String link = getEntryURL(
087 portletRequest, portletResponse, linkBehavior, assetEntry);
088
089 if (Validator.isBlank(link)) {
090 continue;
091 }
092
093 SyndEntry syndEntry = new SyndEntryImpl();
094
095 syndEntry.setLink(link);
096
097 String author = PortalUtil.getUserName(assetEntry);
098
099 syndEntry.setAuthor(author);
100
101 SyndContent syndContent = new SyndContentImpl();
102
103 syndContent.setType(RSSUtil.ENTRY_TYPE_DEFAULT);
104
105 String value = null;
106
107 String languageId = LanguageUtil.getLanguageId(portletRequest);
108
109 if (displayStyle.equals(RSSUtil.DISPLAY_STYLE_TITLE)) {
110 value = StringPool.BLANK;
111 }
112 else {
113 value = assetEntry.getSummary(languageId, true);
114 }
115
116 syndContent.setValue(value);
117
118 syndEntry.setDescription(syndContent);
119
120 syndEntry.setPublishedDate(assetEntry.getPublishDate());
121 syndEntry.setTitle(assetEntry.getTitle(languageId, true));
122 syndEntry.setUpdatedDate(assetEntry.getModifiedDate());
123 syndEntry.setUri(syndEntry.getLink());
124
125 syndEntries.add(syndEntry);
126 }
127
128 syndFeed.setFeedType(RSSUtil.getFeedType(format, version));
129
130 List<SyndLink> syndLinks = new ArrayList<SyndLink>();
131
132 syndFeed.setLinks(syndLinks);
133
134 SyndLink selfSyndLink = new SyndLinkImpl();
135
136 syndLinks.add(selfSyndLink);
137
138 String feedURL = getFeedURL(portletRequest);
139
140 selfSyndLink.setHref(feedURL);
141
142 selfSyndLink.setRel("self");
143
144 SyndLink alternateSyndLink = new SyndLinkImpl();
145
146 syndLinks.add(alternateSyndLink);
147
148 alternateSyndLink.setHref(PortalUtil.getLayoutFullURL(themeDisplay));
149 alternateSyndLink.setRel("alternate");
150
151 syndFeed.setPublishedDate(new Date());
152 syndFeed.setTitle(name);
153 syndFeed.setUri(feedURL);
154
155 return RSSUtil.export(syndFeed);
156 }
157
158 protected List<AssetEntry> getAssetEntries(
159 PortletRequest portletRequest,
160 PortletPreferences portletPreferences)
161 throws Exception {
162
163 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
164 WebKeys.THEME_DISPLAY);
165
166 int rssDelta = GetterUtil.getInteger(
167 portletPreferences.getValue("rssDelta", "20"));
168
169 return AssetPublisherUtil.getAssetEntries(
170 portletPreferences, themeDisplay.getLayout(),
171 themeDisplay.getScopeGroupId(), rssDelta, true);
172 }
173
174 protected String getAssetPublisherURL(PortletRequest portletRequest)
175 throws Exception {
176
177 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
178 WebKeys.THEME_DISPLAY);
179
180 Layout layout = themeDisplay.getLayout();
181
182 PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
183
184 StringBundler sb = new StringBundler(7);
185
186 String layoutFriendlyURL = GetterUtil.getString(
187 PortalUtil.getLayoutFriendlyURL(layout, themeDisplay));
188
189 if (!layoutFriendlyURL.startsWith(Http.HTTP_WITH_SLASH) &&
190 !layoutFriendlyURL.startsWith(Http.HTTPS_WITH_SLASH)) {
191
192 sb.append(themeDisplay.getPortalURL());
193 }
194
195 sb.append(layoutFriendlyURL);
196 sb.append(Portal.FRIENDLY_URL_SEPARATOR);
197 sb.append("asset_publisher/");
198 sb.append(portletDisplay.getInstanceId());
199 sb.append(StringPool.SLASH);
200
201 return sb.toString();
202 }
203
204 protected String getEntryURL(
205 PortletRequest portletRequest, PortletResponse portletResponse,
206 String linkBehavior, AssetEntry assetEntry)
207 throws Exception {
208
209 if (linkBehavior.equals("viewInPortlet")) {
210 return getEntryURLViewInContext(
211 portletRequest, portletResponse, assetEntry);
212 }
213 else {
214 return getEntryURLAssetPublisher(
215 portletRequest, portletResponse, assetEntry);
216 }
217 }
218
219 protected String getEntryURLAssetPublisher(
220 PortletRequest portletRequest, PortletResponse portletResponse,
221 AssetEntry assetEntry)
222 throws Exception {
223
224 AssetRendererFactory assetRendererFactory =
225 AssetRendererFactoryRegistryUtil.getAssetRendererFactoryByClassName(
226 assetEntry.getClassName());
227
228 if (assetRendererFactory == null) {
229 return StringPool.BLANK;
230 }
231
232 StringBundler sb = new StringBundler(4);
233
234 sb.append(getAssetPublisherURL(portletRequest));
235 sb.append(assetRendererFactory.getType());
236 sb.append("/id/");
237 sb.append(assetEntry.getEntryId());
238
239 return sb.toString();
240 }
241
242 protected String getEntryURLViewInContext(
243 PortletRequest portletRequest, PortletResponse portletResponse,
244 AssetEntry assetEntry)
245 throws Exception {
246
247 AssetRendererFactory assetRendererFactory =
248 AssetRendererFactoryRegistryUtil.getAssetRendererFactoryByClassName(
249 assetEntry.getClassName());
250
251 if (assetRendererFactory == null) {
252 return StringPool.BLANK;
253 }
254
255 AssetRenderer assetRenderer = assetRendererFactory.getAssetRenderer(
256 assetEntry.getClassPK());
257
258 String viewInContextURL = assetRenderer.getURLViewInContext(
259 (LiferayPortletRequest)portletRequest,
260 (LiferayPortletResponse)portletResponse, null);
261
262 if (Validator.isNotNull(viewInContextURL) &&
263 !viewInContextURL.startsWith(Http.HTTP_WITH_SLASH) &&
264 !viewInContextURL.startsWith(Http.HTTPS_WITH_SLASH)) {
265
266 ThemeDisplay themeDisplay =
267 (ThemeDisplay)portletRequest.getAttribute(
268 WebKeys.THEME_DISPLAY);
269
270 viewInContextURL = themeDisplay.getPortalURL() + viewInContextURL;
271 }
272
273 return viewInContextURL;
274 }
275
276 protected String getFeedURL(PortletRequest portletRequest)
277 throws Exception {
278
279 String feedURL = getAssetPublisherURL(portletRequest);
280
281 return feedURL.concat("rss");
282 }
283
284 @Override
285 protected byte[] getRSS(
286 ResourceRequest portletRequest, ResourceResponse portletResponse)
287 throws Exception {
288
289 PortletPreferences portletPreferences = portletRequest.getPreferences();
290
291 String selectionStyle = portletPreferences.getValue(
292 "selectionStyle", "dynamic");
293
294 if (!selectionStyle.equals("dynamic")) {
295 return new byte[0];
296 }
297
298 String assetLinkBehavior = portletPreferences.getValue(
299 "assetLinkBehavior", "showFullContent");
300 String rssDisplayStyle = portletPreferences.getValue(
301 "rssDisplayStyle", RSSUtil.DISPLAY_STYLE_ABSTRACT);
302 String rssFeedType = portletPreferences.getValue(
303 "rssFeedType", RSSUtil.FEED_TYPE_DEFAULT);
304 String rssName = portletPreferences.getValue("rssName", null);
305
306 String format = RSSUtil.getFeedTypeFormat(rssFeedType);
307 double version = RSSUtil.getFeedTypeVersion(rssFeedType);
308
309 Set<String> defaultOrderValues = new HashSet<String>();
310
311 defaultOrderValues.add(Field.CREATE_DATE);
312 defaultOrderValues.add(Field.EXPIRATION_DATE);
313 defaultOrderValues.add(Field.MODIFIED_DATE);
314 defaultOrderValues.add(Field.PRIORITY);
315 defaultOrderValues.add(Field.PUBLISH_DATE);
316 defaultOrderValues.add(Field.TITLE);
317
318 if (!PropsValues.ASSET_PUBLISHER_SEARCH_WITH_INDEX) {
319 defaultOrderValues.add(Field.RATINGS);
320 defaultOrderValues.add(Field.VIEW_COUNT);
321 }
322
323 String orderByColumn1 = portletPreferences.getValue(
324 "orderByColumn1", null);
325 String orderByColumn2 = portletPreferences.getValue(
326 "orderbyColumn2", null);
327
328 if (!defaultOrderValues.contains(orderByColumn1)) {
329 portletPreferences.setValue("orderByColumn1", null);
330 portletPreferences.setValue("orderByType1", null);
331 }
332
333 if (!defaultOrderValues.contains(orderByColumn2)) {
334 portletPreferences.setValue("orderByColumn2", null);
335 portletPreferences.setValue("orderByType2", null);
336 }
337
338 String rss = exportToRSS(
339 portletRequest, portletResponse, rssName, null, format, version,
340 rssDisplayStyle, assetLinkBehavior,
341 getAssetEntries(portletRequest, portletPreferences));
342
343 return rss.getBytes(StringPool.UTF8);
344 }
345
346 @Override
347 protected boolean isRSSFeedsEnabled(PortletRequest portletRequest)
348 throws Exception {
349
350 if (!super.isRSSFeedsEnabled(portletRequest)) {
351 return false;
352 }
353
354 PortletPreferences portletPreferences = portletRequest.getPreferences();
355
356 return GetterUtil.getBoolean(
357 portletPreferences.getValue("enableRss", null));
358 }
359
360 }