diff --git a/spring-integration-mail/src/main/java/org/springframework/integration/mail/AbstractMailReceiver.java b/spring-integration-mail/src/main/java/org/springframework/integration/mail/AbstractMailReceiver.java index 2aafdc86a7..ec90845c46 100755 --- a/spring-integration-mail/src/main/java/org/springframework/integration/mail/AbstractMailReceiver.java +++ b/spring-integration-mail/src/main/java/org/springframework/integration/mail/AbstractMailReceiver.java @@ -34,6 +34,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.integration.context.IntegrationObjectSupport; import org.springframework.util.Assert; /** @@ -45,7 +47,7 @@ import org.springframework.util.Assert; * @author Iwein Fuld * @author Oleg Zhurakousky */ -public abstract class AbstractMailReceiver implements MailReceiver, DisposableBean { +public abstract class AbstractMailReceiver extends IntegrationObjectSupport implements MailReceiver, DisposableBean{ protected final Log logger = LogFactory.getLog(this.getClass()); @@ -63,7 +65,7 @@ public abstract class AbstractMailReceiver implements MailReceiver, DisposableBe private volatile boolean shouldDeleteMessages = false; - private volatile boolean shouldMarkMessagesAsRead = false; + private volatile Boolean shouldMarkMessagesAsRead; private volatile Properties javaMailProperties = new Properties(); @@ -153,14 +155,14 @@ public abstract class AbstractMailReceiver implements MailReceiver, DisposableBe * Check if messages should be marked as read * @return */ - public boolean isShouldMarkMessagesAsRead() { + public Boolean isShouldMarkMessagesAsRead() { return shouldMarkMessagesAsRead; } /** * Specify is messages should be marked as read * @return */ - public void setShouldMarkMessagesAsRead(boolean shouldMarkMessagesAsRead) { + public void setShouldMarkMessagesAsRead(Boolean shouldMarkMessagesAsRead) { this.shouldMarkMessagesAsRead = shouldMarkMessagesAsRead; } @@ -251,7 +253,7 @@ public abstract class AbstractMailReceiver implements MailReceiver, DisposableBe Message[] copiedMessages = new Message[messages.length]; for (int i = 0; i < messages.length; i++) { - if (this.isShouldMarkMessagesAsRead()){ + if (this.shouldMarkMessagesAsRead){ messages[i].setFlag(Flag.SEEN, true); } copiedMessages[i] = new MimeMessage((MimeMessage) messages[i]); @@ -312,5 +314,4 @@ public abstract class AbstractMailReceiver implements MailReceiver, DisposableBe public String toString() { return this.url.toString(); } - } diff --git a/spring-integration-mail/src/main/java/org/springframework/integration/mail/ImapMailReceiver.java b/spring-integration-mail/src/main/java/org/springframework/integration/mail/ImapMailReceiver.java index 78ba075fce..8c5a26a959 100755 --- a/spring-integration-mail/src/main/java/org/springframework/integration/mail/ImapMailReceiver.java +++ b/spring-integration-mail/src/main/java/org/springframework/integration/mail/ImapMailReceiver.java @@ -161,5 +161,7 @@ public class ImapMailReceiver extends AbstractMailReceiver { } } } - + protected void onInit() throws Exception { + this.setShouldMarkMessagesAsRead(this.isShouldMarkMessagesAsRead() == null ? true : this.isShouldMarkMessagesAsRead()); + } } diff --git a/spring-integration-mail/src/main/java/org/springframework/integration/mail/config/ImapIdleChannelAdapterParser.java b/spring-integration-mail/src/main/java/org/springframework/integration/mail/config/ImapIdleChannelAdapterParser.java index 607581bf46..1662c91b19 100644 --- a/spring-integration-mail/src/main/java/org/springframework/integration/mail/config/ImapIdleChannelAdapterParser.java +++ b/spring-integration-mail/src/main/java/org/springframework/integration/mail/config/ImapIdleChannelAdapterParser.java @@ -80,8 +80,10 @@ public class ImapIdleChannelAdapterParser extends AbstractSingleBeanDefinitionPa } IntegrationNamespaceUtils.setValueIfAttributeDefined(receiverBuilder, element, "max-fetch-size"); receiverBuilder.addPropertyValue("shouldDeleteMessages", element.getAttribute("should-delete-messages")); - receiverBuilder.addPropertyValue("shouldMarkMessagesAsRead", element.getAttribute("should-mark-messages-as-read")); - return receiverBuilder.getBeanDefinition(); + String markAsRead = element.getAttribute("should-mark-messages-as-read"); + if (StringUtils.hasText(markAsRead)){ + receiverBuilder.addPropertyValue("shouldMarkMessagesAsRead", markAsRead); + } + return receiverBuilder.getBeanDefinition(); } - } diff --git a/spring-integration-mail/src/main/java/org/springframework/integration/mail/config/MailInboundChannelAdapterParser.java b/spring-integration-mail/src/main/java/org/springframework/integration/mail/config/MailInboundChannelAdapterParser.java index 7f717f7ad7..477422c445 100644 --- a/spring-integration-mail/src/main/java/org/springframework/integration/mail/config/MailInboundChannelAdapterParser.java +++ b/spring-integration-mail/src/main/java/org/springframework/integration/mail/config/MailInboundChannelAdapterParser.java @@ -81,7 +81,11 @@ public class MailInboundChannelAdapterParser extends AbstractPollingInboundChann } } receiverBuilder.addPropertyValue("shouldDeleteMessages", element.getAttribute("should-delete-messages")); - receiverBuilder.addPropertyValue("shouldMarkMessagesAsRead", element.getAttribute("should-mark-messages-as-read")); + String markAsRead = element.getAttribute("should-mark-messages-as-read"); + if (StringUtils.hasText(markAsRead)){ + receiverBuilder.addPropertyValue("shouldMarkMessagesAsRead", markAsRead); + } + return receiverBuilder.getBeanDefinition(); } diff --git a/spring-integration-mail/src/main/java/org/springframework/integration/mail/config/MailReceiverFactoryBean.java b/spring-integration-mail/src/main/java/org/springframework/integration/mail/config/MailReceiverFactoryBean.java index bf3cba56ca..fd7c948d17 100644 --- a/spring-integration-mail/src/main/java/org/springframework/integration/mail/config/MailReceiverFactoryBean.java +++ b/spring-integration-mail/src/main/java/org/springframework/integration/mail/config/MailReceiverFactoryBean.java @@ -38,7 +38,7 @@ import org.springframework.util.StringUtils; * @author Oleg Zhurakousky * @since 1.0.3 */ -public class MailReceiverFactoryBean implements FactoryBean, DisposableBean { +public class MailReceiverFactoryBean implements FactoryBean, DisposableBean{ protected final Log logger = LogFactory.getLog(this.getClass()); private volatile String storeUri; @@ -59,7 +59,7 @@ public class MailReceiverFactoryBean implements FactoryBean, Dispo */ private volatile Boolean shouldDeleteMessages = null; - private volatile boolean shouldMarkMessagesAsRead; + private volatile Boolean shouldMarkMessagesAsRead = null; private volatile int maxFetchSize = 1; @@ -147,11 +147,14 @@ public class MailReceiverFactoryBean implements FactoryBean, Dispo receiver.setShouldDeleteMessages(this.shouldDeleteMessages); } receiver.setMaxFetchSize(this.maxFetchSize); - if (isPop3 && this.shouldMarkMessagesAsRead){ - logger.warn("Setting 'should-mark-messages-as-read' to 'true' while using POP3 has no effect"); - } else { - receiver.setShouldMarkMessagesAsRead(this.shouldMarkMessagesAsRead); - } + + if (this.isShouldMarkMessagesAsRead()){ + if (isPop3){ + logger.warn("Setting 'should-mark-messages-as-read' to 'true' while using POP3 has no effect"); + } else if (isImap){ + receiver.setShouldMarkMessagesAsRead(this.shouldMarkMessagesAsRead); + } + } return receiver; } @@ -160,13 +163,12 @@ public class MailReceiverFactoryBean implements FactoryBean, Dispo ((DisposableBean) this.receiver).destroy(); } } - - public boolean isShouldMarkMessagesAsRead() { - return shouldMarkMessagesAsRead; + + public Boolean isShouldMarkMessagesAsRead() { + return shouldMarkMessagesAsRead != null && shouldMarkMessagesAsRead; } - public void setShouldMarkMessagesAsRead(boolean shouldMarkMessagesAsRead) { + public void setShouldMarkMessagesAsRead(Boolean shouldMarkMessagesAsRead) { this.shouldMarkMessagesAsRead = shouldMarkMessagesAsRead; } - } diff --git a/spring-integration-mail/src/test/java/org/springframework/integration/mail/AbstractMailReceiverTests.java b/spring-integration-mail/src/test/java/org/springframework/integration/mail/AbstractMailReceiverTests.java index 5993ebc710..f97cea81d6 100644 --- a/spring-integration-mail/src/test/java/org/springframework/integration/mail/AbstractMailReceiverTests.java +++ b/spring-integration-mail/src/test/java/org/springframework/integration/mail/AbstractMailReceiverTests.java @@ -102,6 +102,7 @@ public class AbstractMailReceiverTests { @Test public void receieveAndDontMarkAsRead() throws Exception{ AbstractMailReceiver receiver = new ImapMailReceiver(); + receiver.setShouldMarkMessagesAsRead(false); receiver = spy(receiver); Message msg1 = mock(MimeMessage.class); Message msg2 = mock(MimeMessage.class); @@ -124,6 +125,7 @@ public class AbstractMailReceiverTests { return null; } }).when(receiver).fetchMessages(messages); + receiver.afterPropertiesSet(); receiver.receive(); verify(msg1, times(0)).setFlag(Flag.SEEN, true); verify(msg2, times(0)).setFlag(Flag.SEEN, true); diff --git a/spring-integration-mail/src/test/java/org/springframework/integration/mail/ImapMailSearchTermsTests.java b/spring-integration-mail/src/test/java/org/springframework/integration/mail/ImapMailSearchTermsTests.java index 326e2d8b49..324d7fd493 100644 --- a/spring-integration-mail/src/test/java/org/springframework/integration/mail/ImapMailSearchTermsTests.java +++ b/spring-integration-mail/src/test/java/org/springframework/integration/mail/ImapMailSearchTermsTests.java @@ -69,6 +69,8 @@ public class ImapMailSearchTermsTests { @Test public void validateSearchTermsWhenShouldNotMarkAsReadNoExistingFlags() throws Exception { ImapMailReceiver receiver = new ImapMailReceiver(); + receiver.setShouldMarkMessagesAsRead(false); + receiver.afterPropertiesSet(); Method compileSearchTerms = ReflectionUtils.findMethod(receiver.getClass(), "compileSearchTerms", Flags.class); compileSearchTerms.setAccessible(true); Flags flags = new Flags(); @@ -78,6 +80,8 @@ public class ImapMailSearchTermsTests { @Test public void validateSearchTermsWhenShouldNotMarkAsReadWithExistingFlags() throws Exception { ImapMailReceiver receiver = new ImapMailReceiver(); + receiver.setShouldMarkMessagesAsRead(false); + receiver.afterPropertiesSet(); Method compileSearchTerms = ReflectionUtils.findMethod(receiver.getClass(), "compileSearchTerms", Flags.class); compileSearchTerms.setAccessible(true); Flags flags = new Flags(); diff --git a/spring-integration-mail/src/test/java/org/springframework/integration/mail/config/ImapIdleChannelAdapterParserTests-context.xml b/spring-integration-mail/src/test/java/org/springframework/integration/mail/config/ImapIdleChannelAdapterParserTests-context.xml index 7c4d050f99..7454a73067 100644 --- a/spring-integration-mail/src/test/java/org/springframework/integration/mail/config/ImapIdleChannelAdapterParserTests-context.xml +++ b/spring-integration-mail/src/test/java/org/springframework/integration/mail/config/ImapIdleChannelAdapterParserTests-context.xml @@ -39,6 +39,13 @@ auto-startup="false" should-delete-messages="true" should-mark-messages-as-read="true"/> + + @@ -95,6 +95,10 @@ + + + + diff --git a/spring-integration-mail/src/test/java/org/springframework/integration/mail/config/InboundChannelAdapterParserTests.java b/spring-integration-mail/src/test/java/org/springframework/integration/mail/config/InboundChannelAdapterParserTests.java index 4aafc8778a..f23005bf0a 100644 --- a/spring-integration-mail/src/test/java/org/springframework/integration/mail/config/InboundChannelAdapterParserTests.java +++ b/spring-integration-mail/src/test/java/org/springframework/integration/mail/config/InboundChannelAdapterParserTests.java @@ -65,11 +65,27 @@ public class InboundChannelAdapterParserTests { } @Test - public void pop3ShouldMarkMessagesAsRead() { + public void pop3IgnoreMarkAsReadWithTrue() { AbstractMailReceiver receiver = this.getReceiver("pop3ShouldMarkAsReadTrue"); assertEquals(Pop3MailReceiver.class, receiver.getClass()); Boolean value = (Boolean) new DirectFieldAccessor(receiver).getPropertyValue("shouldMarkMessagesAsRead"); - assertFalse(value); + assertNull(value); + } + + @Test + public void pop3IgnoreMarkAsReadWithFalse() { + AbstractMailReceiver receiver = this.getReceiver("pop3ShouldMarkAsReadFalse"); + assertEquals(Pop3MailReceiver.class, receiver.getClass()); + Boolean value = (Boolean) new DirectFieldAccessor(receiver).getPropertyValue("shouldMarkMessagesAsRead"); + assertNull(value); + } + + @Test + public void imapShouldMarkMessagesAsRead() { + AbstractMailReceiver receiver = this.getReceiver("imapShouldMarkAsReadTrue"); + assertEquals(ImapMailReceiver.class, receiver.getClass()); + Boolean value = (Boolean) new DirectFieldAccessor(receiver).getPropertyValue("shouldMarkMessagesAsRead"); + assertTrue(value); } @Test