DbFolderControllerImpl.java :  » Chat » claros-chat-1.0 » org » claros » mini » controllers » Java Open Source

Java Open Source » Chat » claros chat 1.0 
claros chat 1.0 » org » claros » mini » controllers » DbFolderControllerImpl.java
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();
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.