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.ContentTypes;
019    import com.liferay.portal.kernel.util.HtmlUtil;
020    import com.liferay.portal.kernel.util.ParamUtil;
021    import com.liferay.portal.kernel.util.StringPool;
022    import com.liferay.portal.kernel.util.Validator;
023    import com.liferay.portal.model.Group;
024    import com.liferay.portal.service.GroupLocalServiceUtil;
025    import com.liferay.portal.struts.PortletAction;
026    import com.liferay.portal.theme.ThemeDisplay;
027    import com.liferay.portal.util.Portal;
028    import com.liferay.portal.util.PortalUtil;
029    import com.liferay.portal.util.WebKeys;
030    import com.liferay.portlet.social.model.SocialActivity;
031    import com.liferay.portlet.social.model.SocialActivityFeedEntry;
032    import com.liferay.portlet.social.service.SocialActivityInterpreterLocalServiceUtil;
033    import com.liferay.portlet.social.service.SocialActivityLocalServiceUtil;
034    import com.liferay.util.RSSUtil;
035    
036    import com.sun.syndication.feed.synd.SyndContent;
037    import com.sun.syndication.feed.synd.SyndContentImpl;
038    import com.sun.syndication.feed.synd.SyndEntry;
039    import com.sun.syndication.feed.synd.SyndEntryImpl;
040    import com.sun.syndication.feed.synd.SyndFeed;
041    import com.sun.syndication.feed.synd.SyndFeedImpl;
042    import com.sun.syndication.io.FeedException;
043    
044    import edu.emory.mathcs.backport.java.util.Collections;
045    
046    import java.io.OutputStream;
047    
048    import java.util.ArrayList;
049    import java.util.Date;
050    import java.util.List;
051    
052    import javax.portlet.PortletConfig;
053    import javax.portlet.PortletRequest;
054    import javax.portlet.ResourceRequest;
055    import javax.portlet.ResourceResponse;
056    
057    import org.apache.struts.action.ActionForm;
058    import org.apache.struts.action.ActionMapping;
059    
060    /**
061     * @author Brian Wing Shun Chan
062     * @author Vilmos Papp
063     */
064    public class RSSAction extends PortletAction {
065    
066            @Override
067            public void serveResource(
068                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
069                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
070                    throws Exception {
071    
072                    resourceResponse.setContentType(ContentTypes.TEXT_XML_UTF8);
073    
074                    OutputStream outputStream = resourceResponse.getPortletOutputStream();
075    
076                    try {
077                            byte[] bytes = getRSS(resourceRequest);
078    
079                            outputStream.write(bytes);
080                    }
081                    finally {
082                            outputStream.close();
083                    }
084            }
085    
086            protected List<SocialActivity> getActivities(PortletRequest portletRequest)
087                    throws Exception {
088    
089                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
090                            WebKeys.THEME_DISPLAY);
091    
092                    Group group = GroupLocalServiceUtil.getGroup(
093                            themeDisplay.getScopeGroupId());
094    
095                    int start = 0;
096                    int end = 10;
097    
098                    if (group.isOrganization()) {
099                            return SocialActivityLocalServiceUtil.getOrganizationActivities(
100                                    group.getOrganizationId(), start, end);
101                    }
102                    else if (group.isRegularSite()) {
103                            return SocialActivityLocalServiceUtil.getGroupActivities(
104                                    group.getGroupId(), start, end);
105                    }
106                    else if (group.isUser()) {
107                            return SocialActivityLocalServiceUtil.getUserActivities(
108                                    group.getClassPK(), start, end);
109                    }
110    
111                    return Collections.emptyList();
112            }
113    
114            protected byte[] getRSS(PortletRequest portletRequest) throws Exception {
115                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
116                            WebKeys.THEME_DISPLAY);
117    
118                    SyndFeed syndFeed = new SyndFeedImpl();
119    
120                    String feedTitle = ParamUtil.getString(portletRequest, "feedTitle");
121    
122                    syndFeed.setDescription(feedTitle);
123    
124                    syndFeed.setFeedType(RSSUtil.FEED_TYPE_DEFAULT);
125    
126                    String feedLink = PortalUtil.getLayoutFullURL(themeDisplay) +
127                            Portal.FRIENDLY_URL_SEPARATOR + "activities/rss";
128    
129                    syndFeed.setLink(feedLink);
130    
131                    syndFeed.setTitle(feedTitle);
132    
133                    List<SyndEntry> syndEntries = new ArrayList<SyndEntry>();
134    
135                    syndFeed.setEntries(syndEntries);
136    
137                    List<SocialActivity> activities = getActivities(portletRequest);
138    
139                    for (SocialActivity activity : activities) {
140                            SocialActivityFeedEntry activityFeedEntry =
141                                    SocialActivityInterpreterLocalServiceUtil.interpret(
142                                            activity, themeDisplay);
143    
144                            if (activityFeedEntry == null) {
145                                    continue;
146                            }
147    
148                            SyndEntry syndEntry = new SyndEntryImpl();
149    
150                            SyndContent syndContent = new SyndContentImpl();
151    
152                            syndContent.setType(RSSUtil.FEED_TYPE_DEFAULT);
153                            syndContent.setValue(activityFeedEntry.getBody());
154    
155                            syndEntry.setDescription(syndContent);
156    
157                            if (Validator.isNotNull(activityFeedEntry.getLink())) {
158                                    syndEntry.setLink(activityFeedEntry.getLink());
159                            }
160    
161                            syndEntry.setPublishedDate(new Date(activity.getCreateDate()));
162                            syndEntry.setTitle(
163                                    HtmlUtil.extractText(activityFeedEntry.getTitle()));
164    
165                            syndEntries.add(syndEntry);
166                    }
167    
168                    String rss = StringPool.BLANK;
169    
170                    try {
171                            rss = RSSUtil.export(syndFeed);
172                    }
173                    catch (FeedException fe) {
174                            throw new SystemException(fe);
175                    }
176    
177                    return rss.getBytes(StringPool.UTF8);
178            }
179    
180            @Override
181            protected boolean isCheckMethodOnProcessAction() {
182                    return _CHECK_METHOD_ON_PROCESS_ACTION;
183            }
184    
185            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
186    
187    }