com.cubusmail.server.services.ConvertUtil.java Source code

Java tutorial

Introduction

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

Source

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

import java.io.IOException;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.TimeZone;

import javax.mail.Address;
import javax.mail.Flags;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Message.RecipientType;

import org.apache.commons.lang.time.DateUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.web.util.HtmlUtils;

import com.cubusmail.common.model.GWTEmailAddress;
import com.cubusmail.common.model.GWTConstants;
import com.cubusmail.common.model.GWTMailFolder;
import com.cubusmail.common.model.GWTMailbox;
import com.cubusmail.common.model.GWTMessageFlags;
import com.cubusmail.common.model.GWTMessageRecord;
import com.cubusmail.common.model.ImageProvider;
import com.cubusmail.common.model.Preferences;
import com.cubusmail.common.util.CubusConstants;
import com.cubusmail.server.mail.IMailFolder;
import com.cubusmail.server.mail.IMailbox;
import com.cubusmail.server.mail.SessionManager;
import com.cubusmail.server.mail.util.MessageUtils;
import com.cubusmail.server.mail.util.MessageUtils.AddressStringType;
import com.sun.mail.imap.IMAPFolder;

/**
 * Utils for GWT services.
 * 
 * @author Juergen Schlierf
 */
public class ConvertUtil {

    public static GWTMailFolder[] convert(List<IMailFolder> mailFolderList) {

        if (mailFolderList != null && mailFolderList.size() > 0) {
            GWTMailFolder[] folderArray = new GWTMailFolder[mailFolderList.size()];
            int index = 0;
            for (IMailFolder mailFolder : mailFolderList) {
                folderArray[index++] = convert(mailFolder, true);
            }

            return folderArray;
        }

        return GWTMailFolder.EMPTY_FOLDER_ARRAY;
    }

    /**
     * Convert instances of IMailFolder to GWTMailFolder including subfolders.
     * 
     * @param mailFolder
     * @return
     */
    public static GWTMailFolder convert(IMailFolder mailFolder, boolean completeTree) {

        GWTMailFolder result = new GWTMailFolder();

        result.setId(mailFolder.getId());
        result.setName(mailFolder.getName());
        // result.setUnreadMessagesCount( mailFolder.getUnreadMessageCount() );
        result.setInbox(mailFolder.isInbox());
        result.setDraft(mailFolder.isDraft());
        result.setSent(mailFolder.isSent());
        result.setTrash(mailFolder.isTrash());
        result.setCreateSubfolderSupported(mailFolder.isCreateSubfolderSupported());
        result.setMoveSupported(mailFolder.isMoveSupported());
        result.setRenameSupported(mailFolder.isRenameSupported());
        result.setDeleteSupported(mailFolder.isDeleteSupported());
        result.setEmptySupported(mailFolder.isEmptySupported());

        if (completeTree) {
            IMailFolder[] subfolders = mailFolder.getSubfolders();
            if (subfolders.length > 0) {
                GWTMailFolder[] gwtSubfolders = new GWTMailFolder[subfolders.length];
                for (int i = 0; i < subfolders.length; i++) {
                    IMailFolder subfolder = mailFolder.getSubfolders()[i];
                    gwtSubfolders[i] = convert(subfolder, completeTree);
                    gwtSubfolders[i].setParent(result);
                }
                result.setSubfolders(gwtSubfolders);
            }
        }

        return result;
    }

    /**
     * @param mailbox
     * @return
     */
    public static GWTMailbox convert(IMailbox mailbox) {

        GWTMailbox result = new GWTMailbox();

        result.setEmailAddress(mailbox.getEmailAddress());
        result.setFullName(mailbox.getFullName());
        result.setUserAccount(mailbox.getUserAccount());
        result.setLoggedIn(true);

        // result.setMailFolders( convert( mailbox.getMailFolderList() ) );

        return result;
    }

