package org.claros.mini.controllers;
import java.io.ByteArrayInputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.claros.commons.db.DbConfigList;
import org.claros.commons.exception.NoPermissionException;
import org.claros.commons.mail.models.EmailHeader;
import org.claros.commons.models.AuthProfile;
import org.claros.commons.utility.Formatter;
import org.claros.mini.models.EmailDbItem;
import org.claros.mini.models.FolderDbItem;
import org.claros.mini.models.FolderDbItemWrapper;
import org.claros.mini.utility.Constants;
import org.claros.mini.utility.Utility;
import com.jenkov.mrpersister.impl.mapping.AutoGeneratedColumnsMapper;
import com.jenkov.mrpersister.itf.IGenericDao;
import com.jenkov.mrpersister.itf.mapping.IObjectMappingKey;
import com.jenkov.mrpersister.util.JdbcUtil;
/**
* @author Umut Gokbayrak
*/
public class DbFolderControllerImpl implements FolderController {
private static Log log = LogFactory.getLog(DbFolderControllerImpl.class);
private AuthProfile auth;
/**
* @param auth
*/
public DbFolderControllerImpl(AuthProfile auth) {
this.auth = auth;
}
/**
* used to disable it.
*
*/
private DbFolderControllerImpl() {
super();
}
/**
* only meaningful for inbox, sent, junk, trash
* @param auth
* @return
*/
private FolderDbItem getSpecialFolderByType(Integer folderType) throws Exception {
IGenericDao dao = null;
FolderDbItem folder = null;
try {
dao = Utility.getDbConnection();
String username = auth.getUsername();
String sql = "select * from FOLDER_DB_ITEMS where user=? and type = ?";
folder = (FolderDbItem)dao.read(FolderDbItem.class, sql, new Object[] {username, folderType});
} finally {
JdbcUtil.close(dao);
dao = null;
}
return folder;
}
/**
* @param auth
* @return
*/
public FolderDbItem getJunkFolder() throws Exception {
return getSpecialFolderByType(Constants.FOLDER_TYPE_JUNK);
}
/**
* @param auth
* @return
*/
public FolderDbItem getInboxFolder() throws Exception {
return getSpecialFolderByType(Constants.FOLDER_TYPE_INBOX);
}
/**
* @param auth
* @return
*/
public FolderDbItem getSentItems() throws Exception {
return getSpecialFolderByType(Constants.FOLDER_TYPE_SENT);
}
/* (non-Javadoc)
* @see org.claros.groupware.webmail.controllers.FolderController#getFolders(org.claros.commons.models.AuthProfile)
*/
public List getFolders() throws Exception {
IGenericDao dao = null;
ArrayList myList = null;
try {
dao = Utility.getDbConnection();
String username = auth.getUsername();
String sql = "select * from FOLDER_DB_ITEMS where user=?";
List folders = dao.readList(FolderDbItem.class, sql, new Object[] {username});
myList = new ArrayList();
if (folders != null) {
FolderDbItem tmp = null;
for (int i=0;i<folders.size();i++) {
tmp = (FolderDbItem)folders.get(i);
FolderDbItemWrapper fd = new FolderDbItemWrapper(tmp);
fd.setUnreadItemCount(countUnreadMessages(tmp.getId().toString()));
fd.setTotalItemCount(countTotalMessages(tmp.getId().toString()));
myList.add(fd);
}
}
} finally {
JdbcUtil.close(dao);
dao = null;
}
return myList;
}
/* (non-Javadoc)
* @see org.claros.groupware.webmail.controllers.FolderController#getFolder(org.claros.commons.models.AuthProfile, java.lang.String)
*/
public FolderDbItem getFolder(String folder) throws Exception {
IGenericDao dao = null;
FolderDbItem fld = null;
try {
Long lFolder = new Long(folder);
dao = Utility.getDbConnection();
String username = auth.getUsername();
String sql = "select * from FOLDER_DB_ITEMS where user=? and id = ?";
fld = (FolderDbItem)dao.read(FolderDbItem.class, sql, new Object[] {username, lFolder});
} finally {
JdbcUtil.close(dao);
dao = null;
}
return fld;
}
/* (non-Javadoc)
* @see org.claros.groupware.webmail.controllers.FolderController#getMailsByFolder(org.claros.commons.models.AuthProfile, java.lang.String)
*/
public List getMailsByFolder(String folder) throws Exception {
IGenericDao dao = null;
List msgs = null;
try {
Long folderId = new Long(folder);
dao = Utility.getDbConnection();
String username = auth.getUsername();
String sql = "select * from EMAIL_DB_ITEMS where user=? and folder_id = ?";
msgs = dao.readList(EmailDbItem.class, sql, new Object[] {username, folderId});
} finally {
JdbcUtil.close(dao);
dao = null;
}
return msgs;
}
/* (non-Javadoc)
* @see org.claros.groupware.webmail.controllers.FolderController#createFolder(org.claros.groupware.webmail.models.FolderDbItem)
*/
public void createFolder(FolderDbItem item) throws Exception {
IGenericDao dao = null;
try {
dao = Utility.getDbConnection();
IObjectMappingKey myObj = Constants.persistMan.getObjectMappingFactory().createInstance(FolderDbItem.class, new AutoGeneratedColumnsMapper(true));
dao.insert(myObj, item);
} finally {
JdbcUtil.close(dao);
dao = null;
}
}
/* (non-Javadoc)
* @see org.claros.groupware.webmail.controllers.FolderController#countUnreadMessages(org.claros.commons.models.AuthProfile, java.lang.Long)
*/
public Integer countUnreadMessages(String folder) throws Exception {
QueryRunner run = new QueryRunner(DbConfigList.getDataSourceById("file"));
HashMap result = null;
String username = auth.getUsername();
try {
Long folderId = new Long(folder);
String sql = "select COUNT(*) as NUMBER from EMAIL_DB_ITEMS where user=? and FOLDER_ID = ? and unread = ?";
result = (HashMap)run.query(sql, new Object[] {username, folderId, new Boolean(true)}, new MapHandler());
} catch (SQLException e) {
return new Integer(0);
}
if (result != null) {
return new Integer(result.get("number").toString());
}
return new Integer(0);
}
/* (non-Javadoc)
* @see org.claros.groupware.webmail.controllers.FolderController#countTotalMessages(org.claros.commons.models.AuthProfile, java.lang.String)
*/
public Integer countTotalMessages(String folder) throws Exception {
QueryRunner run = new QueryRunner(DbConfigList.getDataSourceById("file"));
HashMap result = null;
String username = auth.getUsername();
try {
Long folderId = new Long(folder);
String sql = "select COUNT(*) as NUMBER from EMAIL_DB_ITEMS where user=? and FOLDER_ID = ? ";
result = (HashMap)run.query(sql, new Object[] {username, folderId}, new MapHandler());
} catch (SQLException e) {
return new Integer(0);
}
if (result != null) {
return new Integer(result.get("number").toString());
}
return new Integer(0);
}
/* (non-Javadoc)
* @see org.claros.groupware.webmail.controllers.FolderController#emptyFolder(org.claros.commons.models.AuthProfile, java.lang.String)
*/
public void emptyFolder(String folder) throws Exception {
QueryRunner run = new QueryRunner(DbConfigList.getDataSourceById("file"));
String username = auth.getUsername();
try {
Long folderId = new Long(folder);
String sql = "DELETE FROM EMAIL_DB_ITEMS where user=? and folder_id=?";
run.update(sql, new Object[] {username, folderId});
} catch (SQLException e) {
throw e;
}
}
/* (non-Javadoc)
* @see org.claros.groupware.webmail.controllers.FolderController#deleteFolder(org.claros.commons.models.AuthProfile, java.lang.String)
*/
public void deleteFolder(String folder) throws Exception {
IGenericDao dao = null;
try {
dao = Utility.getTxnDbConnection();
String username = auth.getUsername();
Long folderId = new Long(folder);
FolderDbItem fld = getFolder(folder);
if (!fld.getUser().equals(auth.getUsername())) {
throw new NoPermissionException();
}
String sql = "delete from EMAIL_DB_ITEMS where user=? and folder_id = ?";
// delete the emails under folder
dao.executeUpdate(sql, new Object[] {username, folderId});
sql = "delete from FILTERS where user=? and DESTINATION = ?";
// delete the filters targeting the deleted folder
dao.executeUpdate(sql, new Object[] {username, folderId});
// delete the folder
dao.deleteByPrimaryKey(FolderDbItem.class, folderId);
dao.commit();
} catch (Exception e) {
// dao.rollback();
// throw e;
} finally {
JdbcUtil.close(dao);
dao = null;
}
}
/* (non-Javadoc)
* @see org.claros.groupware.webmail.controllers.FolderController#getHeadersByFolder(org.claros.commons.models.AuthProfile, java.lang.String)
*/
public ArrayList getHeadersByFolder(String folder) throws Exception {
ArrayList headers = new ArrayList();
List mails = getMailsByFolder(folder);
if (mails != null) {
EmailDbItem item = null;
byte bEmail[] = null;
Properties props = new Properties();
Session session = Session.getDefaultInstance(props);
EmailHeader header = null;
for (int i=0;i<mails.size();i++) {
item = (EmailDbItem)mails.get(i);
bEmail = item.getEmail();
ByteArrayInputStream bis = new ByteArrayInputStream(bEmail);
MimeMessage msg = new MimeMessage(session, bis);
try {
header = new EmailHeader();
header.setMultipart((msg.isMimeType("multipart/*")) ? true : false);
header.setMessageId(item.getId().intValue());
header.setFrom(msg.getFrom());
header.setTo(msg.getRecipients(Message.RecipientType.TO));
header.setCc(msg.getRecipients(Message.RecipientType.CC));
header.setBcc(msg.getRecipients(Message.RecipientType.BCC));
header.setDate(msg.getSentDate());
header.setReplyTo(msg.getReplyTo());
header.setSize(item.getSize().longValue());
header.setSubject(msg.getSubject());
header.setUnread(item.getUnread());
// now set the human readables.
header.setDateShown(Formatter.formatDate(header.getDate(), "dd.MM.yyyy HH:mm"));
header.setFromShown(org.claros.commons.mail.utility.Utility.addressArrToString(header.getFrom()));
header.setToShown(org.claros.commons.mail.utility.Utility.addressArrToString(header.getTo()));
header.setCcShown(org.claros.commons.mail.utility.Utility.addressArrToString(header.getCc()));
header.setSizeShown(org.claros.commons.mail.utility.Utility.sizeToHumanReadable(header.getSize()));
// it is time to add it to the arraylist
headers.add(header);
} catch (MessagingException e1) {
log.error("Could not parse headers of e-mail. Message might be defuncted or illegal formatted.", e1);
}
}
}
return headers;
}
/* (non-Javadoc)
* @see org.claros.groupware.webmail.controllers.FolderController#createDefaultFolders(org.claros.commons.models.AuthProfile)
*/
public void createDefaultFolders() throws Exception {
if (getInboxFolder() == null) {
createFolder(new FolderDbItem(null, new Long(0), auth.getUsername(), org.claros.commons.mail.utility.Constants.FOLDER_INBOX, Constants.FOLDER_TYPE_INBOX));
}
if (getJunkFolder() == null) {
createFolder(new FolderDbItem(null, new Long(0), auth.getUsername(), org.claros.commons.mail.utility.Constants.FOLDER_JUNK, Constants.FOLDER_TYPE_JUNK));
}
if (getSentItems() == null) {
createFolder(new FolderDbItem(null, new Long(0), auth.getUsername(), org.claros.commons.mail.utility.Constants.FOLDER_SENT, Constants.FOLDER_TYPE_SENT));
}
}
/* (non-Javadoc)
* @see org.claros.groupware.webmail.controllers.FolderController#renameFolder(java.lang.String, java.lang.String)
*/
public void renameFolder(String oldName, String newName) throws Exception {
List folders = getFolders();
FolderDbItemWrapper tmp = null;
String n = null;
for (int i=0; i<folders.size(); i++) {
tmp = (FolderDbItemWrapper)folders.get(i);
n = tmp.getFolderName();
if (n.equals(oldName)) {
IGenericDao dao = null;
try {
dao = Utility.getDbConnection();
FolderDbItem item = getFolder(tmp.getId().toString());
item.setFolderName(newName);
dao.update(item);
} finally {
JdbcUtil.close(dao);
dao = null;
}
return;
}
}
throw new NoPermissionException();
}
}
|