Java tutorial
/* 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; } }