de.hybris.platform.acceleratorservices.email.impl.DefaultEmailGenerationService.java Source code

Java tutorial

Introduction

Here is the source code for de.hybris.platform.acceleratorservices.email.impl.DefaultEmailGenerationService.java

Source

/*
 * [y] hybris Platform
 *
 * Copyright (c) 2000-2014 hybris AG
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of hybris
 * ("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 hybris.
 *
 *  
 */
package de.hybris.platform.acceleratorservices.email.impl;

import de.hybris.platform.acceleratorservices.email.EmailGenerationService;
import de.hybris.platform.acceleratorservices.email.EmailService;
import de.hybris.platform.acceleratorservices.model.cms2.pages.EmailPageModel;
import de.hybris.platform.acceleratorservices.model.cms2.pages.EmailPageTemplateModel;
import de.hybris.platform.acceleratorservices.model.email.EmailAddressModel;
import de.hybris.platform.acceleratorservices.model.email.EmailMessageModel;
import de.hybris.platform.acceleratorservices.process.email.context.AbstractEmailContext;
import de.hybris.platform.acceleratorservices.process.email.context.EmailContextFactory;
import de.hybris.platform.commons.model.renderer.RendererTemplateModel;
import de.hybris.platform.commons.renderer.RendererService;
import de.hybris.platform.processengine.model.BusinessProcessModel;
import de.hybris.platform.servicelayer.internal.service.AbstractBusinessService;
import de.hybris.platform.servicelayer.util.ServicesUtil;

import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.util.Assert;

/**
 * Service to render email message.
 */
public class DefaultEmailGenerationService extends AbstractBusinessService implements EmailGenerationService {
    private static final Logger LOG = Logger.getLogger(DefaultEmailGenerationService.class);

    private EmailService emailService;
    private RendererService rendererService;
    private EmailContextFactory<BusinessProcessModel> emailContextFactory;

    @Override
    public EmailMessageModel generate(final BusinessProcessModel businessProcessModel,
            final EmailPageModel emailPageModel) throws RuntimeException {
        ServicesUtil.validateParameterNotNull(emailPageModel, "EmailPageModel cannot be null");
        Assert.isInstanceOf(EmailPageTemplateModel.class, emailPageModel.getMasterTemplate(),
                "MasterTemplate associated with EmailPageModel should be EmailPageTemplate");

        final EmailPageTemplateModel emailPageTemplateModel = (EmailPageTemplateModel) emailPageModel
                .getMasterTemplate();
        final RendererTemplateModel bodyRenderTemplate = emailPageTemplateModel.getHtmlTemplate();
        Assert.notNull(bodyRenderTemplate,
                "HtmlTemplate associated with MasterTemplate of EmailPageModel cannot be null");
        final RendererTemplateModel subjectRenderTemplate = emailPageTemplateModel.getSubject();
        Assert.notNull(subjectRenderTemplate,
                "Subject associated with MasterTemplate of EmailPageModel cannot be null");

        final EmailMessageModel emailMessageModel;
        //This call creates the context to be used for rendering of subject and body templates.  
        final AbstractEmailContext<BusinessProcessModel> emailContext = getEmailContextFactory()
                .create(businessProcessModel, emailPageModel, bodyRenderTemplate);

        if (emailContext == null) {
            LOG.error("Failed to create email context for businessProcess [" + businessProcessModel + "]");
            throw new RuntimeException(
                    "Failed to create email context for businessProcess [" + businessProcessModel + "]");
        } else {
            if (!validate(emailContext)) {
                LOG.error("Email context for businessProcess [" + businessProcessModel + "] is not valid: "
                        + ReflectionToStringBuilder.toString(emailContext));
                throw new RuntimeException("Email context for businessProcess [" + businessProcessModel
                        + "] is not valid: " + ReflectionToStringBuilder.toString(emailContext));
            }

            final StringWriter subject = new StringWriter();
            getRendererService().render(subjectRenderTemplate, emailContext, subject);

            final StringWriter body = new StringWriter();
            getRendererService().render(bodyRenderTemplate, emailContext, body);

            emailMessageModel = createEmailMessage(subject.toString(), body.toString(), emailContext);

            if (LOG.isDebugEnabled()) {
                LOG.debug("Email Subject: " + emailMessageModel.getSubject());
                LOG.debug("Email Body: " + emailMessageModel.getBody());
            }

        }

        return emailMessageModel;
    }

    protected boolean validate(final AbstractEmailContext<BusinessProcessModel> emailContext) {
        boolean valid = true;
        if (StringUtils.isBlank(emailContext.getToEmail())) {
            LOG.error("Missing ToEmail in AbstractEmailContext");
            valid = false;
        }

        if (StringUtils.isBlank(emailContext.getFromEmail())) {
            LOG.error("Missing FromEmail in AbstractEmailContext");
            valid = false;
        }
        return valid;
    }

    protected EmailMessageModel createEmailMessage(final String emailSubject, final String emailBody,
            final AbstractEmailContext<BusinessProcessModel> emailContext) {
        final List<EmailAddressModel> toEmails = new ArrayList<EmailAddressModel>();
        final EmailAddressModel toAddress = getEmailService()
                .getOrCreateEmailAddressForEmail(emailContext.getToEmail(), emailContext.getToDisplayName());
        toEmails.add(toAddress);
        final EmailAddressModel fromAddress = getEmailService()
                .getOrCreateEmailAddressForEmail(emailContext.getFromEmail(), emailContext.getFromDisplayName());
        return getEmailService().createEmailMessage(toEmails, new ArrayList<EmailAddressModel>(),
                new ArrayList<EmailAddressModel>(), fromAddress, emailContext.getFromEmail(), emailSubject,
                emailBody, null);
    }

    protected EmailService getEmailService() {
        return emailService;
    }

    @Required
    public void setEmailService(final EmailService emailService) {
        this.emailService = emailService;
    }

    protected RendererService getRendererService() {
        return rendererService;
    }

    @Required
    public void setRendererService(final RendererService rendererService) {
        this.rendererService = rendererService;
    }

    protected EmailContextFactory<BusinessProcessModel> getEmailContextFactory() {
        return emailContextFactory;
    }

    @Required
    public void setEmailContextFactory(final EmailContextFactory<BusinessProcessModel> emailContextFactory) {
        this.emailContextFactory = emailContextFactory;
    }
}