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