dz.alkhwarizmix.framework.java.services.impl.EMailService.java Source code

Java tutorial

Introduction

Here is the source code for dz.alkhwarizmix.framework.java.services.impl.EMailService.java

Source

////////////////////////////////////////////////////////////////////////////////
//     
//
//   ?    ?  (Copyright 2015 Fares Belhaouas)
//  ?  ? (All Rights Reserved)
//
//  NOTICE: Fares Belhaouas permits you to use, modify, and distribute this file
//  in accordance with the terms of the license agreement accompanying it.
//
////////////////////////////////////////////////////////////////////////////////

package dz.alkhwarizmix.framework.java.services.impl;

import java.io.UnsupportedEncodingException;
import java.util.List;

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

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import dz.alkhwarizmix.framework.java.AlKhwarizmixErrorCode;
import dz.alkhwarizmix.framework.java.AlKhwarizmixException;
import dz.alkhwarizmix.framework.java.dao.IAlKhwarizmixDAO;
import dz.alkhwarizmix.framework.java.dao.IEMailDAO;
import dz.alkhwarizmix.framework.java.domain.AbstractAlKhwarizmixDomainObject;
import dz.alkhwarizmix.framework.java.dtos.domain.model.vo.AlKhwarizmixDomainObject;
import dz.alkhwarizmix.framework.java.dtos.email.model.vo.EMail;
import dz.alkhwarizmix.framework.java.services.IAlKhwarizmixServiceValidator;
import dz.alkhwarizmix.framework.java.services.IEMailService;
import dz.alkhwarizmix.framework.java.services.IEMailServiceValidator;

/**
 * <p>
 * TODO: Javadoc
 * </p>
 *
 * @author ?  (Fares Belhaouas)
 * @since     (January 18, 2015)
 */
@Service
@Transactional(readOnly = true)
public class EMailService extends AbstractAlKhwarizmixService implements IEMailService {

    // --------------------------------------------------------------------------
    //
    // Constructors
    //
    // --------------------------------------------------------------------------

    public EMailService() {
        super();
    }

    protected EMailService(final Logger theLogger) {
        this();
        logger = theLogger;
    }

    // --------------------------------------------------------------------------
    //
    // Logger
    //
    // --------------------------------------------------------------------------

    private static Logger logger = null;

    @Override
    protected final Logger getLogger() {
        if (logger == null)
            logger = LoggerFactory.getLogger(EMailService.class);
        return logger;
    }

    // --------------------------------------------------------------------------
    //
    // Properties
    //
    // --------------------------------------------------------------------------

    @Autowired
    private IEMailDAO emailDAO;

    @Autowired
    private IEMailServiceValidator emailValidator;

    @Autowired
    private Jaxb2Marshaller jaxb2Marshaller;

    @Autowired
    private JavaMailSender mailSender;

    @Autowired
    private SimpleMailMessage simpleMailMessage;

    // --------------------------------------------------------------------------
    //
    // Methods
    //
    // --------------------------------------------------------------------------

