MailTarget is now MailSendingMessageConsumer, and the "integration/mail" namespace now defines an "outbound-channel-adapter" element.

This commit is contained in:
Mark Fisher
2008-09-22 18:51:34 +00:00
parent 866b4ab3f8
commit bf151ac50a
9 changed files with 78 additions and 76 deletions

View File

@@ -18,8 +18,8 @@ package org.springframework.integration.mail;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageConsumer;
import org.springframework.integration.message.MessageMapper;
import org.springframework.integration.message.MessageTarget;
import org.springframework.mail.MailMessage;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
@@ -27,12 +27,12 @@ import org.springframework.mail.javamail.MimeMailMessage;
import org.springframework.util.Assert;
/**
* A target adapter for sending mail.
* A {@link MessageConsumer} implementation for sending mail.
*
* @author Marius Bogoevici
* @author Mark Fisher
*/
public class MailTarget implements MessageTarget, InitializingBean {
public class MailSendingMessageConsumer implements MessageConsumer, InitializingBean {
private final JavaMailSender mailSender;
@@ -46,12 +46,12 @@ public class MailTarget implements MessageTarget, InitializingBean {
/**
* Create a MailTargetAdapter.
* Create a MailSendingMessageConsumer.
*
* @param mailSender the {@link JavaMailSender} instance to which this
* adapter will delegate.
*/
public MailTarget(JavaMailSender mailSender) {
public MailSendingMessageConsumer(JavaMailSender mailSender) {
Assert.notNull(mailSender, "'mailSender' must not be null");
this.mailSender = mailSender;
}
@@ -83,11 +83,10 @@ public class MailTarget implements MessageTarget, InitializingBean {
this.objectMessageMapper = objectMessageMapper;
}
public final boolean send(Message<?> message) {
public final void onMessage(Message<?> message) {
MailMessage mailMessage = this.convertMessageToMailMessage(message);
this.mailHeaderGenerator.populateMailMessageHeader(mailMessage, message);
this.sendMailMessage(mailMessage);
return true;
}
@SuppressWarnings("unchecked")

View File

@@ -26,7 +26,7 @@ import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class MailNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
this.registerBeanDefinitionParser("mail-target", new MailTargetParser());
this.registerBeanDefinitionParser("outbound-channel-adapter", new MailOutboundChannelAdapterParser());
this.registerBeanDefinitionParser("polling-mail-source", new PollingMailSourceParser());
this.registerBeanDefinitionParser("imap-idle-mail-source", new SubscribableImapIdleMailSourceParser());
}

View File

@@ -19,33 +19,28 @@ package org.springframework.integration.mail.config;
import org.w3c.dom.Element;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.ConfigurationException;
import org.springframework.integration.mail.MailTarget;
import org.springframework.integration.config.AbstractOutboundChannelAdapterParser;
import org.springframework.integration.mail.MailSendingMessageConsumer;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.util.StringUtils;
/**
* Parser for the &lt;mail-target/&gt; element.
* Parser for the &lt;outbound-channel-adapter/&gt; element of the 'mail' namespace.
*
* @author Mark Fisher
*/
public class MailTargetParser extends AbstractSingleBeanDefinitionParser {
public class MailOutboundChannelAdapterParser extends AbstractOutboundChannelAdapterParser {
protected Class<?> getBeanClass(Element element) {
return MailTarget.class;
return MailSendingMessageConsumer.class;
}
protected boolean shouldGenerateId() {
return false;
}
protected boolean shouldGenerateIdAsFallback() {
return true;
}
protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
@Override
protected String parseConsumer(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MailSendingMessageConsumer.class);
String mailSenderRef = element.getAttribute("mail-sender");
String host = element.getAttribute("host");
String username = element.getAttribute("username");
@@ -75,6 +70,8 @@ public class MailTargetParser extends AbstractSingleBeanDefinitionParser {
if (StringUtils.hasText(headerGeneratorRef)) {
builder.addPropertyReference("headerGenerator", headerGeneratorRef);
}
return BeanDefinitionReaderUtils.registerWithGeneratedName(
builder.getBeanDefinition(), parserContext.getRegistry());
}
}

View File

@@ -16,11 +16,11 @@
]]></xsd:documentation>
</xsd:annotation>
<xsd:element name="mail-target">
<xsd:element name="outbound-channel-adapter">
<xsd:complexType>
<xsd:annotation>
<xsd:documentation>
Defines a mail-sending target.
Defines an outbound mail-sending Channel Adapter.
</xsd:documentation>
</xsd:annotation>
<xsd:attribute name="id" type="xsd:string"/>
@@ -31,7 +31,7 @@
<xsd:attribute name="password" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="polling-mail-source">
<xsd:complexType>
<xsd:annotation>
@@ -44,12 +44,12 @@
<xsd:attribute name="mail-convertor" type="xsd:string" use="optional"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="imap-idle-mail-source">
<xsd:complexType>
<xsd:annotation>
<xsd:documentation>
Defines a polling mail source.
Defines an IMAP mail source.
</xsd:documentation>
</xsd:annotation>
<xsd:attribute name="id" type="xsd:string" use="required"/>

View File

@@ -31,7 +31,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.mail.MailTarget;
import org.springframework.integration.mail.MailSendingMessageConsumer;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.StringMessage;
import org.springframework.mail.SimpleMailMessage;
@@ -42,11 +42,11 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
* @author Marius Bogoevici
*/
@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/org/springframework/integration/mail/mailTarget.xml"})
public class MailTargetContextTests {
@ContextConfiguration(locations = {"classpath:/org/springframework/integration/mail/mailSendingMessageConsumerContextTests.xml"})
public class MailSendingMessageConsumerContextTests {
@Autowired
private MailTarget mailTarget;
private MailSendingMessageConsumer consumer;
@Autowired
private StubJavaMailSender mailSender;
@@ -59,7 +59,7 @@ public class MailTargetContextTests {
@Test
public void testStringMesssagesWithConfiguration() {
this.mailTarget.send(new StringMessage(MailTestsHelper.MESSAGE_TEXT));
this.consumer.onMessage(new StringMessage(MailTestsHelper.MESSAGE_TEXT));
SimpleMailMessage message = MailTestsHelper.createSimpleMailMessage();
assertEquals("no mime message should have been sent",
0, this.mailSender.getSentMimeMessages().size());
@@ -72,13 +72,13 @@ public class MailTargetContextTests {
@Test
public void testByteArrayMessage() throws Exception {
byte[] payload = {1, 2, 3};
mailTarget.send(new GenericMessage<byte[]>(payload));
this.consumer.onMessage(new GenericMessage<byte[]>(payload));
assertEquals("no mime message should have been sent",
1, mailSender.getSentMimeMessages().size());
1, this.mailSender.getSentMimeMessages().size());
assertEquals("only one simple message must be sent",
0, mailSender.getSentSimpleMailMessages().size());
0, this.mailSender.getSentSimpleMailMessages().size());
byte[] buffer = new byte[1024];
MimeMessage mimeMessage = mailSender.getSentMimeMessages().get(0);
MimeMessage mimeMessage = this.mailSender.getSentMimeMessages().get(0);
assertTrue("message must be multipart", mimeMessage.getContent() instanceof Multipart);
int size = new DataInputStream(((Multipart) mimeMessage.getContent()).getBodyPart(0).getInputStream()).read(buffer);
assertEquals("buffer size does not match", payload.length, size);

View File

@@ -32,7 +32,7 @@ import org.junit.Before;
import org.junit.Test;
import org.springframework.integration.mail.MailHeaders;
import org.springframework.integration.mail.MailTarget;
import org.springframework.integration.mail.MailSendingMessageConsumer;
import org.springframework.integration.mail.StaticMailHeaderGenerator;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.MessageBuilder;
@@ -42,9 +42,9 @@ import org.springframework.mail.SimpleMailMessage;
/**
* @author Marius Bogoevici
*/
public class MailTargetTests {
public class MailSendingMessageConsumerTests {
private MailTarget mailTarget;
private MailSendingMessageConsumer consumer;
private StubJavaMailSender mailSender;
@@ -61,14 +61,20 @@ public class MailTargetTests {
this.staticMailHeaderGenerator.setReplyTo(MailTestsHelper.REPLY_TO);
this.staticMailHeaderGenerator.setSubject(MailTestsHelper.SUBJECT);
this.staticMailHeaderGenerator.setTo(MailTestsHelper.TO);
this.mailTarget = new MailTarget(this.mailSender);
this.mailTarget.afterPropertiesSet();
this.consumer = new MailSendingMessageConsumer(this.mailSender);
this.consumer.afterPropertiesSet();
}
@After
public void reset() {
this.mailSender.reset();
}
@Test
public void testTextMessage() {
this.mailTarget.setHeaderGenerator(this.staticMailHeaderGenerator);
this.mailTarget.send(new StringMessage(MailTestsHelper.MESSAGE_TEXT));
this.consumer.setHeaderGenerator(this.staticMailHeaderGenerator);
this.consumer.onMessage(new StringMessage(MailTestsHelper.MESSAGE_TEXT));
SimpleMailMessage message = MailTestsHelper.createSimpleMailMessage();
assertEquals("no mime message should have been sent",
0, mailSender.getSentMimeMessages().size());
@@ -80,9 +86,9 @@ public class MailTargetTests {
@Test
public void testByteArrayMessage() throws Exception {
this.mailTarget.setHeaderGenerator(this.staticMailHeaderGenerator);
this.consumer.setHeaderGenerator(this.staticMailHeaderGenerator);
byte[] payload = {1, 2, 3};
this.mailTarget.send(new GenericMessage<byte[]>(payload));
this.consumer.onMessage(new GenericMessage<byte[]>(payload));
byte[] buffer = new byte[1024];
MimeMessage mimeMessage = this.mailSender.getSentMimeMessages().get(0);
assertTrue("message must be multipart", mimeMessage.getContent() instanceof Multipart);
@@ -104,7 +110,7 @@ public class MailTargetTests {
.setHeader(MailHeaders.BCC, MailTestsHelper.BCC)
.setHeader(MailHeaders.FROM, MailTestsHelper.FROM)
.setHeader(MailHeaders.REPLY_TO, MailTestsHelper.REPLY_TO).build();
this.mailTarget.send(message);
this.consumer.onMessage(message);
SimpleMailMessage mailMessage = MailTestsHelper.createSimpleMailMessage();
assertEquals("no mime message should have been sent",
0, mailSender.getSentMimeMessages().size());
@@ -114,9 +120,4 @@ public class MailTargetTests {
mailMessage, mailSender.getSentSimpleMailMessages().get(0));
}
@After
public void reset() {
this.mailSender.reset();
}
}

View File

@@ -25,7 +25,7 @@ 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.MailTarget;
import org.springframework.integration.mail.MailSendingMessageConsumer;
import org.springframework.integration.message.Message;
import org.springframework.mail.MailMessage;
import org.springframework.mail.MailSender;
@@ -33,36 +33,42 @@ import org.springframework.mail.MailSender;
/**
* @author Mark Fisher
*/
public class MailTargetParserTests {
public class MailOutboundChannelAdapterParserTests {
@Test
public void testTargetWithMailSenderReference() {
public void adapterWithMailSenderReference() {
ApplicationContext context = new ClassPathXmlApplicationContext(
"mailTargetParserTests.xml", this.getClass());
MailTarget target = (MailTarget) context.getBean("targetWithMailSenderReference");
DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(target);
"mailOutboundChannelAdapterParserTests.xml", this.getClass());
Object adapter = context.getBean("adapterWithMailSenderReference.adapter");
MailSendingMessageConsumer consumer = (MailSendingMessageConsumer)
new DirectFieldAccessor(adapter).getPropertyValue("consumer");
DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(consumer);
MailSender mailSender = (MailSender) fieldAccessor.getPropertyValue("mailSender");
assertNotNull(mailSender);
}
@Test
public void testTargetWithHostProperty() {
public void adapterWithHostProperty() {
ApplicationContext context = new ClassPathXmlApplicationContext(
"mailTargetParserTests.xml", this.getClass());
MailTarget target = (MailTarget) context.getBean("targetWithHostProperty");
DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(target);
"mailOutboundChannelAdapterParserTests.xml", this.getClass());
Object adapter = context.getBean("adapterWithHostProperty.adapter");
MailSendingMessageConsumer consumer = (MailSendingMessageConsumer)
new DirectFieldAccessor(adapter).getPropertyValue("consumer");
DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(consumer);
MailSender mailSender = (MailSender) fieldAccessor.getPropertyValue("mailSender");
assertNotNull(mailSender);
}
@Test
public void testTargetWithHeaderGeneratorReference() {
public void adapterWithHeaderGeneratorReference() {
ApplicationContext context = new ClassPathXmlApplicationContext(
"mailTargetParserTests.xml", this.getClass());
MailTarget target = (MailTarget) context.getBean("targetWithHeaderGeneratorReference");
DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(target);
MailHeaderGenerator headerGenerator =
(MailHeaderGenerator) fieldAccessor.getPropertyValue("mailHeaderGenerator");
"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());
}

View File

@@ -7,11 +7,15 @@
http://www.springframework.org/schema/integration/mail
http://www.springframework.org/schema/integration/mail/spring-integration-mail-1.0.xsd">
<mail:mail-target id="targetWithMailSenderReference" mail-sender="mailSender"/>
<mail:outbound-channel-adapter id="adapterWithMailSenderReference" mail-sender="mailSender"/>
<mail:mail-target id="targetWithHostProperty"
<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">
@@ -20,11 +24,6 @@
</constructor-arg>
</bean>
<mail:mail-target id="targetWithHeaderGeneratorReference"
mail-sender="mailSender"
header-generator="testHeaderGenerator"/>
<bean id="testHeaderGenerator"
class="org.springframework.integration.mail.config.MailTargetParserTests$TestHeaderGenerator"/>
<bean id="testHeaderGenerator" class="org.springframework.integration.mail.config.MailOutboundChannelAdapterParserTests$TestHeaderGenerator"/>
</beans>

View File

@@ -15,7 +15,7 @@
</constructor-arg>
</bean>
<bean id="mailTarget" class="org.springframework.integration.mail.MailTarget">
<bean id="mailSendingMessageConsumer" class="org.springframework.integration.mail.MailSendingMessageConsumer">
<constructor-arg ref="javaMailSender"/>
<property name="headerGenerator">
<bean class="org.springframework.integration.mail.StaticMailHeaderGenerator">