package org.nemesis.forum.webapp.admin.action;
import java.util.List;
import java.util.Vector;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.nemesis.forum.Forum;
import org.nemesis.forum.ForumFactory;
import org.nemesis.forum.ForumThread;
import org.nemesis.forum.Message;
import org.nemesis.forum.TreeWalker;
import org.nemesis.forum.User;
import org.nemesis.forum.exception.UnauthorizedException;
import org.nemesis.forum.webapp.admin.bean.ForumBean;
import org.nemesis.forum.webapp.admin.bean.MessageBean;
import org.nemesis.forum.webapp.admin.bean.ThreadBean;
import org.nemesis.forum.webapp.admin.bean.UserBean;
public class ListThreadContentAction extends BaseAction {
static protected Log log = LogFactory.getLog(ListThreadContentAction.class);
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
//check logon
checkUser(request);
ActionErrors errors = new ActionErrors();
try {
List v = new Vector();
ForumFactory forumFactory = ForumFactory.getInstance(getAuthToken(request));
Forum forum = forumFactory.getForum(Integer.parseInt(request.getParameter("id")));
//check permission
checkPermission(request, OperationConstants.LIST_FORUM_CONTENT, forum);
ForumBean fb = new ForumBean();
fb.setId(forum.getID());
fb.setName(forum.getName());
//fb.setApprovedMessages();
//fb.setApprovedThreads();
//fb.setThreads(forum.getThreadCount());
//fb.setMessages(forum.getMessageCount());
request.setAttribute("fb", fb);
ForumThread thread = forum.getThread(Integer.parseInt(request.getParameter("threadID")));
ThreadBean tb = new ThreadBean();
tb.setId(thread.getID());
tb.setForumID(forum.getID());
tb.setCreationDate(thread.getCreationDate());
tb.setModifiedDate(thread.getModifiedDate());
tb.setApproved(thread.isApproved());
tb.setNotApprovedMessages(thread.getMessageCount(false));
tb.setMessages(thread.getMessageCount());
tb.setReplies(thread.getMessageCount() - 1);
tb.setTopic(thread.getName());
TreeWalker walker = thread.treeWalker();
Message rootMessage = walker.getRoot();
populate(walker,tb,rootMessage,0);
request.setAttribute("tb", tb);
request.setAttribute("formatDatePattern", getResources(request).getMessage(getLocale(request),"dateformat"));
} catch (UnauthorizedException ue) {
errors.add("general", new ActionError("listForumContent.unauthorized"));
} catch (Exception e) {
String eid = this.getClass().getName() + "_" + System.currentTimeMillis();
log.error("eid:" + eid + "\nsessionID" + request.getSession().getId(), e);
errors.add("general", new ActionMessage("error.general", "error id:" + eid));
}
if (!errors.isEmpty()) {
saveErrors(request, errors);
return mapping.findForward("cancel");
}
return mapping.findForward("view");
}
/**
* Recursive method to populate.
*/
private void populate(TreeWalker walker, ThreadBean tb, Message message, int depth) {
MessageBean mb=new MessageBean();
mb.setDepth(depth);
mb.setAnonymous(message.isAnonymous());
mb.setApproved(message.isApproved());
mb.setContent(message.getBody());
mb.setCreationDate(message.getCreationDate());
mb.setMessageID(message.getID());
mb.setModifiedDate(message.getModifiedDate());
mb.setSubject(message.getSubject());
UserBean ub = new UserBean();
if(!message.isAnonymous()){
User messageUser = message.getUser();
ub.setId(messageUser.getID());
ub.setUserName(messageUser.getUsername());
ub.setName(messageUser.getName());
ub.setEmail(messageUser.getEmail());
}else{
//:NOTE: we suppose in front application : name & email message property for anonymous user
ub.setUserName(message.getProperty("name"));
ub.setEmail(message.getProperty("email"));
}
mb.setAuthor(ub);
//add message
tb.addMessagesTree(mb);
//children
for (int i = 0; i < walker.getChildCount(message); i++) {
populate(walker, tb, walker.getChild(message, i), (depth + 1));
}
}
}