/**
* ESUP-Portail Helpdesk - Copyright (c) 2004-2009 ESUP-Portail consortium.
*/
package org.esupportail.helpdesk.services.feed.imap;
import java.util.Properties;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.URLName;
import org.esupportail.commons.utils.Assert;
import org.esupportail.commons.utils.strings.StringUtils;
import org.esupportail.helpdesk.domain.beans.Category;
import org.esupportail.helpdesk.domain.beans.Department;
import org.esupportail.helpdesk.domain.beans.Ticket;
import org.esupportail.helpdesk.exceptions.CategoryNotFoundException;
import org.esupportail.helpdesk.exceptions.DepartmentNotFoundException;
import org.esupportail.helpdesk.services.feed.ErrorHolder;
import org.esupportail.helpdesk.services.feed.imap.spam.SpamFilter;
/**
* A class to generate tickets from an email account.
*/
public final class TicketAccountReaderImpl extends AbstractImapAccountReader {
/**
* The serialization id.
*/
private static final long serialVersionUID = 8768505047925270781L;
/**
* The message reader.
*/
private TicketMessageReader messageReader;
/**
* The id of the creation department.
*/
private Long creationDepartmentId;
/**
* The id of the target category.
*/
private Long categoryId;
/**
* The spam filter.
*/
private SpamFilter spamFilter;
/**
* True to delete spam, false to put the spam into the spam category.
*/
private boolean deleteSpam;
/**
* The id of the spam category.
*/
private Long spamCategoryId;
/**
* The email address.
*/
private String address;
/**
* Constructor.
*/
public TicketAccountReaderImpl() {
super();
}
/**
* @see org.esupportail.helpdesk.services.feed.imap.AbstractImapAccountReader#afterPropertiesSet()
*/
@Override
public void afterPropertiesSet() {
super.afterPropertiesSet();
if (isEnabled()) {
Assert.notNull(messageReader,
"property messageReader of class "
+ this.getClass().getName() + " can not be null");
Assert.notNull(categoryId,
"property categoryId of class "
+ this.getClass().getName() + " can not be null");
Assert.notNull(spamFilter,
"property spamFilter of class " + this.getClass().getName()
+ " can not be null (you should probaly set property "
+ "${feed.spamFilter} to nullSpamFilter instead of null)");
if (!spamFilter.filters() || deleteSpam) {
spamCategoryId = null;
} else {
Assert.notNull(spamCategoryId, "property spamCategoryId of class "
+ this.getClass().getName() + " can not be null");
}
Assert.notNull(address,
"property address of class " + this.getClass().getName() + " can not be null");
}
}
/**
* @see org.esupportail.helpdesk.services.feed.AccountReader#read(
* org.esupportail.helpdesk.services.feed.ErrorHolder)
*/
@Override
public boolean read(final ErrorHolder errorHolder) {
Ticket ticket = null;
Category category = null;
if (!errorHolder.hasErrors()) {
try {
category = getDomainService().getCategory(categoryId);
errorHolder.addInfo("Category: " + category.getLabel());
} catch (CategoryNotFoundException e) {
errorHolder.addError(e.getMessage());
}
}
Department creationDepartment = null;
if (!errorHolder.hasErrors()) {
try {
creationDepartment = category.getDepartment();
if (creationDepartmentId != null) {
creationDepartment = getDomainService().getDepartment(creationDepartmentId);
}
errorHolder.addInfo("Department: " + creationDepartment.getLabel());
} catch (DepartmentNotFoundException e) {
errorHolder.addError(e.getMessage());
}
}
Category spamCategory = null;
if (spamCategoryId != null && !errorHolder.hasErrors()) {
try {
spamCategory = getDomainService().getCategory(spamCategoryId);
errorHolder.addInfo("SpamCategory: " + spamCategory.getLabel());
} catch (CategoryNotFoundException e) {
errorHolder.addError(e.getMessage());
}
}
Store store = null;
if (!errorHolder.hasErrors()) {
try {
errorHolder.addInfo("Server: " + getServer());
errorHolder.addInfo("Folder: " + getFolder());
errorHolder.addInfo("Account: " + getAccount());
errorHolder.addInfo("Password: " + "xxxxxxxxx");
Integer timeoutVal = new Integer(getTimeout());
Properties props = System.getProperties();
props.put("mail.imap.class", "com.sun.mail.imap.IMAPStore");
props.put("mail.imap.connectiontimeout", timeoutVal);
props.put("mail.imap.timeout", timeoutVal);
Session session = Session.getInstance(props, null);
URLName urln = new URLName(
"imap://" + getAccount() + ":"
+ getPassword() + "@" + getServer());
store = session.getStore(urln);
} catch (NoSuchProviderException e) {
errorHolder.addError(
"invalid IMAP account [imap://" + getAccount()
+ ":xxxxxxxx@" + getServer() + "]: " + e.getMessage());
}
}
if (!errorHolder.hasErrors()) {
try {
errorHolder.addInfo("connecting to the server...");
store.connect();
} catch (MessagingException e) {
errorHolder.addError(
"could not connect to [imap://" + getAccount()
+ ":xxxxxxxx@" + getServer() + "]: " + e.getMessage());
}
}
Folder folder = null;
if (!errorHolder.hasErrors()) {
try {
errorHolder.addInfo("opening folder [" + getFolder() + "]...");
folder = store.getFolder(getFolder());
if (!folder.exists()) {
String msg = "folder does not exist. Available folders are: ";
Folder defaultFolder = store.getDefaultFolder();
String separator = "";
for (Folder folder2 : defaultFolder.list()) {
msg += separator + folder2.getFullName();
separator = ", ";
}
errorHolder.addError(msg + ".");
}
} catch (MessagingException e) {
errorHolder.addError("could not find the folder: " + e.getMessage());
}
}
if (!errorHolder.hasErrors()) {
try {
folder.open(Folder.READ_WRITE);
} catch (MessagingException e) {
errorHolder.addError("could not open the folder: " + e.getMessage());
}
}
if (!errorHolder.hasErrors()) {
try {
errorHolder.addInfo("expunging the folder...");
folder.expunge();
} catch (MessagingException e) {
errorHolder.addError("could not expunge the folder: " + e.getMessage());
}
}
int messageCount = 0;
if (!errorHolder.hasErrors()) {
try {
messageCount = folder.getMessageCount();
if (messageCount == 0) {
errorHolder.addInfo("no message found.");
} else {
errorHolder.addInfo(messageCount + " message(s) found.");
}
} catch (MessagingException e) {
errorHolder.addError("could not get the number of messages: " + e.getMessage());
}
}
if (!errorHolder.hasErrors()) {
for (int i = 1; i <= messageCount; i++) {
errorHolder.addInfo("getting message #" + i + "...");
Message message;
try {
message = folder.getMessage(i);
} catch (MessagingException e) {
errorHolder.addError(
"could not get message #" + i + ": " + e.getMessage());
break;
}
try {
if (message.isSet(Flags.Flag.DELETED)) {
errorHolder.addInfo("message is marked as deleted, skiping.");
continue;
}
} catch (MessagingException e) {
errorHolder.addError(
"could not get flag for message #" + i + ": " + e.getMessage());
break;
}
ErrorHolder readErrorHolder = new ErrorHolder();
ticket = messageReader.read(
message, address, creationDepartment,
category, spamFilter, deleteSpam, spamCategory,
readErrorHolder);
try {
message.setFlag(Flags.Flag.DELETED, true);
} catch (MessagingException e) {
errorHolder.addInfo("could not mark the message as deleted: " + e.getMessage());
}
errorHolder.add(readErrorHolder);
break;
}
}
if (folder != null && folder.isOpen()) {
try {
errorHolder.addInfo("closing folder...");
folder.close(true/* expunge on exit */);
} catch (MessagingException e) {
errorHolder.addError("could not close the folder: " + e.getMessage());
}
}
if (store != null && store.isConnected()) {
try {
errorHolder.addInfo("closing connection...");
store.close();
} catch (MessagingException e) {
errorHolder.addError("could not close the connection: " + e.getMessage());
}
}
if (errorHolder.hasErrors()) {
errorHolder.addInfo(
errorHolder.getErrorNumber() + " error(s) found for account [imap://"
+ getAccount() + ":xxxxxxxx@" + getServer() + "]");
} else {
errorHolder.addInfo(
"no error found for account [imap://"
+ getAccount() + ":xxxxxxxx@" + getServer() + "]");
}
if (ticket == null) {
return false;
}
getDomainService().ticketMonitoringSendAlerts(null, ticket, null, false);
return true;
}
/**
* @return the creationDepartmentId
*/
protected Long getCreationDepartmentId() {
return creationDepartmentId;
}
/**
* @param creationDepartmentId the creationDepartmentId to set
*/
public void setCreationDepartmentId(final Long creationDepartmentId) {
this.creationDepartmentId = creationDepartmentId;
}
/**
* @return the categoryId
*/
protected Long getCategoryId() {
return categoryId;
}
/**
* @param categoryId the categoryId to set
*/
public void setCategoryId(final Long categoryId) {
this.categoryId = categoryId;
}
/**
* @return the messageReader
*/
protected TicketMessageReader getMessageReader() {
return messageReader;
}
/**
* @param messageReader the messageReader to set
*/
public void setMessageReader(final TicketMessageReader messageReader) {
this.messageReader = messageReader;
}
/**
* @return the address
*/
protected String getAddress() {
return address;
}
/**
* @param address the address to set
*/
public void setAddress(final String address) {
this.address = StringUtils.nullIfEmpty(address);
}
/**
* @return the spamCategoryId
*/
protected Long getSpamCategoryId() {
return spamCategoryId;
}
/**
* @param spamCategoryId the spamCategoryId to set
*/
public void setSpamCategoryId(final Long spamCategoryId) {
this.spamCategoryId = spamCategoryId;
}
/**
* @return the deleteSpam
*/
protected boolean isDeleteSpam() {
return deleteSpam;
}
/**
* @param deleteSpam the deleteSpam to set
*/
public void setDeleteSpam(final boolean deleteSpam) {
this.deleteSpam = deleteSpam;
}
/**
* @return the spamFilter
*/
protected SpamFilter getSpamFilter() {
return spamFilter;
}
/**
* @param spamFilter the spamFilter to set
*/
public void setSpamFilter(final SpamFilter spamFilter) {
this.spamFilter = spamFilter;
}
}