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
101 @Deprecated
102 @Override
103 public SocialActivityCounter addActivityCounter(
104 long groupId, long classNameId, long classPK, String name,
105 int ownerType, int currentValue, int totalValue, int startPeriod,
106 int endPeriod)
107 throws PortalException {
108
109 return addActivityCounter(
110 groupId, classNameId, classPK, name, ownerType, totalValue, 0, 0);
111 }
112
113
153 @Deprecated
154 @Override
155 public SocialActivityCounter addActivityCounter(
156 long groupId, long classNameId, long classPK, String name,
157 int ownerType, int currentValue, int totalValue, int startPeriod,
158 int endPeriod, long previousActivityCounterId, int periodLength)
159 throws PortalException {
160
161 return addActivityCounter(
162 groupId, classNameId, classPK, name, ownerType, totalValue,
163 previousActivityCounterId, periodLength);
164 }
165
166
199 @Override
200 @Transactional(propagation = Propagation.REQUIRES_NEW)
201 public SocialActivityCounter addActivityCounter(
202 long groupId, long classNameId, long classPK, String name,
203 int ownerType, int totalValue, long previousActivityCounterId,
204 int periodLength)
205 throws PortalException {
206
207 SocialActivityCounter activityCounter = null;
208
209 if (previousActivityCounterId != 0) {
210 activityCounter = socialActivityCounterPersistence.findByPrimaryKey(
211 previousActivityCounterId);
212
213 if (periodLength ==
214 SocialActivityCounterConstants.PERIOD_LENGTH_SYSTEM) {
215
216 activityCounter.setEndPeriod(
217 SocialCounterPeriodUtil.getStartPeriod() - 1);
218 }
219 else {
220 activityCounter.setEndPeriod(
221 activityCounter.getStartPeriod() + periodLength - 1);
222 }
223
224 socialActivityCounterPersistence.update(activityCounter);
225 }
226
227 activityCounter = socialActivityCounterPersistence.fetchByG_C_C_N_O_E(
228 groupId, classNameId, classPK, name, ownerType,
229 SocialActivityCounterConstants.END_PERIOD_UNDEFINED, false);
230
231 if (activityCounter != null) {
232 return activityCounter;
233 }
234
235 Group group = groupPersistence.findByPrimaryKey(groupId);
236
237 long activityCounterId = counterLocalService.increment();
238
239 activityCounter = socialActivityCounterPersistence.create(
240 activityCounterId);
241
242 activityCounter.setGroupId(groupId);
243 activityCounter.setCompanyId(group.getCompanyId());
244 activityCounter.setClassNameId(classNameId);
245 activityCounter.setClassPK(classPK);
246 activityCounter.setName(name);
247 activityCounter.setOwnerType(ownerType);
248 activityCounter.setTotalValue(totalValue);
249
250 if (periodLength ==
251 SocialActivityCounterConstants.PERIOD_LENGTH_SYSTEM) {
252
253 activityCounter.setStartPeriod(
254 SocialCounterPeriodUtil.getStartPeriod());
255 }
256 else {
257 activityCounter.setStartPeriod(
258 SocialCounterPeriodUtil.getActivityDay());
259 }
260
261 activityCounter.setEndPeriod(
262 SocialActivityCounterConstants.END_PERIOD_UNDEFINED);
263 activityCounter.setActive(true);
264
265 socialActivityCounterPersistence.update(activityCounter);
266
267 return activityCounter;
268 }
269
270
292 @Override
293 public void addActivityCounters(SocialActivity activity)
294 throws PortalException {
295
296 if (!socialActivitySettingLocalService.isEnabled(
297 activity.getGroupId(), activity.getClassNameId())) {
298
299 return;
300 }
301
302 if (!socialActivitySettingLocalService.isEnabled(
303 activity.getGroupId(), activity.getClassNameId(),
304 activity.getClassPK())) {
305
306 return;
307 }
308
309 if ((activity.getType() ==
310 SocialActivityConstants.TYPE_MOVE_ATTACHMENT_TO_TRASH) ||
311 (activity.getType() ==
312 SocialActivityConstants.TYPE_MOVE_TO_TRASH)) {
313
314 disableActivityCounters(
315 activity.getClassNameId(), activity.getClassPK());
316
317 return;
318 }
319
320 if ((activity.getType() ==
321 SocialActivityConstants.TYPE_RESTORE_ATTACHMENT_FROM_TRASH) ||
322 (activity.getType() ==
323 SocialActivityConstants.TYPE_RESTORE_FROM_TRASH)) {
324
325 enableActivityCounters(
326 activity.getClassNameId(), activity.getClassPK());
327
328 return;
329 }
330
331 User user = userPersistence.findByPrimaryKey(activity.getUserId());
332
333 SocialActivityDefinition activityDefinition =
334 socialActivitySettingLocalService.getActivityDefinition(
335 activity.getGroupId(), activity.getClassName(),
336 activity.getType());
337
338 if ((activityDefinition == null) ||
339 !activityDefinition.isCountersEnabled()) {
340
341 return;
342 }
343
344 SocialActivityProcessor activityProcessor =
345 activityDefinition.getActivityProcessor();
346
347 if (activityProcessor != null) {
348 activityProcessor.processActivity(activity);
349 }
350
351 AssetEntry assetEntry = activity.getAssetEntry();
352
353 User assetEntryUser = userPersistence.findByPrimaryKey(
354 assetEntry.getUserId());
355
356 List<SocialActivityCounter> activityCounters = new ArrayList<>();
357
358 for (SocialActivityCounterDefinition activityCounterDefinition :
359 activityDefinition.getActivityCounterDefinitions()) {
360
361 if (isAddActivityCounter(
362 user, assetEntryUser, assetEntry,
363 activityCounterDefinition)) {
364
365 SocialActivityCounter activityCounter = addActivityCounter(
366 activity.getGroupId(), user, activity,
367 activityCounterDefinition);
368
369 activityCounters.add(activityCounter);
370 }
371 }
372
373 SocialActivityCounter assetActivitiesCounter = null;
374
375 if (!assetEntryUser.isDefaultUser() && assetEntryUser.isActive() &&
376 assetEntry.isVisible()) {
377
378 assetActivitiesCounter = addAssetActivitiesCounter(activity);
379 }
380
381 SocialActivityCounter userActivitiesCounter = null;
382
383 if (!user.isDefaultUser() && user.isActive()) {
384 userActivitiesCounter = addUserActivitiesCounter(activity);
385 }
386
387 for (SocialActivityCounter activityCounter : activityCounters) {
388 SocialActivityCounterDefinition activityCounterDefinition =
389 activityDefinition.getActivityCounterDefinition(
390 activityCounter.getName());
391
392 if (checkActivityLimit(user, activity, activityCounterDefinition)) {
393 incrementActivityCounter(
394 activityCounter, activityCounterDefinition);
395 }
396 }
397
398 if (assetActivitiesCounter != null) {
399 incrementActivityCounter(
400 assetActivitiesCounter,
401 _assetActivitiesActivityCounterDefinition);
402 }
403
404 if (userActivitiesCounter != null) {
405 incrementActivityCounter(
406 userActivitiesCounter,
407 _userActivitiesActivityCounterDefinition);
408 }
409
410 for (SocialAchievement achievement :
411 activityDefinition.getAchievements()) {
412
413 achievement.processActivity(activity);
414 }
415 }
416
417
442 @Deprecated
443 @Override
444 @Transactional(propagation = Propagation.REQUIRES_NEW)
445 public SocialActivityCounter createActivityCounter(
446 long groupId, long classNameId, long classPK, String name,
447 int ownerType, int currentValue, int totalValue, int startPeriod,
448 int endPeriod)
449 throws PortalException {
450
451 return addActivityCounter(
452 groupId, classNameId, classPK, name, ownerType, totalValue, 0, 0);
453 }
454
455
494 @Deprecated
495 @Override
496 @Transactional(propagation = Propagation.REQUIRES_NEW)
497 public SocialActivityCounter createActivityCounter(
498 long groupId, long classNameId, long classPK, String name,
499 int ownerType, int currentValue, int totalValue, int startPeriod,
500 int endPeriod, long previousActivityCounterId, int periodLength)
501 throws PortalException {
502
503 return addActivityCounter(
504 groupId, classNameId, classPK, name, ownerType, totalValue,
505 previousActivityCounterId, periodLength);
506 }
507
508
521 @Override
522 public void deleteActivityCounters(AssetEntry assetEntry)
523 throws PortalException {
524
525 if (assetEntry == null) {
526 return;
527 }
528
529 adjustUserContribution(assetEntry, false);
530
531 socialActivityCounterPersistence.removeByC_C(
532 assetEntry.getClassNameId(), assetEntry.getClassPK());
533
534 socialActivityLimitPersistence.removeByC_C(
535 assetEntry.getClassNameId(), assetEntry.getClassPK());
536
537 socialActivitySettingLocalService.deleteActivitySetting(
538 assetEntry.getGroupId(), assetEntry.getClassName(),
539 assetEntry.getClassPK());
540
541 clearFinderCache();
542 }
543
544
553 @Override
554 public void deleteActivityCounters(long classNameId, long classPK)
555 throws PortalException {
556
557 String className = PortalUtil.getClassName(classNameId);
558
559 if (!className.equals(User.class.getName())) {
560 AssetEntry assetEntry = assetEntryLocalService.fetchEntry(
561 className, classPK);
562
563 deleteActivityCounters(assetEntry);
564 }
565 else {
566 socialActivityCounterPersistence.removeByC_C(classNameId, classPK);
567
568 socialActivityLimitPersistence.removeByUserId(classPK);
569 }
570
571 clearFinderCache();
572 }
573
574
583 @Override
584 public void deleteActivityCounters(String className, long classPK)
585 throws PortalException {
586
587 if (!className.equals(User.class.getName())) {
588 AssetEntry assetEntry = assetEntryLocalService.fetchEntry(
589 className, classPK);
590
591 deleteActivityCounters(assetEntry);
592 }
593 else {
594 long classNameId = classNameLocalService.getClassNameId(className);
595
596 socialActivityCounterPersistence.removeByC_C(classNameId, classPK);
597
598 socialActivityLimitPersistence.removeByUserId(classPK);
599 }
600
601 clearFinderCache();
602 }
603
604
618 @Override
619 public void disableActivityCounters(long classNameId, long classPK)
620 throws PortalException {
621
622 String className = PortalUtil.getClassName(classNameId);
623
624 disableActivityCounters(className, classPK);
625 }
626
627
641 @Override
642 public void disableActivityCounters(String className, long classPK)
643 throws PortalException {
644
645 AssetEntry assetEntry = assetEntryLocalService.fetchEntry(
646 className, classPK);
647
648 if (assetEntry == null) {
649 return;
650 }
651
652 List<SocialActivityCounter> activityCounters =
653 socialActivityCounterPersistence.findByC_C(
654 assetEntry.getClassNameId(), classPK);
655
656 adjustUserContribution(assetEntry, false);
657
658 for (SocialActivityCounter activityCounter : activityCounters) {
659 if (activityCounter.isActive()) {
660 activityCounter.setActive(false);
661
662 socialActivityCounterPersistence.update(activityCounter);
663 }
664 }
665
666 clearFinderCache();
667 }
668
669
683 @Override
684 public void enableActivityCounters(long classNameId, long classPK)
685 throws PortalException {
686
687 String className = PortalUtil.getClassName(classNameId);
688
689 enableActivityCounters(className, classPK);
690 }
691
692
706 @Override
707 public void enableActivityCounters(String className, long classPK)
708 throws PortalException {
709
710 AssetEntry assetEntry = assetEntryLocalService.fetchEntry(
711 className, classPK);
712
713 if (assetEntry == null) {
714 return;
715 }
716
717 List<SocialActivityCounter> activityCounters =
718 socialActivityCounterPersistence.findByC_C(
719 assetEntry.getClassNameId(), classPK);
720
721 adjustUserContribution(assetEntry, true);
722
723 for (SocialActivityCounter activityCounter : activityCounters) {
724 if (!activityCounter.isActive()) {
725 activityCounter.setActive(true);
726
727 socialActivityCounterPersistence.update(activityCounter);
728 }
729 }
730
731 clearFinderCache();
732 }
733
734
746 @Override
747 public SocialActivityCounter fetchActivityCounterByEndPeriod(
748 long groupId, long classNameId, long classPK, String name,
749 int ownerType, int endPeriod) {
750
751 return socialActivityCounterPersistence.fetchByG_C_C_N_O_E(
752 groupId, classNameId, classPK, name, ownerType, endPeriod);
753 }
754
755
767 @Override
768 public SocialActivityCounter fetchActivityCounterByStartPeriod(
769 long groupId, long classNameId, long classPK, String name,
770 int ownerType, int startPeriod) {
771
772 return socialActivityCounterPersistence.fetchByG_C_C_N_O_S(
773 groupId, classNameId, classPK, name, ownerType, startPeriod);
774 }
775
776
787 @Override
788 public SocialActivityCounter fetchLatestActivityCounter(
789 long groupId, long classNameId, long classPK, String name,
790 int ownerType) {
791
792 return socialActivityCounterPersistence.fetchByG_C_C_N_O_E(
793 groupId, classNameId, classPK, name, ownerType,
794 SocialActivityCounterConstants.END_PERIOD_UNDEFINED);
795 }
796
797
811 @Override
812 public List<SocialActivityCounter> getOffsetActivityCounters(
813 long groupId, String name, int startOffset, int endOffset) {
814
815 int startPeriod = SocialCounterPeriodUtil.getStartPeriod(startOffset);
816 int endPeriod = SocialCounterPeriodUtil.getEndPeriod(endOffset);
817
818 return getPeriodActivityCounters(groupId, name, startPeriod, endPeriod);
819 }
820
821
838 @Override
839 public List<SocialActivityCounter> getOffsetDistributionActivityCounters(
840 long groupId, String name, int startOffset, int endOffset) {
841
842 int startPeriod = SocialCounterPeriodUtil.getStartPeriod(startOffset);
843 int endPeriod = SocialCounterPeriodUtil.getEndPeriod(endOffset);
844
845 return getPeriodDistributionActivityCounters(
846 groupId, name, startPeriod, endPeriod);
847 }
848
849
864 @Override
865 public List<SocialActivityCounter> getPeriodActivityCounters(
866 long groupId, String name, int startPeriod, int endPeriod) {
867
868 if (endPeriod == SocialActivityCounterConstants.END_PERIOD_UNDEFINED) {
869 endPeriod = SocialCounterPeriodUtil.getEndPeriod();
870 }
871
872 int offset = SocialCounterPeriodUtil.getOffset(endPeriod);
873
874 int periodLength = SocialCounterPeriodUtil.getPeriodLength(offset);
875
876 return socialActivityCounterFinder.findAC_ByG_N_S_E_1(
877 groupId, name, startPeriod, endPeriod, periodLength);
878 }
879
880
897 @Override
898 public List<SocialActivityCounter> getPeriodDistributionActivityCounters(
899 long groupId, String name, int startPeriod, int endPeriod) {
900
901 int offset = SocialCounterPeriodUtil.getOffset(endPeriod);
902
903 int periodLength = SocialCounterPeriodUtil.getPeriodLength(offset);
904
905 return socialActivityCounterFinder.findAC_ByG_N_S_E_2(
906 groupId, name, startPeriod, endPeriod, periodLength);
907 }
908
909
937 @Override
938 public List<Tuple> getUserActivityCounters(
939 long groupId, String[] rankingNames, String[] selectedNames, int start,
940 int end) {
941
942 List<Long> userIds = socialActivityCounterFinder.findU_ByG_N(
943 groupId, rankingNames, start, end);
944
945 if (userIds.isEmpty()) {
946 return Collections.emptyList();
947 }
948
949 Tuple[] userActivityCounters = new Tuple[userIds.size()];
950
951 List<SocialActivityCounter> activityCounters =
952 socialActivityCounterFinder.findAC_By_G_C_C_N_S_E(
953 groupId, userIds, selectedNames, QueryUtil.ALL_POS,
954 QueryUtil.ALL_POS);
955
956 long userId = 0;
957 Map<String, SocialActivityCounter> activityCountersMap = null;
958
959 for (SocialActivityCounter activityCounter : activityCounters) {
960 if (userId != activityCounter.getClassPK()) {
961 userId = activityCounter.getClassPK();
962 activityCountersMap = new HashMap<>();
963
964 Tuple userActivityCounter = new Tuple(
965 userId, activityCountersMap);
966
967 for (int i = 0; i < userIds.size(); i++) {
968 long curUserId = userIds.get(i);
969
970 if (userId == curUserId) {
971 userActivityCounters[i] = userActivityCounter;
972
973 break;
974 }
975 }
976 }
977
978 activityCountersMap.put(activityCounter.getName(), activityCounter);
979 }
980
981 return Arrays.asList(userActivityCounters);
982 }
983
984
991 @Override
992 public int getUserActivityCountersCount(
993 long groupId, String[] rankingNames) {
994
995 return socialActivityCounterFinder.countU_ByG_N(groupId, rankingNames);
996 }
997
998
1011 @Override
1012 public void incrementUserAchievementCounter(long userId, long groupId)
1013 throws PortalException {
1014
1015 User user = userPersistence.findByPrimaryKey(userId);
1016
1017 SocialActivityCounter activityCounter = addActivityCounter(
1018 groupId, user, new SocialActivityImpl(),
1019 _userAchievementsActivityCounterDefinition);
1020
1021 incrementActivityCounter(
1022 activityCounter, _userAchievementsActivityCounterDefinition);
1023 }
1024
1025 protected SocialActivityCounter addActivityCounter(
1026 final long groupId, final User user, final SocialActivity activity,
1027 final SocialActivityCounterDefinition activityCounterDefinition)
1028 throws PortalException {
1029
1030 int ownerType = activityCounterDefinition.getOwnerType();
1031
1032 long classNameId = getClassNameId(activity.getAssetEntry(), ownerType);
1033 long classPK = getClassPK(user, activity.getAssetEntry(), ownerType);
1034
1035 SocialActivityCounter activityCounter = fetchLatestActivityCounter(
1036 groupId, classNameId, classPK, activityCounterDefinition.getName(),
1037 ownerType);
1038
1039 if (activityCounter == null) {
1040 activityCounter = lockProtectedAddActivityCounter(
1041 groupId, classNameId, classPK,
1042 activityCounterDefinition.getName(), ownerType, 0, 0,
1043 activityCounterDefinition.getPeriodLength());
1044 }
1045 else if (!activityCounter.isActivePeriod(
1046 activityCounterDefinition.getPeriodLength())) {
1047
1048 activityCounter = lockProtectedAddActivityCounter(
1049 groupId, classNameId, classPK,
1050 activityCounterDefinition.getName(), ownerType,
1051 activityCounter.getTotalValue(),
1052 activityCounter.getActivityCounterId(),
1053 activityCounterDefinition.getPeriodLength());
1054 }
1055
1056 if (activityCounterDefinition.getLimitValue() > 0) {
1057 SocialActivityLimit activityLimit =
1058 socialActivityLimitPersistence.fetchByG_U_C_C_A_A(
1059 groupId, user.getUserId(), activity.getClassNameId(),
1060 getLimitClassPK(activity, activityCounterDefinition),
1061 activity.getType(), activityCounterDefinition.getName());
1062
1063 if (activityLimit == null) {
1064 lockProtectedGetActivityLimit(
1065 groupId, user, activity, activityCounterDefinition);
1066 }
1067 }
1068
1069 return activityCounter;
1070 }
1071
1072 protected SocialActivityCounter addAssetActivitiesCounter(
1073 SocialActivity activity)
1074 throws PortalException {
1075
1076 User user = userPersistence.findByPrimaryKey(activity.getUserId());
1077
1078 return addActivityCounter(
1079 activity.getGroupId(), user, activity,
1080 _assetActivitiesActivityCounterDefinition);
1081 }
1082
1083 protected SocialActivityCounter addUserActivitiesCounter(
1084 SocialActivity activity)
1085 throws PortalException {
1086
1087 User user = userPersistence.findByPrimaryKey(activity.getUserId());
1088
1089 return addActivityCounter(
1090 activity.getGroupId(), user, activity,
1091 _userActivitiesActivityCounterDefinition);
1092 }
1093
1094 protected void adjustUserContribution(AssetEntry assetEntry, boolean enable)
1095 throws PortalException {
1096
1097 if (assetEntry == null) {
1098 return;
1099 }
1100
1101 SocialActivityCounter latestPopularityActivityCounter =
1102 fetchLatestActivityCounter(
1103 assetEntry.getGroupId(), assetEntry.getClassNameId(),
1104 assetEntry.getClassPK(),
1105 SocialActivityCounterConstants.NAME_POPULARITY,
1106 SocialActivityCounterConstants.TYPE_ASSET);
1107
1108 if ((latestPopularityActivityCounter == null) ||
1109 (enable && latestPopularityActivityCounter.isActive()) ||
1110 (!enable && !latestPopularityActivityCounter.isActive())) {
1111
1112 return;
1113 }
1114
1115 int factor = -1;
1116
1117 if (enable) {
1118 factor = 1;
1119 }
1120
1121 SocialActivityCounter latestContributionActivityCounter =
1122 fetchLatestActivityCounter(
1123 assetEntry.getGroupId(),
1124 classNameLocalService.getClassNameId(User.class.getName()),
1125 assetEntry.getUserId(),
1126 SocialActivityCounterConstants.NAME_CONTRIBUTION,
1127 SocialActivityCounterConstants.TYPE_CREATOR);
1128
1129 if (latestContributionActivityCounter == null) {
1130 return;
1131 }
1132
1133 int startPeriod = SocialCounterPeriodUtil.getStartPeriod();
1134
1135 if (latestContributionActivityCounter.getStartPeriod() != startPeriod) {
1136 latestContributionActivityCounter = addActivityCounter(
1137 latestContributionActivityCounter.getGroupId(),
1138 latestContributionActivityCounter.getClassNameId(),
1139 latestContributionActivityCounter.getClassPK(),
1140 latestContributionActivityCounter.getName(),
1141 latestContributionActivityCounter.getOwnerType(), 0,
1142 latestContributionActivityCounter.getTotalValue(),
1143 SocialCounterPeriodUtil.getStartPeriod(),
1144 SocialActivityCounterConstants.END_PERIOD_UNDEFINED,
1145 latestContributionActivityCounter.getActivityCounterId(),
1146 SocialActivityCounterConstants.PERIOD_LENGTH_SYSTEM);
1147 }
1148
1149 if (latestPopularityActivityCounter.getStartPeriod() == startPeriod) {
1150 latestContributionActivityCounter.setCurrentValue(
1151 latestContributionActivityCounter.getCurrentValue() +
1152 (latestPopularityActivityCounter.getCurrentValue() *
1153 factor));
1154 }
1155
1156 latestContributionActivityCounter.setTotalValue(
1157 latestContributionActivityCounter.getTotalValue() +
1158 (latestPopularityActivityCounter.getTotalValue() * factor));
1159
1160 socialActivityCounterPersistence.update(
1161 latestContributionActivityCounter);
1162 }
1163
1164 protected boolean checkActivityLimit(
1165 User user, SocialActivity activity,
1166 SocialActivityCounterDefinition activityCounterDefinition)
1167 throws PortalException {
1168
1169 if (activityCounterDefinition.getLimitValue() == 0) {
1170 return true;
1171 }
1172
1173 long classPK = activity.getClassPK();
1174
1175 String name = activityCounterDefinition.getName();
1176
1177 if (name.equals(SocialActivityCounterConstants.NAME_PARTICIPATION)) {
1178 classPK = 0;
1179 }
1180
1181 SocialActivityLimit activityLimit =
1182 socialActivityLimitPersistence.findByG_U_C_C_A_A(
1183 activity.getGroupId(), user.getUserId(),
1184 activity.getClassNameId(), classPK, activity.getType(), name);
1185
1186 int count = activityLimit.getCount(
1187 activityCounterDefinition.getLimitPeriod());
1188
1189 if (count < activityCounterDefinition.getLimitValue()) {
1190 activityLimit.setCount(
1191 activityCounterDefinition.getLimitPeriod(), count + 1);
1192
1193 socialActivityLimitPersistence.update(activityLimit);
1194
1195 return true;
1196 }
1197
1198 return false;
1199 }
1200
1201 protected void clearFinderCache() {
1202 PortalCache<String, SocialActivityCounter> portalCache =
1203 MultiVMPoolUtil.getCache(
1204 SocialActivityCounterFinder.class.getName());
1205
1206 portalCache.removeAll();
1207 }
1208
1209 protected long getClassNameId(AssetEntry assetEntry, int ownerType) {
1210 if (ownerType == SocialActivityCounterConstants.TYPE_ASSET) {
1211 return assetEntry.getClassNameId();
1212 }
1213
1214 return classNameLocalService.getClassNameId(User.class.getName());
1215 }
1216
1217 protected long getClassPK(User user, AssetEntry assetEntry, int ownerType) {
1218 if (ownerType == SocialActivityCounterConstants.TYPE_ACTOR) {
1219 return user.getUserId();
1220 }
1221
1222 if (ownerType == SocialActivityCounterConstants.TYPE_ASSET) {
1223 return assetEntry.getClassPK();
1224 }
1225
1226 return assetEntry.getUserId();
1227 }
1228
1229 protected long getLimitClassPK(
1230 SocialActivity activity,
1231 SocialActivityCounterDefinition activityCounterDefinition) {
1232
1233 String name = activityCounterDefinition.getName();
1234
1235 if (name.equals(SocialActivityCounterConstants.NAME_PARTICIPATION)) {
1236 return 0;
1237 }
1238
1239 return activity.getClassPK();
1240 }
1241
1242 protected void incrementActivityCounter(
1243 SocialActivityCounter activityCounter,
1244 SocialActivityCounterDefinition activityCounterDefinition) {
1245
1246 activityCounter.setCurrentValue(
1247 activityCounter.getCurrentValue() +
1248 activityCounterDefinition.getIncrement());
1249 activityCounter.setTotalValue(
1250 activityCounter.getTotalValue() +
1251 activityCounterDefinition.getIncrement());
1252
1253 socialActivityCounterPersistence.update(activityCounter);
1254
1255 socialActivityCounterPersistence.clearCache(activityCounter);
1256 }
1257
1258 protected boolean isAddActivityCounter(
1259 User user, User assetEntryUser, AssetEntry assetEntry,
1260 SocialActivityCounterDefinition activityCounterDefinition) {
1261
1262 if ((user.isDefaultUser() || !user.isActive()) &&
1263 (activityCounterDefinition.getOwnerType() !=
1264 SocialActivityCounterConstants.TYPE_ASSET)) {
1265
1266 return false;
1267 }
1268
1269 if ((assetEntryUser.isDefaultUser() || !assetEntryUser.isActive()) &&
1270 (activityCounterDefinition.getOwnerType() !=
1271 SocialActivityCounterConstants.TYPE_ACTOR)) {
1272
1273 return false;
1274 }
1275
1276 if (!activityCounterDefinition.isEnabled() ||
1277 (activityCounterDefinition.getIncrement() == 0)) {
1278
1279 return false;
1280 }
1281
1282 String name = activityCounterDefinition.getName();
1283
1284 if ((user.getUserId() == assetEntryUser.getUserId()) &&
1285 (name.equals(SocialActivityCounterConstants.NAME_CONTRIBUTION) ||
1286 name.equals(SocialActivityCounterConstants.NAME_POPULARITY))) {
1287
1288 return false;
1289 }
1290
1291 if ((activityCounterDefinition.getOwnerType() ==
1292 SocialActivityCounterConstants.TYPE_ASSET) &&
1293 !assetEntry.isVisible()) {
1294
1295 return false;
1296 }
1297
1298 return true;
1299 }
1300
1301 protected SocialActivityCounter lockProtectedAddActivityCounter(
1302 final long groupId, final long classNameId, final long classPK,
1303 final String name, final int ownerType, final int totalValue,
1304 final long previousActivityCounterId, final int periodLength)
1305 throws PortalException {
1306
1307 String lockKey = StringUtil.merge(
1308 new Object[] {groupId, classNameId, classPK, name, ownerType},
1309 StringPool.POUND);
1310
1311 LockProtectedAction<SocialActivityCounter> lockProtectedAction =
1312 new LockProtectedAction<SocialActivityCounter>(
1313 SocialActivityCounter.class, lockKey,
1314 PropsValues.SOCIAL_ACTIVITY_LOCK_TIMEOUT,
1315 PropsValues.SOCIAL_ACTIVITY_LOCK_RETRY_DELAY) {
1316
1317 @Override
1318 protected SocialActivityCounter performProtectedAction()
1319 throws PortalException {
1320
1321 SocialActivityCounter activityCounter =
1322 socialActivityCounterLocalService.addActivityCounter(
1323 groupId, classNameId, classPK, name, ownerType,
1324 totalValue, previousActivityCounterId, periodLength);
1325
1326 return activityCounter;
1327 }
1328
1329 };
1330
1331 lockProtectedAction.performAction();
1332
1333 return lockProtectedAction.getReturnValue();
1334 }
1335
1336 protected void lockProtectedGetActivityLimit(
1337 final long groupId, final User user, final SocialActivity activity,
1338 final SocialActivityCounterDefinition activityCounterDefinition)
1339 throws PortalException {
1340
1341 final long classPK = getLimitClassPK(
1342 activity, activityCounterDefinition);
1343
1344 String lockKey = StringUtil.merge(
1345 new Object[] {
1346 groupId, user.getUserId(), activity.getClassNameId(), classPK,
1347 activity.getType(), activityCounterDefinition.getName()
1348 },
1349 StringPool.POUND);
1350
1351 LockProtectedAction<SocialActivityLimit> lockProtectedAction =
1352 new LockProtectedAction<SocialActivityLimit>(
1353 SocialActivityLimit.class, lockKey,
1354 PropsValues.SOCIAL_ACTIVITY_LOCK_TIMEOUT,
1355 PropsValues.SOCIAL_ACTIVITY_LOCK_RETRY_DELAY) {
1356
1357 @Override
1358 protected SocialActivityLimit performProtectedAction()
1359 throws PortalException {
1360
1361 SocialActivityLimit activityLimit =
1362 socialActivityLimitPersistence.fetchByG_U_C_C_A_A(
1363 groupId, user.getUserId(), activity.getClassNameId(),
1364 classPK, activity.getType(),
1365 activityCounterDefinition.getName());
1366
1367 if (activityLimit == null) {
1368 activityLimit =
1369 socialActivityLimitLocalService.addActivityLimit(
1370 user.getUserId(), activity.getGroupId(),
1371 activity.getClassNameId(), classPK,
1372 activity.getType(),
1373 activityCounterDefinition.getName(),
1374 activityCounterDefinition.getLimitPeriod());
1375 }
1376
1377 return activityLimit;
1378 }
1379 };
1380
1381 lockProtectedAction.performAction();
1382
1383 socialActivityLimitPersistence.cacheResult(
1384 lockProtectedAction.getReturnValue());
1385 }
1386
1387 private final SocialActivityCounterDefinition
1388 _assetActivitiesActivityCounterDefinition =
1389 new SocialActivityCounterDefinition(
1390 SocialActivityCounterConstants.NAME_ASSET_ACTIVITIES,
1391 SocialActivityCounterConstants.TYPE_ASSET);
1392 private final SocialActivityCounterDefinition
1393 _userAchievementsActivityCounterDefinition =
1394 new SocialActivityCounterDefinition(
1395 SocialActivityCounterConstants.NAME_USER_ACHIEVEMENTS,
1396 SocialActivityCounterConstants.TYPE_ACTOR);
1397 private final SocialActivityCounterDefinition
1398 _userActivitiesActivityCounterDefinition =
1399 new SocialActivityCounterDefinition(
1400 SocialActivityCounterConstants.NAME_USER_ACTIVITIES,
1401 SocialActivityCounterConstants.TYPE_ACTOR);
1402
1403 }