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            @Override
068            public void addActivityInterpreter(
069                    SocialActivityInterpreter activityInterpreter) {
070    
071                    List<SocialActivityInterpreter> activityInterpreters =
072                            _activityInterpreters.get(activityInterpreter.getSelector());
073    
074                    if (activityInterpreters == null) {
075                            activityInterpreters = new ArrayList<SocialActivityInterpreter>();
076                    }
077    
078                    activityInterpreters.add(activityInterpreter);
079    
080                    _activityInterpreters.put(
081                            activityInterpreter.getSelector(), activityInterpreters);
082            }
083    
084            /**
085             * Removes the activity interpreter from the list of available interpreters.
086             *
087             * @param activityInterpreter the activity interpreter
088             */
089            @Override
090            public void deleteActivityInterpreter(
091                    SocialActivityInterpreter activityInterpreter) {
092    
093                    List<SocialActivityInterpreter> activityInterpreters =
094                            _activityInterpreters.get(activityInterpreter.getSelector());
095    
096                    if (activityInterpreters == null) {
097                            return;
098                    }
099    
100                    activityInterpreters.remove(activityInterpreter);
101            }
102    
103            @Override
104            public Map<String, List<SocialActivityInterpreter>>
105                    getActivityInterpreters() {
106    
107                    return _activityInterpreters;
108            }
109    
110            /**
111             * @deprecated As of 6.2.0, replaced by {@link #interpret(String,
112             *             SocialActivity, ServiceContext)}
113             */
114            @Override
115            public SocialActivityFeedEntry interpret(
116                    SocialActivity activity, ThemeDisplay themeDisplay) {
117    
118                    ServiceContext serviceContext = null;
119    
120                    try {
121                            serviceContext = ServiceContextFactory.getInstance(
122                                    themeDisplay.getRequest());
123                    }
124                    catch (Exception e) {
125                            return null;
126                    }
127    
128                    return interpret(StringPool.BLANK, activity, serviceContext);
129            }
130    
131            /**
132             * Creates a human readable activity feed entry for the activity using an
133             * available compatible activity interpreter.
134             *
135             * <p>
136             * This method finds the appropriate interpreter for the activity by going
137             * through the available interpreters and asking them if they can handle the
138             * asset type of the activity.
139             * </p>
140             *
141             * @param  activity the activity to be translated to human readable form
142             * @return the activity feed that is a human readable form of the activity
143             *         record or <code>null</code> if a compatible interpreter is not
144             *         found
145             */
146            @Override
147            public SocialActivityFeedEntry interpret(
148                    String selector, SocialActivity activity,
149                    ServiceContext serviceContext) {
150    
151                    HttpServletRequest request = serviceContext.getRequest();
152    
153                    if (request == null) {
154                            return null;
155                    }
156    
157                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
158                            WebKeys.THEME_DISPLAY);
159    
160                    try {
161                            if (activity.getUserId() == themeDisplay.getDefaultUserId()) {
162                                    return null;
163                            }
164                    }
165                    catch (Exception e) {
166                            _log.error(e, e);
167                    }
168    
169                    if (activity.getMirrorActivityId() > 0) {
170                            SocialActivity mirrorActivity = null;
171    
172                            try {
173                                    mirrorActivity = socialActivityLocalService.getActivity(
174                                            activity.getMirrorActivityId());
175                            }
176                            catch (Exception e) {
177                            }
178    
179                            if (mirrorActivity != null) {
180                                    activity = mirrorActivity;
181                            }
182                    }
183    
184                    List<SocialActivityInterpreter> activityInterpreters =
185                            _activityInterpreters.get(selector);
186    
187                    if (activityInterpreters == null) {
188                            return null;
189                    }
190    
191                    String className = PortalUtil.getClassName(activity.getClassNameId());
192    
193                    for (int i = 0; i < activityInterpreters.size(); i++) {
194                            SocialActivityInterpreterImpl activityInterpreter =
195                                    (SocialActivityInterpreterImpl)activityInterpreters.get(i);
196    
197                            if (activityInterpreter.hasClassName(className)) {
198                                    SocialActivityFeedEntry activityFeedEntry =
199                                            activityInterpreter.interpret(activity, serviceContext);
200    
201                                    if (activityFeedEntry != null) {
202                                            activityFeedEntry.setPortletId(
203                                                    activityInterpreter.getPortletId());
204    
205                                            return activityFeedEntry;
206                                    }
207                            }
208                    }
209    
210                    return null;
211            }
212    
213            @Override
214            public SocialActivityFeedEntry interpret(
215                    String selector, SocialActivitySet activitySet,
216                    ServiceContext serviceContext) {
217    
218                    HttpServletRequest request = serviceContext.getRequest();
219    
220                    if (request == null) {
221                            return null;
222                    }
223    
224                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
225                            WebKeys.THEME_DISPLAY);
226    
227                    try {
228                            if (activitySet.getUserId() == themeDisplay.getDefaultUserId()) {
229                                    return null;
230                            }
231                    }
232                    catch (Exception e) {
233                            _log.error(e, e);
234                    }
235    
236                    List<SocialActivityInterpreter> activityInterpreters =
237                            _activityInterpreters.get(selector);
238    
239                    if (activityInterpreters == null) {
240                            return null;
241                    }
242    
243                    String className = PortalUtil.getClassName(
244                            activitySet.getClassNameId());
245    
246                    for (int i = 0; i < activityInterpreters.size(); i++) {
247                            SocialActivityInterpreterImpl activityInterpreter =
248                                    (SocialActivityInterpreterImpl)activityInterpreters.get(i);
249    
250                            if (activityInterpreter.hasClassName(className)) {
251                                    SocialActivityFeedEntry activityFeedEntry =
252                                            activityInterpreter.interpret(activitySet, serviceContext);
253    
254                                    if (activityFeedEntry != null) {
255                                            activityFeedEntry.setPortletId(
256                                                    activityInterpreter.getPortletId());
257    
258                                            return activityFeedEntry;
259                                    }
260                            }
261                    }
262    
263                    return null;
264            }
265    
266            @Override
267            public void updateActivitySet(long activityId)
268                    throws PortalException, SystemException {
269    
270                    if (!PropsValues.SOCIAL_ACTIVITY_SETS_BUNDLING_ENABLED) {
271                            socialActivitySetLocalService.addActivitySet(activityId);
272    
273                            return;
274                    }
275    
276                    List<SocialActivityInterpreter> activityInterpreters =
277                            _activityInterpreters.get(
278                                    PropsValues.SOCIAL_ACTIVITY_SETS_SELECTOR);
279    
280                    if (activityInterpreters != null) {
281                            SocialActivity activity =
282                                    socialActivityPersistence.findByPrimaryKey(activityId);
283    
284                            String className = PortalUtil.getClassName(
285                                    activity.getClassNameId());
286    
287                            for (int i = 0; i < activityInterpreters.size(); i++) {
288                                    SocialActivityInterpreterImpl activityInterpreter =
289                                            (SocialActivityInterpreterImpl)activityInterpreters.get(i);
290    
291                                    if (activityInterpreter.hasClassName(className)) {
292                                            activityInterpreter.updateActivitySet(activityId);
293    
294                                            return;
295                                    }
296                            }
297                    }
298            }
299    
300            private static Log _log = LogFactoryUtil.getLog(
301                    SocialActivityInterpreterLocalServiceImpl.class);
302    
303            private Map<String, List<SocialActivityInterpreter>> _activityInterpreters =
304                    new HashMap<String, List<SocialActivityInterpreter>>();
305    
306    }