001
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.dao.db.DB;
020 import com.liferay.portal.kernel.dao.db.DBFactoryUtil;
021 import com.liferay.portal.kernel.dao.orm.QueryUtil;
022 import com.liferay.portal.kernel.exception.PortalException;
023 import com.liferay.portal.kernel.exception.SystemException;
024 import com.liferay.portal.kernel.log.Log;
025 import com.liferay.portal.kernel.log.LogFactoryUtil;
026 import com.liferay.portal.kernel.transaction.Propagation;
027 import com.liferay.portal.kernel.transaction.Transactional;
028 import com.liferay.portal.kernel.util.PropsKeys;
029 import com.liferay.portal.kernel.util.StringBundler;
030 import com.liferay.portal.kernel.util.StringPool;
031 import com.liferay.portal.kernel.util.StringUtil;
032 import com.liferay.portal.kernel.util.Tuple;
033 import com.liferay.portal.model.Group;
034 import com.liferay.portal.model.Lock;
035 import com.liferay.portal.model.User;
036 import com.liferay.portal.util.PortalUtil;
037 import com.liferay.portal.util.PropsValues;
038 import com.liferay.portlet.asset.model.AssetEntry;
039 import com.liferay.portlet.social.model.SocialAchievement;
040 import com.liferay.portlet.social.model.SocialActivity;
041 import com.liferay.portlet.social.model.SocialActivityCounter;
042 import com.liferay.portlet.social.model.SocialActivityCounterConstants;
043 import com.liferay.portlet.social.model.SocialActivityCounterDefinition;
044 import com.liferay.portlet.social.model.SocialActivityDefinition;
045 import com.liferay.portlet.social.model.SocialActivityLimit;
046 import com.liferay.portlet.social.model.SocialActivityProcessor;
047 import com.liferay.portlet.social.service.SocialActivityCounterLocalService;
048 import com.liferay.portlet.social.service.base.SocialActivityCounterLocalServiceBaseImpl;
049 import com.liferay.portlet.social.service.persistence.SocialActivityCounterFinder;
050 import com.liferay.portlet.social.util.SocialCounterPeriodUtil;
051
052 import java.util.Arrays;
053 import java.util.Collections;
054 import java.util.Date;
055 import java.util.HashMap;
056 import java.util.List;
057 import java.util.Map;
058
059
074 public class SocialActivityCounterLocalServiceImpl
075 extends SocialActivityCounterLocalServiceBaseImpl {
076
077
105 public SocialActivityCounter addActivityCounter(
106 long groupId, long classNameId, long classPK, String name,
107 int ownerType, int currentValue, int totalValue, int startPeriod,
108 int endPeriod)
109 throws PortalException, SystemException {
110
111 return addActivityCounter(
112 groupId, classNameId, classPK, name, ownerType, currentValue,
113 totalValue, startPeriod, endPeriod, 0, 0);
114 }
115
116
154 public SocialActivityCounter addActivityCounter(
155 long groupId, long classNameId, long classPK, String name,
156 int ownerType, int currentValue, int totalValue, int startPeriod,
157 int endPeriod, long previousActivityCounterId, int periodLength)
158 throws PortalException, SystemException {
159
160 SocialActivityCounter activityCounter = null;
161
162 String lockKey = getLockKey(
163 groupId, classNameId, classPK, name, ownerType);
164
165 Lock lock = null;
166
167 while (true) {
168 try {
169 lock = lockLocalService.lock(
170 SocialActivityCounter.class.getName(), lockKey, lockKey,
171 false);
172 }
173 catch (Exception e) {
174 if (_log.isWarnEnabled()) {
175 _log.warn(
176 "Unable to acquire activity counter lock. Retrying.");
177 }
178
179 continue;
180 }
181
182 if (lock.isNew()) {
183 try {
184 DB db = DBFactoryUtil.getDB();
185
186 String dbType = db.getType();
187
188 if (dbType.equals(DB.TYPE_HYPERSONIC)) {
189
190
191
192 activityCounter = createActivityCounter(
193 groupId, classNameId, classPK, name, ownerType,
194 currentValue, totalValue, startPeriod, endPeriod,
195 previousActivityCounterId, periodLength);
196 }
197 else {
198 activityCounter =
199 socialActivityCounterLocalService.
200 createActivityCounter(
201 groupId, classNameId, classPK, name,
202 ownerType, currentValue, totalValue,
203 startPeriod, endPeriod,
204 previousActivityCounterId, periodLength);
205
206 }
207 }
208 finally {
209 lockLocalService.unlock(
210 SocialActivityCounter.class.getName(), lockKey, lockKey,
211 false);
212 }
213
214 break;
215 }
216
217 Date createDate = lock.getCreateDate();
218
219 if ((System.currentTimeMillis() - createDate.getTime()) >=
220 PropsValues.SOCIAL_ACTIVITY_COUNTER_LOCK_TIMEOUT) {
221
222 lockLocalService.unlock(
223 SocialActivityCounter.class.getName(), lockKey,
224 lock.getOwner(), false);
225
226 if (_log.isWarnEnabled()) {
227 _log.warn(
228 "Forcibly removed lock " + lock + ". See " +
229 PropsKeys.SOCIAL_ACTIVITY_COUNTER_LOCK_TIMEOUT);
230 }
231 }
232 else {
233 try {
234 Thread.sleep(
235 PropsValues.SOCIAL_ACTIVITY_COUNTER_LOCK_RETRY_DELAY);
236 }
237 catch (InterruptedException ie) {
238 if (_log.isWarnEnabled()) {
239 _log.warn(
240 "Interrupted while waiting to reacquire lock", ie);
241 }
242 }
243 }
244 }
245
246 return activityCounter;
247 }
248
249
272 public void addActivityCounters(SocialActivity activity)
273 throws PortalException, SystemException {
274
275 if (!socialActivitySettingLocalService.isEnabled(
276 activity.getGroupId(), activity.getClassNameId())) {
277
278 return;
279 }
280
281 if (!socialActivitySettingLocalService.isEnabled(
282 activity.getGroupId(), activity.getClassNameId(),
283 activity.getClassPK())) {
284
285 return;
286 }
287
288 User user = userPersistence.findByPrimaryKey(activity.getUserId());
289
290 SocialActivityDefinition activityDefinition =
291 socialActivitySettingLocalService.getActivityDefinition(
292 activity.getGroupId(), activity.getClassName(),
293 activity.getType());
294
295 if ((activityDefinition == null) || !activityDefinition.isEnabled()) {
296 return;
297 }
298
299 SocialActivityProcessor activityProcessor =
300 activityDefinition.getActivityProcessor();
301
302 if (activityProcessor != null) {
303 activityProcessor.processActivity(activity);
304 }
305
306 AssetEntry assetEntry = activity.getAssetEntry();
307
308 User assetEntryUser = userPersistence.findByPrimaryKey(
309 assetEntry.getUserId());
310
311 for (SocialActivityCounterDefinition activityCounterDefinition :
312 activityDefinition.getActivityCounterDefinitions()) {
313
314 if (addActivityCounter(
315 user, assetEntryUser, activityCounterDefinition) &&
316 checkActivityLimit(user, activity, activityCounterDefinition)) {
317
318 incrementActivityCounter(
319 activity.getGroupId(), user, activity.getAssetEntry(),
320 activityCounterDefinition);
321 }
322 }
323
324 for (SocialAchievement achievement :
325 activityDefinition.getAchievements()) {
326
327 achievement.processActivity(activity);
328 }
329
330 if (!user.isDefaultUser() && user.isActive()) {
331 incrementActivityCounter(
332 activity.getGroupId(),
333 PortalUtil.getClassNameId(User.class.getName()),
334 activity.getUserId(),
335 SocialActivityCounterConstants.NAME_USER_ACTIVITIES,
336 SocialActivityCounterConstants.TYPE_ACTOR, 1,
337 SocialActivityCounterConstants.PERIOD_LENGTH_SYSTEM);
338 }
339
340 if (!assetEntryUser.isDefaultUser() && assetEntryUser.isActive()) {
341 incrementActivityCounter(
342 activity.getGroupId(), activity.getClassNameId(),
343 activity.getClassPK(),
344 SocialActivityCounterConstants.NAME_ASSET_ACTIVITIES,
345 SocialActivityCounterConstants.TYPE_ASSET, 1,
346 SocialActivityCounterConstants.PERIOD_LENGTH_SYSTEM);
347 }
348 }
349
350
376 @Transactional(propagation = Propagation.REQUIRES_NEW)
377 public SocialActivityCounter createActivityCounter(
378 long groupId, long classNameId, long classPK, String name,
379 int ownerType, int currentValue, int totalValue, int startPeriod,
380 int endPeriod)
381 throws PortalException, SystemException {
382
383 return createActivityCounter(
384 groupId, classNameId, classPK, name, ownerType, currentValue,
385 totalValue, startPeriod, endPeriod, 0, 0);
386 }
387
388
425 @Transactional(propagation = Propagation.REQUIRES_NEW)
426 public SocialActivityCounter createActivityCounter(
427 long groupId, long classNameId, long classPK, String name,
428 int ownerType, int currentValue, int totalValue, int startPeriod,
429 int endPeriod, long previousActivityCounterId, int periodLength)
430 throws PortalException, SystemException {
431
432 SocialActivityCounter activityCounter = null;
433
434 if (previousActivityCounterId != 0) {
435 activityCounter = socialActivityCounterPersistence.findByPrimaryKey(
436 previousActivityCounterId);
437
438 if (periodLength ==
439 SocialActivityCounterConstants.PERIOD_LENGTH_SYSTEM) {
440
441 activityCounter.setEndPeriod(
442 SocialCounterPeriodUtil.getStartPeriod() - 1);
443 }
444 else {
445 activityCounter.setEndPeriod(
446 activityCounter.getStartPeriod() + periodLength - 1);
447 }
448
449 socialActivityCounterPersistence.update(activityCounter);
450 }
451
452 activityCounter = socialActivityCounterPersistence.fetchByG_C_C_N_O_E(
453 groupId, classNameId, classPK, name, ownerType, endPeriod, false);
454
455 if (activityCounter != null) {
456 return activityCounter;
457 }
458
459 Group group = groupPersistence.findByPrimaryKey(groupId);
460
461 long activityCounterId = counterLocalService.increment();
462
463 activityCounter = socialActivityCounterPersistence.create(
464 activityCounterId);
465
466 activityCounter.setGroupId(groupId);
467 activityCounter.setCompanyId(group.getCompanyId());
468 activityCounter.setClassNameId(classNameId);
469 activityCounter.setClassPK(classPK);
470 activityCounter.setName(name);
471 activityCounter.setOwnerType(ownerType);
472 activityCounter.setCurrentValue(currentValue);
473 activityCounter.setTotalValue(totalValue);
474 activityCounter.setStartPeriod(startPeriod);
475 activityCounter.setEndPeriod(endPeriod);
476 activityCounter.setActive(true);
477
478 socialActivityCounterPersistence.update(activityCounter);
479
480 return activityCounter;
481 }
482
483
497 public void deleteActivityCounters(AssetEntry assetEntry)
498 throws PortalException, SystemException {
499
500 if (assetEntry == null) {
501 return;
502 }
503
504 adjustUserContribution(assetEntry, false);
505
506 socialActivityCounterPersistence.removeByC_C(
507 assetEntry.getClassNameId(), assetEntry.getClassPK());
508
509 socialActivityLimitPersistence.removeByC_C(
510 assetEntry.getClassNameId(), assetEntry.getClassPK());
511
512 socialActivitySettingLocalService.deleteActivitySetting(
513 assetEntry.getGroupId(), assetEntry.getClassName(),
514 assetEntry.getClassPK());
515
516 clearFinderCache();
517 }
518
519
529 public void deleteActivityCounters(long classNameId, long classPK)
530 throws PortalException, SystemException {
531
532 String className = PortalUtil.getClassName(classNameId);
533
534 if (!className.equals(User.class.getName())) {
535 AssetEntry assetEntry = assetEntryLocalService.fetchEntry(
536 className, classPK);
537
538 deleteActivityCounters(assetEntry);
539 }
540 else {
541 socialActivityCounterPersistence.removeByC_C(classNameId, classPK);
542
543 socialActivityLimitPersistence.removeByUserId(classPK);
544 }
545
546 clearFinderCache();
547 }
548
549
559 public void deleteActivityCounters(String className, long classPK)
560 throws PortalException, SystemException {
561
562 if (!className.equals(User.class.getName())) {
563 AssetEntry assetEntry = assetEntryLocalService.fetchEntry(
564 className, classPK);
565
566 deleteActivityCounters(assetEntry);
567 }
568 else {
569 long classNameId = PortalUtil.getClassNameId(className);
570
571 socialActivityCounterPersistence.removeByC_C(classNameId, classPK);
572
573 socialActivityLimitPersistence.removeByUserId(classPK);
574 }
575
576 clearFinderCache();
577 }
578
579
594 public void disableActivityCounters(long classNameId, long classPK)
595 throws PortalException, SystemException {
596
597 String className = PortalUtil.getClassName(classNameId);
598
599 disableActivityCounters(className, classPK);
600 }
601
602
617 public void disableActivityCounters(String className, long classPK)
618 throws PortalException, SystemException {
619
620 AssetEntry assetEntry = assetEntryLocalService.fetchEntry(
621 className, classPK);
622
623 if (assetEntry == null) {
624 return;
625 }
626
627 List<SocialActivityCounter> activityCounters =
628 socialActivityCounterPersistence.findByC_C(
629 assetEntry.getClassNameId(), classPK);
630
631 adjustUserContribution(assetEntry, false);
632
633 for (SocialActivityCounter activityCounter : activityCounters) {
634 if (activityCounter.isActive()) {
635 activityCounter.setActive(false);
636
637 socialActivityCounterPersistence.update(activityCounter);
638 }
639 }
640
641 clearFinderCache();
642 }
643
644
659 public void enableActivityCounters(long classNameId, long classPK)
660 throws PortalException, SystemException {
661
662 String className = PortalUtil.getClassName(classNameId);
663
664 enableActivityCounters(className, classPK);
665 }
666
667
682 public void enableActivityCounters(String className, long classPK)
683 throws PortalException, SystemException {
684
685 AssetEntry assetEntry = assetEntryLocalService.fetchEntry(
686 className, classPK);
687
688 if (assetEntry == null) {
689 return;
690 }
691
692 List<SocialActivityCounter> activityCounters =
693 socialActivityCounterPersistence.findByC_C(
694 assetEntry.getClassNameId(), classPK);
695
696 adjustUserContribution(assetEntry, true);
697
698 for (SocialActivityCounter activityCounter : activityCounters) {
699 if (!activityCounter.isActive()) {
700 activityCounter.setActive(true);
701
702 socialActivityCounterPersistence.update(activityCounter);
703 }
704 }
705
706 clearFinderCache();
707 }
708
709
722 public SocialActivityCounter fetchActivityCounterByEndPeriod(
723 long groupId, long classNameId, long classPK, String name,
724 int ownerType, int endPeriod)
725 throws SystemException {
726
727 return socialActivityCounterPersistence.fetchByG_C_C_N_O_E(
728 groupId, classNameId, classPK, name, ownerType, endPeriod);
729 }
730
731
744 public SocialActivityCounter fetchActivityCounterByStartPeriod(
745 long groupId, long classNameId, long classPK, String name,
746 int ownerType, int startPeriod)
747 throws SystemException {
748
749 return socialActivityCounterPersistence.fetchByG_C_C_N_O_S(
750 groupId, classNameId, classPK, name, ownerType, startPeriod);
751 }
752
753
765 public SocialActivityCounter fetchLatestActivityCounter(
766 long groupId, long classNameId, long classPK, String name,
767 int ownerType)
768 throws SystemException {
769
770 return socialActivityCounterPersistence.fetchByG_C_C_N_O_E(
771 groupId, classNameId, classPK, name, ownerType,
772 SocialActivityCounterConstants.END_PERIOD_UNDEFINED);
773 }
774
775
790 public List<SocialActivityCounter> getOffsetActivityCounters(
791 long groupId, String name, int startOffset, int endOffset)
792 throws SystemException {
793
794 int startPeriod = SocialCounterPeriodUtil.getStartPeriod(startOffset);
795 int endPeriod = SocialCounterPeriodUtil.getEndPeriod(endOffset);
796
797 return getPeriodActivityCounters(groupId, name, startPeriod, endPeriod);
798 }
799
800
818 public List<SocialActivityCounter> getOffsetDistributionActivityCounters(
819 long groupId, String name, int startOffset, int endOffset)
820 throws SystemException {
821
822 int startPeriod = SocialCounterPeriodUtil.getStartPeriod(startOffset);
823 int endPeriod = SocialCounterPeriodUtil.getEndPeriod(endOffset);
824
825 return getPeriodDistributionActivityCounters(
826 groupId, name, startPeriod, endPeriod);
827 }
828
829
845 public List<SocialActivityCounter> getPeriodActivityCounters(
846 long groupId, String name, int startPeriod, int endPeriod)
847 throws SystemException {
848
849 if (endPeriod == SocialActivityCounterConstants.END_PERIOD_UNDEFINED) {
850 endPeriod = SocialCounterPeriodUtil.getEndPeriod();
851 }
852
853 int offset = SocialCounterPeriodUtil.getOffset(endPeriod);
854
855 int periodLength = SocialCounterPeriodUtil.getPeriodLength(offset);
856
857 return socialActivityCounterFinder.findAC_ByG_N_S_E_1(
858 groupId, name, startPeriod, endPeriod, periodLength);
859 }
860
861
879 public List<SocialActivityCounter> getPeriodDistributionActivityCounters(
880 long groupId, String name, int startPeriod, int endPeriod)
881 throws SystemException {
882
883 int offset = SocialCounterPeriodUtil.getOffset(endPeriod);
884
885 int periodLength = SocialCounterPeriodUtil.getPeriodLength(offset);
886
887 return socialActivityCounterFinder.findAC_ByG_N_S_E_2(
888 groupId, name, startPeriod, endPeriod, periodLength);
889 }
890
891
920 public List<Tuple> getUserActivityCounters(
921 long groupId, String[] rankingNames, String[] selectedNames,
922 int start, int end)
923 throws SystemException {
924
925 List<Long> userIds = socialActivityCounterFinder.findU_ByG_N(
926 groupId, rankingNames, start, end);
927
928 if (userIds.isEmpty()) {
929 return Collections.emptyList();
930 }
931
932 Tuple[] userActivityCounters = new Tuple[userIds.size()];
933
934 List<SocialActivityCounter> activityCounters =
935 socialActivityCounterFinder.findAC_By_G_C_C_N_S_E(
936 groupId, userIds, selectedNames, QueryUtil.ALL_POS,
937 QueryUtil.ALL_POS);
938
939 long userId = 0;
940 Map<String, SocialActivityCounter> activityCountersMap = null;
941
942 for (SocialActivityCounter activityCounter : activityCounters) {
943 if (userId != activityCounter.getClassPK()) {
944 userId = activityCounter.getClassPK();
945 activityCountersMap =
946 new HashMap<String, SocialActivityCounter>();
947
948 Tuple userActivityCounter = new Tuple(
949 userId, activityCountersMap);
950
951 for (int i = 0; i < userIds.size(); i++) {
952 long curUserId = userIds.get(i);
953
954 if (userId == curUserId) {
955 userActivityCounters[i] = userActivityCounter;
956
957 break;
958 }
959 }
960 }
961
962 activityCountersMap.put(activityCounter.getName(), activityCounter);
963 }
964
965 return Arrays.asList(userActivityCounters);
966 }
967
968
976 public int getUserActivityCountersCount(long groupId, String[] rankingNames)
977 throws SystemException {
978
979 return socialActivityCounterFinder.countU_ByG_N(groupId, rankingNames);
980 }
981
982
996 public void incrementUserAchievementCounter(long userId, long groupId)
997 throws PortalException, SystemException {
998
999 incrementActivityCounter(
1000 groupId, PortalUtil.getClassNameId(User.class.getName()), userId,
1001 SocialActivityCounterConstants.NAME_USER_ACHIEVEMENTS,
1002 SocialActivityCounterConstants.TYPE_ACTOR, 1,
1003 SocialActivityCounterConstants.PERIOD_LENGTH_SYSTEM);
1004 }
1005
1006 protected boolean addActivityCounter(
1007 User user, User assetEntryUser,
1008 SocialActivityCounterDefinition activityCounterDefinition) {
1009
1010 if ((user.isDefaultUser() || !user.isActive()) &&
1011 (activityCounterDefinition.getOwnerType() !=
1012 SocialActivityCounterConstants.TYPE_ASSET)) {
1013
1014 return false;
1015 }
1016
1017 if ((assetEntryUser.isDefaultUser() || !assetEntryUser.isActive()) &&
1018 (activityCounterDefinition.getOwnerType() !=
1019 SocialActivityCounterConstants.TYPE_ACTOR)) {
1020
1021 return false;
1022 }
1023
1024 if (!activityCounterDefinition.isEnabled() ||
1025 (activityCounterDefinition.getIncrement() == 0)) {
1026
1027 return false;
1028 }
1029
1030 String name = activityCounterDefinition.getName();
1031
1032 if ((user.getUserId() == assetEntryUser.getUserId()) &&
1033 (name.equals(SocialActivityCounterConstants.NAME_CONTRIBUTION) ||
1034 name.equals(SocialActivityCounterConstants.NAME_POPULARITY))) {
1035
1036 return false;
1037 }
1038
1039 return true;
1040 }
1041
1042 protected void adjustUserContribution(AssetEntry assetEntry, boolean enable)
1043 throws PortalException, SystemException {
1044
1045 if (assetEntry == null) {
1046 return;
1047 }
1048
1049 SocialActivityCounter latestPopularityActivityCounter =
1050 fetchLatestActivityCounter(
1051 assetEntry.getGroupId(), assetEntry.getClassNameId(),
1052 assetEntry.getClassPK(),
1053 SocialActivityCounterConstants.NAME_POPULARITY,
1054 SocialActivityCounterConstants.TYPE_ASSET);
1055
1056 if ((latestPopularityActivityCounter == null) ||
1057 (enable && latestPopularityActivityCounter.isActive()) ||
1058 (!enable && !latestPopularityActivityCounter.isActive())) {
1059
1060 return;
1061 }
1062
1063 int factor = -1;
1064
1065 if (enable) {
1066 factor = 1;
1067 }
1068
1069 SocialActivityCounter latestContributionActivityCounter =
1070 fetchLatestActivityCounter(
1071 assetEntry.getGroupId(),
1072 PortalUtil.getClassNameId(User.class.getName()),
1073 assetEntry.getUserId(),
1074 SocialActivityCounterConstants.NAME_CONTRIBUTION,
1075 SocialActivityCounterConstants.TYPE_CREATOR);
1076
1077 if (latestContributionActivityCounter == null) {
1078 return;
1079 }
1080
1081 int startPeriod = SocialCounterPeriodUtil.getStartPeriod();
1082
1083 if (latestContributionActivityCounter.getStartPeriod() != startPeriod) {
1084 latestContributionActivityCounter = addActivityCounter(
1085 latestContributionActivityCounter.getGroupId(),
1086 latestContributionActivityCounter.getClassNameId(),
1087 latestContributionActivityCounter.getClassPK(),
1088 latestContributionActivityCounter.getName(),
1089 latestContributionActivityCounter.getOwnerType(), 0,
1090 latestContributionActivityCounter.getTotalValue(),
1091 SocialCounterPeriodUtil.getStartPeriod(),
1092 SocialActivityCounterConstants.END_PERIOD_UNDEFINED,
1093 latestContributionActivityCounter.getActivityCounterId(),
1094 SocialActivityCounterConstants.PERIOD_LENGTH_SYSTEM);
1095 }
1096
1097 if (latestPopularityActivityCounter.getStartPeriod() == startPeriod) {
1098 latestContributionActivityCounter.setCurrentValue(
1099 latestContributionActivityCounter.getCurrentValue() +
1100 (latestPopularityActivityCounter.getCurrentValue() *
1101 factor));
1102 }
1103
1104 latestContributionActivityCounter.setTotalValue(
1105 latestContributionActivityCounter.getTotalValue() +
1106 (latestPopularityActivityCounter.getTotalValue() * factor));
1107
1108 socialActivityCounterPersistence.update(
1109 latestContributionActivityCounter);
1110 }
1111
1112 protected boolean checkActivityLimit(
1113 User user, SocialActivity activity,
1114 SocialActivityCounterDefinition activityCounterDefinition)
1115 throws PortalException, SystemException {
1116
1117 if (activityCounterDefinition.getLimitValue() == 0) {
1118 return true;
1119 }
1120
1121 long classPK = activity.getClassPK();
1122
1123 String name = activityCounterDefinition.getName();
1124
1125 if (name.equals(SocialActivityCounterConstants.NAME_PARTICIPATION)) {
1126 classPK = 0;
1127 }
1128
1129 SocialActivityLimit activityLimit =
1130 socialActivityLimitPersistence.fetchByG_U_C_C_A_A(
1131 activity.getGroupId(), user.getUserId(),
1132 activity.getClassNameId(), classPK, activity.getType(),
1133 activityCounterDefinition.getName());
1134
1135 if (activityLimit == null) {
1136 try {
1137 activityLimit =
1138 socialActivityLimitLocalService.addActivityLimit(
1139 user.getUserId(), activity.getGroupId(),
1140 activity.getClassNameId(), classPK, activity.getType(),
1141 activityCounterDefinition.getName(),
1142 activityCounterDefinition.getLimitPeriod());
1143 }
1144 catch (SystemException se) {
1145 activityLimit =
1146 socialActivityLimitPersistence.fetchByG_U_C_C_A_A(
1147 activity.getGroupId(), user.getUserId(),
1148 activity.getClassNameId(), classPK, activity.getType(),
1149 activityCounterDefinition.getName());
1150
1151 if (activityLimit == null) {
1152 throw se;
1153 }
1154 }
1155 }
1156
1157 int count = activityLimit.getCount(
1158 activityCounterDefinition.getLimitPeriod());
1159
1160 if (count < activityCounterDefinition.getLimitValue()) {
1161 activityLimit.setCount(
1162 activityCounterDefinition.getLimitPeriod(), count + 1);
1163
1164 socialActivityLimitPersistence.update(activityLimit);
1165
1166 return true;
1167 }
1168
1169 return false;
1170 }
1171
1172 protected void clearFinderCache() {
1173 PortalCache<String, SocialActivityCounter> portalCache =
1174 MultiVMPoolUtil.getCache(
1175 SocialActivityCounterFinder.class.getName());
1176
1177 portalCache.removeAll();
1178 }
1179
1180 protected String getLockKey(
1181 long groupId, long classNameId, long classPK, String name,
1182 int ownerType) {
1183
1184 StringBundler sb = new StringBundler(7);
1185
1186 sb.append(StringUtil.toHexString(groupId));
1187 sb.append(StringPool.POUND);
1188 sb.append(StringUtil.toHexString(classNameId));
1189 sb.append(StringPool.POUND);
1190 sb.append(StringUtil.toHexString(classPK));
1191 sb.append(StringPool.POUND);
1192 sb.append(name);
1193
1194 return sb.toString();
1195 }
1196
1197 protected void incrementActivityCounter(
1198 long groupId, long classNameId, long classPK, String name,
1199 int ownerType, int increment, int periodLength)
1200 throws PortalException, SystemException {
1201
1202 SocialActivityCounter activityCounter = fetchLatestActivityCounter(
1203 groupId, classNameId, classPK, name, ownerType);
1204
1205 if (activityCounter == null) {
1206 activityCounter = addActivityCounter(
1207 groupId, classNameId, classPK, name, ownerType, 0, 0,
1208 SocialCounterPeriodUtil.getStartPeriod(),
1209 SocialActivityCounterConstants.END_PERIOD_UNDEFINED);
1210
1211 if (periodLength > 0) {
1212 activityCounter.setStartPeriod(
1213 SocialCounterPeriodUtil.getActivityDay());
1214 }
1215 }
1216
1217 if (!activityCounter.isActivePeriod(periodLength)) {
1218 activityCounter = addActivityCounter(
1219 activityCounter.getGroupId(), activityCounter.getClassNameId(),
1220 activityCounter.getClassPK(), activityCounter.getName(),
1221 activityCounter.getOwnerType(), 0,
1222 activityCounter.getTotalValue(),
1223 SocialCounterPeriodUtil.getStartPeriod(),
1224 SocialActivityCounterConstants.END_PERIOD_UNDEFINED,
1225 activityCounter.getActivityCounterId(), periodLength);
1226 }
1227
1228 activityCounter.setCurrentValue(
1229 activityCounter.getCurrentValue() + increment);
1230 activityCounter.setTotalValue(
1231 activityCounter.getTotalValue() + increment);
1232
1233 socialActivityCounterPersistence.update(activityCounter);
1234 }
1235
1236 protected void incrementActivityCounter(
1237 long groupId, User user, AssetEntry assetEntry,
1238 SocialActivityCounterDefinition activityCounterDefinition)
1239 throws PortalException, SystemException {
1240
1241 int ownerType = activityCounterDefinition.getOwnerType();
1242 long userClassNameId = PortalUtil.getClassNameId(User.class.getName());
1243
1244 if (ownerType == SocialActivityCounterConstants.TYPE_ACTOR) {
1245 incrementActivityCounter(
1246 groupId, userClassNameId, user.getUserId(),
1247 activityCounterDefinition.getName(), ownerType,
1248 activityCounterDefinition.getIncrement(),
1249 activityCounterDefinition.getPeriodLength());
1250 }
1251 else if (ownerType == SocialActivityCounterConstants.TYPE_ASSET) {
1252 incrementActivityCounter(
1253 groupId, assetEntry.getClassNameId(), assetEntry.getClassPK(),
1254 activityCounterDefinition.getName(), ownerType,
1255 activityCounterDefinition.getIncrement(),
1256 activityCounterDefinition.getPeriodLength());
1257 }
1258 else {
1259 incrementActivityCounter(
1260 groupId, userClassNameId, assetEntry.getUserId(),
1261 activityCounterDefinition.getName(), ownerType,
1262 activityCounterDefinition.getIncrement(),
1263 activityCounterDefinition.getPeriodLength());
1264 }
1265 }
1266
1267 private static Log _log = LogFactoryUtil.getLog(
1268 SocialActivityCounterLocalService.class);
1269
1270 }