|
What this is
Other links
The source code
/*
* $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/user/PostWebHandler.java,v 1.65.2.1 2005/05/20 08:52:56 minhnn Exp $
* $Author: minhnn $
* $Revision: 1.65.2.1 $
* $Date: 2005/05/20 08:52:56 $
*
* ====================================================================
*
* Copyright (C) 2002-2005 by MyVietnam.net
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* All copyright notices regarding mvnForum MUST remain intact
* in the scripts and in the outputted HTML.
* The "powered by" text/logo with a link back to
* http://www.mvnForum.com and http://www.MyVietnam.net in the
* footer of the pages MUST remain visible when the pages
* are viewed on the internet or intranet.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Support can be obtained from support forums at:
* http://www.mvnForum.com/mvnforum/index
*
* Correspondence and Marketing Questions can be sent to:
* info@MyVietnam.net
*
* @author: Minh Nguyen minhnn@MyVietnam.net
* @author: Mai Nguyen mai.nh@MyVietnam.net
*/
package com.mvnforum.user;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mvnforum.*;
import com.mvnforum.auth.*;
import com.mvnforum.common.StatisticsUtil;
import com.mvnforum.db.*;
import com.mvnforum.search.post.*;
import net.myvietnam.mvncore.exception.*;
import net.myvietnam.mvncore.filter.DisableHtmlTagFilter;
import net.myvietnam.mvncore.interceptor.InterceptorService;
import net.myvietnam.mvncore.security.FloodControl;
import net.myvietnam.mvncore.util.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
class PostWebHandler {
private static Log log = LogFactory.getLog(PostWebHandler.class);
private OnlineUserManager onlineUserManager = OnlineUserManager.getInstance();
PostWebHandler() {
}
/**
* This method is for addpost page
*/
void prepareAdd(HttpServletRequest request, HttpServletResponse response)
throws ObjectNotFoundException, DatabaseException, BadInputException, AuthenticationException, AssertionException {
Locale locale = I18nUtil.getLocaleInRequest(request);
if (MVNForumConfig.getEnableNewPost() == false) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.AssertionException.cannot_create_new_post.new_post_is_disabled");
throw new AssertionException(localizedMessage);
//throw new AssertionException("Cannot create new post because NEW_POST feature is disabled by administrator.");
}
OnlineUser onlineUser = onlineUserManager.getOnlineUser(request);
MVNForumPermission permission = onlineUser.getPermission();
if (MVNForumConfig.isGuestUserInDatabase() == false) {
permission.ensureIsAuthenticated();
}
// we set this action attribute first because the return below can make method return prematurely
request.setAttribute("action", "addnew");
int parentPostID = 0;
try {
// neu co parent thi` khong co forum !!!
parentPostID = ParamUtil.getParameterInt(request, "parent");
} catch (Exception ex) {
// do nothing
// NOTE: we cannot return here since user can have a parameter parent = 0
}
if (parentPostID == 0) {// new thread
int forumID = ParamUtil.getParameterInt(request, "forum");
ForumBean forumBean = null;
try {
forumBean = ForumCache.getInstance().getBean(forumID);
} catch (ObjectNotFoundException e) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.forumid_not_exists", new Object[] {new Integer(forumID)});
throw new ObjectNotFoundException(localizedMessage);
}
forumBean.ensureNotDisabledForum();
forumBean.ensureNotClosedForum();
forumBean.ensureNotLockedForum();
permission.ensureCanAddThread(forumID);
} else {// reply to a post
// this is a parent post
PostBean postBean = null;
try {
postBean = DAOFactory.getPostDAO().getPost(parentPostID);// can throw DatabaseException
} catch (ObjectNotFoundException ex) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.postid_not_exists", new Object[] {new Integer(parentPostID)});
throw new ObjectNotFoundException(localizedMessage);
}
// check permission
int forumID = postBean.getForumID();
ForumBean forumBean = null;
try {
forumBean = ForumCache.getInstance().getBean(forumID);
} catch (ObjectNotFoundException e) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.forumid_not_exists", new Object[] {new Integer(forumID)});
throw new ObjectNotFoundException(localizedMessage);
}
forumBean.ensureNotDisabledForum();
forumBean.ensureNotClosedForum();
forumBean.ensureNotLockedForum();
permission.ensureCanAddPost(forumID);
// now we prepare to list lastest post in the thread
int threadID = postBean.getThreadID();
// now check if thread is closed or locked, if it is, then cannot reply to a post
ThreadBean threadBean = null;
try {
threadBean = DAOFactory.getThreadDAO().getThread(threadID);
} catch ( ObjectNotFoundException ex ) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.threadid_not_exists", new Object[] {new Integer(threadID)});
throw new ObjectNotFoundException(localizedMessage);
}
threadBean.ensureStatusCanReply();
Collection postBeans = DAOFactory.getPostDAO().getLastEnablePosts_inThread_limit(threadID, MVNForumConfig.ROWS_IN_LAST_REPLIES);
request.setAttribute("ParentPostBean", postBean);
request.setAttribute("PostBeans", postBeans);
}
boolean isPreviewing = ParamUtil.getParameterBoolean(request, "preview");
if (isPreviewing) {
MyUtil.saveVNTyperMode(request, response);
// Check if user enter some text or not
ParamUtil.getParameter(request, "PostTopic", true);
ParamUtil.getParameter(request, "message", true);// use message instead of MessageBody
MemberBean memberBean = DAOFactory.getMemberDAO().getMember_forPublic(onlineUser.getMemberID());
request.setAttribute("MemberBean", memberBean);
}
}
void processAdd(HttpServletRequest request, HttpServletResponse response)
throws ObjectNotFoundException, AssertionException, DatabaseException, CreateException,
BadInputException, ForeignKeyNotFoundException, AuthenticationException, FloodException, InterceptorException {
Locale locale = I18nUtil.getLocaleInRequest(request);
if (MVNForumConfig.getEnableNewPost() == false) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.AssertionException.cannot_create_new_post.new_post_is_disabled");
throw new AssertionException(localizedMessage);
//throw new AssertionException("Cannot create new post because NEW_POST feature is disabled by administrator.");
}
String currentIP = request.getRemoteAddr();
try {
FloodControl.ensureNotReachMaximum(MVNForumGlobal.FLOOD_ID_NEW_POST, currentIP);
} catch (FloodException fe) {
//throw new FloodException("You have reached the maximum number of the post adding actions for this page. Please try this page later. This is to prevent forum from being flooded.");
Integer maxPosts = new Integer(FloodControl.getActionsPerHour(MVNForumGlobal.FLOOD_ID_NEW_POST));
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.FloodException.add_post_too_many_times", new Object[] {maxPosts});
throw new FloodException(localizedMessage);
}
OnlineUser onlineUser = onlineUserManager.getOnlineUser(request);
MVNForumPermission permission = onlineUser.getPermission();
MyUtil.saveVNTyperMode(request, response);
int memberID = onlineUser.getMemberID();
String memberName = onlineUser.getMemberName();
Timestamp now = DateUtil.getCurrentGMTTimestamp();
int parentPostID = ParamUtil.getParameterInt(request, "parent");
boolean attachMore = ParamUtil.getParameterBoolean(request, "AttachMore");
boolean addFavoriteThread = ParamUtil.getParameterBoolean(request, "AddFavoriteParentThread");
boolean addWatchThread = ParamUtil.getParameterBoolean(request, "AddWatchParentThread");
String postTopic = ParamUtil.getParameter(request, "PostTopic", true);
postTopic = DisableHtmlTagFilter.filter(postTopic);// always disable HTML
InterceptorService.getInstance().validateContent(postTopic);
String postBody = ParamUtil.getParameter(request, "message", true); // use message instead of MessageBody
postBody = DisableHtmlTagFilter.filter(postBody);// always disable HTML
InterceptorService.getInstance().validateContent(postBody);
String postIcon = ParamUtil.getParameter(request, "PostIcon");
postIcon = DisableHtmlTagFilter.filter(postIcon);// always disable HTML
int forumID = 0;
int threadID= 0;
boolean isPendingThread = false;
boolean isForumModerator = false;
if (parentPostID == 0) {// new thread
forumID = ParamUtil.getParameterInt(request, "forum");
ForumBean forumBean = null;
try {
forumBean = ForumCache.getInstance().getBean(forumID);
} catch (ObjectNotFoundException e) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.forumid_not_exists", new Object[] {new Integer(forumID)});
throw new ObjectNotFoundException(localizedMessage);
}
forumBean.ensureNotDisabledForum();
forumBean.ensureNotClosedForum();
forumBean.ensureNotLockedForum();
// check permission
isForumModerator = permission.canModerateThread(forumID);
permission.ensureCanAddThread(forumID);
String lastPostMemberName = memberName;
int threadType = ParamUtil.getParameterUnsignedInt(request, "ThreadType", ThreadBean.THREAD_TYPE_DEFAULT);
if ( threadType > ThreadBean.THREAD_TYPE_GLOBAL_ANNOUNCEMENT /* 3 */) {
//threadType = 0;
throw new BadInputException("Not support this thread type");
}
if (threadType == ThreadBean.THREAD_TYPE_GLOBAL_ANNOUNCEMENT) {
permission.ensureCanAdminSystem();
//forumID = -1; // this thread not belongs to any forum
} else if (threadType != ThreadBean.THREAD_TYPE_DEFAULT ) {
permission.ensureCanModerateThread(forumID);
}
int threadOption = 0; //@todo review and support it later
int threadStatus = ThreadBean.THREAD_STATUS_DEFAULT;
// Ensure that moderator dont have to moderate the thread to enable it
if (forumBean.shouldModerateThread() && !isForumModerator) {
threadStatus = ThreadBean.THREAD_STATUS_DISABLED;
isPendingThread = true;
}
int threadHasPoll = 0;//@todo review and support it later
int threadDuration = 0;//@todo review and support it later
int threadAttachCount = 0;
threadID = DAOFactory.getThreadDAO().createThread(forumID, memberName, lastPostMemberName,
postTopic, postBody, 0/*threadVoteCount*/,
0/*threadVoteTotalStars*/, now/*threadCreationDate*/, now/*threadLastPostDate*/,
threadType, threadOption, threadStatus,
threadHasPoll, 0/*threadViewCount*/, 0/*threadReplyCount*/,
postIcon, threadDuration, threadAttachCount);
} else {// reply to a post
PostBean parentPostBean = null;
try {
parentPostBean = DAOFactory.getPostDAO().getPost(parentPostID);// can throw DatabaseException
} catch (ObjectNotFoundException ex) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.postid_not_exists", new Object[] {new Integer(parentPostID)});
throw new ObjectNotFoundException(localizedMessage);
}
forumID = parentPostBean.getForumID();
threadID = parentPostBean.getThreadID();
ForumBean forumBean = null;
try {
forumBean = ForumCache.getInstance().getBean(forumID);
} catch (ObjectNotFoundException e) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.forumid_not_exists", new Object[] {new Integer(forumID)});
throw new ObjectNotFoundException(localizedMessage);
}
forumBean.ensureNotDisabledForum();
forumBean.ensureNotClosedForum();
forumBean.ensureNotLockedForum();
// check permission
isForumModerator = permission.canModerateThread(forumID);
permission.ensureCanAddPost(forumID);
// now check if thread is closed or locked, if it is, then cannot reply to a post
ThreadBean threadBean = null;
try {
threadBean = DAOFactory.getThreadDAO().getThread(threadID);
} catch (ObjectNotFoundException ex ) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.threadid_not_exists", new Object[] {new Integer(threadID)});
throw new ObjectNotFoundException(localizedMessage);
}
threadBean.ensureStatusCanReply();
}
//Timestamp postLastEditDate = now;
String postCreationIP = currentIP;
String postLastEditIP = "";// should we init it to postCreationIP ???
int postFormatOption = 0;
int postOption = 0;
int postStatus = PostBean.POST_STATUS_DEFAULT;
try {
// Ensure that moderator dont have to moderate the thread to enable it
if (ForumCache.getInstance().getBean(forumID).shouldModeratePost() && !isForumModerator) {
// we will not disble post that is a thread (parentPostID == 0)
if (parentPostID != 0) {// replied post
postStatus = PostBean.POST_STATUS_DISABLED;
}
}
} catch (ObjectNotFoundException e) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.forumid_not_exists", new Object[] {new Integer(forumID)});
throw new ObjectNotFoundException(localizedMessage);
}
int postAttachCount = 0;
int postID = DAOFactory.getPostDAO().createPost(parentPostID, forumID, threadID,
memberID, memberName, ""/*lastEditMemberName*/,
postTopic, postBody, now/*postCreationDate*/,
now/*postLastEditDate*/, postCreationIP, postLastEditIP,
0/*postEditCount*/, postFormatOption, postOption,
postStatus, postIcon, postAttachCount);
StatisticsUtil.updateMemberStatistics(memberID);
StatisticsUtil.updateForumStatistics(forumID);
StatisticsUtil.updateThreadStatistics(threadID);
/** @todo Update PostEditLog table here */
//add favorite thread if user checked it
if (addFavoriteThread) {
permission.ensureIsAuthenticated();
//@todo: add checking of MVNForumConfig.getEnableFavoriteThread()
// check to make sure that this user doesnt exceed his favorite max
int currentFavoriteCount = DAOFactory.getFavoriteThreadDAO().getNumberOfFavoriteThreads_inMember(memberID);
int maxFavorites = MVNForumConfig.getMaxFavoriteThread();
if (currentFavoriteCount < maxFavorites) {
Timestamp favoriteCreationDate = now;
int favoriteType = 0; //@todo implement it later
int favoriteOption = 0; //@todo implement it later
int favoriteStatus = 0; //@todo implement it later
// now check permission the this user have the readPost permission
permission.ensureCanReadPost(forumID);
// has the permission now, then insert to database
try {
DAOFactory.getFavoriteThreadDAO().create(memberID, threadID, forumID,
favoriteCreationDate, favoriteType, favoriteOption,
favoriteStatus);
} catch (DuplicateKeyException ex) {
// already add favorite thread, just ignore
}
}
}
//add watch if user checked it
if (addWatchThread) {
permission.ensureIsAuthenticated();
permission.ensureIsActivated();
if (MVNForumConfig.getEnableWatch() == false) {
// should never happen, because if it happen, then the whole process is broken
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.AssertionException.cannot_add_watch.watch_is_disabled");
throw new AssertionException(localizedMessage);
//throw new AssertionException("Cannot add Watch because Watch feature is disabled by administrator.");
}
int watchType = 0;//ParamUtil.getParameterInt(request, "WatchType");
int watchOption = 0;//ParamUtil.getParameterInt(request, "WatchOption");
int watchStatus = 0;//ParamUtil.getParameterInt(request, "WatchStatus");
Timestamp watchCreationDate = now;
Timestamp watchLastSentDate = now;
Timestamp watchEndDate = now;// @todo: check it !!!
try {
DAOFactory.getWatchDAO().create(memberID, 0/*watchCategoryID*/, 0/*watchForumID*/,
threadID, watchType, watchOption,
watchStatus, watchCreationDate, watchLastSentDate,
watchEndDate);
} catch (DuplicateKeyException ex) {
// User try to create a duplicate watch, just ignore
}
}
// now, update the Search Index
//@todo check the performance here
PostBean justAddedPostBean = null;
try {
justAddedPostBean = DAOFactory.getPostDAO().getPost(postID);
} catch(ObjectNotFoundException ex) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.postid_not_exists", new Object[] {new Integer(postID)});
throw new ObjectNotFoundException(localizedMessage);
}
PostIndexer.scheduleAddPostTask(justAddedPostBean);
request.setAttribute("PostBean", justAddedPostBean);
request.setAttribute("ForumID", String.valueOf(forumID));
request.setAttribute("ThreadID", String.valueOf(threadID));
request.setAttribute("PostID", String.valueOf(postID));
request.setAttribute("AttachMore", new Boolean(attachMore));
request.setAttribute("AddFavoriteParentThread", new Boolean(addFavoriteThread));
request.setAttribute("AddWatchParentThread", new Boolean(addWatchThread));
request.setAttribute("IsPendingThread", new Boolean(isPendingThread));
/**@todo: review, this variable is still reserved*/
//request.setAttribute("ParentPostID", String.valueOf(parentPostID));
FloodControl.increaseCount(MVNForumGlobal.FLOOD_ID_NEW_POST, currentIP);
}
void preparePrintPost(HttpServletRequest request)
throws ObjectNotFoundException, DatabaseException, BadInputException,
AuthenticationException, AssertionException {
OnlineUser onlineUser = onlineUserManager.getOnlineUser(request);
MVNForumPermission permission = onlineUser.getPermission();
int postID = ParamUtil.getParameterInt(request, "post");
Locale locale = I18nUtil.getLocaleInRequest(request);
PostBean postBean = null;
try {
postBean = DAOFactory.getPostDAO().getPost(postID);
} catch(ObjectNotFoundException ex) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.postid_not_exists", new Object[] {new Integer(postID)});
throw new ObjectNotFoundException(localizedMessage);
}
int threadID = postBean.getThreadID();
int forumID = postBean.getForumID();
try {
ForumCache.getInstance().getBean(forumID).ensureNotDisabledForum();
} catch (ObjectNotFoundException e) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.forumid_not_exists", new Object[] {new Integer(forumID)});
throw new ObjectNotFoundException(localizedMessage);
}
permission.ensureCanReadPost(forumID);
// to show the thread topic
ThreadBean threadBean = null;
try {
threadBean = DAOFactory.getThreadDAO().getThread(threadID);
} catch ( ObjectNotFoundException ex ) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.threadid_not_exists", new Object[] {new Integer(threadID)});
throw new ObjectNotFoundException(localizedMessage);
}
MemberBean memberBean = null;
if (postBean.getMemberID() > 0) {
memberBean = DAOFactory.getMemberDAO().getMember_forPublic(postBean.getMemberID());
}
postBean.setMemberBean(memberBean);
int postAttachCount = postBean.getPostAttachCount();
if ( (postAttachCount > 0) && MVNForumConfig.getEnableAttachment()) {
Collection attachBeans = DAOFactory.getAttachmentDAO().getAttachments_inPost(postID);
int actualAttachCount = attachBeans.size();
// now check if the attachCount in talbe Post equals to the actual attachCount in table Attachment
if (postAttachCount != actualAttachCount) {
if (actualAttachCount != DAOFactory.getAttachmentDAO().getNumberOfAttachments_inPost(postID)) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.AssertionException.serious_error.cannot_process_attachment_count");
throw new AssertionException(localizedMessage);
//throw new AssertionException("AssertionException: Serious error: cannot process Attachment Count in table Attachment");
}
log.warn("The attachment count in table Post and Attachment are not synchronized. In table Post = " + postAttachCount + " and in table Attachment = " + actualAttachCount + ". Synchronize to " + actualAttachCount);
DAOFactory.getPostDAO().updateAttachCount(postID, actualAttachCount);
}
if (actualAttachCount > 0) {
postBean.setAttachmentBeans(attachBeans);
}
}
request.setAttribute("PostBean", postBean);
request.setAttribute("ThreadBean", threadBean);
}
/**
* then, it will be forward to addpost.jsp
* NOTE: This method MUST NOT use parameter MessageParent (need some process to figure out)
*/
void prepareEdit(HttpServletRequest request)
throws ObjectNotFoundException, DatabaseException, BadInputException, AuthenticationException, AssertionException {
OnlineUser onlineUser = onlineUserManager.getOnlineUser(request);
MVNForumPermission permission = onlineUser.getPermission();
// a guest CANNOT edit a post, because it need Authenticated Permission
permission.ensureIsAuthenticated();
Locale locale = I18nUtil.getLocaleInRequest(request);
int postID = ParamUtil.getParameterInt(request, "post");
PostBean postBean = null;
try {
postBean = DAOFactory.getPostDAO().getPost(postID);
} catch(ObjectNotFoundException ex) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.postid_not_exists", new Object[] {new Integer(postID)});
throw new ObjectNotFoundException(localizedMessage);
}
int forumID = postBean.getForumID();
ForumBean forumBean = null;
try {
forumBean = ForumCache.getInstance().getBean(forumID);
} catch (ObjectNotFoundException e) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.forumid_not_exists", new Object[] {new Integer(forumID)});
throw new ObjectNotFoundException(localizedMessage);
}
forumBean.ensureNotDisabledForum();
forumBean.ensureNotLockedForum();
// now check if thread is closed or locked, if it is, then cannot reply to a post
int threadID = postBean.getThreadID();
ThreadBean threadBean = null;
try {
threadBean = DAOFactory.getThreadDAO().getThread(threadID);
} catch ( ObjectNotFoundException ex ) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.threadid_not_exists", new Object[] {new Integer(threadID)});
throw new ObjectNotFoundException(localizedMessage);
}
threadBean.ensureStatusCanEdit();
int logonMemberID = onlineUser.getMemberID();
int authorID = postBean.getMemberID();
// check constraint
if (permission.canEditPost(forumID)) {
// have permission, just do nothing, that is dont check the max day contraint
} else if (logonMemberID == authorID) {// same author
// check date here, usually must not older than 7 days
Timestamp now = DateUtil.getCurrentGMTTimestamp();
Timestamp postDate = postBean.getPostCreationDate();
int maxDays = MVNForumConfig.getMaxEditDays();
if ( (now.getTime() - postDate.getTime()) > (DateUtil.DAY * maxDays) ) {
/** @todo choose a better Exception here */
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.BadInputException.cannot_edit.post_is_too_old", new Object[] {new Integer(maxDays)});
throw new BadInputException(localizedMessage);
//throw new BadInputException("You cannot edit a post which is older than " + maxDays + " days.");
}
/** @todo check status of this post */
/*
if (postBean.getPostStatus() == ?) {
throw new BadInputException("Cannot edit message which is disable.");
}*/
} else {//not an author, so this user must have Edit Permission
permission.ensureCanEditPost(forumID);// this method ALWAYS throws AuthenticationException
}
request.setAttribute("PostToEdit", postBean);
request.setAttribute("action", "update");
boolean isPreviewing = ParamUtil.getParameterBoolean(request, "preview");
if (isPreviewing) {
// Check if user enter some text or not
ParamUtil.getParameter(request, "PostTopic", true);
ParamUtil.getParameter(request, "message", true);// use message instead of MessageBody
MemberBean memberBean = DAOFactory.getMemberDAO().getMember_forPublic(onlineUser.getMemberID());
request.setAttribute("MemberBean", memberBean);
}
}
/**
* @todo: log the modification
* @todo: check the comment below, it's obsolete now :(
* @todo: check coi messageTopic co the la optional khi reply
* NOTE: This method MUST NOT get parameter MessageParent (need some process to figure out)
* so it needs to call setAttribute with messageParent for page updatepostsuccess.jsp
*/
void processUpdate(HttpServletRequest request)
throws ObjectNotFoundException, BadInputException, DatabaseException, CreateException,
ForeignKeyNotFoundException, AuthenticationException, AssertionException, InterceptorException {
OnlineUser onlineUser = onlineUserManager.getOnlineUser(request);
MVNForumPermission permission = onlineUser.getPermission();
// a guest CANNOT edit a post, because it need Authenticated Permission
permission.ensureIsAuthenticated();
Locale locale = I18nUtil.getLocaleInRequest(request);
Timestamp now = DateUtil.getCurrentGMTTimestamp();
int postID = ParamUtil.getParameterInt(request, "post");// dont change
// check constraint
PostBean postBean = null;
try {
postBean = DAOFactory.getPostDAO().getPost(postID);
} catch(ObjectNotFoundException ex) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.postid_not_exists", new Object[] {new Integer(postID)});
throw new ObjectNotFoundException(localizedMessage);
}
int forumID = postBean.getForumID();
int threadID = postBean.getThreadID();
ForumBean forumBean = ForumCache.getInstance().getBean(forumID);
forumBean.ensureNotDisabledForum();
forumBean.ensureNotLockedForum();
// now check if thread is locked, if it is, then cannot reply to a post
// Please note that if the threadStatus is closed, post can still be edited
ThreadBean threadBean = null;
try {
threadBean = DAOFactory.getThreadDAO().getThread(threadID);
} catch ( ObjectNotFoundException ex ) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.threadid_not_exists", new Object[] {new Integer(threadID)});
throw new ObjectNotFoundException(localizedMessage);
}
threadBean.ensureStatusCanEdit();
String postTopic = ParamUtil.getParameter(request, "PostTopic", true);
postTopic = DisableHtmlTagFilter.filter(postTopic);// always disable HTML
InterceptorService.getInstance().validateContent(postTopic);
String postBody = ParamUtil.getParameter(request, "message", true);// use message instead of PostBody
postBody = DisableHtmlTagFilter.filter(postBody);// always disable HTML
InterceptorService.getInstance().validateContent(postBody);
int logonMemberID = onlineUser.getMemberID();
String logonMemberName = onlineUser.getMemberName();
int authorID = postBean.getMemberID();
// check constraint
if (permission.canEditPost(forumID)) {
// have permission, just do nothing, that is dont check the max day contraint
} else if (logonMemberID == authorID) {// same author
// check date here, usually must not older than 7 days
Timestamp postDate = postBean.getPostCreationDate();
int maxDays = MVNForumConfig.getMaxEditDays();
if ( (now.getTime() - postDate.getTime()) > (DateUtil.DAY * maxDays) ) {
/** @todo choose a better Exception here */
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.BadInputException.cannot_edit.post_is_too_old", new Object[] {new Integer(maxDays)});
throw new BadInputException(localizedMessage);
//throw new BadInputException("You cannot edit a post which is older than " + maxDays + " days.");
}
/** @todo check status of this post */
/*
if (postBean.getPostStatus() == ?) {
throw new BadInputException("Cannot edit a post which is disable.");
}*/
} else {//not an author, so this user must have Edit Permission
permission.ensureCanEditPost(forumID);// this method ALWAYS throws AuthenticationException
}
String postLastEditIP = request.getRemoteAddr();
int postFormatOption = 0;//@todo review and support it later
int postOption = 0;//@todo review and support it later
int postStatus = postBean.getPostStatus();// use old post status
String postIcon = ParamUtil.getParameter(request, "PostIcon");
postIcon = DisableHtmlTagFilter.filter(postIcon);// always disable HTML
/*
* Note that although the 2 methods below can be combined,
* I dont do that for clearness
*/
/** @todo log the modification here */
DAOFactory.getPostDAO().update(postID, // primary key
logonMemberName, postTopic, postBody,
now/*postLastEditDate*/, postLastEditIP, postFormatOption,
postOption, postStatus, postIcon);
DAOFactory.getPostDAO().increaseEditCount(postID);
if (postBean.getParentPostID() == 0) {//edit a top post ( thread )
String threadIcon = postIcon;
DAOFactory.getThreadDAO().updateTopic_Body_Icon(threadID, postTopic, postBody, threadIcon);
}
boolean attachMore = ParamUtil.getParameterBoolean(request, "AttachMore");
boolean addFavoriteThread = ParamUtil.getParameterBoolean(request, "AddFavoriteParentThread");
boolean addWatchThread = ParamUtil.getParameterBoolean(request, "AddWatchParentThread");
//add favorite thread if user checked it
if (addFavoriteThread) {
permission.ensureIsAuthenticated();
//@todo: add checking of MVNForumConfig.getEnableFavoriteThread()
// check to make sure that this user doesnt exceed his favorite max
int currentFavoriteCount = DAOFactory.getFavoriteThreadDAO().getNumberOfFavoriteThreads_inMember(logonMemberID);
int maxFavorites = MVNForumConfig.getMaxFavoriteThread();
if (currentFavoriteCount < maxFavorites) {
Timestamp favoriteCreationDate = now;
int favoriteType = 0; //@todo implement it later
int favoriteOption = 0; //@todo implement it later
int favoriteStatus = 0; //@todo implement it later
// now check permission the this user have the readPost permission
permission.ensureCanReadPost(forumID);
// has the permission now, then insert to database
try {
DAOFactory.getFavoriteThreadDAO().create(logonMemberID, threadID, forumID,
favoriteCreationDate, favoriteType, favoriteOption, favoriteStatus);
} catch (DuplicateKeyException ex) {
// already add favorite thread, just ignore
}
}
}
//add watch if user checked it
if (addWatchThread) {
permission.ensureIsAuthenticated();
permission.ensureIsActivated();
if (MVNForumConfig.getEnableWatch() == false) {
// should never happen, because if it happen, then the whole process is broken
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.AssertionException.cannot_add_watch.watch_is_disabled");
throw new AssertionException(localizedMessage);
//throw new AssertionException("Cannot add Watch because Watch feature is disabled by administrator.");
}
int watchType = 0;//ParamUtil.getParameterInt(request, "WatchType");
int watchOption = 0;//ParamUtil.getParameterInt(request, "WatchOption");
int watchStatus = 0;//ParamUtil.getParameterInt(request, "WatchStatus");
Timestamp watchCreationDate = now;
Timestamp watchLastSentDate = now;
Timestamp watchEndDate = now;// @todo: check it !!!
try {
DAOFactory.getWatchDAO().create(logonMemberID, 0/*watchCategoryID*/, 0/*watchForumID*/,
threadID, watchType, watchOption,
watchStatus, watchCreationDate, watchLastSentDate,
watchEndDate);
} catch (DuplicateKeyException ex) {
// User try to create a duplicate watch, just ignore
}
}
request.setAttribute("ForumID", String.valueOf(forumID));
request.setAttribute("ThreadID", String.valueOf(threadID));
request.setAttribute("AttachMore", new Boolean(attachMore));
request.setAttribute("PostBean", postBean);
// now update the search index
//@todo : modify for better performance here
PostIndexer.scheduleUpdatePostTask(DAOFactory.getPostDAO().getPost(postID));
}
void prepareDelete(HttpServletRequest request)
throws ObjectNotFoundException, BadInputException, DatabaseException, AuthenticationException, AssertionException {
OnlineUser onlineUser = onlineUserManager.getOnlineUser(request);
MVNForumPermission permission = onlineUser.getPermission();
// user must have been authenticated before he can delete
permission.ensureIsAuthenticated();
Locale locale = I18nUtil.getLocaleInRequest(request);
// primary key column(s)
int postID = ParamUtil.getParameterInt(request, "post");
PostBean postBean = null;
try {
postBean = DAOFactory.getPostDAO().getPost(postID);
} catch(ObjectNotFoundException ex) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.postid_not_exists", new Object[] {new Integer(postID)});
throw new ObjectNotFoundException(localizedMessage);
}
int forumID = postBean.getForumID();
try {
ForumCache.getInstance().getBean(forumID).ensureNotDisabledForum();
} catch (ObjectNotFoundException e) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.forumid_not_exists", new Object[] {new Integer(forumID)});
throw new ObjectNotFoundException(localizedMessage);
}
if (postBean.getParentPostID() == 0) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.BadInputException.cannot_delete_root_post");
throw new BadInputException(localizedMessage);
//throw new BadInputException("Cannot delete a root post. Use delete thread instead.");
}
// check constraint
int logonMemberID = onlineUser.getMemberID();
int authorID = postBean.getMemberID();
if (permission.canDeletePost(forumID)) {
// have permission, just do nothing, that is dont check the max day contraint
} else if (logonMemberID == authorID) {// same author
// check date here, usually must not older than 7 days
Timestamp now = DateUtil.getCurrentGMTTimestamp();
Timestamp postDate = postBean.getPostCreationDate();
int maxDays = MVNForumConfig.getMaxDeleteDays();
if ( (now.getTime() - postDate.getTime()) > (DateUtil.DAY * maxDays) ) {
/** @todo choose a better Exception here */
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.BadInputException.cannot_delete.post_is_too_old");
throw new BadInputException(localizedMessage);
//throw new BadInputException("You cannot delete a post which is older than " + maxDays + " days.");
}
//Check to make sure that "no reply" for this post
int threadID = postBean.getThreadID();
Collection postBeans = DAOFactory.getPostDAO().getEnablePosts_inThread_limit(threadID, 0, 10000);
boolean foundReply = false;
for (Iterator ite = postBeans.iterator(); ite.hasNext(); ) {
PostBean tPostBean = (PostBean) ite.next();
if (tPostBean.getParentPostID() == postBean.getPostID()) {
foundReply = true;
break;
}
}
if (foundReply) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.BadInputException.cannot_delete_post.post_has_reply");
throw new BadInputException(localizedMessage);
//throw new BadInputException("Cannot delete a post that has reply!");
}
if (postBean.getPostStatus() == PostBean.POST_STATUS_DISABLED) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.BadInputException.cannot_delete_your_own_post.post_is_in_pending_status");
throw new BadInputException(localizedMessage);
//throw new BadInputException("Cannot delete your own post in pending status.");
}
} else {//not an author, so this user must have Edit Permission
permission.ensureCanDeletePost(forumID);// this method ALWAYS throws AuthenticationException
}
request.setAttribute("PostBean", postBean);
}
void processDelete(HttpServletRequest request)
throws BadInputException, DatabaseException, AuthenticationException, AssertionException, ObjectNotFoundException {
Locale locale = I18nUtil.getLocaleInRequest(request);
// primary key column(s)
int postID = ParamUtil.getParameterInt(request, "post");
PostBean postBean = null;
try {
postBean = DAOFactory.getPostDAO().getPost(postID);
} catch(ObjectNotFoundException ex) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.postid_not_exists", new Object[] {new Integer(postID)});
throw new ObjectNotFoundException(localizedMessage);
}
// now check the password
MyUtil.ensureCorrectCurrentPassword(request);
ForumCache.getInstance().getBean(postBean.getForumID()).ensureNotDisabledForum();
// delete the post and children attachments
deletePost(request, postBean);
int threadID = postBean.getThreadID();
int forumID = postBean.getForumID();
// now update the forum and thread statistics
StatisticsUtil.updateForumStatistics(forumID);
StatisticsUtil.updateThreadStatistics(threadID);
request.setAttribute("ForumID", String.valueOf(forumID));
request.setAttribute("ThreadID", String.valueOf(threadID));
}
// Note that this method does not update the forum statistics and thread statistics
private void deletePost(HttpServletRequest request, PostBean postBean)
throws AssertionException, DatabaseException, AuthenticationException,
BadInputException, ObjectNotFoundException {
OnlineUser onlineUser = onlineUserManager.getOnlineUser(request);
MVNForumPermission permission = onlineUser.getPermission();
// user must have been authenticated before he can delete
permission.ensureIsAuthenticated();
int parentPostID = postBean.getParentPostID();
Locale locale = I18nUtil.getLocaleInRequest(request);
if (parentPostID == 0) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.BadInputException.cannot_delete_root_post");
throw new BadInputException(localizedMessage);
//throw new BadInputException("Cannot delete a root post. Use delete thread instead.");
}
int forumID = postBean.getForumID();
// check constraint
int logonMemberID = onlineUser.getMemberID();
int authorID = postBean.getMemberID();
if (permission.canDeletePost(forumID)) {
// have permission, just do nothing, that is dont check the max day contraint
} else if (logonMemberID == authorID) {// same author
// check date here, usually must not older than 7 days
Timestamp now = DateUtil.getCurrentGMTTimestamp();
Timestamp postDate = postBean.getPostCreationDate();
int maxDays = MVNForumConfig.getMaxDeleteDays();
if ( (now.getTime() - postDate.getTime()) > (DateUtil.DAY * maxDays) ) {
/** @todo choose a better Exception here */
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.BadInputException.cannot_delete.post_is_too_old", new Object[] {new Integer(maxDays)});
throw new BadInputException(localizedMessage);
//throw new BadInputException("You cannot delete a post which is older than " + maxDays + " days.");
}
//Check to make sure that "no reply" for this post
int threadID = postBean.getThreadID();
Collection postBeans = DAOFactory.getPostDAO().getEnablePosts_inThread_limit(threadID, 0, 10000);
boolean foundReply = false;
for (Iterator ite = postBeans.iterator(); ite.hasNext(); ) {
PostBean tPostBean = (PostBean) ite.next();
if (tPostBean.getParentPostID() == postBean.getPostID()) {
foundReply = true;
break;
}
}
if (foundReply) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.BadInputException.cannot_delete_post.post_has_reply");
throw new BadInputException(localizedMessage);
//throw new BadInputException("Cannot delete a post that has reply!");
}
if (postBean.getPostStatus() == PostBean.POST_STATUS_DISABLED) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.BadInputException.cannot_delete_your_own_post.post_is_in_pending_status");
throw new BadInputException(localizedMessage);
//throw new BadInputException("Cannot delete your own disabled post.");
}
} else {//not an author, so this user must have Edit Permission
permission.ensureCanDeletePost(forumID);// this method ALWAYS throws AuthenticationException
}
int postID = postBean.getPostID();
// Delete all attachments in this post,
// we must call this before any attempt to delete the post
AttachmentWebHandler.deleteAttachments_inPost(postID);
// now delete the post, note that we delete it after delete all child objects (attachment)
DAOFactory.getPostDAO().delete(postID);
try {
DAOFactory.getPostDAO().updateParentPostID(postID, parentPostID);
} catch (ObjectNotFoundException ex) {
// we just ignore if no post is affect by this method
}
int memberID = postBean.getMemberID();
StatisticsUtil.updateMemberStatistics(memberID);
// now update the search index
PostIndexer.scheduleDeletePostTask(postID, DeletePostIndexTask.OBJECT_TYPE_POST);
}
void prepareModeratePendingPosts_limit(HttpServletRequest request)
throws AssertionException, DatabaseException, AuthenticationException, BadInputException,
DatabaseException, ObjectNotFoundException {
OnlineUser onlineUser = onlineUserManager.getOnlineUser(request);
MVNForumPermission permission = onlineUser.getPermission();
Locale locale = I18nUtil.getLocaleInRequest(request);
int threadID = ParamUtil.getParameterInt(request, "thread");
ThreadBean threadBean = null;
try {
threadBean = DAOFactory.getThreadDAO().getThread(threadID);
} catch ( ObjectNotFoundException ex ) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.threadid_not_exists", new Object[] {new Integer(threadID)});
throw new ObjectNotFoundException(localizedMessage);
}
int forumID = threadBean.getForumID();
try {
ForumCache.getInstance().getBean(forumID).ensureNotDisabledForum();
} catch (ObjectNotFoundException e) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.forumid_not_exists", new Object[] {new Integer(forumID)});
throw new ObjectNotFoundException(localizedMessage);
}
int numberOfPosts = DAOFactory.getPostDAO().getNumberOfDisablePosts_inThread(threadID);
// user must have been authenticated before he can view pending/disabled threads
permission.ensureIsAuthenticated();
// check normal permission
permission.ensureCanModerateThread(forumID);
int postsPerPage = 10000;
int offset = 0;
Collection postBeans = DAOFactory.getPostDAO().getDisablePosts_inThread_limit(threadID, offset, postsPerPage);
Iterator iterator = postBeans.iterator();
while (iterator.hasNext()) {
PostBean postBean = (PostBean) iterator.next();
// very slow here
/** @todo find a better solution */
MemberBean memberBean = null;
if (postBean.getMemberID() != 0 && postBean.getMemberID() != MVNForumConstant.MEMBER_ID_OF_GUEST) {
memberBean = DAOFactory.getMemberDAO().getMember_forPublic(postBean.getMemberID());
}
postBean.setMemberBean(memberBean);
int postAttachCount = postBean.getPostAttachCount();
if ((postAttachCount > 0) && MVNForumConfig.getEnableAttachment()) {
int postID = postBean.getPostID();
Collection attachBeans = DAOFactory.getAttachmentDAO().getAttachments_inPost(postID);
int actualAttachCount = attachBeans.size();
// now check if the attachCount in talbe Post equals to the actual attachCount in table Attachment
if (postAttachCount != actualAttachCount) {
if (actualAttachCount != DAOFactory.getAttachmentDAO().getNumberOfAttachments_inPost(postID)) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.AssertionException.serious_error.cannot_process_attachment_count");
throw new AssertionException(localizedMessage);
//throw new AssertionException("AssertionException: Serious error: cannot process Attachment Count in table Attachment");
}
log.warn("The attachment count in table Post and Attachment are not synchronized. In table Post = " +
postAttachCount + " and in table Attachment = " + actualAttachCount + ". Synchronize to " + actualAttachCount);
DAOFactory.getPostDAO().updateAttachCount(postID, actualAttachCount);
}
if (actualAttachCount > 0) {
postBean.setAttachmentBeans(attachBeans);
}
}
}
PostBean firstPostBean = DAOFactory.getPostDAO().getFirstPost_inThread(threadID);
if (firstPostBean.getMemberID() != 0 && firstPostBean.getMemberID() != MVNForumConstant.MEMBER_ID_OF_GUEST) {
MemberBean memberBean = DAOFactory.getMemberDAO().getMember_forPublic(firstPostBean.getMemberID());
firstPostBean.setMemberBean(memberBean);
}
request.setAttribute("ThreadBean", threadBean);
request.setAttribute("FirstPostBean", firstPostBean);
request.setAttribute("PostBeans", postBeans);
request.setAttribute("NumberOfPosts", new Integer(numberOfPosts));
}
void processModeratePendingPosts(HttpServletRequest request)
throws AssertionException, DatabaseException, AuthenticationException,
BadInputException, DatabaseException, ObjectNotFoundException {
OnlineUser onlineUser = onlineUserManager.getOnlineUser(request);
MVNForumPermission permission = onlineUser.getPermission();
Locale locale = I18nUtil.getLocaleInRequest(request);
// user must have been authenticated before he can moderate pending/disabled posts
permission.ensureIsAuthenticated();
// check normal permission, note that we dont check
// permission on a forumID because we allow moderate posts
// in multiple forums even if the web interface does not support it
int threadID = -1;
int forumID = -1;
try {
threadID = ParamUtil.getParameterInt(request, "thread");
ThreadBean threadBean = null;
try {
threadBean = DAOFactory.getThreadDAO().getThread(threadID);
} catch ( ObjectNotFoundException ex ) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.threadid_not_exists", new Object[] {new Integer(threadID)});
throw new ObjectNotFoundException(localizedMessage);
}
forumID = threadBean.getForumID();
permission.ensureCanModerateThread(forumID);
ForumCache.getInstance().getBean(forumID).ensureNotDisabledForum();
} catch (BadInputException ex) {
// just ignore, in case of use customized client
}
permission.ensureCanModerateThreadInAnyForum();
try {
String prefix = "modpostaction_";
for (Enumeration enumeration = request.getParameterNames(); enumeration.hasMoreElements(); ) {
String param = (String) enumeration.nextElement();
if (param.startsWith(prefix)) {
String modValue = ParamUtil.getParameter(request, param, true);
String strPostID = param.substring(prefix.length());
int postID = Integer.parseInt(strPostID);
if (modValue.equals("approve")) {
PostBean postBean = null;
try {
postBean = DAOFactory.getPostDAO().getPost(postID);
} catch(ObjectNotFoundException ex) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.postid_not_exists", new Object[] {new Integer(postID)});
throw new ObjectNotFoundException(localizedMessage);
}
int currentForumID = postBean.getForumID();
permission.ensureCanModerateThread(currentForumID);
DAOFactory.getPostDAO().updateStatus(postID, PostBean.POST_STATUS_DEFAULT);
} else if (modValue.equals("delete")) {
PostBean postBean = null;
try {
postBean = DAOFactory.getPostDAO().getPost(postID);
} catch(ObjectNotFoundException ex) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.postid_not_exists", new Object[] {new Integer(postID)});
throw new ObjectNotFoundException(localizedMessage);
}
deletePost(request, postBean);
} else {
// it means ignore, do nothing
}
}
}
} finally {
// now update the forum statistics
if (forumID != -1) {
StatisticsUtil.updateForumStatistics(forumID);
}
// now update the thread statistics
if (threadID != -1) {
StatisticsUtil.updateThreadStatistics(threadID);
}
}
request.setAttribute("ForumID", String.valueOf(forumID));
request.setAttribute("ThreadID", String.valueOf(threadID));
}
/**
* This method is for viewthread page and printthread page
*/
void prepareViewThread(HttpServletRequest request)
throws DatabaseException, ObjectNotFoundException, BadInputException, AuthenticationException, AssertionException {
OnlineUser onlineUser = onlineUserManager.getOnlineUser(request);
MVNForumPermission permission = onlineUser.getPermission();
Locale locale = I18nUtil.getLocaleInRequest(request);
int threadID = ParamUtil.getParameterInt(request, "thread");
boolean printAll = ParamUtil.getParameterBoolean(request, "printall");
ThreadBean threadBean = null;
try {
threadBean = DAOFactory.getThreadDAO().getThread(threadID);
} catch ( ObjectNotFoundException ex ) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.threadid_not_exists", new Object[] {new Integer(threadID)});
throw new ObjectNotFoundException(localizedMessage);
}
int forumID = threadBean.getForumID();
int numberOfPosts = DAOFactory.getPostDAO().getNumberOfEnablePosts_inThread(threadID);
// check normal permission
permission.ensureCanReadPost(forumID);
//ForumBean forumBean = null;
try {
ForumCache.getInstance().getBean(forumID).ensureNotDisabledForum();
} catch (ObjectNotFoundException e) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.forumid_not_exists", new Object[] {new Integer(forumID)});
throw new ObjectNotFoundException(localizedMessage);
}
// Only moderator can view disable threads
if (threadBean.getThreadStatus() == ThreadBean.THREAD_STATUS_DISABLED) {
permission.ensureCanModerateThread(forumID);
}
int postsPerPage = onlineUser.getPostsPerPage();
int offset = 0;
boolean lastPage = ParamUtil.getParameterBoolean(request, "lastpage");
if (lastPage) {
// note that in the worst case, numberOfPosts could equals 0 (bad database)
int pageCount = numberOfPosts / postsPerPage;
int odd = numberOfPosts % postsPerPage;
if (odd > 0) {
pageCount++;
}
if (pageCount < 1) {
pageCount = 1;// at least, there is one page
}
offset = (pageCount-1) * postsPerPage;
} else {
try {
offset = ParamUtil.getParameterInt(request, "offset");
} catch (BadInputException e) {
// do nothing
}
}
if (printAll) {
postsPerPage = 10000; //We assume that big number
offset = 0;
}
Collection postBeans = DAOFactory.getPostDAO().getEnablePosts_inThread_limit(threadID, offset, postsPerPage);
Iterator iterator = postBeans.iterator();
while(iterator.hasNext()) {
PostBean postBean = (PostBean)iterator.next();
// very slow here
/** @todo find a better solution */
MemberBean memberBean = null;
if (postBean.getMemberID() != 0 && postBean.getMemberID() != MVNForumConstant.MEMBER_ID_OF_GUEST) {
memberBean = DAOFactory.getMemberDAO().getMember_forPublic(postBean.getMemberID());
}
postBean.setMemberBean(memberBean);
int postAttachCount = postBean.getPostAttachCount();
if ( (postAttachCount > 0) && MVNForumConfig.getEnableAttachment()) {
int postID = postBean.getPostID();
Collection attachBeans = DAOFactory.getAttachmentDAO().getAttachments_inPost(postID);
int actualAttachCount = attachBeans.size();
// now check if the attachCount in talbe Post equals to the actual attachCount in table Attachment
if (postAttachCount != actualAttachCount) {
if (actualAttachCount != DAOFactory.getAttachmentDAO().getNumberOfAttachments_inPost(postID)) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.AssertionException.serious_error.cannot_process_attachment_count");
throw new AssertionException(localizedMessage);
//throw new AssertionException("AssertionException: Serious error: cannot process Attachment Count in table Attachment");
}
log.warn("The attachment count in table Post and Attachment are not synchronized. In table Post = " + postAttachCount + " and in table Attachment = " + actualAttachCount + ". Synchronize to " + actualAttachCount);
DAOFactory.getPostDAO().updateAttachCount(postID, actualAttachCount);
}
if (actualAttachCount > 0) {
postBean.setAttachmentBeans(attachBeans);
}
}
}
int previousTopic = DAOFactory.getThreadDAO().getPreviousEnableThread(forumID, threadID);// can throw AssertionException
int nextTopic = DAOFactory.getThreadDAO().getNextEnableThread(forumID, threadID);// can throw AssertionException
int pendingPostCount = 0;
if (permission.canModerateThread(forumID)) {
pendingPostCount = DAOFactory.getPostDAO().getNumberOfDisablePosts_inThread(threadID);
}
DAOFactory.getThreadDAO().increaseViewCount(threadID);
request.setAttribute("ThreadBean", threadBean);
request.setAttribute("PostBeans", postBeans);
request.setAttribute("NumberOfPosts", new Integer(numberOfPosts));
request.setAttribute("PreviousTopic", new Integer(previousTopic));
request.setAttribute("NextTopic", new Integer(nextTopic));
request.setAttribute("PendingPostCount", new Integer(pendingPostCount));
}
void prepareSearch(HttpServletRequest request)
throws AssertionException {
if (!MVNForumConfig.getEnableSearch()) {
Locale locale = I18nUtil.getLocaleInRequest(request);
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.AssertionException.search_disabled");
throw new AssertionException(localizedMessage);
}
}
void processSearch(HttpServletRequest request, HttpServletResponse response)
throws BadInputException, IOException, DatabaseException,
ObjectNotFoundException, AuthenticationException, AssertionException {
OnlineUser onlineUser = onlineUserManager.getOnlineUser(request);
MVNForumPermission permission = onlineUser.getPermission();
Locale locale = I18nUtil.getLocaleInRequest(request);
if (!MVNForumConfig.getEnableSearch()) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.AssertionException.search_disabled");
throw new AssertionException(localizedMessage);
}
MyUtil.saveVNTyperMode(request, response);
String memberName = ParamUtil.getParameter(request, "member");
StringUtil.checkGoodName(memberName);
int minAttachmentCount = ParamUtil.getParameterInt(request, "minattach", 0);
// if user does not enter MemberName or attachment, then user must enter "key"
boolean requireKey = ((memberName.length() == 0) && (minAttachmentCount == 0));
String key = ParamUtil.getParameter(request, "key", requireKey);
int forumID = ParamUtil.getParameterInt(request, "forum", 0);//negative means category
int offset = ParamUtil.getParameterUnsignedInt(request, "offset", 0);
int rows = ParamUtil.getParameterUnsignedInt(request, "rows", 20);
if (rows == 0) {
rows = 20;// fix NullPointerException when rows = 0
}
// offset should be even when divide with rowsToReturn
offset = (offset / rows) * rows;
PostSearchQuery query = new PostSearchQuery();
if (key.length() > 0) {
query.setSearchString(key);
int scopeInPost = ParamUtil.getParameterInt(request, "scopeinpost", PostSearchQuery.SEARCH_ONLY_BODY|PostSearchQuery.SEARCH_ONLY_TITLE);
query.setScopeInPost(scopeInPost);
}
if (memberName.length() > 0) {
try {
int memberID = DAOFactory.getMemberDAO().getMemberIDFromMemberName(memberName);
query.setMemberId(memberID);
} catch(ObjectNotFoundException ex) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.membername_not_exists", new Object[] {memberName});
throw new ObjectNotFoundException(localizedMessage);
}
}
if (minAttachmentCount > 0) {
query.setMinAttachmentCount(minAttachmentCount);
}
int searchDate = ParamUtil.getParameterUnsignedInt(request, "date", PostSearchQuery.SEARCH_ANY_DATE);
int searchBeforeAfter = ParamUtil.getParameterInt(request, "beforeafter", PostSearchQuery.SEARCH_NEWER);
if ((searchDate != PostSearchQuery.SEARCH_ANY_DATE) && (searchDate < 365 * 10)) { // 10 years
long deltaTime = DateUtil.DAY * searchDate;
Timestamp now = DateUtil.getCurrentGMTTimestamp();
Timestamp from = null;
Timestamp to = null;
long currentTime = now.getTime();
if (searchBeforeAfter == PostSearchQuery.SEARCH_NEWER) {
from = new Timestamp(currentTime - deltaTime);
} else {// older
to = new Timestamp(currentTime - deltaTime);
}
query.setFromDate(from);
query.setToDate(to);
}
if (forumID > 0) {
query.setForumId(forumID);
} else if (forumID < 0) {
// choose to search in a category
query.setForumId(forumID);
} else {
// forumID equals to 0, it mean global searching
// just do nothing, lucene will search all forums (globally)
}
query.searchDocuments(offset, rows, permission);
int hitCount = query.getHitCount();
Collection result = query.getPostResult();
// Remove postd that current user dont have permission
// NOTE: these below code does not remove the enable posts in
// a disabled thread. This is not usually the case because
// normally we will delete the thread instead of change it
// from Enable to Disabled
for (Iterator iter = result.iterator(); iter.hasNext(); ) {
PostBean postBean = (PostBean)iter.next();
int currentForumID = postBean.getForumID();
if (ForumCache.getInstance().getBean(currentForumID).getForumStatus() == ForumBean.FORUM_STATUS_DISABLED) {
iter.remove();
} else if ( (permission.canReadPost(currentForumID) == false) ||
(postBean.getPostStatus() == PostBean.POST_STATUS_DISABLED)) {
iter.remove();
}
else if (postBean.getParentPostID() == 0) {// first post
// Please note that the first post is always Enable even if
// the thread is Disable. In this case always show result
// if the current user is moderator
if (permission.canModerateThread(currentForumID) == false) {
int threadID = postBean.getThreadID();
ThreadBean threadBean = null;
try {
threadBean = DAOFactory.getThreadDAO().getThread(threadID);
} catch ( ObjectNotFoundException ex ) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.ObjectNotFoundException.threadid_not_exists", new Object[] {new Integer(threadID)});
throw new ObjectNotFoundException(localizedMessage);
}
if (threadBean.getThreadStatus() == ThreadBean.THREAD_STATUS_DISABLED) {
iter.remove();
}
}
}
}
if (offset > hitCount) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.BadInputException.offset_greater_than_total_rows");
throw new BadInputException(localizedMessage);
//throw new BadInputException("Cannot search with offset > total posts");
}
// request.setAttribute("key", Encoder.encodeURL(key));
// request.setAttribute("member", memberName);
// request.setAttribute("forum", new Integer(forumID));
// request.setAttribute("offset", new Integer(offset));
// request.setAttribute("attachment", new Boolean(withAttachment));
request.setAttribute("rows", new Integer(rows));
request.setAttribute("TotalPosts", new Integer(hitCount));
request.setAttribute("PostBeans", result);
request.setAttribute("SearchQuery", query);
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.