/*
* Created on 21/08/2006 21:08:19
*/
package net.jforum.api.integration.mail.pop;
import java.util.Properties;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Flags.Flag;
import net.jforum.entities.MailIntegration;
import net.jforum.exceptions.MailException;
import net.jforum.util.preferences.ConfigKeys;
import net.jforum.util.preferences.SystemGlobals;
/**
* Handles the connection to the POP server.
*
* @author Rafael Steil
* @version $Id: POPConnector.java,v 1.4 2006/10/05 02:00:23 rafaelsteil Exp $
*/
public class POPConnector
{
private Store store;
private Folder folder;
private MailIntegration mailIntegration;
private Message[] messages;
/**
* @param mailIntegration the {@link MailIntegration} instance with
* all the information necessary to connect to the pop server
*/
public void setMailIntegration(MailIntegration mailIntegration)
{
this.mailIntegration = mailIntegration;
}
/**
* Lists all available messages in the pop server
* @return Array of {@link Message}'s
*/
public Message[] listMessages()
{
try {
this.messages = this.folder.getMessages();
return this.messages;
}
catch (Exception e) {
throw new MailException(e);
}
}
/**
* Opens a connection to the pop server.
* The method will try to retrieve the <i>INBOX</i> folder in
* <i>READ_WRITE</i> mode
*/
public void openConnection()
{
try {
Session session = Session.getDefaultInstance(new Properties());
this.store = session.getStore(this.mailIntegration.isSSL() ? "pop3s" : "pop3");
this.store.connect(this.mailIntegration.getPopHost(),
this.mailIntegration.getPopPort(),
this.mailIntegration.getPopUsername(),
this.mailIntegration.getPopPassword());
this.folder = this.store.getFolder("INBOX");
if (folder == null) {
throw new Exception("No Inbox");
}
this.folder.open(Folder.READ_WRITE);
}
catch (Exception e) {
throw new MailException(e);
}
}
/**
* Closes the connection to the pop server.
* Before finishing the communication channel, all messages
* are flaged for deletion.
*/
public void closeConnection()
{
boolean deleteMessages = !SystemGlobals.getBoolValue(ConfigKeys.MAIL_POP3_DEBUG_KEEP_MESSAGES);
this.closeConnection(deleteMessages);
}
/**
* Closes the connection to the pop server.
* @param deleteAll If true, all messages are flaged for deletion
*/
public void closeConnection(boolean deleteAll)
{
if (deleteAll) {
this.markAllMessagesAsDeleted();
}
if (this.folder != null) try { this.folder.close(false); } catch (Exception e) {}
if (this.store != null) try { this.store.close(); } catch (Exception e) {}
}
/**
* Flag all messages for deletion.
*/
private void markAllMessagesAsDeleted()
{
try {
if (this.messages != null) {
for (int i = 0; i < this.messages.length; i++) {
this.messages[i].setFlag(Flag.DELETED, true);
}
}
}
catch (Exception e) {
throw new MailException(e);
}
}
}