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