com.marc.lastweek.business.services.mail.impl.MailServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.marc.lastweek.business.services.mail.impl.MailServiceImpl.java

Source

/*
 * MailServerImpl.java
 * Copyright (c) 2009, Monte Alto Research Center, All Rights Reserved.
 *
 * This software is the confidential and proprietary information of
 * Monte Alto Research Center ("Confidential Information"). You shall not
 * disclose such Confidential Information and shall use it only in
 * accordance with the terms of the license agreement you entered into
 * with Monte Alto Research Center
 */
package com.marc.lastweek.business.services.mail.impl;

import java.text.MessageFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import loc.marc.commons.business.services.general.GeneralService;

import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.tools.generic.DateTool;
import org.apache.velocity.tools.generic.ResourceTool;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.velocity.VelocityEngineUtils;

import com.marc.lastweek.business.entities.classifiedad.ClassifiedAd;
import com.marc.lastweek.business.services.mail.MailService;
import com.marc.lastweek.web.application.LastweekApplication;

public class MailServiceImpl implements MailService {

    private final static String TEMPLATE_FAVORITES = "favorites";
    private final static String TEMPLATE_ACTIVATION = "activation";
    private final static String TEMPLATE_CONTACT = "contact";
    private final static String TEMPLATE_REFRESH = "refresh";
    private final static String TEMPLATE_EXPIRED = "expired";

    private final static String FIELD_SUBJECT = ".subject";

    private static final String CHARSET = "ISO-8859-1";
    private static final Locale SPANISH_LOCALE = new Locale("es");
    private final static String MAIL_MESSAGES_FILE = "mail-templates/mail-messages";

    protected JavaMailSender javaMailSender = null;

    protected VelocityEngine velocityEngine = null;

    protected Map<String, String> velocityTemplates = new HashMap<String, String>();

    protected String from;

    public void sendFavoritesMail(String address, List<Long> favoritesList) {
        Map<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("favorites", favoritesList);
        List<ClassifiedAd> adsList = LastweekApplication.get().getGeneralService().queryForList(ClassifiedAd.class,
                "getClassifiedAdsInList", parameters);

        Map<String, Object> templateData = new HashMap<String, Object>();
        templateData.put("baseurl", "http://localhost:8080/lastweek/details/clid");
        templateData.put("adsList", adsList);

        this.sendMail(SPANISH_LOCALE, TEMPLATE_FAVORITES, templateData, address);
    }

    public void sendActivationMail(ClassifiedAd classifiedAd) {

        Map<String, Object> templateData = new HashMap<String, Object>();
        //TODO localhost:8080? change!
        templateData.put("baseurl", "http://localhost:8080/lastweek/details/clid");
        templateData.put("ad", classifiedAd);
        this.sendMail(SPANISH_LOCALE, TEMPLATE_ACTIVATION, templateData, classifiedAd.getUserData().getEmail());
    }

    public void sendContactMail(String senderName, String senderEmail, String text, Long classifiedAdId) {
        Map<String, Object> templateData = new HashMap<String, Object>();
        ClassifiedAd classifiedAd = LastweekApplication.get().getGeneralService().get(ClassifiedAd.class,
                classifiedAdId);
        //TODO localhost:8080? change!
        templateData.put("baseurl", "http://localhost:8080/lastweek/details/clid");
        templateData.put("ad", classifiedAd);
        templateData.put("senderName", senderName);
        templateData.put("senderEmail", senderEmail);
        templateData.put("text", text);
        this.sendMail(SPANISH_LOCALE, TEMPLATE_CONTACT, templateData, classifiedAd.getUserData().getEmail());
    }

    @Transactional
    public void sendRefreshMail(Long classifiedAdId, GeneralService generalService) {
        Map<String, Object> templateData = new HashMap<String, Object>();
        ClassifiedAd classifiedAd = generalService.find(ClassifiedAd.class, classifiedAdId);
        //TODO localhost:8080? change!
        templateData.put("baseurl", "http://localhost:8080/lastweek/details/clid");
        templateData.put("ad", classifiedAd);
        this.sendMail(SPANISH_LOCALE, TEMPLATE_REFRESH, templateData, classifiedAd.getUserData().getEmail());
    }

    @Transactional
    public void sendExpiredMail(Long classifiedAdId, GeneralService generalService) {
        Map<String, Object> templateData = new HashMap<String, Object>();
        ClassifiedAd classifiedAd = generalService.find(ClassifiedAd.class, classifiedAdId);
        //TODO localhost:8080? change!
        templateData.put("baseurl", "http://localhost:8080/lastweek/details/clid");
        templateData.put("ad", classifiedAd);
        this.sendMail(SPANISH_LOCALE, TEMPLATE_EXPIRED, templateData, classifiedAd.getUserData().getEmail());
    }

    public void setFrom(String from) {
        this.from = from;
    }

    @Required
    public void setJavaMailSender(JavaMailSender javaMailSender) {
        this.javaMailSender = javaMailSender;
    }

    @Required
    public void setVelocityEngine(VelocityEngine velocityEngine) {
        this.velocityEngine = velocityEngine;
    }

    @Required
    public void setVelocityTemplates(Map<String, String> velocityTemplates) {
        this.velocityTemplates = velocityTemplates;
    }

    private void sendMail(Locale locale, String templateName, Map<String, Object> templateData, String mailTo) {
        this.javaMailSender.send(getMimeMessagePreparator(locale, templateName, templateData, mailTo));
    }

    private MimeMessagePreparator getMimeMessagePreparator(final Locale locale, final String templateName,
            final Map<String, Object> templateData, final String mailTo) {

        MimeMessagePreparator preparator = new MimeMessagePreparator() {
            public void prepare(MimeMessage mimeMessage) throws MessagingException {
                MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);

                // Set message attributes
                message.setTo(mailTo);
                message.setFrom(MailServiceImpl.this.from);
                message.setSubject(getMailMessageEntry(locale, templateName + FIELD_SUBJECT));

                // Add parameters
                Map<String, Object> model = new HashMap<String, Object>();
                model.put("locale", locale);
                model.put("dateTool", new DateTool());
                model.put("resourceTool", new ResourceTool());

                // Insert data in the template
                for (String name : templateData.keySet()) {
                    model.put(name, templateData.get(name));
                }

                String text = VelocityEngineUtils.mergeTemplateIntoString(MailServiceImpl.this.velocityEngine,
                        MailServiceImpl.this.velocityTemplates.get(templateName), CHARSET, model);
                message.setText(text, true);

                // Insert stylesheet
                //ClassPathResource stylesheet = new ClassPathResource("templates/email.css", MailServiceImpl.class);
                //                ClassPathResource stylesheet = new ClassPathResource(MAIL_STYLESHEET, );
                //                message.addInline("email.css", stylesheet, "text/css");                        
            }
        };
        return preparator;
    }

    public static String getMailMessageEntry(Locale locale, String key, Object... arguments) {
        return MessageFormat.format(ResourceBundle.getBundle(MAIL_MESSAGES_FILE, locale).getString(key), arguments);
    }
}