com.cubusmail.gwtui.server.services.UserAccountService.java Source code

Java tutorial

Introduction

Here is the source code for com.cubusmail.gwtui.server.services.UserAccountService.java

Source

/* UserAccountService.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.gwtui.server.services;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.TimeZone;

import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.servlet.ServletException;

import net.sf.hibernate4gwt.core.HibernateBeanManager;
import net.sf.hibernate4gwt.gwt.HibernateRemoteService;

import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections.comparators.ReverseComparator;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.web.util.HtmlUtils;

import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.server.rpc.RPC;
import com.google.gwt.user.server.rpc.RPCRequest;

import com.cubusmail.core.BeanFactory;
import com.cubusmail.core.BeanIds;
import com.cubusmail.gwtui.client.exceptions.GWTInvalidSessionException;
import com.cubusmail.gwtui.client.services.IUserAccountService;
import com.cubusmail.gwtui.domain.Contact;
import com.cubusmail.gwtui.domain.ContactFolder;
import com.cubusmail.gwtui.domain.ContactListFields;
import com.cubusmail.gwtui.domain.Identity;
import com.cubusmail.gwtui.domain.UserAccount;
import com.cubusmail.mail.IMailbox;
import com.cubusmail.mail.SessionManager;
import com.cubusmail.mail.util.MessageUtils;
import com.cubusmail.mail.util.MessageUtils.AddressStringType;
import com.cubusmail.user.UserAccountDao;

/**
 * Implementation of UserAccountService.
 * 
 * @author Juergen Schlierf
 */
public class UserAccountService extends HibernateRemoteService implements IUserAccountService {

    private static final long serialVersionUID = 3680152258110434790L;

    private Logger log = Logger.getLogger(getClass().getName());

    public UserAccountService() {

    }

    @Override
    public void init() throws ServletException {

        super.init();
        setBeanManager((HibernateBeanManager) BeanFactory.getBean("hibernateBeanManager"));
    }

