001    /**
002     * Copyright (c) 2000-2013 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.social.service.impl;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.log.Log;
020    import com.liferay.portal.kernel.log.LogFactoryUtil;
021    import com.liferay.portal.kernel.util.StringPool;
022    import com.liferay.portal.kernel.util.WebKeys;
023    import com.liferay.portal.service.ServiceContext;
024    import com.liferay.portal.service.ServiceContextFactory;
025    import com.liferay.portal.theme.ThemeDisplay;
026    import com.liferay.portal.util.PortalUtil;
027    import com.liferay.portal.util.PropsValues;
028    import com.liferay.portlet.social.model.SocialActivity;
029    import com.liferay.portlet.social.model.SocialActivityFeedEntry;
030    import com.liferay.portlet.social.model.SocialActivityInterpreter;
031    import com.liferay.portlet.social.model.SocialActivitySet;
032    import com.liferay.portlet.social.model.impl.SocialActivityInterpreterImpl;
033    import com.liferay.portlet.social.service.base.SocialActivityInterpreterLocalServiceBaseImpl;
034    
035    import java.util.ArrayList;
036    import java.util.HashMap;
037    import java.util.List;
038    import java.util.Map;
039    
040    import javax.servlet.http.HttpServletRequest;
041    
042    /**
043     * The social activity interpreter local service. Activity interpreters are
044     * classes responsible for translating activity records into human readable
045     * form. This service holds a list of interpreters and provides methods to add
046     * or remove items from this list.
047     *
048     * <p>
049     * Activity interpreters use the language files to get text fragments based on
050     * the activity's type and the type of asset on which the activity was done.
051     * Interpreters are created for specific asset types and are only capable of
052     * translating activities done on assets of those types. As an example, there is
053     * an interpreter BlogsActivityInterpreter that can only translate activity
054     * records for blog entries.
055     * </p>
056     *
057     * @author Brian Wing Shun Chan
058     */
059    public class SocialActivityInterpreterLocalServiceImpl
060            extends SocialActivityInterpreterLocalServiceBaseImpl {
061    
062            /**
063             * Adds the activity interpreter to the list of available interpreters.
064             *
065             * @param activityInterpreter the activity interpreter
066             */
067            public void addActivityInterpreter(
068                    SocialActivityInterpreter activityInterpreter) {
069    
070                    List<SocialActivityInterpreter> activityInterpreters =
071                            _activityInterpreters.get(activityInterpreter.getSelector());
072    
073                    if (activityInterpreters == null) {
074                            activityInterpreters = new ArrayList<SocialActivityInterpreter>();
075                    }
076    
077                    activityInterpreters.add(activityInterpreter);
078    
079                    _activityInterpreters.put(
080                            activityInterpreter.getSelector(), activityInterpreters);
081            }
082    
083            /**
084             * Removes the activity interpreter from the list of available interpreters.
085             *
086             * @param activityInterpreter the activity interpreter
087             */
088            public void deleteActivityInterpreter(
089                    SocialActivityInterpreter activityInterpreter) {
090    
091                    List<SocialActivityInterpreter> activityInterpreters =
092                            _activityInterpreters.get(activityInterpreter.getSelector());
093    
094                    if (activityInterpreters == null) {
095                            return;
096                    }
097    
098                    activityInterpreters.remove(activityInterpreter);
099            }
100    
101            public Map<String, List<SocialActivityInterpreter>>
102                    getActivityInterpreters() {
103    
104                    return _activityInterpreters;
105            }
106    
107            /**
108             * @deprecated As of 6.2.0, replaced by {@link #interpret(String,
109             *             SocialActivity, ServiceContext)}
110             */
111            public SocialActivityFeedEntry interpret(
112                    SocialActivity activity, ThemeDisplay themeDisplay) {
113    
114                    ServiceContext serviceContext = null;
115    
116                    try {
117                            serviceContext = ServiceContextFactory.getInstance(
118                                    themeDisplay.getRequest());
119                    }
120                    catch (Exception e) {
121                            return null;
122                    }
123    
124                    return interpret(StringPool.BLANK, activity, serviceContext);
125            }
126    
127            /**
128             * Creates a human readable activity feed entry for the activity using an
129             * available compatible activity interpreter.
130             *
131             * <p>
132             * This method finds the appropriate interpreter for the activity by going
133             * through the available interpreters and asking them if they can handle the
134             * asset type of the activity.
135             * </p>
136             *
137             * @param  activity the activity to be translated to human readable form
138             * @return the activity feed that is a human readable form of the activity
139             *         record or <code>null</code> if a compatible interpreter is not
140             *         found
141             */
142            public SocialActivityFeedEntry interpret(
143                    String selector, SocialActivity activity,
144                    ServiceContext serviceContext) {
145    
146                    HttpServletRequest request = serviceContext.getRequest();
147    
148                    if (request == null) {
149                            return null;
150                    }
151    
152                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
153                            WebKeys.THEME_DISPLAY);
154    
155                    try {
156                            if (activity.getUserId() == themeDisplay.getDefaultUserId()) {
157                                    return null;
158                            }
159                    }
160                    catch (Exception e) {
161                            _log.error(e, e);
162                    }
163    
164                    if (activity.getMirrorActivityId() > 0) {
165                            SocialActivity mirrorActivity = null;
166    
167                            try {
168                                    mirrorActivity = socialActivityLocalService.getActivity(
169                                            activity.getMirrorActivityId());
170                            }
171                            catch (Exception e) {
172                            }
173    
174                            if (mirrorActivity != null) {
175                                    activity = mirrorActivity;
176                            }
177                    }
178    
179                    List<SocialActivityInterpreter> activityInterpreters =
180                            _activityInterpreters.get(selector);
181    
182                    if (activityInterpreters == null) {
183                            return null;
184                    }
185    
186                    String className = PortalUtil.getClassName(activity.getClassNameId());
187    
188                    for (int i = 0; i < activityInterpreters.size(); i++) {
189                            SocialActivityInterpreterImpl activityInterpreter =
190                                    (SocialActivityInterpreterImpl)activityInterpreters.get(i);
191    
192                            if (activityInterpreter.hasClassName(className)) {
193                                    SocialActivityFeedEntry activityFeedEntry =
194                                            activityInterpreter.interpret(activity, serviceContext);
195    
196                                    if (activityFeedEntry != null) {
197                                            activityFeedEntry.setPortletId(
198                                                    activityInterpreter.getPortletId());
199    
200                                            return activityFeedEntry;
201                                    }
202                            }
203                    }
204    
205                    return null;
206            }
207    
208            public SocialActivityFeedEntry interpret(
209                    String selector, SocialActivitySet activitySet,
210                    ServiceContext serviceContext) {
211    
212                    HttpServletRequest request = serviceContext.getRequest();
213    
214                    if (request == null) {
215                            return null;
216                    }
217    
218                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
219                            WebKeys.THEME_DISPLAY);
220    
221                    try {
222                            if (activitySet.getUserId() == themeDisplay.getDefaultUserId()) {
223                                    return null;
224                            }
225                    }
226                    catch (Exception e) {
227                            _log.error(e, e);
228                    }
229    
230                    List<SocialActivityInterpreter> activityInterpreters =
231                            _activityInterpreters.get(selector);
232    
233                    if (activityInterpreters == null) {
234                            return null;
235                    }
236    
237                    String className = PortalUtil.getClassName(
238                            activitySet.getClassNameId());
239    
240                    for (int i = 0; i < activityInterpreters.size(); i++) {
241                            SocialActivityInterpreterImpl activityInterpreter =
242                                    (SocialActivityInterpreterImpl)activityInterpreters.get(i);
243    
244                            if (activityInterpreter.hasClassName(className)) {
245                                    SocialActivityFeedEntry activityFeedEntry =
246                                            activityInterpreter.interpret(activitySet, serviceContext);
247    
248                                    if (activityFeedEntry != null) {
249                                            activityFeedEntry.setPortletId(
250                                                    activityInterpreter.getPortletId());
251    
252                                            return activityFeedEntry;
253                                    }
254                            }
255                    }
256    
257                    return null;
258            }
259    
260            public void updateActivitySet(long activityId)
261                    throws PortalException, SystemException {
262    
263                    List<SocialActivityInterpreter> activityInterpreters =
264                            _activityInterpreters.get(
265                                    PropsValues.SOCIAL_ACTIVITY_SETS_SELECTOR);
266    
267                    if (activityInterpreters != null) {
268                            SocialActivity activity =
269                                    socialActivityPersistence.findByPrimaryKey(activityId);
270    
271                            String className = PortalUtil.getClassName(
272                                    activity.getClassNameId());
273    
274                            for (int i = 0; i < activityInterpreters.size(); i++) {
275                                    SocialActivityInterpreterImpl activityInterpreter =
276                                            (SocialActivityInterpreterImpl)activityInterpreters.get(i);
277    
278                                    if (activityInterpreter.hasClassName(className)) {
279                                            activityInterpreter.updateActivitySet(activityId);
280                                    }
281                            }
282                    }
283            }
284    
285            private static Log _log = LogFactoryUtil.getLog(
286                    SocialActivityInterpreterLocalServiceImpl.class);
287    
288            private Map<String, List<SocialActivityInterpreter>> _activityInterpreters =
289                    new HashMap<String, List<SocialActivityInterpreter>>();
290    
291    }