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