Removed MailHeaderGenerator. The MailSendingMessageConsumer handles the mapping of header values, but those values should be provided by a Transformer initially.

This commit is contained in:
Mark Fisher
2008-09-25 20:36:00 +00:00
parent 8b24cd7d6b
commit 1aff8abeee
12 changed files with 89 additions and 447 deletions

View File

@@ -1,126 +0,0 @@
/*
* Copyright 2002-2008 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.springframework.integration.mail;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.integration.message.Message;
import org.springframework.mail.MailMessage;
/**
* Base implementation for {@link MailHeaderGenerator MailHeaderGenerators}.
* This class is abstract. Subclasses must implement the corresponding template
* methods to retrieve the values for the mail message's subject, recipients,
* and from/reply-to addresses based on the integration {@link Message}.
*
* @author Marius Bogoevici
* @author Mark Fisher
*/
public abstract class AbstractMailHeaderGenerator implements MailHeaderGenerator {
private final Log logger = LogFactory.getLog(this.getClass());
/**
* Retrieve the subject of an e-mail message from an integration message.
*
* @param message the integration {@link Message}
* @return the e-mail message subject
*/
protected abstract String getSubject(Message<?> message);
/**
* Retrieve the recipients list from an integration message.
*
* @param message the integration {@link Message}
* @return recipients list (TO)
*/
protected abstract String[] getTo(Message<?> message);
/**
* Retrieve the CC recipients list from an integration message.
*
* @param message the integration {@link Message}
* @return CC recipients list (e-mail addresses)
*/
protected abstract String[] getCc(Message<?> message);
/**
* Retrieve the BCC recipients list from an integration message.
*
* @param message the integration {@link Message}
* @return BCC recipients list (e-mail addresses)
*/
protected abstract String[] getBcc(Message<?> message);
/**
* Retrieve the From: e-mail address from an integration message.
*
* @param message the integration {@link Message}
* @return the From: e-mail address
*/
protected abstract String getFrom(Message<?> message);
/**
* Retrieve the Reply To: e-mail address from an integration message.
*
* @param message the integration {@link Message}
* @return the ReplyTo: e-mail address
*/
protected abstract String getReplyTo(Message<?> message);
/**
* Populate the mail message using the results of the template methods.
*/
public final void populateMailMessageHeader(MailMessage mailMessage, Message<?> message) {
final String subject = getSubject(message);
final String[] to = getTo(message);
final String[] cc = getCc(message);
final String[] bcc = getBcc(message);
final String from = getFrom(message);
final String replyTo = getReplyTo(message);
if (subject != null) {
mailMessage.setSubject(subject);
}
else if (logger.isWarnEnabled()) {
logger.warn("no 'SUBJECT' property available for mail message");
}
if (to != null) {
mailMessage.setTo(to);
}
else if (logger.isWarnEnabled()) {
logger.warn("no 'TO' property available for mail message");
}
if (cc != null) {
mailMessage.setCc(cc);
}
if (bcc != null) {
mailMessage.setBcc(bcc);
}
if (from != null) {
mailMessage.setFrom(from);
}
else if (logger.isWarnEnabled()) {
logger.warn("no 'FROM' property available for mail message");
}
if (replyTo != null) {
mailMessage.setReplyTo(replyTo);
}
}
}

View File

@@ -1,77 +0,0 @@
/*
* Copyright 2002-2008 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.springframework.integration.mail;
import org.springframework.integration.message.Message;
/**
* The default implementation of {@link MailHeaderGenerator}. Configures the
* {@link org.springframework.mail.MailMessage} properties based on attributes
* provided with known attribute keys as defined in {@link MailHeaders}.
*
* @author Mark Fisher
*/
public class DefaultMailHeaderGenerator extends AbstractMailHeaderGenerator {
@Override
protected String getSubject(Message<?> message) {
return this.retrieveAsString(message, MailHeaders.SUBJECT);
}
@Override
protected String[] getTo(Message<?> message) {
return this.retrieveAsStringArray(message, MailHeaders.TO);
}
@Override
protected String[] getCc(Message<?> message) {
return this.retrieveAsStringArray(message, MailHeaders.CC);
}
@Override
protected String[] getBcc(Message<?> message) {
return this.retrieveAsStringArray(message, MailHeaders.BCC);
}
@Override
protected String getFrom(Message<?> message) {
return this.retrieveAsString(message, MailHeaders.FROM);
}
@Override
protected String getReplyTo(Message<?> message) {
return this.retrieveAsString(message, MailHeaders.REPLY_TO);
}
private String retrieveAsString(Message<?> message, String key) {
Object value = message.getHeaders().get(key);
return (value instanceof String) ? (String) value : null;
}
private String[] retrieveAsStringArray(Message<?> message, String key) {
Object value = message.getHeaders().get(key);
if (value instanceof String[]) {
return (String[]) value;
}
if (value instanceof String) {
return new String[] { (String) value };
}
return null;
}
}

