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.orm.QueryUtil;
020 import com.liferay.portal.kernel.exception.PortalException;
021 import com.liferay.portal.kernel.lock.LockProtectedAction;
022 import com.liferay.portal.kernel.transaction.Propagation;
023 import com.liferay.portal.kernel.transaction.Transactional;
024 import com.liferay.portal.kernel.util.StringPool;
025 import com.liferay.portal.kernel.util.StringUtil;
026 import com.liferay.portal.kernel.util.Tuple;
027 import com.liferay.portal.model.Group;
028 import com.liferay.portal.model.User;
029 import com.liferay.portal.util.PortalUtil;
030 import com.liferay.portal.util.PropsValues;
031 import com.liferay.portlet.asset.model.AssetEntry;
032 import com.liferay.portlet.social.model.SocialAchievement;
033 import com.liferay.portlet.social.model.SocialActivity;
034 import com.liferay.portlet.social.model.SocialActivityConstants;
035 import com.liferay.portlet.social.model.SocialActivityCounter;
036 import com.liferay.portlet.social.model.SocialActivityCounterConstants;
037 import com.liferay.portlet.social.model.SocialActivityCounterDefinition;
038 import com.liferay.portlet.social.model.SocialActivityDefinition;
039 import com.liferay.portlet.social.model.SocialActivityLimit;
040 import com.liferay.portlet.social.model.SocialActivityProcessor;
041 import com.liferay.portlet.social.model.impl.SocialActivityImpl;
042 import com.liferay.portlet.social.service.base.SocialActivityCounterLocalServiceBaseImpl;
043 import com.liferay.portlet.social.service.persistence.SocialActivityCounterFinder;
044 import com.liferay.portlet.social.util.SocialCounterPeriodUtil;
045
046 import java.util.ArrayList;
047 import java.util.Arrays;
048 import java.util.Collections;
049 import java.util.HashMap;
050 import java.util.List;
051 import java.util.Map;
052
053
068 public class SocialActivityCounterLocalServiceImpl
069 extends SocialActivityCounterLocalServiceBaseImpl {
070
071
099 @Deprecated
100 @Override
101 public SocialActivityCounter addActivityCounter(
102 long groupId, long classNameId, long classPK, String name,
103 int ownerType, int currentValue, int totalValue, int startPeriod,
104 int endPeriod)
105 throws PortalException {
106
107 return addActivityCounter(
108 groupId, classNameId, classPK, name, ownerType, totalValue, 0, 0);
109 }
110
111
148 @Deprecated
149 @Override
150 public SocialActivityCounter addActivityCounter(
151 long groupId, long classNameId, long classPK, String name,
152 int ownerType, int currentValue, int totalValue, int startPeriod,
153 int endPeriod, long previousActivityCounterId, int periodLength)
154 throws PortalException {
155
156 return addActivityCounter(
157 groupId, classNameId, classPK, name, ownerType, totalValue,
158 previousActivityCounterId, periodLength);
159 }
160
161
191 @Override
192 @Transactional(propagation = Propagation.REQUIRES_NEW)
193 public SocialActivityCounter addActivityCounter(
194 long groupId, long classNameId, long classPK, String name,
195 int ownerType, int totalValue, long previousActivityCounterId,
196 int periodLength)
197 throws PortalException {
198
199 SocialActivityCounter activityCounter = null;
200
201 if (previousActivityCounterId != 0) {
202 activityCounter = socialActivityCounterPersistence.findByPrimaryKey(
203 previousActivityCounterId);
204
205 if (periodLength ==
206 SocialActivityCounterConstants.PERIOD_LENGTH_SYSTEM) {
207
208 activityCounter.setEndPeriod(
209 SocialCounterPeriodUtil.getStartPeriod() - 1);
210 }
211 else {
212 activityCounter.setEndPeriod(
213 activityCounter.getStartPeriod() + periodLength - 1);
214 }
215
216 socialActivityCounterPersistence.update(activityCounter);
217 }
218
219 activityCounter = socialActivityCounterPersistence.fetchByG_C_C_N_O_E(
220 groupId, classNameId, classPK, name, ownerType,
221 SocialActivityCounterConstants.END_PERIOD_UNDEFINED, false);
222
223 if (activityCounter != null) {
224 return activityCounter;
225 }
226
227 Group group = groupPersistence.findByPrimaryKey(groupId);
228
229 long activityCounterId = counterLocalService.increment();
230
231 activityCounter = socialActivityCounterPersistence.create(
232 activityCounterId);
233
234 activityCounter.setGroupId(groupId);
235 activityCounter.setCompanyId(group.getCompanyId());
236 activityCounter.setClassNameId(classNameId);
237 activityCounter.setClassPK(classPK);
238 activityCounter.setName(name);
239 activityCounter.setOwnerType(ownerType);
240 activityCounter.setTotalValue(totalValue);
241
242 if (periodLength ==
243 SocialActivityCounterConstants.PERIOD_LENGTH_SYSTEM) {
244
245 activityCounter.setStartPeriod(
246 SocialCounterPeriodUtil.getStartPeriod());
247 }
248 else {
249 activityCounter.setStartPeriod(
250 SocialCounterPeriodUtil.getActivityDay());
251 }
252
253 activityCounter.setEndPeriod(
254 SocialActivityCounterConstants.END_PERIOD_UNDEFINED);
255 activityCounter.setActive(true);
256
257 socialActivityCounterPersistence.update(activityCounter);
258
259 return activityCounter;
260 }
261
262
282 @Override
283 public void addActivityCounters(SocialActivity activity)
284 throws PortalException {
285
286 if (!socialActivitySettingLocalService.isEnabled(
287 activity.getGroupId(), activity.getClassNameId())) {
288
289 return;
290 }
291
292 if (!socialActivitySettingLocalService.isEnabled(
293 activity.getGroupId(), activity.getClassNameId(),
294 activity.getClassPK())) {
295
296 return;
297 }
298
299 if ((activity.getType() ==
300 SocialActivityConstants.TYPE_MOVE_ATTACHMENT_TO_TRASH) ||
301 (activity.getType() ==
302 SocialActivityConstants.TYPE_MOVE_TO_TRASH)) {
303
304 disableActivityCounters(
305 activity.getClassNameId(), activity.getClassPK());
306
307 return;
308 }
309
310 if ((activity.getType() ==
311 SocialActivityConstants.TYPE_RESTORE_ATTACHMENT_FROM_TRASH) ||
312 (activity.getType() ==
313 SocialActivityConstants.TYPE_RESTORE_FROM_TRASH)) {
314
315 enableActivityCounters(
316 activity.getClassNameId(), activity.getClassPK());
317
318 return;
319 }
320
321 User user = userPersistence.findByPrimaryKey(activity.getUserId());
322
323 SocialActivityDefinition activityDefinition =
324 socialActivitySettingLocalService.getActivityDefinition(
325 activity.getGroupId(), activity.getClassName(),
326 activity.getType());
327
328 if ((activityDefinition == null) ||
329 !activityDefinition.isCountersEnabled()) {
330
331 return;
332 }
333
334 SocialActivityProcessor activityProcessor =
335 activityDefinition.getActivityProcessor();
336
337 if (activityProcessor != null) {
338 activityProcessor.processActivity(activity);
339 }
340
341 AssetEntry assetEntry = activity.getAssetEntry();
342
343 User assetEntryUser = userPersistence.findByPrimaryKey(
344 assetEntry.getUserId());
345
346 List<SocialActivityCounter> activityCounters = new ArrayList<>();
347
348 for (SocialActivityCounterDefinition activityCounterDefinition :
349 activityDefinition.getActivityCounterDefinitions()) {
350
351 if (isAddActivityCounter(
352 user, assetEntryUser, assetEntry,
353 activityCounterDefinition)) {
354
355 SocialActivityCounter activityCounter = addActivityCounter(
356 activity.getGroupId(), user, activity,
357 activityCounterDefinition);
358
359 activityCounters.add(activityCounter);
360 }
361 }
362
363 SocialActivityCounter assetActivitiesCounter = null;
364
365 if (!assetEntryUser.isDefaultUser() && assetEntryUser.isActive() &&
366 assetEntry.isVisible()) {
367
368 assetActivitiesCounter = addAssetActivitiesCounter(activity);
369 }
370
371 SocialActivityCounter userActivitiesCounter = null;
372
373 if (!user.isDefaultUser() && user.isActive()) {
374 userActivitiesCounter = addUserActivitiesCounter(activity);
375 }
376
377 for (SocialActivityCounter activityCounter : activityCounters) {
378 SocialActivityCounterDefinition activityCounterDefinition =
379 activityDefinition.getActivityCounterDefinition(
380 activityCounter.getName());
381
382 if (checkActivityLimit(user, activity, activityCounterDefinition)) {
383 incrementActivityCounter(
384 activityCounter, activityCounterDefinition);
385 }
386 }
387
388 if (assetActivitiesCounter != null) {
389 incrementActivityCounter(
390 assetActivitiesCounter,
391 _assetActivitiesActivityCounterDefinition);
392 }
393
394 if (userActivitiesCounter != null) {
395 incrementActivityCounter(
396 userActivitiesCounter,
397 _userActivitiesActivityCounterDefinition);
398 }
399
400 for (SocialAchievement achievement :
401 activityDefinition.getAchievements()) {
402
403 achievement.processActivity(activity);
404 }
405 }
406
407
430 @Deprecated
431 @Override
432 @Transactional(propagation = Propagation.REQUIRES_NEW)
433 public SocialActivityCounter createActivityCounter(
434 long groupId, long classNameId, long classPK, String name,
435 int ownerType, int currentValue, int totalValue, int startPeriod,
436 int endPeriod)
437 throws PortalException {
438
439 return addActivityCounter(
440 groupId, classNameId, classPK, name, ownerType, totalValue, 0, 0);
441 }
442
443
479 @Deprecated
480 @Override
481 @Transactional(propagation = Propagation.REQUIRES_NEW)
482 public SocialActivityCounter createActivityCounter(
483 long groupId, long classNameId, long classPK, String name,
484 int ownerType, int currentValue, int totalValue, int startPeriod,
485 int endPeriod, long previousActivityCounterId, int periodLength)
486 throws PortalException {
487
488 return addActivityCounter(
489 groupId, classNameId, classPK, name, ownerType, totalValue,
490 previousActivityCounterId, periodLength);
491 }
492
493
504 @Override
505 public void deleteActivityCounters(AssetEntry assetEntry)
506 throws PortalException {
507
508 if (assetEntry == null) {
509 return;
510 }
511
512 adjustUserContribution(assetEntry, false);
513
514 socialActivityCounterPersistence.removeByC_C(
515 assetEntry.getClassNameId(), assetEntry.getClassPK());
516
517 socialActivityLimitPersistence.removeByC_C(
518 assetEntry.getClassNameId(), assetEntry.getClassPK());
519
520 socialActivitySettingLocalService.deleteActivitySetting(
521 assetEntry.getGroupId(), assetEntry.getClassName(),
522 assetEntry.getClassPK());
523
524 clearFinderCache();
525 }
526
527
534 @Override
535 public void deleteActivityCounters(long classNameId, long classPK)
536 throws PortalException {
537
538 String className = PortalUtil.getClassName(classNameId);
539
540 if (!className.equals(User.class.getName())) {
541 AssetEntry assetEntry = assetEntryLocalService.fetchEntry(
542 className, classPK);
543
544 deleteActivityCounters(assetEntry);
545 }
546 else {
547 socialActivityCounterPersistence.removeByC_C(classNameId, classPK);
548
549 socialActivityLimitPersistence.removeByUserId(classPK);
550 }
551
552 clearFinderCache();
553 }
554
555
562 @Override
563 public void deleteActivityCounters(String className, long classPK)
564 throws PortalException {
565
566 if (!className.equals(User.class.getName())) {
567 AssetEntry assetEntry = assetEntryLocalService.fetchEntry(
568 className, classPK);
569
570 deleteActivityCounters(assetEntry);
571 }
572 else {
573 long classNameId = classNameLocalService.getClassNameId(className);
574
575 socialActivityCounterPersistence.removeByC_C(classNameId, classPK);
576
577 socialActivityLimitPersistence.removeByUserId(classPK);
578 }
579
580 clearFinderCache();
581 }
582
583
595 @Override
596 public void disableActivityCounters(long classNameId, long classPK)
597 throws PortalException {
598
599 String className = PortalUtil.getClassName(classNameId);
600
601 disableActivityCounters(className, classPK);
602 }
603
604
616 @Override
617 public void disableActivityCounters(String className, long classPK)
618 throws PortalException {
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
656 @Override
657 public void enableActivityCounters(long classNameId, long classPK)
658 throws PortalException {
659
660 String className = PortalUtil.getClassName(classNameId);
661
662 enableActivityCounters(className, classPK);
663 }
664
665
677 @Override
678 public void enableActivityCounters(String className, long classPK)
679 throws PortalException {
680
681 AssetEntry assetEntry = assetEntryLocalService.fetchEntry(
682 className, classPK);
683
684 if (assetEntry == null) {
685 return;
686 }
687
688 List<SocialActivityCounter> activityCounters =
689 socialActivityCounterPersistence.findByC_C(
690 assetEntry.getClassNameId(), classPK);
691
692 adjustUserContribution(assetEntry, true);
693
694 for (SocialActivityCounter activityCounter : activityCounters) {
695 if (!activityCounter.isActive()) {
696 activityCounter.setActive(true);
697
698 socialActivityCounterPersistence.update(activityCounter);
699 }
700 }
701
702 clearFinderCache();
703 }
704
705
717 @Override
718 public SocialActivityCounter fetchActivityCounterByEndPeriod(
719 long groupId, long classNameId, long classPK, String name,
720 int ownerType, int endPeriod) {
721
722 return socialActivityCounterPersistence.fetchByG_C_C_N_O_E(
723 groupId, classNameId, classPK, name, ownerType, endPeriod);
724 }
725
726
738 @Override
739 public SocialActivityCounter fetchActivityCounterByStartPeriod(
740 long groupId, long classNameId, long classPK, String name,
741 int ownerType, int startPeriod) {
742
743 return socialActivityCounterPersistence.fetchByG_C_C_N_O_S(
744 groupId, classNameId, classPK, name, ownerType, startPeriod);
745 }
746
747
758 @Override
759 public SocialActivityCounter fetchLatestActivityCounter(
760 long groupId, long classNameId, long classPK, String name,
761 int ownerType) {
762
763 return socialActivityCounterPersistence.fetchByG_C_C_N_O_E(
764 groupId, classNameId, classPK, name, ownerType,
765 SocialActivityCounterConstants.END_PERIOD_UNDEFINED);
766 }
767
768
782 @Override
783 public List<SocialActivityCounter> getOffsetActivityCounters(
784 long groupId, String name, int startOffset, int endOffset) {
785
786 int startPeriod = SocialCounterPeriodUtil.getStartPeriod(startOffset);
787 int endPeriod = SocialCounterPeriodUtil.getEndPeriod(endOffset);
788
789 return getPeriodActivityCounters(groupId, name, startPeriod, endPeriod);
790 }
791
792
809 @Override
810 public List<SocialActivityCounter> getOffsetDistributionActivityCounters(
811 long groupId, String name, int startOffset, int endOffset) {
812
813 int startPeriod = SocialCounterPeriodUtil.getStartPeriod(startOffset);
814 int endPeriod = SocialCounterPeriodUtil.getEndPeriod(endOffset);
815
816 return getPeriodDistributionActivityCounters(
817 groupId, name, startPeriod, endPeriod);
818 }
819
820
835 @Override
836 public List<SocialActivityCounter> getPeriodActivityCounters(
837 long groupId, String name, int startPeriod, int endPeriod) {
838
839 if (endPeriod == SocialActivityCounterConstants.END_PERIOD_UNDEFINED) {
840 endPeriod = SocialCounterPeriodUtil.getEndPeriod();
841 }
842
843 int offset = SocialCounterPeriodUtil.getOffset(endPeriod);
844
845 int periodLength = SocialCounterPeriodUtil.getPeriodLength(offset);
846
847 return socialActivityCounterFinder.findAC_ByG_N_S_E_1(
848 groupId, name, startPeriod, endPeriod, periodLength);
849 }
850
851
868 @Override
869 public List<SocialActivityCounter> getPeriodDistributionActivityCounters(
870 long groupId, String name, int startPeriod, int endPeriod) {
871
872 int offset = SocialCounterPeriodUtil.getOffset(endPeriod);
873
874 int periodLength = SocialCounterPeriodUtil.getPeriodLength(offset);
875
876 return socialActivityCounterFinder.findAC_ByG_N_S_E_2(
877 groupId, name, startPeriod, endPeriod, periodLength);
878 }
879
880
907 @Override
908 public List<Tuple> getUserActivityCounters(
909 long groupId, String[] rankingNames, String[] selectedNames, int start,
910 int end) {
911
912 List<Long> userIds = socialActivityCounterFinder.findU_ByG_N(
913 groupId, rankingNames, start, end);
914
915 if (userIds.isEmpty()) {
916 return Collections.emptyList();
917 }
918
919 Tuple[] userActivityCounters = new Tuple[userIds.size()];
920
921 List<SocialActivityCounter> activityCounters =
922 socialActivityCounterFinder.findAC_By_G_C_C_N_S_E(
923 groupId, userIds, selectedNames, QueryUtil.ALL_POS,
924 QueryUtil.ALL_POS);
925
926 long userId = 0;
927 Map<String, SocialActivityCounter> activityCountersMap = null;
928
929 for (SocialActivityCounter activityCounter : activityCounters) {
930 if (userId != activityCounter.getClassPK()) {
931 userId = activityCounter.getClassPK();
932 activityCountersMap = new HashMap<>();
933
934 Tuple userActivityCounter = new Tuple(
935 userId, activityCountersMap);
936
937 for (int i = 0; i < userIds.size(); i++) {
938 long curUserId = userIds.get(i);
939
940 if (userId == curUserId) {
941 userActivityCounters[i] = userActivityCounter;
942
943 break;
944 }
945 }
946 }
947
948 activityCountersMap.put(activityCounter.getName(), activityCounter);
949 }
950
951 return Arrays.asList(userActivityCounters);
952 }
953
954
961 @Override
962 public int getUserActivityCountersCount(
963 long groupId, String[] rankingNames) {
964
965 return socialActivityCounterFinder.countU_ByG_N(groupId, rankingNames);
966 }
967
968
979 @Override
980 public void incrementUserAchievementCounter(long userId, long groupId)
981 throws PortalException {
982
983 User user = userPersistence.findByPrimaryKey(userId);
984
985 SocialActivityCounter activityCounter = addActivityCounter(
986 groupId, user, new SocialActivityImpl(),
987 _userAchievementsActivityCounterDefinition);
988
989 incrementActivityCounter(
990 activityCounter, _userAchievementsActivityCounterDefinition);
991 }
992
993 protected SocialActivityCounter addActivityCounter(
994 final long groupId, final User user, final SocialActivity activity,
995 final SocialActivityCounterDefinition activityCounterDefinition)
996 throws PortalException {
997
998 int ownerType = activityCounterDefinition.getOwnerType();
999
1000 long classNameId = getClassNameId(activity.getAssetEntry(), ownerType);
1001 long classPK = getClassPK(user, activity.getAssetEntry(), ownerType);
1002
1003 SocialActivityCounter activityCounter = fetchLatestActivityCounter(
1004 groupId, classNameId, classPK, activityCounterDefinition.getName(),
1005 ownerType);
1006
1007 if (activityCounter == null) {
1008 activityCounter = lockProtectedAddActivityCounter(
1009 groupId, classNameId, classPK,
1010 activityCounterDefinition.getName(), ownerType, 0, 0,
1011 activityCounterDefinition.getPeriodLength());
1012 }
1013 else if (!activityCounter.isActivePeriod(
1014 activityCounterDefinition.getPeriodLength())) {
1015
1016 activityCounter = lockProtectedAddActivityCounter(
1017 groupId, classNameId, classPK,
1018 activityCounterDefinition.getName(), ownerType,
1019 activityCounter.getTotalValue(),
1020 activityCounter.getActivityCounterId(),
1021 activityCounterDefinition.getPeriodLength());
1022 }
1023
1024 if (activityCounterDefinition.getLimitValue() > 0) {
1025 SocialActivityLimit activityLimit =
1026 socialActivityLimitPersistence.fetchByG_U_C_C_A_A(
1027 groupId, user.getUserId(), activity.getClassNameId(),
1028 getLimitClassPK(activity, activityCounterDefinition),
1029 activity.getType(), activityCounterDefinition.getName());
1030
1031 if (activityLimit == null) {
1032 lockProtectedGetActivityLimit(
1033 groupId, user, activity, activityCounterDefinition);
1034 }
1035 }
1036
1037 return activityCounter;
1038 }
1039
1040 protected SocialActivityCounter addAssetActivitiesCounter(
1041 SocialActivity activity)
1042 throws PortalException {
1043
1044 User user = userPersistence.findByPrimaryKey(activity.getUserId());
1045
1046 return addActivityCounter(
1047 activity.getGroupId(), user, activity,
1048 _assetActivitiesActivityCounterDefinition);
1049 }
1050
1051 protected SocialActivityCounter addUserActivitiesCounter(
1052 SocialActivity activity)
1053 throws PortalException {
1054
1055 User user = userPersistence.findByPrimaryKey(activity.getUserId());
1056
1057 return addActivityCounter(
1058 activity.getGroupId(), user, activity,
1059 _userActivitiesActivityCounterDefinition);
1060 }
1061
1062 protected void adjustUserContribution(AssetEntry assetEntry, boolean enable)
1063 throws PortalException {
1064
1065 if (assetEntry == null) {
1066 return;
1067 }
1068
1069 SocialActivityCounter latestPopularityActivityCounter =
1070 fetchLatestActivityCounter(
1071 assetEntry.getGroupId(), assetEntry.getClassNameId(),
1072 assetEntry.getClassPK(),
1073 SocialActivityCounterConstants.NAME_POPULARITY,
1074 SocialActivityCounterConstants.TYPE_ASSET);
1075
1076 if ((latestPopularityActivityCounter == null) ||
1077 (enable && latestPopularityActivityCounter.isActive()) ||
1078 (!enable && !latestPopularityActivityCounter.isActive())) {
1079
1080 return;
1081 }
1082
1083 int factor = -1;
1084
1085 if (enable) {
1086 factor = 1;
1087 }
1088
1089 SocialActivityCounter latestContributionActivityCounter =
1090 fetchLatestActivityCounter(
1091 assetEntry.getGroupId(),
1092 classNameLocalService.getClassNameId(User.class.getName()),
1093 assetEntry.getUserId(),
1094 SocialActivityCounterConstants.NAME_CONTRIBUTION,
1095 SocialActivityCounterConstants.TYPE_CREATOR);
1096
1097 if (latestContributionActivityCounter == null) {
1098 return;
1099 }
1100
1101 int startPeriod = SocialCounterPeriodUtil.getStartPeriod();
1102
1103 if (latestContributionActivityCounter.getStartPeriod() != startPeriod) {
1104 latestContributionActivityCounter = addActivityCounter(
1105 latestContributionActivityCounter.getGroupId(),
1106 latestContributionActivityCounter.getClassNameId(),
1107 latestContributionActivityCounter.getClassPK(),
1108 latestContributionActivityCounter.getName(),
1109 latestContributionActivityCounter.getOwnerType(), 0,
1110 latestContributionActivityCounter.getTotalValue(),
1111 SocialCounterPeriodUtil.getStartPeriod(),
1112 SocialActivityCounterConstants.END_PERIOD_UNDEFINED,
1113 latestContributionActivityCounter.getActivityCounterId(),
1114 SocialActivityCounterConstants.PERIOD_LENGTH_SYSTEM);
1115 }
1116
1117 if (latestPopularityActivityCounter.getStartPeriod() == startPeriod) {
1118 latestContributionActivityCounter.setCurrentValue(
1119 latestContributionActivityCounter.getCurrentValue() +
1120 (latestPopularityActivityCounter.getCurrentValue() *
1121 factor));
1122 }
1123
1124 latestContributionActivityCounter.setTotalValue(
1125 latestContributionActivityCounter.getTotalValue() +
1126 (latestPopularityActivityCounter.getTotalValue() * factor));
1127
1128 socialActivityCounterPersistence.update(
1129 latestContributionActivityCounter);
1130 }
1131
1132 protected boolean checkActivityLimit(
1133 User user, SocialActivity activity,
1134 SocialActivityCounterDefinition activityCounterDefinition)
1135 throws PortalException {
1136
1137 if (activityCounterDefinition.getLimitValue() == 0) {
1138 return true;
1139 }
1140
1141 long classPK = activity.getClassPK();
1142
1143 String name = activityCounterDefinition.getName();
1144
1145 if (name.equals(SocialActivityCounterConstants.NAME_PARTICIPATION)) {
1146 classPK = 0;
1147 }
1148
1149 SocialActivityLimit activityLimit =
1150 socialActivityLimitPersistence.findByG_U_C_C_A_A(
1151 activity.getGroupId(), user.getUserId(),
1152 activity.getClassNameId(), classPK, activity.getType(), name);
1153
1154 int count = activityLimit.getCount(
1155 activityCounterDefinition.getLimitPeriod());
1156
1157 if (count < activityCounterDefinition.getLimitValue()) {
1158 activityLimit.setCount(
1159 activityCounterDefinition.getLimitPeriod(), count + 1);
1160
1161 socialActivityLimitPersistence.update(activityLimit);
1162
1163 return true;
1164 }
1165
1166 return false;
1167 }
1168
1169 protected void clearFinderCache() {
1170 PortalCache<String, SocialActivityCounter> portalCache =
1171 MultiVMPoolUtil.getPortalCache(
1172 SocialActivityCounterFinder.class.getName());
1173
1174 portalCache.removeAll();
1175 }
1176
1177 protected long getClassNameId(AssetEntry assetEntry, int ownerType) {
1178 if (ownerType == SocialActivityCounterConstants.TYPE_ASSET) {
1179 return assetEntry.getClassNameId();
1180 }
1181
1182 return classNameLocalService.getClassNameId(User.class.getName());
1183 }
1184
1185 protected long getClassPK(User user, AssetEntry assetEntry, int ownerType) {
1186 if (ownerType == SocialActivityCounterConstants.TYPE_ACTOR) {
1187 return user.getUserId();
1188 }
1189
1190 if (ownerType == SocialActivityCounterConstants.TYPE_ASSET) {
1191 return assetEntry.getClassPK();
1192 }
1193
1194 return assetEntry.getUserId();
1195 }
1196
1197 protected long getLimitClassPK(
1198 SocialActivity activity,
1199 SocialActivityCounterDefinition activityCounterDefinition) {
1200
1201 String name = activityCounterDefinition.getName();
1202
1203 if (name.equals(SocialActivityCounterConstants.NAME_PARTICIPATION)) {
1204 return 0;
1205 }
1206
1207 return activity.getClassPK();
1208 }
1209
1210 protected void incrementActivityCounter(
1211 SocialActivityCounter activityCounter,
1212 SocialActivityCounterDefinition activityCounterDefinition) {
1213
1214 activityCounter.setCurrentValue(
1215 activityCounter.getCurrentValue() +
1216 activityCounterDefinition.getIncrement());
1217 activityCounter.setTotalValue(
1218 activityCounter.getTotalValue() +
1219 activityCounterDefinition.getIncrement());
1220
1221 socialActivityCounterPersistence.update(activityCounter);
1222
1223 socialActivityCounterPersistence.clearCache(activityCounter);
1224 }
1225
1226 protected boolean isAddActivityCounter(
1227 User user, User assetEntryUser, AssetEntry assetEntry,
1228 SocialActivityCounterDefinition activityCounterDefinition) {
1229
1230 if ((user.isDefaultUser() || !user.isActive()) &&
1231 (activityCounterDefinition.getOwnerType() !=
1232 SocialActivityCounterConstants.TYPE_ASSET)) {
1233
1234 return false;
1235 }
1236
1237 if ((assetEntryUser.isDefaultUser() || !assetEntryUser.isActive()) &&
1238 (activityCounterDefinition.getOwnerType() !=
1239 SocialActivityCounterConstants.TYPE_ACTOR)) {
1240
1241 return false;
1242 }
1243
1244 if (!activityCounterDefinition.isEnabled() ||
1245 (activityCounterDefinition.getIncrement() == 0)) {
1246
1247 return false;
1248 }
1249
1250 String name = activityCounterDefinition.getName();
1251
1252 if ((user.getUserId() == assetEntryUser.getUserId()) &&
1253 (name.equals(SocialActivityCounterConstants.NAME_CONTRIBUTION) ||
1254 name.equals(SocialActivityCounterConstants.NAME_POPULARITY))) {
1255
1256 return false;
1257 }
1258
1259 if ((activityCounterDefinition.getOwnerType() ==
1260 SocialActivityCounterConstants.TYPE_ASSET) &&
1261 !assetEntry.isVisible()) {
1262
1263 return false;
1264 }
1265
1266 return true;
1267 }
1268
1269 protected SocialActivityCounter lockProtectedAddActivityCounter(
1270 final long groupId, final long classNameId, final long classPK,
1271 final String name, final int ownerType, final int totalValue,
1272 final long previousActivityCounterId, final int periodLength)
1273 throws PortalException {
1274
1275 String lockKey = StringUtil.merge(
1276 new Object[] {groupId, classNameId, classPK, name, ownerType},
1277 StringPool.POUND);
1278
1279 LockProtectedAction<SocialActivityCounter> lockProtectedAction =
1280 new LockProtectedAction<SocialActivityCounter>(
1281 SocialActivityCounter.class, lockKey,
1282 PropsValues.SOCIAL_ACTIVITY_LOCK_TIMEOUT,
1283 PropsValues.SOCIAL_ACTIVITY_LOCK_RETRY_DELAY) {
1284
1285 @Override
1286 protected SocialActivityCounter performProtectedAction()
1287 throws PortalException {
1288
1289 SocialActivityCounter activityCounter =
1290 socialActivityCounterLocalService.addActivityCounter(
1291 groupId, classNameId, classPK, name, ownerType,
1292 totalValue, previousActivityCounterId,
1293 periodLength);
1294
1295 return activityCounter;
1296 }
1297
1298 };
1299
1300 lockProtectedAction.performAction();
1301
1302 return lockProtectedAction.getReturnValue();
1303 }
1304
1305 protected void lockProtectedGetActivityLimit(
1306 final long groupId, final User user, final SocialActivity activity,
1307 final SocialActivityCounterDefinition activityCounterDefinition)
1308 throws PortalException {
1309
1310 final long classPK = getLimitClassPK(
1311 activity, activityCounterDefinition);
1312
1313 String lockKey = StringUtil.merge(
1314 new Object[] {
1315 groupId, user.getUserId(), activity.getClassNameId(), classPK,
1316 activity.getType(), activityCounterDefinition.getName()
1317 },
1318 StringPool.POUND);
1319
1320 LockProtectedAction<SocialActivityLimit> lockProtectedAction =
1321 new LockProtectedAction<SocialActivityLimit>(
1322 SocialActivityLimit.class, lockKey,
1323 PropsValues.SOCIAL_ACTIVITY_LOCK_TIMEOUT,
1324 PropsValues.SOCIAL_ACTIVITY_LOCK_RETRY_DELAY) {
1325
1326 @Override
1327 protected SocialActivityLimit performProtectedAction()
1328 throws PortalException {
1329
1330 SocialActivityLimit activityLimit =
1331 socialActivityLimitPersistence.fetchByG_U_C_C_A_A(
1332 groupId, user.getUserId(),
1333 activity.getClassNameId(), classPK,
1334 activity.getType(),
1335 activityCounterDefinition.getName());
1336
1337 if (activityLimit == null) {
1338 activityLimit =
1339 socialActivityLimitLocalService.addActivityLimit(
1340 user.getUserId(), activity.getGroupId(),
1341 activity.getClassNameId(), classPK,
1342 activity.getType(),
1343 activityCounterDefinition.getName(),
1344 activityCounterDefinition.getLimitPeriod());
1345 }
1346
1347 return activityLimit;
1348 }
1349
1350 };
1351
1352 lockProtectedAction.performAction();
1353
1354 socialActivityLimitPersistence.cacheResult(
1355 lockProtectedAction.getReturnValue());
1356 }
1357
1358 private final SocialActivityCounterDefinition
1359 _assetActivitiesActivityCounterDefinition =
1360 new SocialActivityCounterDefinition(
1361 SocialActivityCounterConstants.NAME_ASSET_ACTIVITIES,
1362 SocialActivityCounterConstants.TYPE_ASSET);
1363 private final SocialActivityCounterDefinition
1364 _userAchievementsActivityCounterDefinition =
1365 new SocialActivityCounterDefinition(
1366 SocialActivityCounterConstants.NAME_USER_ACHIEVEMENTS,
1367 SocialActivityCounterConstants.TYPE_ACTOR);
1368 private final SocialActivityCounterDefinition
1369 _userActivitiesActivityCounterDefinition =
1370 new SocialActivityCounterDefinition(
1371 SocialActivityCounterConstants.NAME_USER_ACTIVITIES,
1372 SocialActivityCounterConstants.TYPE_ACTOR);
1373
1374 }