001    /**
002     * Copyright (c) 2000-2012 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.JSONFactoryUtil;
022    import com.liferay.portal.kernel.json.JSONObject;
023    import com.liferay.portal.kernel.util.GetterUtil;
024    import com.liferay.portal.kernel.util.StringBundler;
025    import com.liferay.portal.kernel.util.StringPool;
026    import com.liferay.portal.model.Group;
027    import com.liferay.portal.util.PortalUtil;
028    import com.liferay.portlet.social.model.SocialActivityCounterDefinition;
029    import com.liferay.portlet.social.model.SocialActivityDefinition;
030    import com.liferay.portlet.social.model.SocialActivitySetting;
031    import com.liferay.portlet.social.model.SocialActivitySettingConstants;
032    import com.liferay.portlet.social.service.base.SocialActivitySettingLocalServiceBaseImpl;
033    import com.liferay.portlet.social.util.SocialConfigurationUtil;
034    
035    import java.util.ArrayList;
036    import java.util.List;
037    
038    /**
039     * @author Zsolt Berentey
040     */
041    public class SocialActivitySettingLocalServiceImpl
042            extends SocialActivitySettingLocalServiceBaseImpl {
043    
044            public SocialActivityDefinition getActivityDefinition(
045                            long groupId, String className, int activityType)
046                    throws SystemException {
047    
048                    String key = encodeKey(groupId, className, activityType);
049    
050                    SocialActivityDefinition activityDefinition =
051                            (SocialActivityDefinition)_activityDefinitions.get(key);
052    
053                    if (activityDefinition != null) {
054                            return activityDefinition;
055                    }
056    
057                    SocialActivityDefinition defaultActivityDefinition =
058                            SocialConfigurationUtil.getActivityDefinition(
059                                    className, activityType);
060    
061                    if (defaultActivityDefinition == null) {
062                            return null;
063                    }
064    
065                    activityDefinition = getActivityDefinition(
066                            groupId, className, activityType, defaultActivityDefinition);
067    
068                    _activityDefinitions.put(key, activityDefinition);
069    
070                    return activityDefinition;
071            }
072    
073            public List<SocialActivityDefinition> getActivityDefinitions(
074                            long groupId, String className)
075                    throws SystemException {
076    
077                    List<SocialActivityDefinition> activityDefinitions =
078                            new ArrayList<SocialActivityDefinition>();
079    
080                    List<SocialActivityDefinition> defaultActivityDefinitions =
081                            SocialConfigurationUtil.getActivityDefinitions(className);
082    
083                    for (SocialActivityDefinition defaultActivityDefinition :
084                                    defaultActivityDefinitions) {
085    
086                            SocialActivityDefinition activityDefinition = getActivityDefinition(
087                                    groupId, className,
088                                    defaultActivityDefinition.getActivityType());
089    
090                            activityDefinitions.add(activityDefinition);
091                    }
092    
093                    return activityDefinitions;
094            }
095    
096            public List<SocialActivitySetting> getActivitySettings(long groupId)
097                    throws SystemException {
098    
099                    return socialActivitySettingPersistence.findByG_A(groupId, 0);
100            }
101    
102            public boolean isEnabled(long groupId, long classNameId)
103                    throws SystemException {
104    
105                    SocialActivitySetting activitySetting =
106                            socialActivitySettingPersistence.fetchByG_C_A_N(
107                                    groupId, classNameId, 0,
108                                    SocialActivitySettingConstants.NAME_ENABLED);
109    
110                    if (activitySetting == null) {
111                            return false;
112                    }
113    
114                    return GetterUtil.getBoolean(activitySetting.getValue());
115            }
116    
117            public void updateActivitySetting(
118                            long groupId, String className, boolean enabled)
119                    throws PortalException, SystemException {
120    
121                    long classNameId = PortalUtil.getClassNameId(className);
122    
123                    SocialActivitySetting activitySetting =
124                            socialActivitySettingPersistence.fetchByG_C_A_N(
125                                    groupId, classNameId, 0,
126                                    SocialActivitySettingConstants.NAME_ENABLED);
127    
128                    if (activitySetting == null) {
129                            Group group = groupLocalService.getGroup(groupId);
130    
131                            long activitySettingId = counterLocalService.increment();
132    
133                            activitySetting = socialActivitySettingPersistence.create(
134                                    activitySettingId);
135    
136                            activitySetting.setGroupId(groupId);
137                            activitySetting.setCompanyId(group.getCompanyId());
138                            activitySetting.setClassNameId(classNameId);
139                            activitySetting.setName(
140                                    SocialActivitySettingConstants.NAME_ENABLED);
141                    }
142    
143                    activitySetting.setValue(String.valueOf(enabled));
144    
145                    socialActivitySettingPersistence.update(activitySetting, false);
146            }
147    
148            public void updateActivitySetting(
149                            long groupId, String className, int activityType,
150                            SocialActivityCounterDefinition activityCounterDefinition)
151                    throws PortalException, SystemException {
152    
153                    long classNameId = PortalUtil.getClassNameId(className);
154    
155                    SocialActivityDefinition defaultActivityDefinition =
156                            SocialConfigurationUtil.getActivityDefinition(
157                                    className, activityType);
158    
159                    SocialActivityCounterDefinition defaultActivityCounterDefinition =
160                            defaultActivityDefinition.getActivityCounterDefinition(
161                                    activityCounterDefinition.getName());
162    
163                    SocialActivitySetting activitySetting =
164                            socialActivitySettingPersistence.fetchByG_C_A_N(
165                                    groupId, classNameId, activityType,
166                                    activityCounterDefinition.getName());
167    
168                    if ((defaultActivityCounterDefinition != null) &&
169                            defaultActivityCounterDefinition.equals(
170                                    activityCounterDefinition)) {
171    
172                            if (activitySetting != null) {
173                                    socialActivitySettingPersistence.remove(activitySetting);
174                            }
175    
176                            return;
177                    }
178    
179                    if (activitySetting != null) {
180                            activitySetting.setValue(toJSON(activityCounterDefinition));
181                    }
182                    else {
183                            Group group = groupLocalService.getGroup(groupId);
184    
185                            long activitySettingId = counterLocalService.increment();
186    
187                            activitySetting = socialActivitySettingPersistence.create(
188                                    activitySettingId);
189    
190                            activitySetting.setGroupId(groupId);
191                            activitySetting.setCompanyId(group.getCompanyId());
192                            activitySetting.setClassNameId(classNameId);
193                            activitySetting.setActivityType(activityType);
194                            activitySetting.setName(activityCounterDefinition.getName());
195                            activitySetting.setValue(toJSON(activityCounterDefinition));
196                    }
197    
198                    socialActivitySettingPersistence.update(activitySetting, false);
199    
200                    String key = encodeKey(groupId, className, activityType);
201    
202                    _activityDefinitions.remove(key);
203            }
204    
205            public void updateActivitySettings(
206                            long groupId, String className, int activityType,
207                            List<SocialActivityCounterDefinition> activityCounterDefinitions)
208                    throws PortalException, SystemException {
209    
210                    for (SocialActivityCounterDefinition activityCounterDefinition :
211                                    activityCounterDefinitions) {
212    
213                            updateActivitySetting(
214                                    groupId, className, activityType, activityCounterDefinition);
215                    }
216            }
217    
218            protected String encodeKey(
219                    long groupId, String className, int activityType) {
220    
221                    StringBundler sb = new StringBundler(5);
222    
223                    sb.append(groupId);
224                    sb.append(StringPool.POUND);
225                    sb.append(className);
226                    sb.append(StringPool.POUND);
227                    sb.append(activityType);
228    
229                    return sb.toString();
230            }
231    
232            protected SocialActivityDefinition getActivityDefinition(
233                            long groupId, String className, int activityType,
234                            SocialActivityDefinition defaultActivityDefinition)
235                    throws SystemException {
236    
237                    SocialActivityDefinition activityDefinition =
238                            defaultActivityDefinition.clone();
239    
240                    List<SocialActivitySetting> activitySettings = getActivitySettings(
241                            groupId, className, defaultActivityDefinition.getActivityType());
242    
243                    for (SocialActivitySetting activitySetting : activitySettings) {
244                            String name = activitySetting.getName();
245    
246                            if (name.equals(SocialActivitySettingConstants.NAME_ENABLED)) {
247                                    activityDefinition.setEnabled(
248                                            GetterUtil.getBoolean(
249                                                    activitySetting.getValue(),
250                                                    defaultActivityDefinition.isEnabled()));
251                            }
252                            else if (name.equals(
253                                                    SocialActivitySettingConstants.NAME_LOG_ENABLED)) {
254    
255                                    activityDefinition.setLogActivity(
256                                            GetterUtil.getBoolean(
257                                                    activitySetting.getValue(),
258                                                    defaultActivityDefinition.isLogActivity()));
259                            }
260                            else {
261                                    JSONObject jsonObject = null;
262    
263                                    try {
264                                            jsonObject = JSONFactoryUtil.createJSONObject(
265                                                    activitySetting.getValue());
266                                    }
267                                    catch (Exception e) {
268                                            jsonObject = JSONFactoryUtil.createJSONObject();
269                                    }
270    
271                                    SocialActivityCounterDefinition activityCounterDefinition =
272                                            activityDefinition.getActivityCounterDefinition(name);
273    
274                                    if (activityCounterDefinition == null) {
275                                            activityCounterDefinition =
276                                                    new SocialActivityCounterDefinition();
277    
278                                            activityCounterDefinition.setName(name);
279    
280                                            activityDefinition.addCounter(activityCounterDefinition);
281                                    }
282    
283                                    activityCounterDefinition.setEnabled(
284                                            jsonObject.getBoolean("enabled"));
285                                    activityCounterDefinition.setIncrement(
286                                            jsonObject.getInt("value"));
287                                    activityCounterDefinition.setLimitEnabled(
288                                            jsonObject.getBoolean("limitEnabled"));
289                                    activityCounterDefinition.setLimitPeriod(
290                                            jsonObject.getInt("limitPeriod"));
291                                    activityCounterDefinition.setLimitValue(
292                                            jsonObject.getInt("limitValue"));
293                                    activityCounterDefinition.setOwnerType(
294                                            jsonObject.getInt("ownerType"));
295                            }
296                    }
297    
298                    return activityDefinition;
299            }
300    
301            protected List<SocialActivitySetting> getActivitySettings(
302                            long groupId, String className, int activityType)
303                    throws SystemException {
304    
305                    long classNameId = PortalUtil.getClassNameId(className);
306    
307                    List<SocialActivitySetting> activitySettings =
308                            socialActivitySettingPersistence.findByG_C_A(
309                                    groupId, classNameId, activityType);
310    
311                    return activitySettings;
312            }
313    
314            protected String toJSON(
315                    SocialActivityCounterDefinition activityCounterDefinition) {
316    
317                    JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
318    
319                    jsonObject.put("enabled", activityCounterDefinition.isEnabled());
320                    jsonObject.put(
321                            "limitEnabled", activityCounterDefinition.isLimitEnabled());
322                    jsonObject.put(
323                            "limitPeriod", activityCounterDefinition.getLimitPeriod());
324                    jsonObject.put("limitValue", activityCounterDefinition.getLimitValue());
325                    jsonObject.put("ownerType", activityCounterDefinition.getOwnerType());
326                    jsonObject.put("value", activityCounterDefinition.getIncrement());
327    
328                    return jsonObject.toString();
329            }
330    
331            private static PortalCache _activityDefinitions = MultiVMPoolUtil.getCache(
332                    SocialActivitySettingLocalServiceImpl.class.getName());
333    
334    }