public
static
Map<Category, List<Forum>> getBetaTopForums(
int
userId, List<Topic> primaryBestList, List<Topic> secondaryBestList){
BestTopicsDAO bestTopicDAO = DataAccessDriver.newBestTopicDAO();
Map<Integer, Integer> ratings = bestTopicDAO.selectForumRatingsByUserId(userId);
Collection<Integer> forumIds =
new
LinkedHashSet<>();
List<Integer> ratedForumIds = CollectionCommon.getKeysSortedByValues(ratings,
true
);
final
int
defaultUserId = SystemGlobals.getIntValue(ConfigKeys.BEST_TOPICS_DEFAULT_USER_ID);
addForumIds(forumIds, ratedForumIds, id -> {
Integer r = ratings.get(id);
return
r !=
null
&& r >
5
;
});
addForumIds(forumIds, primaryBestList);
addForumIds(forumIds, secondaryBestList);
if
(userId != defaultUserId) {
Collection<Integer> fids = getTopRatedForumIds(bestTopicDAO);
addForumIds(forumIds, fids, id -> id !=
null
);
}
List<Topic> tmpTopics = TopicRepository.getHottestTopics();
addForumIds(forumIds, tmpTopics);
addForumIds(forumIds, ratedForumIds, id -> {
Integer r = ratings.get(id);
return
r !=
null
&& r <
6
;
});
Map<Category, List<Forum>> forums =
new
LinkedHashMap<>();
PermissionControl pc = SecurityRepository.get(userId);
final
int
maxTopForums = SystemGlobals.getIntValue(ConfigKeys.BETA_VIEW_MAX_TOP_FORUMS_IN_HOME);
AtomicInteger countForumsToShow =
new
AtomicInteger(
0
);
forumIds.stream()
.filter(id -> pc.canAccess(SecurityConstants.PERM_FORUM, String.valueOf(id)))
.map(ForumRepository::getForum)
.filter(f -> f !=
null
&& f.isShowInForumList())
.forEach(f -> addForumToCategory(forums, f, maxTopForums, countForumsToShow));
return
forums;
}
private
static
void
addForumToCategory(Map<Category, List<Forum>> forums, Forum f,
int
maxTopForums,
AtomicInteger countForumsToShow) {
Category c = ForumRepository.getCategory(f.getCategoryId());
if
(c !=
null
&& countForumsToShow.incrementAndGet() <= maxTopForums) {
List<Forum> fs;
if
(forums.containsKey(c)) {
fs = forums.get(c);
}
else
{
fs =
new
ArrayList<>();
forums.put(c, fs);
}
fs.add(f);
}
}
private
static
void
addForumIds(Collection<Integer> forumIds, List<Topic> candidates) {
if
(candidates !=
null
) {
List<Integer> toAdd = candidates.stream().map(Topic::getForumId).collect(Collectors.toList());
forumIds.addAll(toAdd);
}
}
private
static
void
addForumIds(Collection<Integer> forumIds, Collection<Integer> candidates, Predicate<Integer> predicate) {
if
(candidates !=
null
) {
List<Integer> toAdd = candidates.stream().filter(predicate).collect(Collectors.toList());
forumIds.addAll(toAdd);
}
}