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