View File

@@ -1,39 +0,0 @@
/*
* Copyright 2002-2008 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.springframework.integration.mail;
import org.springframework.integration.message.Message;
import org.springframework.mail.MailMessage;
/**
* Strategy interface for generating header information for an e-mail message
* from the content of the integration message. Minimal configuration should
* include the recipients list, the subject, from/reply-to, etc. However, this
* strategy allows the implementation of more complex business logic, when these
* parameters are depending on the integration message itself.
*
* @author Marius Bogoevici
*/
public interface MailHeaderGenerator {
/**
* Populate the e-mail message header based on the content of the
* integration message.
*/
void populateMailMessageHeader(MailMessage mailMessage, Message<?> message);
}

View File

@@ -23,6 +23,7 @@ import org.springframework.core.io.ByteArrayResource;
import org.springframework.integration.adapter.MessageMappingException;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageConsumer;
import org.springframework.integration.message.MessageHeaders;
import org.springframework.mail.MailMessage;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
@@ -35,9 +36,10 @@ import org.springframework.util.Assert;
*
* <p>If the Message is an instance of {@link MailMessage}, it will be passed
* as-is. If the Message payload is a byte array, it will be passed as an
* attachment, and the {@link MailHeaders#ATTACHMENT_FILENAME} header is
* required. For any other payload type, a {@link SimpleMailMessage} will be
* created with the payload's <code>toString()</code> value as the Mail text.
* attachment, and in that case, the {@link MailHeaders#ATTACHMENT_FILENAME}
* header is required. For any other payload type, a {@link SimpleMailMessage}
* will be created with the payload's <code>toString()</code> value as the Mail
* text.
*
* @see MailHeaders
*
@@ -48,8 +50,6 @@ public class MailSendingMessageConsumer implements MessageConsumer {
private final JavaMailSender mailSender;
private volatile MailHeaderGenerator mailHeaderGenerator = new DefaultMailHeaderGenerator();
/**
* Create a MailSendingMessageConsumer.
@@ -63,34 +63,8 @@ public class MailSendingMessageConsumer implements MessageConsumer {
}
public void setHeaderGenerator(MailHeaderGenerator mailHeaderGenerator) {
Assert.notNull(mailHeaderGenerator, "'mailHeaderGenerator' must not be null");
this.mailHeaderGenerator = mailHeaderGenerator;
}
public final void onMessage(Message<?> message) {
MailMessage mailMessage = this.convertMessageToMailMessage(message);
this.mailHeaderGenerator.populateMailMessageHeader(mailMessage, message);
this.sendMailMessage(mailMessage);
}
@SuppressWarnings("unchecked")
private MailMessage convertMessageToMailMessage(Message<?> message) {
MailMessage mailMessage = null;
if (message.getPayload() instanceof MailMessage) {
mailMessage = (MailMessage) message.getPayload();
}
else if (message.getPayload() instanceof byte[]) {
mailMessage = this.createMailMessageFromByteArrayMessage((Message<byte[]>) message);
}
else {
mailMessage = new SimpleMailMessage();
mailMessage.setText(message.getPayload().toString());
}
return mailMessage;
}
private void sendMailMessage(MailMessage mailMessage) {
if (mailMessage instanceof SimpleMailMessage) {
this.mailSender.send((SimpleMailMessage) mailMessage);
}
@@ -103,6 +77,23 @@ public class MailSendingMessageConsumer implements MessageConsumer {
}
}
@SuppressWarnings("unchecked")
private MailMessage convertMessageToMailMessage(Message<?> message) {
if (message.getPayload() instanceof MailMessage) {
return (MailMessage) message.getPayload();
}
MailMessage mailMessage = null;
if (message.getPayload() instanceof byte[]) {
mailMessage = this.createMailMessageFromByteArrayMessage((Message<byte[]>) message);
}
else {
mailMessage = new SimpleMailMessage();
mailMessage.setText(message.getPayload().toString());
}
this.configureHeaderValues(mailMessage, message.getHeaders());
return mailMessage;
}
private MailMessage createMailMessageFromByteArrayMessage(Message<byte[]> message) {
String attachmentFileName = message.getHeaders().get(MailHeaders.ATTACHMENT_FILENAME, String.class);
if (attachmentFileName == null) {
@@ -123,4 +114,44 @@ public class MailSendingMessageConsumer implements MessageConsumer {
}
}
private void configureHeaderValues(MailMessage mailMessage, MessageHeaders headers) {
String subject = headers.get(MailHeaders.SUBJECT, String.class);
if (subject != null) {
mailMessage.setSubject(subject);
}
String[] to = this.retrieveAsStringArray(headers, MailHeaders.TO);
if (to != null) {
mailMessage.setTo(to);
}
String[] cc = this.retrieveAsStringArray(headers, MailHeaders.CC);
if (cc != null) {
mailMessage.setCc(cc);
}
String[] bcc = this.retrieveAsStringArray(headers, MailHeaders.BCC);
if (bcc != null) {
mailMessage.setBcc(bcc);
}
String from = headers.get(MailHeaders.FROM, String.class);
if (from != null) {
mailMessage.setFrom(from);
}
String replyTo = headers.get(MailHeaders.REPLY_TO, String.class);
if (replyTo != null) {
mailMessage.setReplyTo(replyTo);
}
}
private String[] retrieveAsStringArray(MessageHeaders headers, String key) {
Object value = headers.get(key);
if (value != null) {
if (value instanceof String[]) {
return (String[]) value;
}
if (value instanceof String) {
return new String[] { (String) value };
}
}
return null;
}
}

View File

@@ -1,90 +0,0 @@
/*
* 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.springframework.integration.mail;
import org.springframework.integration.message.Message;
/**
* Mail header generator implementation that populates a mail message header
* from statically configured properties.
*
* @author Marius Bogoevici
*/
public class StaticMailHeaderGenerator extends AbstractMailHeaderGenerator {
private String subject;
private String[] to;
private String[] cc;
private String[] bcc;
private String from;
private String replyTo;
public void setSubject(String subject) {
this.subject = subject;
}
protected String getSubject(Message<?> message) {
return this.subject;
}
public void setTo(String[] to) {
this.to = to;
}
protected String[] getTo(Message<?> message) {
return this.to;
}
public void setCc(String[] cc) {
this.cc = cc;
}
protected String[] getCc(Message<?> message) {
return this.cc;
}
public void setBcc(String[] bcc) {
this.bcc = bcc;
}
protected String[] getBcc(Message<?> message) {
return this.bcc;
}
public void setFrom(String from) {
this.from = from;
}
protected String getFrom(Message<?> message) {
return this.from;
}
public void setReplyTo(String replyTo) {
this.replyTo = replyTo;
}
protected String getReplyTo(Message<?> message) {
return this.replyTo;
}
}

View File

@@ -25,7 +25,6 @@
</xsd:annotation>
<xsd:attribute name="id" type="xsd:string"/>
<xsd:attribute name="mail-sender" type="xsd:string"/>
<xsd:attribute name="header-generator" type="xsd:string"/>
<xsd:attribute name="host" type="xsd:string"/>
<xsd:attribute name="username" type="xsd:string"/>
<xsd:attribute name="password" type="xsd:string"/>

View File

@@ -34,7 +34,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.adapter.MessageMappingException;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.StringMessage;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -60,14 +59,14 @@ public class MailSendingMessageConsumerContextTests {
@Test
public void stringMesssagesWithConfiguration() {
this.consumer.onMessage(new StringMessage(MailTestsHelper.MESSAGE_TEXT));
SimpleMailMessage message = MailTestsHelper.createSimpleMailMessage();
this.consumer.onMessage(MailTestsHelper.createIntegrationMessage());
SimpleMailMessage mailMessage = MailTestsHelper.createSimpleMailMessage();
assertEquals("no mime message should have been sent",
0, this.mailSender.getSentMimeMessages().size());
assertEquals("only one simple message must be sent",
1, this.mailSender.getSentSimpleMailMessages().size());
assertEquals("message content different from expected",
message, this.mailSender.getSentSimpleMailMessages().get(0));
mailMessage, this.mailSender.getSentSimpleMailMessages().get(0));
}
@Test
@@ -76,6 +75,7 @@ public class MailSendingMessageConsumerContextTests {
org.springframework.integration.message.Message<?> message =
MessageBuilder.withPayload(payload)
.setHeader(MailHeaders.ATTACHMENT_FILENAME, "attachment.txt")
.setHeader(MailHeaders.TO, MailTestsHelper.TO)
.build();
this.consumer.onMessage(message);
assertEquals("no mime message should have been sent",

View File

@@ -32,7 +32,6 @@ import org.junit.Before;
import org.junit.Test;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.StringMessage;
import org.springframework.mail.SimpleMailMessage;
/**
@@ -44,19 +43,10 @@ public class MailSendingMessageConsumerTests {
private StubJavaMailSender mailSender;
private StaticMailHeaderGenerator staticMailHeaderGenerator;
@Before
public void setUp() throws Exception {
this.mailSender = new StubJavaMailSender(new MimeMessage((Session) null));
this.staticMailHeaderGenerator = new StaticMailHeaderGenerator();
this.staticMailHeaderGenerator.setBcc(MailTestsHelper.BCC);
this.staticMailHeaderGenerator.setCc(MailTestsHelper.CC);
this.staticMailHeaderGenerator.setFrom(MailTestsHelper.FROM);
this.staticMailHeaderGenerator.setReplyTo(MailTestsHelper.REPLY_TO);
this.staticMailHeaderGenerator.setSubject(MailTestsHelper.SUBJECT);
this.staticMailHeaderGenerator.setTo(MailTestsHelper.TO);
this.consumer = new MailSendingMessageConsumer(this.mailSender);
}
@@ -68,24 +58,23 @@ public class MailSendingMessageConsumerTests {
@Test
public void textMessage() {
this.consumer.setHeaderGenerator(this.staticMailHeaderGenerator);
this.consumer.onMessage(new StringMessage(MailTestsHelper.MESSAGE_TEXT));
SimpleMailMessage message = MailTestsHelper.createSimpleMailMessage();
this.consumer.onMessage(MailTestsHelper.createIntegrationMessage());
SimpleMailMessage mailMessage = MailTestsHelper.createSimpleMailMessage();
assertEquals("no mime message should have been sent",
0, mailSender.getSentMimeMessages().size());
assertEquals("only one simple message must be sent",
1, mailSender.getSentSimpleMailMessages().size());
assertEquals("message content different from expected",
message, mailSender.getSentSimpleMailMessages().get(0));
mailMessage, mailSender.getSentSimpleMailMessages().get(0));
}
@Test
public void byteArrayMessage() throws Exception {
this.consumer.setHeaderGenerator(this.staticMailHeaderGenerator);
byte[] payload = {1, 2, 3};
org.springframework.integration.message.Message<byte[]> message =
MessageBuilder.withPayload(payload)
.setHeader(MailHeaders.ATTACHMENT_FILENAME, "attachment.txt")
.setHeader(MailHeaders.TO, MailTestsHelper.TO)
.build();
this.consumer.onMessage(message);
byte[] buffer = new byte[1024];
@@ -100,16 +89,8 @@ public class MailSendingMessageConsumerTests {
}
@Test
public void defaultMailHeaderGenerator() {
org.springframework.integration.message.Message<String> message =
MessageBuilder.withPayload(MailTestsHelper.MESSAGE_TEXT)
.setHeader(MailHeaders.SUBJECT, MailTestsHelper.SUBJECT)
.setHeader(MailHeaders.TO, MailTestsHelper.TO)
.setHeader(MailHeaders.CC, MailTestsHelper.CC)
.setHeader(MailHeaders.BCC, MailTestsHelper.BCC)
.setHeader(MailHeaders.FROM, MailTestsHelper.FROM)
.setHeader(MailHeaders.REPLY_TO, MailTestsHelper.REPLY_TO).build();
this.consumer.onMessage(message);
public void mailHeaders() {
this.consumer.onMessage(MailTestsHelper.createIntegrationMessage());
SimpleMailMessage mailMessage = MailTestsHelper.createSimpleMailMessage();
assertEquals("no mime message should have been sent",
0, mailSender.getSentMimeMessages().size());

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2007 the original author or authors.
* Copyright 2002-2008 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.
@@ -16,6 +16,8 @@
package org.springframework.integration.mail;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.mail.SimpleMailMessage;
/**
@@ -53,4 +55,15 @@ public class MailTestsHelper {
return message;
}
public static Message<String> createIntegrationMessage() {
return MessageBuilder.withPayload(MailTestsHelper.MESSAGE_TEXT)
.setHeader(MailHeaders.SUBJECT, MailTestsHelper.SUBJECT)
.setHeader(MailHeaders.TO, MailTestsHelper.TO)
.setHeader(MailHeaders.CC, MailTestsHelper.CC)
.setHeader(MailHeaders.BCC, MailTestsHelper.BCC)
.setHeader(MailHeaders.FROM, MailTestsHelper.FROM)
.setHeader(MailHeaders.REPLY_TO, MailTestsHelper.REPLY_TO)
.build();
}
}

View File

@@ -16,7 +16,6 @@
package org.springframework.integration.mail.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import org.junit.Test;
@@ -24,10 +23,7 @@ import org.junit.Test;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.mail.MailHeaderGenerator;
import org.springframework.integration.mail.MailSendingMessageConsumer;
import org.springframework.integration.message.Message;
import org.springframework.mail.MailMessage;
import org.springframework.mail.MailSender;
/**
@@ -59,24 +55,4 @@ public class MailOutboundChannelAdapterParserTests {
assertNotNull(mailSender);
}
@Test
public void adapterWithHeaderGeneratorReference() {
ApplicationContext context = new ClassPathXmlApplicationContext(
"mailOutboundChannelAdapterParserTests.xml", this.getClass());
Object adapter = context.getBean("adapterWithHeaderGeneratorReference.adapter");
MailSendingMessageConsumer consumer = (MailSendingMessageConsumer)
new DirectFieldAccessor(adapter).getPropertyValue("consumer");
DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(consumer);
MailHeaderGenerator headerGenerator = (MailHeaderGenerator)
fieldAccessor.getPropertyValue("mailHeaderGenerator");
assertEquals(TestHeaderGenerator.class, headerGenerator.getClass());
}
public static class TestHeaderGenerator implements MailHeaderGenerator {
public void populateMailMessageHeader(MailMessage mailMessage, Message<?> message) {
}
}
}

View File

@@ -7,15 +7,12 @@
http://www.springframework.org/schema/integration/mail
http://www.springframework.org/schema/integration/mail/spring-integration-mail-1.0.xsd">
<mail:outbound-channel-adapter id="adapterWithMailSenderReference" mail-sender="mailSender"/>
<mail:outbound-channel-adapter id="adapterWithMailSenderReference"
mail-sender="mailSender"/>
<mail:outbound-channel-adapter id="adapterWithHostProperty"
host="somehost" username="someuser" password="somepassword"/>
<mail:outbound-channel-adapter id="adapterWithHeaderGeneratorReference"
mail-sender="mailSender"
header-generator="testHeaderGenerator"/>
<bean id="mailSender" class="org.springframework.integration.mail.StubJavaMailSender">
<constructor-arg>
<bean class="javax.mail.internet.MimeMessage">
@@ -24,6 +21,4 @@
</constructor-arg>
</bean>
<bean id="testHeaderGenerator" class="org.springframework.integration.mail.config.MailOutboundChannelAdapterParserTests$TestHeaderGenerator"/>
</beans>

View File

@@ -17,27 +17,6 @@
<bean id="mailSendingMessageConsumer" class="org.springframework.integration.mail.MailSendingMessageConsumer">
<constructor-arg ref="javaMailSender"/>
<property name="headerGenerator">
<bean class="org.springframework.integration.mail.StaticMailHeaderGenerator">
<property name="subject">
<util:constant static-field="org.springframework.integration.mail.MailTestsHelper.SUBJECT"/>
</property>
<property name="to">
<util:constant static-field="org.springframework.integration.mail.MailTestsHelper.TO"/>
</property>
<property name="cc">
<util:constant static-field="org.springframework.integration.mail.MailTestsHelper.CC"/>
</property>
<property name="bcc">
<util:constant static-field="org.springframework.integration.mail.MailTestsHelper.BCC"/>
</property>
<property name="from">
<util:constant static-field="org.springframework.integration.mail.MailTestsHelper.FROM"/>
</property>
<property name="replyTo">
<util:constant static-field="org.springframework.integration.mail.MailTestsHelper.REPLY_TO"/>
</property>
</bean>
</property>
</bean>
</beans>