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.cache.MultiVMPoolUtil;
018    import com.liferay.portal.kernel.cache.PortalCache;
019    import com.liferay.portal.kernel.exception.PortalException;
020    import com.liferay.portal.kernel.exception.SystemException;
021    import com.liferay.portal.kernel.json.JSONException;
022    import com.liferay.portal.kernel.json.JSONFactoryUtil;
023    import com.liferay.portal.kernel.json.JSONObject;
024    import com.liferay.portal.kernel.log.Log;
025    import com.liferay.portal.kernel.log.LogFactoryUtil;
026    import com.liferay.portal.kernel.util.GetterUtil;
027    import com.liferay.portal.kernel.util.StringBundler;
028    import com.liferay.portal.kernel.util.StringPool;
029    import com.liferay.portal.model.Group;
030    import com.liferay.portal.util.PortalUtil;
031    import com.liferay.portlet.social.NoSuchActivitySettingException;
032    import com.liferay.portlet.social.model.SocialActivityCounterDefinition;
033    import com.liferay.portlet.social.model.SocialActivityDefinition;
034    import com.liferay.portlet.social.model.SocialActivitySetting;
035    import com.liferay.portlet.social.model.SocialActivitySettingConstants;
036    import com.liferay.portlet.social.service.base.SocialActivitySettingLocalServiceBaseImpl;
037    import com.liferay.portlet.social.util.SocialConfigurationUtil;
038    
039    import java.util.ArrayList;
040    import java.util.List;
041    
042    /**
043     * @author Zsolt Berentey
044     */
045    public class SocialActivitySettingLocalServiceImpl
046            extends SocialActivitySettingLocalServiceBaseImpl {
047    
048            public void deleteActivitySetting(
049                            long groupId, String className, long classPK)
050                    throws SystemException {
051    
052                    long classNameId = PortalUtil.getClassNameId(className);
053                    String name = _PREFIX_CLASS_PK.concat(String.valueOf(classPK));
054    
055                    try {
056                            socialActivitySettingPersistence.removeByG_C_A_N(
057                                    groupId, classNameId, 0, name);
058                    }
059                    catch (NoSuchActivitySettingException nsase) {
060                    }
061            }
062    
063            public void deleteActivitySettings(long groupId) throws SystemException {
064                    socialActivitySettingPersistence.removeByGroupId(groupId);
065            }
066    
067            public SocialActivityDefinition getActivityDefinition(
068                            long groupId, String className, int activityType)
069                    throws SystemException {
070    
071                    String key = encodeKey(groupId, className, activityType);
072    
073                    SocialActivityDefinition activityDefinition = _activityDefinitions.get(
074                            key);
075    
076                    if (activityDefinition != null) {
077                            return activityDefinition;
078                    }
079    
080                    SocialActivityDefinition defaultActivityDefinition =
081                            SocialConfigurationUtil.getActivityDefinition(
082                                    className, activityType);
083    
084                    if (defaultActivityDefinition == null) {
085                            return null;
086                    }
087    
088                    activityDefinition = getActivityDefinition(
089                            groupId, className, activityType, defaultActivityDefinition);
090    
091                    _activityDefinitions.put(key, activityDefinition);
092    
093                    return activityDefinition;
094            }
095    
096            public List<SocialActivityDefinition> getActivityDefinitions(
097                            long groupId, String className)
098                    throws SystemException {
099    
100                    List<SocialActivityDefinition> activityDefinitions =
101                            new ArrayList<SocialActivityDefinition>();
102    
103                    List<SocialActivityDefinition> defaultActivityDefinitions =
104                            SocialConfigurationUtil.getActivityDefinitions(className);
105    
106                    for (SocialActivityDefinition defaultActivityDefinition :
107                                    defaultActivityDefinitions) {
108    
109                            SocialActivityDefinition activityDefinition = getActivityDefinition(
110                                    groupId, className,
111                                    defaultActivityDefinition.getActivityType());
112    
113                            activityDefinitions.add(activityDefinition);
114                    }
115    
116                    return activityDefinitions;
117            }
118    
119            public List<SocialActivitySetting> getActivitySettings(long groupId)
120                    throws SystemException {
121    
122                    return socialActivitySettingPersistence.findByG_A(groupId, 0);
123            }
124    
125            public boolean isEnabled(long groupId, long classNameId)
126                    throws SystemException {
127    
128                    SocialActivitySetting activitySetting =
129                            socialActivitySettingPersistence.fetchByG_C_A_N(
130                                    groupId, classNameId, 0,
131                                    SocialActivitySettingConstants.NAME_ENABLED);
132    
133                    if (activitySetting == null) {
134                            return false;
135                    }
136    
137                    return GetterUtil.getBoolean(activitySetting.getValue());
138            }
139    
140            public boolean isEnabled(long groupId, long classNameId, long classPK)
141                    throws SystemException {
142    
143                    String name = _PREFIX_CLASS_PK.concat(String.valueOf(classPK));
144    
145                    SocialActivitySetting activitySetting =
146                            socialActivitySettingPersistence.fetchByG_C_A_N(
147                                    groupId, classNameId, 0, name);
148    
149                    if (activitySetting == null) {
150                            return true;
151                    }
152    
153                    try {
154                            JSONObject jsonObject = JSONFactoryUtil.createJSONObject(
155                                    activitySetting.getValue());
156    
157                            return jsonObject.getBoolean("enabled");
158                    }
159                    catch (JSONException jsone) {
160                            _log.error(
161                                    "Unable to create JSON object from " +
162                                            activitySetting.getValue());
163    
164                            return false;
165                    }
166            }
167    
168            public void updateActivitySetting(
169                            long groupId, String className, boolean enabled)
170                    throws PortalException, SystemException {
171    
172                    long classNameId = PortalUtil.getClassNameId(className);
173    
174                    SocialActivitySetting activitySetting =
175                            socialActivitySettingPersistence.fetchByG_C_A_N(
176                                    groupId, classNameId, 0,
177                                    SocialActivitySettingConstants.NAME_ENABLED);
178    
179                    if (activitySetting == null) {
180                            Group group = groupLocalService.getGroup(groupId);
181    
182                            long activitySettingId = counterLocalService.increment();
183    
184                            activitySetting = socialActivitySettingPersistence.create(
185                                    activitySettingId);
186    
187                            activitySetting.setGroupId(groupId);
188                            activitySetting.setCompanyId(group.getCompanyId());
189                            activitySetting.setClassNameId(classNameId);
190                            activitySetting.setName(
191                                    SocialActivitySettingConstants.NAME_ENABLED);
192                    }
193    
194                    activitySetting.setValue(String.valueOf(enabled));
195    
196                    socialActivitySettingPersistence.update(activitySetting);
197            }
198    
199            public void updateActivitySetting(
200                            long groupId, String className, int activityType,
201                            SocialActivityCounterDefinition activityCounterDefinition)
202                    throws PortalException, SystemException {
203    
204                    long classNameId = PortalUtil.getClassNameId(className);
205    
206                    SocialActivityDefinition defaultActivityDefinition =
207                            SocialConfigurationUtil.getActivityDefinition(
208                                    className, activityType);
209    
210                    SocialActivityCounterDefinition defaultActivityCounterDefinition =
211                            defaultActivityDefinition.getActivityCounterDefinition(
212                                    activityCounterDefinition.getName());
213    
214                    SocialActivitySetting activitySetting =
215                            socialActivitySettingPersistence.fetchByG_C_A_N(
216                                    groupId, classNameId, activityType,
217                                    activityCounterDefinition.getName());
218    
219                    if ((defaultActivityCounterDefinition != null) &&
220                            defaultActivityCounterDefinition.equals(
221                                    activityCounterDefinition)) {
222    
223                            if (activitySetting != null) {
224                                    socialActivitySettingPersistence.remove(activitySetting);
225                            }
226    
227                            return;
228                    }
229    
230                    if (activitySetting != null) {
231                            activitySetting.setValue(toJSON(activityCounterDefinition));
232                    }
233                    else {
234                            Group group = groupLocalService.getGroup(groupId);
235    
236                            long activitySettingId = counterLocalService.increment();
237    
238                            activitySetting = socialActivitySettingPersistence.create(
239                                    activitySettingId);
240    
241                            activitySetting.setGroupId(groupId);
242                            activitySetting.setCompanyId(group.getCompanyId());
243                            activitySetting.setClassNameId(classNameId);
244                            activitySetting.setActivityType(activityType);
245                            activitySetting.setName(activityCounterDefinition.getName());
246                            activitySetting.setValue(toJSON(activityCounterDefinition));
247                    }
248    
249                    socialActivitySettingPersistence.update(activitySetting);
250    
251                    String key = encodeKey(groupId, className, activityType);
252    
253                    _activityDefinitions.remove(key);
254            }
255    
256            public void updateActivitySetting(
257                            long groupId, String className, long classPK, boolean enabled)
258                    throws PortalException, SystemException {
259    
260                    long classNameId = PortalUtil.getClassNameId(className);
261                    String name = _PREFIX_CLASS_PK.concat(String.valueOf(classPK));
262    
263                    SocialActivitySetting activitySetting =
264                            socialActivitySettingPersistence.fetchByG_C_A_N(
265                                    groupId, classNameId, 0, name);
266    
267                    if (activitySetting == null) {
268                            Group group = groupLocalService.getGroup(groupId);
269    
270                            long activitySettingId = counterLocalService.increment();
271    
272                            activitySetting = socialActivitySettingPersistence.create(
273                                    activitySettingId);
274    
275                            activitySetting.setGroupId(groupId);
276                            activitySetting.setCompanyId(group.getCompanyId());
277                            activitySetting.setClassNameId(classNameId);
278                            activitySetting.setName(name);
279                    }
280    
281                    JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
282    
283                    jsonObject.put("enabled", enabled);
284    
285                    activitySetting.setValue(jsonObject.toString());
286    
287                    socialActivitySettingPersistence.update(activitySetting);
288            }
289    
290            public void updateActivitySettings(
291                            long groupId, String className, int activityType,
292                            List<SocialActivityCounterDefinition> activityCounterDefinitions)
293                    throws PortalException, SystemException {
294    
295                    for (SocialActivityCounterDefinition activityCounterDefinition :
296                                    activityCounterDefinitions) {
297    
298                            updateActivitySetting(
299                                    groupId, className, activityType, activityCounterDefinition);
300                    }
301            }
302    
303            protected String encodeKey(
304                    long groupId, String className, int activityType) {
305    
306                    StringBundler sb = new StringBundler(5);
307    
308                    sb.append(groupId);
309                    sb.append(StringPool.POUND);
310                    sb.append(className);
311                    sb.append(StringPool.POUND);
312                    sb.append(activityType);
313    
314                    return sb.toString();
315            }
316    
317            protected SocialActivityDefinition getActivityDefinition(
318                            long groupId, String className, int activityType,
319                            SocialActivityDefinition defaultActivityDefinition)
320                    throws SystemException {
321    
322                    SocialActivityDefinition activityDefinition =
323                            defaultActivityDefinition.clone();
324    
325                    List<SocialActivitySetting> activitySettings = getActivitySettings(
326                            groupId, className, defaultActivityDefinition.getActivityType());
327    
328                    for (SocialActivitySetting activitySetting : activitySettings) {
329                            String name = activitySetting.getName();
330    
331                            if (name.equals(SocialActivitySettingConstants.NAME_ENABLED)) {
332                                    activityDefinition.setCountersEnabled(
333                                            GetterUtil.getBoolean(
334                                                    activitySetting.getValue(),
335                                                    defaultActivityDefinition.isCountersEnabled()));
336                            }
337                            else if (name.equals(
338                                                    SocialActivitySettingConstants.NAME_LOG_ENABLED)) {
339    
340                                    activityDefinition.setLogActivity(
341                                            GetterUtil.getBoolean(
342                                                    activitySetting.getValue(),
343                                                    defaultActivityDefinition.isLogActivity()));
344                            }
345                            else {
346                                    JSONObject jsonObject = null;
347    
348                                    try {
349                                            jsonObject = JSONFactoryUtil.createJSONObject(
350                                                    activitySetting.getValue());
351                                    }
352                                    catch (Exception e) {
353                                            jsonObject = JSONFactoryUtil.createJSONObject();
354                                    }
355    
356                                    SocialActivityCounterDefinition activityCounterDefinition =
357                                            activityDefinition.getActivityCounterDefinition(name);
358    
359                                    if (activityCounterDefinition == null) {
360                                            activityCounterDefinition =
361                                                    new SocialActivityCounterDefinition();
362    
363                                            activityCounterDefinition.setName(name);
364    
365                                            activityDefinition.addCounter(activityCounterDefinition);
366                                    }
367    
368                                    activityCounterDefinition.setEnabled(
369                                            jsonObject.getBoolean("enabled"));
370                                    activityCounterDefinition.setIncrement(
371                                            jsonObject.getInt("value"));
372                                    activityCounterDefinition.setLimitEnabled(
373                                            jsonObject.getBoolean("limitEnabled"));
374                                    activityCounterDefinition.setLimitPeriod(
375                                            jsonObject.getInt("limitPeriod"));
376                                    activityCounterDefinition.setLimitValue(
377                                            jsonObject.getInt("limitValue"));
378                                    activityCounterDefinition.setOwnerType(
379                                            jsonObject.getInt("ownerType"));
380                            }
381                    }
382    
383                    return activityDefinition;
384            }
385    
386            protected List<SocialActivitySetting> getActivitySettings(
387                            long groupId, String className, int activityType)
388                    throws SystemException {
389    
390                    long classNameId = PortalUtil.getClassNameId(className);
391    
392                    List<SocialActivitySetting> activitySettings =
393                            socialActivitySettingPersistence.findByG_C_A(
394                                    groupId, classNameId, activityType);
395    
396                    return activitySettings;
397            }
398    
399            protected String toJSON(
400                    SocialActivityCounterDefinition activityCounterDefinition) {
401    
402                    JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
403    
404                    jsonObject.put("enabled", activityCounterDefinition.isEnabled());
405                    jsonObject.put(
406                            "limitEnabled", activityCounterDefinition.isLimitEnabled());
407                    jsonObject.put(
408                            "limitPeriod", activityCounterDefinition.getLimitPeriod());
409                    jsonObject.put("limitValue", activityCounterDefinition.getLimitValue());
410                    jsonObject.put("ownerType", activityCounterDefinition.getOwnerType());
411                    jsonObject.put("value", activityCounterDefinition.getIncrement());
412    
413                    return jsonObject.toString();
414            }
415    
416            private static final String _PREFIX_CLASS_PK = "_LFR_CLASS_PK_";
417    
418            private static Log _log = LogFactoryUtil.getLog(
419                    SocialActivitySettingLocalServiceImpl.class);
420    
421            private static PortalCache<String, SocialActivityDefinition>
422                    _activityDefinitions = MultiVMPoolUtil.getCache(
423                            SocialActivitySettingLocalServiceImpl.class.getName());
424    
425    }