package org.iatoki.judgels.raguel.forum; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import org.iatoki.judgels.raguel.forum.module.ForumModule; import org.iatoki.judgels.raguel.forum.module.ForumModules; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; public final class Forum { private final long id; private final String jid; private final Forum parentForum; private final List<Forum> subforums; private final String name; private final String description; private final Map<ForumModules, ForumModule> modules; private final Date lastUpdate; private final String lastUpdateUserJid; public Forum(long id, String jid, Forum parentForum, List<Forum> subforums, String name, String description, Map<ForumModules, ForumModule> modules, Date lastUpdate, String lastUpdateUserJid) { this.id = id; this.jid = jid; this.parentForum = parentForum; this.subforums = subforums; this.name = name; this.description = description; this.modules = modules; this.lastUpdate = lastUpdate; this.lastUpdateUserJid = lastUpdateUserJid; } public long getId() { return id; } public String getJid() { return jid; } public Forum getParentForum() { return parentForum; } public List<Forum> getSubforums() { return subforums; } public String getName() { return name; } public String getDescription() { return description; } public Set<ForumModules> getModulesSet() { return ImmutableSet.copyOf(modules.keySet()); } public List<ForumModule> getModules() { return ImmutableList.copyOf(modules.values()); } public boolean containModule(ForumModules forumModules) { return modules.containsKey(forumModules); } public boolean inheritModule(ForumModules forumModules) { if (getParentForum() == null) { return false; } if (getParentForum().containModule(forumModules)) { return true; } return getParentForum().inheritModule(forumModules); } public boolean containOrInheritModule(ForumModules forumModules) { return containModule(forumModules) || inheritModule(forumModules); } public Forum getForumOrParentWithModule(ForumModules forumModules) { if (containModule(forumModules)) { return this; } if (getParentForum() == null) { return null; } return getParentForum().getForumOrParentWithModule(forumModules); } public ForumModule getModule(ForumModules forumModules) { return modules.get(forumModules); } public Date getLastUpdate() { return lastUpdate; } public String getLastUpdateUserJid() { return lastUpdateUserJid; } public boolean containsJidInHierarchy(String forumJid) { Forum forum = this; while (forum != null) { if (forum.getJid().equals(forumJid)) { return true; } forum = forum.getParentForum(); } return false; } public String prependSpacesBasedOnLevel(int totalSpaces) { int depth = 0; Forum parent = getParentForum(); while (parent != null) { depth++; parent = parent.getParentForum(); } StringBuilder sb = new StringBuilder(); while (depth != 0) { for (int i = 0; i < totalSpaces; ++i) { sb.append(" "); } depth--; } sb.append(getName()); return sb.toString(); } }