1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet.social.service.impl;
16  
17  import com.liferay.portal.kernel.cache.MultiVMPoolUtil;
18  import com.liferay.portal.kernel.cache.PortalCache;
19  import com.liferay.portal.kernel.exception.PortalException;
20  import com.liferay.portal.kernel.exception.SystemException;
21  import com.liferay.portal.kernel.util.ListUtil;
22  import com.liferay.portal.kernel.util.StringBundler;
23  import com.liferay.portal.kernel.util.StringPool;
24  import com.liferay.portal.model.Group;
25  import com.liferay.portal.security.permission.ResourceActionsUtil;
26  import com.liferay.portal.util.PortalUtil;
27  import com.liferay.portlet.social.NoSuchEquitySettingException;
28  import com.liferay.portlet.social.model.SocialEquityActionMapping;
29  import com.liferay.portlet.social.model.SocialEquitySetting;
30  import com.liferay.portlet.social.model.SocialEquitySettingConstants;
31  import com.liferay.portlet.social.model.impl.SocialEquitySettingImpl;
32  import com.liferay.portlet.social.service.base.SocialEquitySettingLocalServiceBaseImpl;
33  
34  import java.util.Collections;
35  import java.util.List;
36  
37  /**
38   * <a href="SocialEquitySettingLocalServiceImpl.java.html"><b><i>View Source</i>
39   * </b></a>
40   *
41   * @author Zsolt Berentey
42   * @author Brian Wing Shun Chan
43   */
44  public class SocialEquitySettingLocalServiceImpl
45      extends SocialEquitySettingLocalServiceBaseImpl {
46  
47      public static final String CACHE_NAME =
48          SocialEquitySettingLocalServiceImpl.class.getName();
49  
50      public List<SocialEquitySetting> getEquitySettings(
51              long groupId, String className, String actionId)
52          throws SystemException {
53  
54          long classNameId = PortalUtil.getClassNameId(className);
55  
56          return getEquitySettings(groupId, classNameId, actionId);
57      }
58  
59      public List<SocialEquitySetting> getEquitySettings(
60              long groupId, long classNameId, String actionId)
61          throws SystemException {
62  
63          String key = encodeKey(classNameId, actionId);
64  
65          List<SocialEquitySetting> socialEquitySettings =
66              (List<SocialEquitySetting>)_portalCache.get(key);
67  
68          if (socialEquitySettings != null) {
69              return socialEquitySettings;
70          }
71  
72          String className = PortalUtil.getClassName(classNameId);
73  
74          SocialEquityActionMapping equityActionMapping =
75              ResourceActionsUtil.getSocialEquityActionMapping(
76                  className, actionId);
77  
78          if (equityActionMapping == null) {
79              socialEquitySettings = Collections.EMPTY_LIST;
80  
81              _portalCache.put(key, socialEquitySettings);
82  
83              return socialEquitySettings;
84          }
85  
86          List<SocialEquitySetting> equitySettings =
87              socialEquitySettingPersistence.findByG_C_A(
88                  groupId, classNameId, actionId);
89  
90          equitySettings = ListUtil.copy(equitySettings);
91  
92          if (equitySettings.isEmpty()) {
93              if (equityActionMapping.getInformationValue() > 0) {
94                  SocialEquitySetting informationEquitySetting =
95                      getInformationEquitySetting(actionId, equityActionMapping);
96  
97                  equitySettings.add(informationEquitySetting);
98              }
99  
100             if (equityActionMapping.getParticipationValue() > 0) {
101                 SocialEquitySetting participationEquitySetting =
102                     getParticipationEquitySetting(
103                         actionId, equityActionMapping);
104 
105                 equitySettings.add(participationEquitySetting);
106             }
107         }
108         else if (equitySettings.size() == 1) {
109             SocialEquitySetting equitySetting = equitySettings.get(0);
110 
111             if ((equityActionMapping.getInformationValue() > 0) &&
112                 (equitySetting.getType() ==
113                     SocialEquitySettingConstants.TYPE_PARTICIPATION)) {
114 
115                 SocialEquitySetting informationEquitySetting =
116                     getInformationEquitySetting(actionId, equityActionMapping);
117 
118                 equitySettings.add(informationEquitySetting);
119             }
120             else if ((equityActionMapping.getParticipationValue() > 0) &&
121                      (equitySetting.getType() ==
122                         SocialEquitySettingConstants.TYPE_INFORMATION)) {
123 
124                 SocialEquitySetting participationEquitySetting =
125                     getParticipationEquitySetting(
126                         actionId, equityActionMapping);
127 
128                 equitySettings.add(participationEquitySetting);
129             }
130         }
131 
132         _portalCache.put(key, socialEquitySettings);
133 
134         return equitySettings;
135     }
136 
137     public void updateSocialEquitySettings(
138             long groupId, String className,
139             List<SocialEquityActionMapping> equityActionMappings)
140         throws PortalException, SystemException {
141 
142         for (SocialEquityActionMapping equityActionMapping :
143                 equityActionMappings) {
144 
145             updateSocialEquitySettings(groupId, className, equityActionMapping);
146         }
147     }
148 
149     protected String encodeKey(long classNameId, String actionId) {
150         StringBundler sb = new StringBundler(5);
151 
152         sb.append(CACHE_NAME);
153         sb.append(StringPool.POUND);
154         sb.append(classNameId);
155         sb.append(StringPool.POUND);
156         sb.append(actionId);
157 
158         return sb.toString();
159     }
160 
161     protected SocialEquitySetting getEquitySetting(
162             long groupId, String className, String actionId, int type)
163         throws PortalException, SystemException {
164 
165         long classNameId = PortalUtil.getClassNameId(className);
166 
167         SocialEquitySetting equitySetting = null;
168 
169         try {
170             equitySetting = socialEquitySettingPersistence.findByG_C_A_T(
171                 groupId, classNameId, actionId, type);
172         }
173         catch (NoSuchEquitySettingException nsqse) {
174             Group group = groupLocalService.getGroup(groupId);
175 
176             long equitySettingId = counterLocalService.increment();
177 
178             equitySetting = socialEquitySettingPersistence.create(
179                 equitySettingId);
180 
181             equitySetting.setGroupId(groupId);
182             equitySetting.setCompanyId(group.getCompanyId());
183             equitySetting.setClassNameId(classNameId);
184             equitySetting.setActionId(actionId);
185             equitySetting.setType(type);
186         }
187 
188         return equitySetting;
189     }
190 
191     protected SocialEquitySetting getInformationEquitySetting(
192         String actionId, SocialEquityActionMapping equityActionMapping) {
193 
194         SocialEquitySetting equitySetting = new SocialEquitySettingImpl();
195 
196         equitySetting.setActionId(actionId);
197         equitySetting.setType(SocialEquitySettingConstants.TYPE_INFORMATION);
198         equitySetting.setValue(equityActionMapping.getInformationValue());
199         equitySetting.setValidity(equityActionMapping.getInformationLifespan());
200 
201         return equitySetting;
202     }
203 
204     protected SocialEquitySetting getParticipationEquitySetting(
205         String actionId, SocialEquityActionMapping equityActionMapping) {
206 
207         SocialEquitySetting equitySetting = new SocialEquitySettingImpl();
208 
209         equitySetting.setActionId(actionId);
210         equitySetting.setType(SocialEquitySettingConstants.TYPE_PARTICIPATION);
211         equitySetting.setValue(equityActionMapping.getParticipationValue());
212         equitySetting.setValidity(
213             equityActionMapping.getParticipationLifespan());
214 
215         return equitySetting;
216     }
217 
218     protected void updateSocialEquitySettings(
219             long groupId, String className,
220             SocialEquityActionMapping equityActionMapping)
221         throws PortalException, SystemException {
222 
223         SocialEquityActionMapping defaultEquityActionMapping =
224             PortalUtil.getSocialEquityActionMapping(
225                 className, equityActionMapping.getActionId());
226 
227         if ((equityActionMapping.getInformationValue() > 0) &&
228             !equityActionMapping.equals(
229                 defaultEquityActionMapping,
230                 SocialEquitySettingConstants.TYPE_INFORMATION)) {
231 
232             SocialEquitySetting equitySetting = getEquitySetting(
233                 groupId, className, equityActionMapping.getActionId(),
234                 SocialEquitySettingConstants.TYPE_INFORMATION);
235 
236             if ((equityActionMapping.getInformationValue() !=
237                     equitySetting.getValue()) ||
238                 (equityActionMapping.getInformationLifespan() !=
239                         equitySetting.getValidity())) {
240 
241                 equitySetting.setValue(
242                     equityActionMapping.getInformationValue());
243                 equitySetting.setValidity(
244                     equityActionMapping.getInformationLifespan());
245 
246                 socialEquitySettingPersistence.update(equitySetting, false);
247             }
248         }
249 
250         if ((equityActionMapping.getParticipationValue() > 0) &&
251             !equityActionMapping.equals(
252                 defaultEquityActionMapping,
253                 SocialEquitySettingConstants.TYPE_PARTICIPATION)) {
254 
255             SocialEquitySetting equitySetting = getEquitySetting(
256                     groupId, className, equityActionMapping.getActionId(),
257                     SocialEquitySettingConstants.TYPE_PARTICIPATION);
258 
259             if ((equityActionMapping.getParticipationValue() !=
260                     equitySetting.getValue()) ||
261                 (equityActionMapping.getParticipationLifespan() !=
262                     equitySetting.getValidity())) {
263 
264                 equitySetting.setValue(
265                     equityActionMapping.getParticipationValue());
266                 equitySetting.setValidity(
267                     equityActionMapping.getParticipationLifespan());
268 
269                 socialEquitySettingPersistence.update(equitySetting, false);
270             }
271         }
272 
273         long classNameId = PortalUtil.getClassNameId(className);
274 
275         String key = encodeKey(classNameId, equityActionMapping.getActionId());
276 
277         _portalCache.remove(key);
278     }
279 
280     private static PortalCache _portalCache = MultiVMPoolUtil.getCache(
281         CACHE_NAME);
282 
283 }