    /**
     * @return
     */
    private UserAccountDao getUserAccountDao() {

        return (UserAccountDao) BeanFactory.getBean(BeanIds.USER_ACCOUNT_DAO);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.google.gwt.user.server.rpc.RemoteServiceServlet#processCall(java.
     * lang.String)
     */
    @Override
    public String processCall(String payload) throws SerializationException {

        if (SessionManager.isLoggedIn()) {
            try {
                return super.processCall(payload);
            } catch (SerializationException e) {
                log.error(e.getMessage(), e);
                throw e;
            }
        } else {
            RPCRequest rpcRequest = RPC.decodeRequest(payload, this.getClass(), this);
            return RPC.encodeResponseForFailure(rpcRequest.getMethod(), new GWTInvalidSessionException());
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.cubusmail.gwtui.client.services.IUserAccountService#saveUserAccount
     * (com.cubusmail.gwtui.domain.UserAccount)
     */
    public UserAccount saveUserAccount(UserAccount account) {

        UserAccount origin = SessionManager.get().getUserAccount();

        List<Identity> identitiesToDelete = new ArrayList<Identity>();
        for (Identity identity : origin.getIdentities()) {
            if (!account.getIdentities().contains(identity)) {
                identitiesToDelete.add(identity);
                account.removeIdentity(identity);
            }
        }
        if (identitiesToDelete.size() > 0) {
            getUserAccountDao().deleteIdentities(identitiesToDelete);
        }
        getUserAccountDao().saveUserAccount(account);
        SessionManager.get().setUserAccount(account);

        return account;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.cubusmail.gwtui.client.services.IUserAccountService#retrieveUserAccount
     * ()
     */
    public UserAccount retrieveUserAccount() {

        IMailbox mailbox = SessionManager.get().getMailbox();

        return getUserAccountDao().getUserAccountByUsername(mailbox.getUserName());
    }

    /*
     * (non-Javadoc)
     * 
     * @seecom.cubusmail.gwtui.client.services.IUserAccountService#
     * retrieveContactFolders()
     */
    public List<ContactFolder> retrieveContactFolders() {

        UserAccount account = SessionManager.get().getUserAccount();
        return getUserAccountDao().retrieveContactFolders(account);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.cubusmail.gwtui.client.services.IUserAccountService#createContactFolder
     * (com.cubusmail.gwtui.domain.ContactFolder)
     */
    public ContactFolder createContactFolder(String folderName) {

        ContactFolder folder = new ContactFolder();
        folder.setFolderName(folderName);

        UserAccount account = SessionManager.get().getUserAccount();
        folder.setUserAccount(account);
        getUserAccountDao().saveContactFolder(folder);

        return folder;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.cubusmail.gwtui.client.services.IUserAccountService#saveContactFolder
     * (com.cubusmail.gwtui.domain.ContactFolder)
     */
    public void saveContactFolder(ContactFolder folder) {

        UserAccount account = SessionManager.get().getUserAccount();
        folder.setUserAccount(account);
        getUserAccountDao().saveContactFolder(folder);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.cubusmail.gwtui.client.services.IUserAccountService#deleteContactFolder
     * (com.cubusmail.gwtui.domain.ContactFolder)
     */
    public void deleteContactFolder(ContactFolder folder) {

        getUserAccountDao().deleteContactFolder(folder);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.cubusmail.gwtui.client.services.IUserAccountService#retrieveContactArray
     * ()
     */
    @SuppressWarnings("unchecked")
    public String[][] retrieveContactArray(ContactFolder folder, String sortField, String sortDirection) {

        List<Contact> contactList = getUserAccountDao().retrieveContactList(folder);

        if (contactList != null && contactList.size() > 0) {
            if (!StringUtils.isEmpty(sortField)) {
                boolean ascending = "ASC".equals(sortDirection);
                String fieldName = null;
                if (sortField.equals(ContactListFields.DISPLAY_NAME.name())) {
                    fieldName = "displayName";
                } else if (sortField.equals(ContactListFields.EMAIL.name())) {
                    fieldName = "email";
                } else if (sortField.equals(ContactListFields.COMPANY.name())) {
                    fieldName = "company";
                }
                Comparator comparator = null;
                if (ascending) {
                    comparator = new BeanComparator(fieldName);
                } else {
                    comparator = new ReverseComparator(new BeanComparator(fieldName));
                }
                Collections.sort(contactList, comparator);
            }

            String[][] array = new String[contactList.size()][ContactListFields.values().length];
            for (int i = 0; i < contactList.size(); i++) {
                array[i][ContactListFields.ID.ordinal()] = Long.toString(contactList.get(i).getId());
                array[i][ContactListFields.DISPLAY_NAME.ordinal()] = contactList.get(i).getDisplayName();
                array[i][ContactListFields.EMAIL.ordinal()] = contactList.get(i).getEmail();
                array[i][ContactListFields.COMPANY.ordinal()] = contactList.get(i).getCompany();
                array[i][ContactListFields.INTERNET_ADDRESS.ordinal()] = MessageUtils
                        .toInternetAddress(contactList.get(i).getEmail(), contactList.get(i).getDisplayName());
            }

            return array;
        } else {
            return new String[0][0];
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @seecom.cubusmail.gwtui.client.services.IUserAccountService#
     * retrieveRecipientsArray()
     */
    public String[][] retrieveRecipientsArray(String addressLine) {

        UserAccount account = SessionManager.get().getUserAccount();

        String[] addressStrings = parsePreviousAndLastAddress(addressLine);

        String searchString = addressStrings[1];
        List<Contact> contacts = getUserAccountDao().retrieveRecipients(account, searchString);

        if (contacts != null) {
            String[][] array = new String[contacts.size()][2];
            for (int i = 0; i < contacts.size(); i++) {
                if (!StringUtils.isEmpty(addressStrings[0])) {
                    array[i][0] = addressStrings[0] + ", " + MessageUtils
                            .toInternetAddress(contacts.get(i).getEmail(), contacts.get(i).getDisplayName());
                } else {
                    array[i][0] = MessageUtils.toInternetAddress(contacts.get(i).getEmail(),
                            contacts.get(i).getDisplayName());
                }
                array[i][1] = HtmlUtils.htmlEscape(array[i][0]);
            }

            return array;
        }

        return new String[][] { { addressLine, addressLine } };
    }

    /**
     * Parse out, the uncomplete Adresses
     * 
     * @param addressLine
     * @return
     * @throws MessagingException
     */
    public String[] parsePreviousAndLastAddress(String addressLine) {

        String[] result = new String[] { "", "" };

        try {
            InternetAddress[] addresses = InternetAddress.parse(addressLine, false);

            if (addresses != null) {
                if (addresses.length > 1) {
                    InternetAddress[] dest = new InternetAddress[addresses.length - 1];
                    for (int i = 0; i < addresses.length - 1; i++) {
                        dest[i] = addresses[i];
                    }
                    result[0] = MessageUtils.getMailAdressString(dest, AddressStringType.COMPLETE);
                }
                result[1] = addresses[addresses.length - 1].toUnicodeString();
            }
        } catch (MessagingException e) {
            // should never happen
            log.error(e.getMessage());
        }

        return result;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.cubusmail.gwtui.client.services.IUserAccountService#deleteContacts
     * (java.util.List)
     */
    public void deleteContacts(Long[] ids) {

        getUserAccountDao().deleteContacts(ids);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.cubusmail.gwtui.client.services.IUserAccountService#moveContacts(
     * java.lang.Long[], com.cubusmail.gwtui.domain.ContactFolder)
     */
    public void moveContacts(Long[] contactIds, ContactFolder targetFolder) {

        getUserAccountDao().moveContacts(contactIds, targetFolder);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.cubusmail.gwtui.client.services.IUserAccountService#saveContact(com
     * .cubusmail.gwtui.domain.Contact)
     */
    public void saveContact(Contact contact) {

        getUserAccountDao().saveContact(contact);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.cubusmail.gwtui.client.services.IUserAccountService#retrieveContact
     * (java.lang.Long)
     */
    public Contact retrieveContact(Long id) {

        return getUserAccountDao().getContactById(id);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.cubusmail.gwtui.client.services.IUserAccountService#retrieveTimezones
     * ()
     */
    public String[][] retrieveTimezones() {

        NumberFormat format = new DecimalFormat("00");
        Locale locale = SessionManager.get().getLocale();
        ResourceBundle bundle = ConvertUtil.getTimezonesBundle(locale);
        Enumeration<String> ids = bundle.getKeys();
        List<TimeZone> timeZoneList = toSortedZimeZoneList(ids);
        String[][] result = new String[timeZoneList.size()][2];
        int index = 0;
        for (TimeZone timeZone : timeZoneList) {
            result[index][0] = timeZone.getID();
            String hours = format.format(timeZone.getRawOffset() / 3600000);
            if (timeZone.getRawOffset() >= 0) {
                result[index][1] = "(+" + hours + ":00) " + bundle.getString(timeZone.getID());
            } else {
                result[index][1] = "(" + hours + ":00) " + bundle.getString(timeZone.getID());
            }
            index++;
        }

        return result;
    }

    @SuppressWarnings("unchecked")
    private List<TimeZone> toSortedZimeZoneList(Enumeration<String> ids) {

        List<TimeZone> result = new ArrayList<TimeZone>();
        while (ids.hasMoreElements()) {
            result.add(TimeZone.getTimeZone(ids.nextElement()));
        }

        Collections.sort(result, new BeanComparator("rawOffset"));

        return result;
    }
}