/*
* Created on 26/08/2006 22:20:46
*/
package net.jforum.api.integration.mail.pop;
import java.util.HashMap;
import java.util.Iterator;
import org.apache.log4j.Logger;
import freemarker.template.SimpleHash;
import net.jforum.JForumExecutionContext;
import net.jforum.SessionFacade;
import net.jforum.context.JForumContext;
import net.jforum.context.RequestContext;
import net.jforum.context.standard.StandardRequestContext;
import net.jforum.context.standard.StandardSessionContext;
import net.jforum.dao.DataAccessDriver;
import net.jforum.dao.ForumDAO;
import net.jforum.entities.Topic;
import net.jforum.entities.User;
import net.jforum.entities.UserSession;
import net.jforum.util.preferences.ConfigKeys;
import net.jforum.view.forum.PostAction;
/**
* @author Rafael Steil
* @version $Id: POPPostAction.java,v 1.10 2007/07/31 13:52:47 rafaelsteil Exp $
*/
public class POPPostAction
{
private static Logger logger = Logger.getLogger(POPPostAction.class);
public void insertMessages(POPParser parser)
{
long ms = System.currentTimeMillis();
int counter = 0;
try {
JForumExecutionContext ex = JForumExecutionContext.get();
RequestContext request = new StandardRequestContext();
ex.setForumContext(new JForumContext("/", "", request, null));
JForumExecutionContext.set(ex);
SessionFacade.setAttribute(ConfigKeys.TOPICS_READ_TIME, new HashMap());
for (Iterator iter = parser.getMessages().iterator(); iter.hasNext(); ) {
POPMessage m = (POPMessage)iter.next();
String sessionId = ms + m.getSender() + counter++;
request.getSessionContext().setAttribute(StandardSessionContext.SESSION_ID, sessionId);
User user = this.findUser(m.getSender());
if (user == null) {
logger.warn("Could not find user with email " + m.getSender() + ". Ignoring his message.");
continue;
}
try {
UserSession us = new UserSession();
us.setUserId(user.getId());
us.setUsername(us.getUsername());
us.setSessionId(sessionId);
SessionFacade.add(us, sessionId);
SessionFacade.setAttribute(ConfigKeys.LOGGED, "1");
SessionFacade.removeAttribute(ConfigKeys.LAST_POST_TIME);
SessionFacade.setAttribute(ConfigKeys.REQUEST_IGNORE_CAPTCHA, "1");
this.insertMessage(m, user);
}
finally {
SessionFacade.remove(sessionId);
}
}
}
finally {
JForumExecutionContext.finish();
}
}
/**
* Calls {@link PostAction#insertSave()}
* @param m the mail message
* @param user the user who's sent the message
*/
private void insertMessage(POPMessage m, User user)
{
this.addDataToRequest(m, user);
PostAction postAction = new PostAction(JForumExecutionContext.getRequest(), new SimpleHash());
postAction.insertSave();
}
/**
* Extracts information from a mail message and adds it to the request context
* @param m the mail message
* @param user the user who's sending the message
*/
private void addDataToRequest(POPMessage m, User user)
{
RequestContext request = JForumExecutionContext.getRequest();
request.addParameter("forum_id", Integer.toString(this.discoverForumId(m.getListEmail())));
request.addParameter("topic_type", Integer.toString(Topic.TYPE_NORMAL));
request.addParameter("quick", "1");
request.addParameter("subject", m.getSubject());
request.addParameter("message", m.getMessage());
int topicId = this.discoverTopicId(m);
if (topicId > 0) {
request.addParameter("topic_id", Integer.toString(topicId));
}
if (!user.isBbCodeEnabled()) {
request.addParameter("disable_bbcode", "on");
}
if (!user.isSmiliesEnabled()) {
request.addParameter("disable_smilies", "on");
}
if (!user.isHtmlEnabled()) {
request.addParameter("disable_html", "on");
}
}
/**
* Tries to extract message relationship from the headers
* @param m the message to extract headers from
* @return the topic id, if found, or 0 (zero) othwerwise
*/
private int discoverTopicId(POPMessage m)
{
int topicId = 0;
String inReplyTo = m.getInReplyTo();
if (inReplyTo != null) {
topicId = MessageId.parse(inReplyTo).getTopicId();
}
return topicId;
}
/**
* Given an email address, finds the forum instance associated to it
* @param listEmail the forum's email address to search for
* @return the forum's id, or 0 (zero) if nothing was found
*/
private int discoverForumId(String listEmail)
{
ForumDAO dao = DataAccessDriver.getInstance().newForumDAO();
return dao.discoverForumId(listEmail);
}
/**
* Finds an user by his email address
* @param email the email address to use in the search
* @return the matching record, or null if nothing was found
*/
private User findUser(String email)
{
return DataAccessDriver.getInstance().newUserDAO().findByEmail(email);
}
}