001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
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    /**
062     * @author Brian Wing Shun Chan
063     * @author Julio Camarero
064     */
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    }