    /**
     * {@inheritDoc}
     */
    @Transactional(readOnly = false)
    @Override
    public EMail addEMail(final EMail email, final boolean validateObjectToPublish) throws AlKhwarizmixException {
        getLogger().debug("addEmail");
        final EMail result = (EMail) addObject(email, validateObjectToPublish);
        getLogger().trace("addEMail: return {}", result);
        return result;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public EMail getEMail(final EMail email, final boolean validateObjectToPublish) throws AlKhwarizmixException {
        getLogger().debug("getEMail");
        final EMail result = (EMail) getObject(email, validateObjectToPublish);
        getLogger().trace("getEMail: return {}", result);
        return result;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public AbstractAlKhwarizmixDomainObject getObject(final AbstractAlKhwarizmixDomainObject object,
            final boolean validateObjectToPublish) throws AlKhwarizmixException {
        getLogger().trace("getObject");
        EMail result = getEMailDAO().getEMail((EMail) object);
        if (validateObjectToPublish && (result != null)) {
            result = (EMail) result.clone();
            getServiceValidator().validateObjectToPublish(result, getSessionOwner());
        }
        getLogger().trace("getObject: return {}", result);
        return result;
    }

    /**
     * TODO: JAVADOC
     */
    public List<EMail> getEMailList(DetachedCriteria criteriaToUse, final int firstResult, final int maxResult,
            final boolean validateForPublishing) throws AlKhwarizmixException {
        getLogger().debug("getEMailList");
        if (criteriaToUse == null)
            criteriaToUse = DetachedCriteria.forClass(EMail.class);
        // criteriaToUse.addOrder(Order.asc(EMail.USERID));
        final List<EMail> result = (List<EMail>) (List<?>) getObjectList(criteriaToUse, firstResult, maxResult,
                validateForPublishing);
        return result;
    }

    /**
     */
    @Override
    public EMail getPendingEMail(final boolean validateObjectToPublish) throws AlKhwarizmixException {
        getLogger().trace("getPendingEMail");
        EMail result = null;
        final List<EMail> pendingEMails = getEMailList(getPendingEMailsCriteria(), 0, 1, validateObjectToPublish);
        if (pendingEMails.size() > 0)
            result = pendingEMails.get(0);
        getLogger().trace("getPendingEMail: return {}", result);
        return result;
    }

    private DetachedCriteria getPendingEMailsCriteria() {
        final DetachedCriteria result = DetachedCriteria.forClass(EMail.class);
        result.add(Restrictions.isNull("sentAt"));
        return result;
    }

    /**
     *
     */
    @Override
    public void sendEMail(final EMail email) throws AlKhwarizmixException {
        final SimpleMailMessage simpleMailMessage = getSimpleMailMessage(email);
        final MimeMessage mimeMessage = mailSender.createMimeMessage();

        try {
            final MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            helper.setFrom(simpleMailMessage.getFrom(), email.getSender().getName());
            helper.setTo(simpleMailMessage.getTo());
            helper.setSubject(simpleMailMessage.getSubject());
            helper.setText(simpleMailMessage.getText());
            mailSender.send(mimeMessage);
        } catch (final MessagingException ex) {
            getLogger().warn("sendEmail: {}", ex.getMessage());
            throw new AlKhwarizmixException(AlKhwarizmixErrorCode.SERVER_INTERNAL_ERROR, ex);
        } catch (final UnsupportedEncodingException ex) {
            getLogger().warn("sendEmail: {}", ex.getMessage());
            throw new AlKhwarizmixException(AlKhwarizmixErrorCode.SERVER_INTERNAL_ERROR, ex);
        }
    }

    /**
     */
    @Transactional(readOnly = false)
    @Override
    public EMail updateEMail(final EMail email, final AlKhwarizmixDomainObject updater,
            final boolean validateObjectToPublish) throws AlKhwarizmixException {
        getLogger().debug("updateEMail");
        final EMail result = (EMail) updateObject(email, updater, validateObjectToPublish);
        getLogger().trace("updateEMail: return {}", result);
        return result;
    }

    // --------------------------------------------------------------------------
    //
    // Getters & Setters
    //
    // --------------------------------------------------------------------------

    // ----------------------------------
    // mailSender
    // ----------------------------------

    /**
     *
     */
    public void setMailSender(final JavaMailSender value) {
        mailSender = value;
    }

    // ----------------------------------
    // simpleMailMessage
    // ----------------------------------

    /**
     *
     */
    public void setSimpleMailMessage(final SimpleMailMessage value) {
        simpleMailMessage = value;
    }

    /**
     *
     */
    public SimpleMailMessage getSimpleMailMessage(final EMail email) {
        final SimpleMailMessage result = new SimpleMailMessage(simpleMailMessage);
        result.setFrom(email.getSender().getUserId());
        result.setTo(email.getReceiver().getUserId());
        result.setText(email.getBody());
        return result;
    }

    // ----------------------------------
    // emailDAO
    // ----------------------------------

    private final IEMailDAO getEMailDAO() {
        return emailDAO;
    }

    protected final void setEMailDAO(final IEMailDAO value) {
        emailDAO = value;
    }

    @Override
    protected IAlKhwarizmixDAO getServiceDAO() {
        return emailDAO;
    }

    // ----------------------------------
    // emailValidator
    // ----------------------------------

    protected final void setEMailValidator(final IEMailServiceValidator value) {
        emailValidator = value;
    }

    @Override
    protected final IAlKhwarizmixServiceValidator getServiceValidator() {
        return emailValidator;
    }

    // ----------------------------------
    // jaxb2Marshaller
    // ----------------------------------

    @Override
    protected final Jaxb2Marshaller getJaxb2Marshaller() {
        return jaxb2Marshaller;
    }

    @Override
    protected final void setJaxb2Marshaller(final Jaxb2Marshaller value) {
        jaxb2Marshaller = value;
    }

} // Class