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.assetpublisher.util.AssetPublisherUtil;
036 import com.liferay.util.RSSUtil;
037
038 import com.sun.syndication.feed.synd.SyndContent;
039 import com.sun.syndication.feed.synd.SyndContentImpl;
040 import com.sun.syndication.feed.synd.SyndEntry;
041 import com.sun.syndication.feed.synd.SyndEntryImpl;
042 import com.sun.syndication.feed.synd.SyndFeed;
043 import com.sun.syndication.feed.synd.SyndFeedImpl;
044 import com.sun.syndication.feed.synd.SyndLink;
045 import com.sun.syndication.feed.synd.SyndLinkImpl;
046
047 import java.util.ArrayList;
048 import java.util.Date;
049 import java.util.List;
050
051 import javax.portlet.PortletPreferences;
052 import javax.portlet.PortletRequest;
053 import javax.portlet.PortletResponse;
054 import javax.portlet.ResourceRequest;
055 import javax.portlet.ResourceResponse;
056
057
061 public class RSSAction extends com.liferay.portal.struts.RSSAction {
062
063 protected String exportToRSS(
064 PortletRequest portletRequest, PortletResponse portletResponse,
065 String name, String description, String format, double version,
066 String displayStyle, String linkBehavior,
067 List<AssetEntry> assetEntries)
068 throws Exception {
069
070 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
071 WebKeys.THEME_DISPLAY);
072
073 SyndFeed syndFeed = new SyndFeedImpl();
074
075 syndFeed.setDescription(GetterUtil.getString(description, name));
076
077 List<SyndEntry> syndEntries = new ArrayList<SyndEntry>();
078
079 syndFeed.setEntries(syndEntries);
080
081 for (AssetEntry assetEntry : assetEntries) {
082 SyndEntry syndEntry = new SyndEntryImpl();
083
084 String author = PortalUtil.getUserName(assetEntry);
085
086 syndEntry.setAuthor(author);
087
088 SyndContent syndContent = new SyndContentImpl();
089
090 syndContent.setType(RSSUtil.ENTRY_TYPE_DEFAULT);
091
092 String value = null;
093
094 String languageId = LanguageUtil.getLanguageId(portletRequest);
095
096 if (displayStyle.equals(RSSUtil.DISPLAY_STYLE_TITLE)) {
097 value = StringPool.BLANK;
098 }
099 else {
100 value = assetEntry.getSummary(languageId, true);
101 }
102
103 syndContent.setValue(value);
104
105 syndEntry.setDescription(syndContent);
106
107 String link = getEntryURL(
108 portletRequest, portletResponse, linkBehavior, assetEntry);
109
110 syndEntry.setLink(link);
111
112 syndEntry.setPublishedDate(assetEntry.getPublishDate());
113 syndEntry.setTitle(assetEntry.getTitle(languageId, true));
114 syndEntry.setUpdatedDate(assetEntry.getModifiedDate());
115 syndEntry.setUri(syndEntry.getLink());
116
117 syndEntries.add(syndEntry);
118 }
119
120 syndFeed.setFeedType(RSSUtil.getFeedType(format, version));
121
122 List<SyndLink> syndLinks = new ArrayList<SyndLink>();
123
124 syndFeed.setLinks(syndLinks);
125
126 SyndLink selfSyndLink = new SyndLinkImpl();
127
128 syndLinks.add(selfSyndLink);
129
130 String feedURL = getFeedURL(portletRequest);
131
132 selfSyndLink.setHref(feedURL);
133
134 selfSyndLink.setRel("self");
135
136 SyndLink alternateSyndLink = new SyndLinkImpl();
137
138 syndLinks.add(alternateSyndLink);
139
140 alternateSyndLink.setHref(PortalUtil.getLayoutFullURL(themeDisplay));
141 alternateSyndLink.setRel("alternate");
142
143 syndFeed.setPublishedDate(new Date());
144 syndFeed.setTitle(name);
145 syndFeed.setUri(feedURL);
146
147 return RSSUtil.export(syndFeed);
148 }
149
150 protected List<AssetEntry> getAssetEntries(
151 PortletRequest portletRequest,
152 PortletPreferences portletPreferences)
153 throws Exception {
154
155 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
156 WebKeys.THEME_DISPLAY);
157
158 int rssDelta = GetterUtil.getInteger(
159 portletPreferences.getValue("rssDelta", "20"));
160
161 return AssetPublisherUtil.getAssetEntries(
162 portletPreferences, themeDisplay.getLayout(),
163 themeDisplay.getScopeGroupId(), rssDelta, true);
164 }
165
166 protected String getAssetPublisherURL(PortletRequest portletRequest)
167 throws Exception {
168
169 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
170 WebKeys.THEME_DISPLAY);
171
172 Layout layout = themeDisplay.getLayout();
173
174 PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
175
176 StringBundler sb = new StringBundler(7);
177
178 String layoutFriendlyURL = GetterUtil.getString(
179 PortalUtil.getLayoutFriendlyURL(layout, themeDisplay));
180
181 if (!layoutFriendlyURL.startsWith(Http.HTTP_WITH_SLASH) &&
182 !layoutFriendlyURL.startsWith(Http.HTTPS_WITH_SLASH)) {
183
184 sb.append(themeDisplay.getPortalURL());
185 }
186
187 sb.append(layoutFriendlyURL);
188 sb.append(Portal.FRIENDLY_URL_SEPARATOR);
189 sb.append("asset_publisher/");
190 sb.append(portletDisplay.getInstanceId());
191 sb.append(StringPool.SLASH);
192
193 return sb.toString();
194 }
195
196 protected String getEntryURL(
197 PortletRequest portletRequest, PortletResponse portletResponse,
198 String linkBehavior, AssetEntry assetEntry)
199 throws Exception {
200
201 if (linkBehavior.equals("viewInPortlet")) {
202 return getEntryURLViewInContext(
203 portletRequest, portletResponse, assetEntry);
204 }
205 else {
206 return getEntryURLAssetPublisher(
207 portletRequest, portletResponse, assetEntry);
208 }
209 }
210
211 protected String getEntryURLAssetPublisher(
212 PortletRequest portletRequest, PortletResponse portletResponse,
213 AssetEntry assetEntry)
214 throws Exception {
215
216 AssetRendererFactory assetRendererFactory =
217 AssetRendererFactoryRegistryUtil.getAssetRendererFactoryByClassName(
218 assetEntry.getClassName());
219
220 StringBundler sb = new StringBundler(4);
221
222 sb.append(getAssetPublisherURL(portletRequest));
223 sb.append(assetRendererFactory.getType());
224 sb.append("/id/");
225 sb.append(assetEntry.getEntryId());
226
227 return sb.toString();
228 }
229
230 protected String getEntryURLViewInContext(
231 PortletRequest portletRequest, PortletResponse portletResponse,
232 AssetEntry assetEntry)
233 throws Exception {
234
235 AssetRendererFactory assetRendererFactory =
236 AssetRendererFactoryRegistryUtil.getAssetRendererFactoryByClassName(
237 assetEntry.getClassName());
238
239 AssetRenderer assetRenderer = assetRendererFactory.getAssetRenderer(
240 assetEntry.getClassPK());
241
242 String viewInContextURL = assetRenderer.getURLViewInContext(
243 (LiferayPortletRequest)portletRequest,
244 (LiferayPortletResponse)portletResponse, null);
245
246 if (Validator.isNotNull(viewInContextURL) &&
247 !viewInContextURL.startsWith(Http.HTTP_WITH_SLASH) &&
248 !viewInContextURL.startsWith(Http.HTTPS_WITH_SLASH)) {
249
250 ThemeDisplay themeDisplay =
251 (ThemeDisplay)portletRequest.getAttribute(
252 WebKeys.THEME_DISPLAY);
253
254 viewInContextURL = themeDisplay.getPortalURL() + viewInContextURL;
255 }
256
257 return viewInContextURL;
258 }
259
260 protected String getFeedURL(PortletRequest portletRequest)
261 throws Exception {
262
263 String feedURL = getAssetPublisherURL(portletRequest);
264
265 return feedURL.concat("rss");
266 }
267
268 @Override
269 protected byte[] getRSS(
270 ResourceRequest portletRequest, ResourceResponse portletResponse)
271 throws Exception {
272
273 PortletPreferences portletPreferences = portletRequest.getPreferences();
274
275 String selectionStyle = portletPreferences.getValue(
276 "selectionStyle", "dynamic");
277
278 if (!selectionStyle.equals("dynamic")) {
279 return new byte[0];
280 }
281
282 String assetLinkBehavior = portletPreferences.getValue(
283 "assetLinkBehavior", "showFullContent");
284 String rssDisplayStyle = portletPreferences.getValue(
285 "rssDisplayStyle", RSSUtil.DISPLAY_STYLE_ABSTRACT);
286 String rssFeedType = portletPreferences.getValue(
287 "rssFeedType", RSSUtil.FEED_TYPE_DEFAULT);
288 String rssName = portletPreferences.getValue("rssName", null);
289
290 String format = RSSUtil.getFeedTypeFormat(rssFeedType);
291 double version = RSSUtil.getFeedTypeVersion(rssFeedType);
292
293 String rss = exportToRSS(
294 portletRequest, portletResponse, rssName, null, format, version,
295 rssDisplayStyle, assetLinkBehavior,
296 getAssetEntries(portletRequest, portletPreferences));
297
298 return rss.getBytes(StringPool.UTF8);
299 }
300
301 }