Package com.cubusmail.user

Source Code of com.cubusmail.user.UserAccountDao

/* MessageUtils.java

   Copyright (c) 2009 Juergen Schlierf, All Rights Reserved
  
   This file is part of Cubusmail (http://code.google.com/p/cubusmail/).
 
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 3 of the License, or (at your option) any later version.
 
   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.
 
   You should have received a copy of the GNU Lesser General Public
   License along with Cubusmail. If not, see <http://www.gnu.org/licenses/>.
  
*/
package com.cubusmail.user;

import java.lang.reflect.Field;
import java.util.List;

import javax.mail.internet.InternetAddress;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.web.util.HtmlUtils;

import com.cubusmail.core.BeanIds;
import com.cubusmail.gwtui.domain.Contact;
import com.cubusmail.gwtui.domain.ContactFolder;
import com.cubusmail.gwtui.domain.ContactFolderType;
import com.cubusmail.gwtui.domain.Identity;
import com.cubusmail.gwtui.domain.Preferences;
import com.cubusmail.gwtui.domain.UserAccount;
import com.cubusmail.mail.util.MessageUtils;

/**
* DAO for user account operations.
*
* @author Juergen Schlierf
*/
public class UserAccountDao extends HibernateDaoSupport implements ApplicationContextAware {

  private Logger logger = Logger.getLogger( this.getClass() );

  private ApplicationContext applicationContext;

  /**
   * @param id
   * @return
   */
  public UserAccount getUserAccountById( Integer id ) {

    UserAccount account = (UserAccount) getHibernateTemplate().get( UserAccount.class, id );
    prepareAccount( account );
    return account;
  }

  /**
   * @param name
   * @return
   */
  @SuppressWarnings("unchecked")
  public UserAccount getUserAccountByUsername( String username ) {

    List<UserAccount> list = getHibernateTemplate().find( "from UserAccount u where u.username = ?", username );
    if ( list.size() == 0 ) {
      return null;
    }
    else if ( list.size() == 1 ) {
      UserAccount account = list.get( 0 );
      if ( account.getPreferences() == null ) {
        account.setPreferences( (Preferences) this.applicationContext.getBean( BeanIds.PREFERENCES_BEAN ) );
      }
      if ( !StringUtils.isEmpty( account.getPreferencesJson() ) ) {
        json2Preferences( account.getPreferencesJson(), account.getPreferences() );
      }
      prepareAccount( account );
      return account;
    }
    else {
      throw new DataIntegrityViolationException( "More than one user account for the same username." );
    }
  }

  /**
   * @param account
   * @return
   */
  public Long saveUserAccount( UserAccount account ) {

    JSONObject jsonObject = new JSONObject( account.getPreferences() );
    account.setPreferencesJson( jsonObject.toString() );
    prepareAccount( account );
    getHibernateTemplate().saveOrUpdate( account );
    if ( logger.isDebugEnabled() ) {
      logger.debug( "Save UserAccount with ID: " + account.getId() );
    }

    return account.getId();
  }

  /**
   * @param identities
   */
  public void deleteIdentities( List<Identity> identities ) {

    getHibernateTemplate().deleteAll( identities );
  }

  /**
   * @param account
   * @return
   */
  @SuppressWarnings("unchecked")
  public List<ContactFolder> retrieveContactFolders( UserAccount account ) {

    List<ContactFolder> folderList = getHibernateTemplate().find(
        "from ContactFolder cf where cf.userAccount.id=?", account.getId() );

    return folderList;
  }

  /**
   * @param account
   * @return
   */
  @SuppressWarnings("unchecked")
  public ContactFolder getRecipientContactFolder( UserAccount account ) {

    List<ContactFolder> folderList = getHibernateTemplate().find(
        "from ContactFolder cf where cf.userAccount.id=? and cf.folderType="
            + ContactFolderType.RECIPIENTS.getType(), account.getId() );

    if ( folderList != null && folderList.size() > 0 ) {
      return folderList.get( 0 );
    }

    return null;
  }

  /**
   * @param folder
   */
  public Long saveContactFolder( ContactFolder folder ) {

    getHibernateTemplate().saveOrUpdate( folder );
    if ( logger.isDebugEnabled() ) {
      logger.debug( "Save UserAccount with ID: " + folder.getId() );
    }

    return folder.getId();
  }

  /**
   * @param folder
   */
  public void deleteContactFolder( ContactFolder folder ) {

    getHibernateTemplate().delete( folder );
  }

  /**
   * @param folder
   * @return
   */
  @SuppressWarnings("unchecked")
  public List<Contact> retrieveContactList( ContactFolder folder ) {

    List<Contact> contactList = getHibernateTemplate().find( "from Contact c where c.contactFolder.id=?",
        folder.getId() );

    fillDisplayName( contactList );

    return contactList;
  }

  /**
   * @param account
   * @param searchString
   * @return
   */
  @SuppressWarnings("unchecked")
  public List<Contact> retrieveRecipients( UserAccount account, String searchString ) {

    if ( StringUtils.isEmpty( searchString ) ) {
      return null;
    }

    searchString = searchString.toUpperCase();

    String query = "from Contact c where c.contactFolder.userAccount.id=? and (upper(c.email) like '"
        + searchString + "%'";
    if ( searchString.indexOf( '@' ) == -1 ) {
      query += " or upper(c.firstName) like '" + searchString + "%' or upper(c.lastName) like '" + searchString
          + "%')";
    }
    else {
      query += ")";
    }

    List<Contact> contactList = getHibernateTemplate().find( query, account.getId() );
    fillDisplayName( contactList );

    return contactList;
  }

