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