    /**
     * Convert dedicated messages to string arrays for GridList.
     * 
     * @param context
     * @param preferences
     * @param currentFolder
     * @param pageSize
     * @param msgs
     * @return
     * @throws MessagingException
     */
    public static GWTMessageRecord[] convertMessagesToStringArray(ApplicationContext context,
            Preferences preferences, IMAPFolder currentFolder, int pageSize, Message msgs[])
            throws MessagingException {

        GWTMessageRecord[] result = new GWTMessageRecord[pageSize];

        // get date formats for message list date
        Locale locale = SessionManager.get().getLocale();
        TimeZone timezone = SessionManager.get().getTimeZone();
        String datePattern = context.getMessage(CubusConstants.MESSAGELIST_DATE_FORMAT_PATTERN, null, locale);
        String timePattern = context.getMessage(CubusConstants.MESSAGELIST_TIME_FORMAT_PATTERN, null, locale);

        NumberFormat sizeFormat = MessageUtils.createSizeFormat(locale);

        DateFormat dateFormat = null;
        DateFormat timeFormat = null;
        if (preferences.isShortTimeFormat()) {
            dateFormat = new SimpleDateFormat(datePattern, locale);
            timeFormat = new SimpleDateFormat(timePattern, locale);
            timeFormat.setTimeZone(timezone);
        } else {
            dateFormat = new SimpleDateFormat(datePattern + " " + timePattern, locale);
        }
        dateFormat.setTimeZone(timezone);
        Date today = Calendar.getInstance(timezone).getTime();

        for (int i = 0; i < pageSize; i++) {
            result[i] = new GWTMessageRecord();
            if (preferences.isShortTimeFormat() && DateUtils.isSameDay(today, msgs[i].getSentDate())) {
                // show only time
                convertToStringArray(currentFolder, msgs[i], result[i], timeFormat, sizeFormat);
            } else {
                convertToStringArray(currentFolder, msgs[i], result[i], dateFormat, sizeFormat);
            }
        }

        return result;
    }

    /**
     * @param folder
     * @param msg
     * @param result
     * @throws MessagingException
     */
    private static void convertToStringArray(IMAPFolder folder, Message msg, GWTMessageRecord result,
            DateFormat dateFormat, NumberFormat decimalFormat) throws MessagingException {

        result.setId(Long.toString(folder.getUID(msg)));
        try {
            result.setAttachmentImage(MessageUtils.hasAttachments(msg) ? ImageProvider.MSG_ATTACHMENT : null);
        } catch (IOException e) {
            // do nothing
        }
        GWTMessageFlags flags = new GWTMessageFlags();
        flags.setDeleted(msg.isSet(Flags.Flag.DELETED));
        flags.setUnread(!msg.isSet(Flags.Flag.SEEN));
        flags.setAnswered(msg.isSet(Flags.Flag.ANSWERED));
        flags.setDraft(msg.isSet(Flags.Flag.DRAFT));
        result.setFlags(flags);

        result.setProrityImage(getPriorityImage(msg));
        result.setSubject(HtmlUtils.htmlEscape(msg.getSubject()));

        result.setFrom(
                HtmlUtils.htmlEscape(MessageUtils.getMailAdressString(msg.getFrom(), AddressStringType.PERSONAL)));
        result.setTo(HtmlUtils.htmlEscape(
                MessageUtils.getMailAdressString(msg.getRecipients(RecipientType.TO), AddressStringType.PERSONAL)));
        if (msg.getSentDate() != null) {
            result.setSendDateString(HtmlUtils.htmlEscape(dateFormat.format(msg.getSentDate())));
            result.setSendDate(msg.getSentDate());
        }

        int msgSize = MessageUtils.calculateAttachmentSize(msg.getSize());
        result.setSizeString(HtmlUtils.htmlEscape(MessageUtils.formatPartSize(msgSize, decimalFormat)));
        result.setSize(msgSize);
    }

    /**
     * @param msg
     * @return
     */
    private static String getPriorityImage(Message msg) {

        int priority = MessageUtils.getMessagePriority(msg);
        if (priority == GWTConstants.PRIORITY_NONE) {
            return null;
        } else if (priority == GWTConstants.PRIORITY_VERY_LOW || priority == GWTConstants.PRIORITY_LOW) {
            return ImageProvider.PRIORITY_LOW;
        } else if (priority == GWTConstants.PRIORITY_VERY_HIGH || priority == GWTConstants.PRIORITY_VERY_HIGH) {
            return ImageProvider.PRIORITY_HIGH;
        }

        return null;
    }

    /**
     * @param addresses
     * @return
     */
    public static GWTEmailAddress[] convertAddress(Address[] addresses) throws MessagingException {

        if (addresses != null) {
            GWTEmailAddress[] gwtAdresses = new GWTEmailAddress[addresses.length];
            for (int i = 0; i < addresses.length; i++) {
                GWTEmailAddress gwtAddress = new GWTEmailAddress();
                gwtAddress.setInternetAddress(
                        MessageUtils.getMailAdressString(addresses[i], AddressStringType.COMPLETE));
                gwtAddress.setName(MessageUtils.getMailAdressString(addresses[i], AddressStringType.PERSONAL_ONLY));
                gwtAddress.setEmail(MessageUtils.getMailAdressString(addresses[i], AddressStringType.EMAIL));
                gwtAdresses[i] = gwtAddress;
            }

            return gwtAdresses;
        }

        return null;
    }

    /**
     * @param locale
     * @return
     */
    public static ResourceBundle getTimezonesBundle(Locale locale) {

        return ResourceBundle.getBundle(CubusConstants.TIMEZONES_BUNDLE_NAME, locale);
    }
}