  /**
   * @param contactList
   */
  private void fillDisplayName( List<Contact> contactList ) {

    if ( contactList != null ) {
      for (Contact contact : contactList) {
        String displayName = "";
        boolean isLastNameEmpty = StringUtils.isEmpty( contact.getLastName() );
        boolean isFirstNameEmpty = StringUtils.isEmpty( contact.getFirstName() );
        if ( !isLastNameEmpty ) {
          displayName = contact.getLastName();
        }
        if ( !isLastNameEmpty && !isFirstNameEmpty ) {
          displayName += ", ";
        }
        if ( !isFirstNameEmpty ) {
          displayName += contact.getFirstName();
        }
        contact.setDisplayName( displayName );
      }
    }
  }

  /**
   * @param contact
   * @return
   */
  public Long saveContact( Contact contact ) {

    getHibernateTemplate().saveOrUpdate( contact );
    if ( logger.isDebugEnabled() ) {
      logger.debug( "Saved Contact with ID: " + contact.getId() );
    }

    return contact.getId();
  }

  /**
   * @param ids
   */
  public void deleteContacts( Long[] ids ) {

    try {
      getHibernateTemplate().bulkUpdate( "delete from ContactAddress a where contact_fk = ?", ids );
      getHibernateTemplate().bulkUpdate( "delete from Contact c where c.id=?", ids );
    }
    catch (Throwable e) {
      logger.error( e.getMessage(), e );
    }
  }

  /**
   * @param contactIds
   * @param targetFolder
   */
  public void moveContacts( Long[] contactIds, ContactFolder targetFolder ) {

    try {
      getHibernateTemplate().bulkUpdate(
          "update Contact set CONTACTFOLDERS_FK = " + targetFolder.getId() + " where ID in ?", contactIds );
    }
    catch (Throwable e) {
      logger.error( e.getMessage(), e );
    }
  }

  /**
   * @param id
   * @return
   */
  public Contact getContactById( Long id ) {

    return (Contact) getHibernateTemplate().get( Contact.class, id );
  }

  /**
   * @param id
   * @return
   */
  @SuppressWarnings("unchecked")
  public Contact getContactByEmail( ContactFolder folder, String email ) {

    List<Contact> list = getHibernateTemplate().find(
        "from Contact c where c.email = ? and c.contactFolder.id=" + folder.getId(), email );

    if ( list != null && list.size() > 0 ) {
      return list.get( 0 );
    }

    return null;
  }

  /**
   * @param preferencesJson
   * @param preferences
   */
  private void json2Preferences( String preferencesJson, Preferences preferences ) {

    try {
      JSONObject object = new JSONObject( preferencesJson );
      Field[] fields = Preferences.class.getFields();
      if ( fields != null ) {
        for (Field field : fields) {
          Object value = object.has( field.getName() ) ? object.get( field.getName() ) : null;
          if ( value != null ) {
            if ( value instanceof Integer ) {
              field.setInt( preferences, ((Integer) value).intValue() );
            }
            else if ( value instanceof Boolean ) {
              field.setBoolean( preferences, ((Boolean) value).booleanValue() );
            }
            else if ( value instanceof String ) {
              field.set( preferences, value );
            }
          }
        }
      }
    }
    catch (JSONException e) {
      logger.error( e.getMessage(), e );
    }
    catch (NumberFormatException e) {
      logger.error( e.getMessage(), e );
    }
    catch (IllegalArgumentException e) {
      logger.error( e.getMessage(), e );
    }
    catch (IllegalAccessException e) {
      logger.error( e.getMessage(), e );
    }
  }

  /**
   * @param account
   */
  private void prepareAccount( UserAccount account ) {

    if ( account.getIdentities() != null ) {
      for (Identity identity : account.getIdentities()) {
        identity.setInternetAddress( MessageUtils.toInternetAddress( identity.getEmail(), identity
            .getDisplayName() ) );
        identity.setEscapedInternetAddress( HtmlUtils.htmlEscape( identity.getInternetAddress() ) );
      }
    }
  }

  /**
   * @param addresses
   */
  public void saveRecipients( UserAccount account, InternetAddress[] addresses ) {

    ContactFolder recipientFolder = getRecipientContactFolder( account );

    if ( recipientFolder == null ) {
      recipientFolder = new ContactFolder( ContactFolderType.RECIPIENTS );
      recipientFolder.setFolderName( "Recipients" );
      recipientFolder.setUserAccount( account );
      saveContactFolder( recipientFolder );
    }
    if ( addresses != null ) {
      for (InternetAddress address : addresses) {
        Contact contact = getContactByEmail( recipientFolder, address.getAddress() );
        if ( contact == null ) {
          contact = new Contact();
          contact.setLastName( address.getPersonal() );
          contact.setEmail( address.getAddress() );
          contact.setContactFolder( recipientFolder );
          saveContact( contact );
        }
      }
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * org.springframework.context.ApplicationContextAware#setApplicationContext
   * (org.springframework.context.ApplicationContext)
   */
  public void setApplicationContext( ApplicationContext applicationContext ) throws BeansException {

    this.applicationContext = applicationContext;
  }
}
TOP

Related Classes of com.cubusmail.user.UserAccountDao

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.