001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.activities.action;
016    
017    import com.liferay.portal.kernel.exception.SystemException;
018    import com.liferay.portal.kernel.util.HtmlUtil;
019    import com.liferay.portal.kernel.util.ParamUtil;
020    import com.liferay.portal.kernel.util.StringPool;
021    import com.liferay.portal.kernel.util.Validator;
022    import com.liferay.portal.model.Group;
023    import com.liferay.portal.service.GroupLocalServiceUtil;
024    import com.liferay.portal.theme.ThemeDisplay;
025    import com.liferay.portal.util.Portal;
026    import com.liferay.portal.util.PortalUtil;
027    import com.liferay.portal.util.WebKeys;
028    import com.liferay.portlet.social.model.SocialActivity;
029    import com.liferay.portlet.social.model.SocialActivityFeedEntry;
030    import com.liferay.portlet.social.service.SocialActivityInterpreterLocalServiceUtil;
031    import com.liferay.portlet.social.service.SocialActivityLocalServiceUtil;
032    import com.liferay.util.RSSUtil;
033    
034    import com.sun.syndication.feed.synd.SyndContent;
035    import com.sun.syndication.feed.synd.SyndContentImpl;
036    import com.sun.syndication.feed.synd.SyndEntry;
037    import com.sun.syndication.feed.synd.SyndEntryImpl;
038    import com.sun.syndication.feed.synd.SyndFeed;
039    import com.sun.syndication.feed.synd.SyndFeedImpl;
040    import com.sun.syndication.feed.synd.SyndLink;
041    import com.sun.syndication.feed.synd.SyndLinkImpl;
042    import com.sun.syndication.io.FeedException;
043    
044    import java.util.ArrayList;
045    import java.util.Collections;
046    import java.util.Date;
047    import java.util.List;
048    
049    import javax.portlet.PortletRequest;
050    import javax.portlet.ResourceRequest;
051    import javax.portlet.ResourceResponse;
052    
053    /**
054     * @author Brian Wing Shun Chan
055     * @author Vilmos Papp
056     */
057    public class RSSAction extends com.liferay.portal.struts.RSSAction {
058    
059            protected List<SocialActivity> getActivities(PortletRequest portletRequest)
060                    throws Exception {
061    
062                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
063                            WebKeys.THEME_DISPLAY);
064    
065                    Group group = GroupLocalServiceUtil.getGroup(
066                            themeDisplay.getScopeGroupId());
067    
068                    int start = 0;
069                    int end = 10;
070    
071                    if (group.isOrganization()) {
072                            return SocialActivityLocalServiceUtil.getOrganizationActivities(
073                                    group.getOrganizationId(), start, end);
074                    }
075                    else if (group.isRegularSite()) {
076                            return SocialActivityLocalServiceUtil.getGroupActivities(
077                                    group.getGroupId(), start, end);
078                    }
079                    else if (group.isUser()) {
080                            return SocialActivityLocalServiceUtil.getUserActivities(
081                                    group.getClassPK(), start, end);
082                    }
083    
084                    return Collections.emptyList();
085            }
086    
087            @Override
088            protected byte[] getRSS(
089                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
090                    throws Exception {
091    
092                    ThemeDisplay themeDisplay = (ThemeDisplay)resourceRequest.getAttribute(
093                            WebKeys.THEME_DISPLAY);
094    
095                    SyndFeed syndFeed = new SyndFeedImpl();
096    
097                    String description = ParamUtil.getString(resourceRequest, "feedTitle");
098    
099                    syndFeed.setDescription(description);
100    
101                    List<SyndEntry> syndEntries = new ArrayList<SyndEntry>();
102    
103                    syndFeed.setEntries(syndEntries);
104    
105                    List<SocialActivity> activities = getActivities(resourceRequest);
106    
107                    for (SocialActivity activity : activities) {
108                            SocialActivityFeedEntry activityFeedEntry =
109                                    SocialActivityInterpreterLocalServiceUtil.interpret(
110                                            activity, themeDisplay);
111    
112                            if (activityFeedEntry == null) {
113                                    continue;
114                            }
115    
116                            SyndEntry syndEntry = new SyndEntryImpl();
117    
118                            SyndContent syndContent = new SyndContentImpl();
119    
120                            syndContent.setType(RSSUtil.FEED_TYPE_DEFAULT);
121                            syndContent.setValue(activityFeedEntry.getBody());
122    
123                            syndEntry.setDescription(syndContent);
124    
125                            if (Validator.isNotNull(activityFeedEntry.getLink())) {
126                                    syndEntry.setLink(activityFeedEntry.getLink());
127                            }
128    
129                            syndEntry.setPublishedDate(new Date(activity.getCreateDate()));
130                            syndEntry.setTitle(
131                                    HtmlUtil.extractText(activityFeedEntry.getTitle()));
132    
133                            syndEntries.add(syndEntry);
134                    }
135    
136                    syndFeed.setFeedType(RSSUtil.FEED_TYPE_DEFAULT);
137    
138                    List<SyndLink> syndLinks = new ArrayList<SyndLink>();
139    
140                    syndFeed.setLinks(syndLinks);
141    
142                    SyndLink selfSyndLink = new SyndLinkImpl();
143    
144                    syndLinks.add(selfSyndLink);
145    
146                    String link =
147                            PortalUtil.getLayoutFullURL(themeDisplay) +
148                                    Portal.FRIENDLY_URL_SEPARATOR + "activities/rss";
149    
150                    selfSyndLink.setHref(link);
151    
152                    selfSyndLink.setRel("self");
153    
154                    SyndLink alternateSyndLink = new SyndLinkImpl();
155    
156                    syndLinks.add(alternateSyndLink);
157    
158                    alternateSyndLink.setHref(PortalUtil.getLayoutFullURL(themeDisplay));
159                    alternateSyndLink.setRel("alternate");
160    
161                    syndFeed.setPublishedDate(new Date());
162                    syndFeed.setTitle(description);
163                    syndFeed.setUri(link);
164    
165                    String rss = StringPool.BLANK;
166    
167                    try {
168                            rss = RSSUtil.export(syndFeed);
169                    }
170                    catch (FeedException fe) {
171                            throw new SystemException(fe);
172                    }
173    
174                    return rss.getBytes(StringPool.UTF8);
175            }
176    
177    }