package org.iatoki.judgels.raguel.forum;
import com.beust.jcommander.internal.Maps;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import org.iatoki.judgels.raguel.forum.module.ForumModuleDao;
import org.iatoki.judgels.raguel.forum.module.ForumModuleModel;
import org.iatoki.judgels.raguel.forum.module.ForumModuleModel_;
import org.iatoki.judgels.raguel.forum.module.ForumModule;
import org.iatoki.judgels.raguel.forum.module.ForumModuleFactory;
import org.iatoki.judgels.raguel.forum.module.ForumModules;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Stack;
import java.util.stream.Collectors;
public final class ForumServiceUtils {
private ForumServiceUtils() {
//prevent instantiation
}
public static Forum createPlainForumFromModel(ForumModel forumModel, Forum parentForum) {
return new Forum(forumModel.id, forumModel.jid, parentForum, Lists.newArrayList(), forumModel.name, forumModel.description, null, null, "-");
}
public static Forum createForumFromModel(ForumModuleFactory forumModuleFactory, ForumModel forumModel, Forum parentForum, List<ForumModuleModel> forumModulesModel, Date timeUpdate, String userUpdate) {
ImmutableMap.Builder<ForumModules, ForumModule> forumModuleBuilder = ImmutableMap.builder();
for (ForumModuleModel forumModuleModel : forumModulesModel) {
ForumModules forumModules = ForumModules.valueOf(forumModuleModel.name);
forumModuleBuilder.put(forumModules, forumModuleFactory.parseFromConfig(forumModules, forumModuleModel.config));
}
return new Forum(forumModel.id, forumModel.jid, parentForum, Lists.newArrayList(), forumModel.name, forumModel.description, forumModuleBuilder.build(), timeUpdate, userUpdate);
}
public static Forum createForumWithParentFromModel(ForumDao forumDao, ForumLastPostDao forumLastPostDao, ForumModuleDao forumModuleDao, ForumModuleFactory forumModuleFactory, ForumModel intendedForumModel) {
Stack<ForumModel> forumModelStack = new Stack<>();
forumModelStack.push(intendedForumModel);
while (!forumModelStack.peek().parentJid.isEmpty()) {
forumModelStack.push(forumDao.findByJid(forumModelStack.peek().parentJid));
}
List<String> forumJids = forumModelStack.stream().map(m -> m.jid).collect(Collectors.toList());
List<ForumModuleModel> forumModuleModels = forumModuleDao.findSortedByFilters("id", "asc", "", ImmutableMap.of(ForumModuleModel_.enabled, Boolean.valueOf(true)), ImmutableMap.of(ForumModuleModel_.forumJid, forumJids), 0, -1);
Map<String, List<ForumModuleModel>> mapForumJidsToForumModuleModel = Maps.newHashMap();
for (ForumModuleModel forumModuleModel : forumModuleModels) {
List<ForumModuleModel> value;
if (mapForumJidsToForumModuleModel.containsKey(forumModuleModel.forumJid)) {
value = mapForumJidsToForumModuleModel.get(forumModuleModel.forumJid);
} else {
value = Lists.newArrayList();
}
value.add(forumModuleModel);
mapForumJidsToForumModuleModel.put(forumModuleModel.forumJid, value);
}
List<ForumLastPostModel> forumLastPostModels = forumLastPostDao.findSortedByFiltersIn("id", "asc", "", ImmutableMap.of(ForumLastPostModel_.forumJid, forumJids), 0, -1);
ImmutableMap.Builder<String, ForumLastPostModel> mapForumJidsToLastPostModelBuilder = ImmutableMap.builder();
for (ForumLastPostModel forumLastPostModel : forumLastPostModels) {
mapForumJidsToLastPostModelBuilder.put(forumLastPostModel.forumJid, forumLastPostModel);
}
Map<String, ForumLastPostModel> mapForumJidsToLastPostModel = mapForumJidsToLastPostModelBuilder.build();
Forum parentForum = null;
Forum intendedForum = null;
while (!forumModelStack.isEmpty()) {
ForumModel currentForumModel = forumModelStack.pop();
List<ForumModuleModel> currentForumModuleModels = mapForumJidsToForumModuleModel.get(currentForumModel.jid);
if (currentForumModuleModels == null) {
currentForumModuleModels = ImmutableList.of();
}
Date timeUpdate = null;
String userUpdate = "-";
ForumLastPostModel forumLastPostModel = mapForumJidsToLastPostModel.get(currentForumModel.jid);
if (forumLastPostModel != null) {
timeUpdate = new Date(forumLastPostModel.timeUpdate);
userUpdate = forumLastPostModel.userUpdate;
}
Forum currentForum = ForumServiceUtils.createForumFromModel(forumModuleFactory, currentForumModel, parentForum, currentForumModuleModels, timeUpdate, userUpdate);
if (currentForumModel.jid.equals(intendedForumModel.jid) && (intendedForum == null)) {
intendedForum = currentForum;
} else {
if (parentForum != null) {
parentForum.getSubforums().add(currentForum);
}
parentForum = currentForum;
}
}
return intendedForum;
}
public static Forum createForumWithParentAndSubforumsUntilCertainDepthFromModel(ForumDao forumDao, ForumLastPostDao forumLastPostDao, ForumModuleDao forumModuleDao, ForumModuleFactory forumModuleFactory, ForumModel intendedForumModel, long maxDepth) {
Forum intendedForum = createForumWithParentFromModel(forumDao, forumLastPostDao, forumModuleDao, forumModuleFactory, intendedForumModel);
intendedForum = createForumWithSubforumsUntilCertainDepthFromModel(forumDao, forumLastPostDao, forumModuleDao, forumModuleFactory, intendedForum, 0, maxDepth);
return intendedForum;
}
public static Forum createForumWithSubforumsUntilCertainDepthFromModel(ForumDao forumDao, ForumLastPostDao forumLastPostDao, ForumModuleDao forumModuleDao, ForumModuleFactory forumModuleFactory, Forum currentForum, long currentDepth, long maxDepth) {
if (currentDepth > maxDepth) {
return currentForum;
}
List<ForumModel> forumModels = forumDao.findSortedByFiltersEq("id", "asc", "", ImmutableMap.of(ForumModel_.parentJid, currentForum.getJid()), 0, -1);
List<String> forumJids = forumModels.stream().map(m -> m.jid).collect(Collectors.toList());
List<ForumModuleModel> forumModuleModels = forumModuleDao.findSortedByFilters("id", "asc", "", ImmutableMap.of(ForumModuleModel_.enabled, Boolean.valueOf(true)), ImmutableMap.of(ForumModuleModel_.forumJid, forumJids), 0, -1);
Map<String, List<ForumModuleModel>> mapForumJidsToForumModuleModel = Maps.newHashMap();
for (ForumModuleModel forumModuleModel : forumModuleModels) {
List<ForumModuleModel> value;
if (mapForumJidsToForumModuleModel.containsKey(forumModuleModel.forumJid)) {
value = mapForumJidsToForumModuleModel.get(forumModuleModel.forumJid);
} else {
value = Lists.newArrayList();
}
value.add(forumModuleModel);
mapForumJidsToForumModuleModel.put(forumModuleModel.forumJid, value);
}
List<ForumLastPostModel> forumLastPostModels = forumLastPostDao.findSortedByFiltersIn("id", "asc", "", ImmutableMap.of(ForumLastPostModel_.forumJid, forumJids), 0, -1);
ImmutableMap.Builder<String, ForumLastPostModel> mapForumJidsToLastPostBuilder = ImmutableMap.builder();
for (ForumLastPostModel forumLastPostModel : forumLastPostModels) {
mapForumJidsToLastPostBuilder.put(forumLastPostModel.forumJid, forumLastPostModel);
}
Map<String, ForumLastPostModel> mapForumJidsToLastPost = mapForumJidsToLastPostBuilder.build();
for (ForumModel forumModel : forumModels) {
List<ForumModuleModel> currentForumModuleModels = mapForumJidsToForumModuleModel.get(forumModel.jid);
if (currentForumModuleModels == null) {
currentForumModuleModels = ImmutableList.of();
}
Date timeUpdate = null;
String userUpdate = "-";
ForumLastPostModel forumLastPostModel = mapForumJidsToLastPost.get(forumModel.jid);
if (forumLastPostModel != null) {
timeUpdate = new Date(forumLastPostModel.timeUpdate);
userUpdate = forumLastPostModel.userUpdate;
}
Forum forum = ForumServiceUtils.createForumFromModel(forumModuleFactory, forumModel, currentForum, currentForumModuleModels, timeUpdate, userUpdate);
forum = createForumWithSubforumsUntilCertainDepthFromModel(forumDao, forumLastPostDao, forumModuleDao, forumModuleFactory, forum, currentDepth + 1, maxDepth);
currentForum.getSubforums().add(forum);
}
return currentForum;
}
public static void updateForumAndParents(ForumDao forumDao, Forum forum, String userJid, String userIpAddress) {
ImmutableList.Builder<String> forumJids = ImmutableList.builder();
Forum currentForum = forum;
while (currentForum != null) {
forumJids.add(currentForum.getJid());
currentForum = currentForum.getParentForum();
}
List<ForumModel> forumModels = forumDao.findSortedByFiltersIn("id", "asc", "", ImmutableMap.of(ForumModel_.jid, forumJids.build()), 0, -1);
for (ForumModel forumModel : forumModels) {
forumDao.edit(forumModel, userJid, userIpAddress);
}
}
public static void updateForumAndParents(ForumDao forumDao, ForumLastPostDao forumLastPostDao, Forum forum, String userJid, String userIpAddress) {
ImmutableList.Builder<String> forumJids = ImmutableList.builder();
Forum currentForum = forum;
while (currentForum != null) {
forumJids.add(currentForum.getJid());
currentForum = currentForum.getParentForum();
}
List<ForumModel> forumModels = forumDao.findSortedByFiltersIn("id", "asc", "", ImmutableMap.of(ForumModel_.jid, forumJids.build()), 0, -1);
for (ForumModel forumModel : forumModels) {
forumDao.edit(forumModel, userJid, userIpAddress);
ForumLastPostModel forumLastPostModel;
if (forumLastPostDao.existsByForumJid(forumModel.jid)) {
forumLastPostModel = forumLastPostDao.findByForumJid(forumModel.jid);
forumLastPostDao.edit(forumLastPostModel, userJid, userIpAddress);
} else {
forumLastPostModel = new ForumLastPostModel();
forumLastPostModel.forumJid = forumModel.jid;
forumLastPostDao.persist(forumLastPostModel, userJid, userIpAddress);
}
}
}
}