/*
* Copyright 2002-2007 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springmodules.email;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.mail.MailSender;
import org.springframework.util.Assert;
import org.springmodules.email.conf.EmailParser;
import org.springmodules.template.Template;
import org.springmodules.template.TemplateResolver;
import org.springmodules.util.StringResource;
/**
* A template based based class for email dispatchers. A {@link org.springmodules.template.TemplateResolver} is used
* to resolve the appropriate template based on the email name. Then the template is executed with the email model,
* and the output of that execution is parsed using a {@link EmailParser} into an {@link Email} object which is sent
* using the configured {@link org.springframework.mail.MailSender}.
*
* @author Uri Boness
*/
public abstract class AbstractEmailDispatcher implements EmailDispatcher, InitializingBean {
private final static String DEFAULT_ENCODING = "UTF-8";
private TemplateResolver templateResolver;
private MailSender mailSender;
private EmailParser emailParser;
private String encoding = DEFAULT_ENCODING;
/**
* Sends the email associated with the given name.
*
* @param emailName The name of the email to send.
*/
public void send(String emailName) {
send(emailName, new HashMap());
}
/**
* Sends the email associated with the given email name, while populating it first with the given model.
*
* @param emailName The name of the email to send.
* @param model The model to populate the email prior to sending.
*/
public void send(String emailName, Map model) {
Email email = resolveEmail(emailName, model);
send(email);
}
// todo improve performance using pipes ?
/**
* Resolves the {@link Email} by its name and given model.
*
* @param name The name of the email.
* @param model The model to populate the email.
* @return The resolved email.
*/
protected Email resolveEmail(String name, Map model) {
StringWriter writer = new StringWriter();
Template template = templateResolver.resolve(name, getEncoding());
template.generate(writer, model);
return emailParser.parse(new StringResource(writer.toString()));
}
/**
* Called by the Spring application context after this object has been wired with its dependencies. This method
* only validates that the wiring is correct.
*
* @throws Exception Thrown if for some reason the wiring of this object is incorrect.
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
public void afterPropertiesSet() throws Exception {
Assert.notNull(templateResolver, "Property 'templateResolver' must be set");
Assert.notNull(mailSender, "Property 'mailSender' must be set");
Assert.notNull(emailParser, "Property 'templateResolver' must be set");
Assert.notNull(templateResolver, "Property 'templateResolver' must be set");
}
//============================================== Setter/Getter =====================================================
/**
* Sets the template resolver that is used to resolve the email templates based on the email name and model.
*
* @param templateResolver The template resolver that is used to resolve the email templates.
*/
public void setTemplateResolver(TemplateResolver templateResolver) {
this.templateResolver = templateResolver;
}
/**
* Returns the template resolver that is used to resolve the email templates based on the email name and model.
*
* @return The template resolver that is used to resolve the email templates based on the email name and model.
*/
protected TemplateResolver getTemplateResolver() {
return templateResolver;
}
/**
* Sets the {@link MailSender} by which the emails will be sent.
*
* @param mailSender The email sender by which the emails will be sent.
*/
public void setMailSender(MailSender mailSender) {
this.mailSender = mailSender;
}
/**
* Returns the mail sender by which the emails will be sent.
*
* @return The mail sender by which the emails will be sent.
*/
protected MailSender getMailSender() {
return mailSender;
}
/**
* Sets the {@link EmailParser} that will be used to parse the email template outputs.
*
* @param emailParser The mail parser that will be used to parse the email template outputs.
*/
public void setEmailParser(EmailParser emailParser) {
this.emailParser = emailParser;
}
/**
* Sets the encoding of the emails to be sent. The default encoding is set to UTF-8.
*
* @param encoding The encoding of the emails to be sent.
*/
public void setEncoding(String encoding) {
this.encoding = encoding;
}
/**
* Returns the encoding of the emails to be sent.
*
* @return The encoding of the emails to be sent.
*/
public String getEncoding() {
return encoding;
}
}