/* * Copyright (c) JForum Team * All rights reserved. * * Redistribution and use in source and binary forms, * with or without modification, are permitted provided * that the following conditions are met: * * 1) Redistributions of source code must retain the above * copyright notice, this list of conditions and the * following disclaimer. * 2) Redistributions in binary form must reproduce the * above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or * other materials provided with the distribution. * 3) Neither the name of "Rafael Steil" nor * the names of its contributors may be used to endorse * or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * * Created on 12/11/2004 18:04:12 * The JForum Project * http://www.jforum.net */ package net.jforum.view.forum.common; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import net.jforum.SessionFacade; import net.jforum.dao.DataAccessDriver; import net.jforum.dao.ForumDAO; import net.jforum.entities.Category; import net.jforum.entities.Forum; import net.jforum.entities.LastPostInfo; import net.jforum.entities.Post; import net.jforum.entities.Topic; import net.jforum.entities.UserSession; import net.jforum.repository.ForumRepository; import net.jforum.util.concurrent.Executor; import net.jforum.util.mail.EmailSenderTask; import net.jforum.util.mail.ForumNewTopicSpammer; import net.jforum.util.preferences.ConfigKeys; import net.jforum.util.preferences.SystemGlobals; import org.apache.log4j.Logger; /** * @author Rafael Steil * @version $Id: ForumCommon.java,v 1.24 2007/08/01 22:30:05 rafaelsteil Exp $ */ public class ForumCommon { private static Logger logger = Logger.getLogger(ForumCommon.class); /** * Check if some forum has unread messages. * @param forum The forum to search for unread messages * @param tracking Tracking of the topics read by the user * @param lastVisit The last visit time of the current user */ public static void checkUnreadPosts(Forum forum, Map tracking, long lastVisit) { LastPostInfo lpi = forum.getLastPostInfo(); if (lpi == null) { return; } Integer topicId = new Integer(lpi.getTopicId()); if (tracking != null && tracking.containsKey(topicId)) { long readTime = ((Long)tracking.get(topicId)).longValue(); forum.setUnread(readTime > 0 && lpi.getPostTimeMillis() > readTime); } else { forum.setUnread(lpi.getPostTimeMillis() > lastVisit); } } /** * Gets all forums available to the user. * * @param us An <code>UserSession</code> instance with user information * @param anonymousUserId The id which represents the anonymous user * @param tracking <code>Map</code> instance with information * about the topics read by the user * @param checkUnreadPosts <code>true</code> if is to search for unread topics inside the forums, * or <code>false</code> if this action is not needed. * @return A <code>List</code> instance where each record is an instance of a <code>Category</code> * object */ public static List getAllCategoriesAndForums(UserSession us, int anonymousUserId, Map tracking, boolean checkUnreadPosts) { long lastVisit = 0; int userId = anonymousUserId; if (us != null) { lastVisit = us.getLastVisit().getTime(); userId = us.getUserId(); } // Do not check for unread posts if the user is not logged in checkUnreadPosts = checkUnreadPosts && (userId != anonymousUserId); List categories = ForumRepository.getAllCategories(userId); if (!checkUnreadPosts) { return categories; } List returnCategories = new ArrayList(); for (Iterator iter = categories.iterator(); iter.hasNext(); ) { Category c = new Category((Category)iter.next()); for (Iterator tmpIterator = c.getForums().iterator(); tmpIterator.hasNext(); ) { Forum f = (Forum)tmpIterator.next(); ForumCommon.checkUnreadPosts(f, tracking, lastVisit); } returnCategories.add(c); } return returnCategories; } /** * @see #getAllCategoriesAndForums(UserSession, int, Map, boolean) * @return List * @param checkUnreadPosts boolean */ public static List getAllCategoriesAndForums(boolean checkUnreadPosts) { return getAllCategoriesAndForums(SessionFacade.getUserSession(), SystemGlobals.getIntValue(ConfigKeys.ANONYMOUS_USER_ID), SessionFacade.getTopicsReadTime(), checkUnreadPosts); } /** * @see #getAllCategoriesAndForums(boolean) * @return List */ public static List getAllCategoriesAndForums() { UserSession us = SessionFacade.getUserSession(); boolean checkUnread = (us != null && us.getUserId() != SystemGlobals.getIntValue(ConfigKeys.ANONYMOUS_USER_ID)); return getAllCategoriesAndForums(checkUnread); } /** * Sends a "new topic" notification message to all users watching the forum. * * @param f The Forum changed * @param t The new topic * @param post the newly created message */ public static void notifyUsers(Forum f, Topic t, Post post) { if (SystemGlobals.getBoolValue(ConfigKeys.MAIL_NOTIFY_ANSWERS)) { try { ForumDAO dao = DataAccessDriver.getInstance().newForumDAO(); List usersToNotify = dao.notifyUsers(f); // we only have to send an email if there are users // subscribed to the topic if (usersToNotify != null && usersToNotify.size() > 0) { Executor.execute( new EmailSenderTask( new ForumNewTopicSpammer(f, t, post, usersToNotify))); } } catch (Exception e) { logger.warn("Error while sending notification emails: " + e); } } } }