INT-1436, modified 'should-mark-messages-as-read' tobe only 'true' by default for IMAP and completely ignored for other mail protocols
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -161,5 +161,7 @@ public class ImapMailReceiver extends AbstractMailReceiver {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void onInit() throws Exception {
|
||||
this.setShouldMarkMessagesAsRead(this.isShouldMarkMessagesAsRead() == null ? true : this.isShouldMarkMessagesAsRead());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ import org.springframework.util.StringUtils;
|
||||
* @author Oleg Zhurakousky
|
||||
* @since 1.0.3
|
||||
*/
|
||||
public class MailReceiverFactoryBean implements FactoryBean<MailReceiver>, DisposableBean {
|
||||
public class MailReceiverFactoryBean implements FactoryBean<MailReceiver>, DisposableBean{
|
||||
protected final Log logger = LogFactory.getLog(this.getClass());
|
||||
|
||||
private volatile String storeUri;
|
||||
@@ -59,7 +59,7 @@ public class MailReceiverFactoryBean implements FactoryBean<MailReceiver>, 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<MailReceiver>, 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<MailReceiver>, 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -39,6 +39,13 @@
|
||||
auto-startup="false"
|
||||
should-delete-messages="true"
|
||||
should-mark-messages-as-read="true"/>
|
||||
|
||||
<mail:imap-idle-channel-adapter id="simpleAdapterMarkAsReadFalse"
|
||||
store-uri="imap:foo"
|
||||
channel="channel"
|
||||
auto-startup="false"
|
||||
should-delete-messages="true"
|
||||
should-mark-messages-as-read="false"/>
|
||||
|
||||
<mail:imap-idle-channel-adapter id="customAdapter"
|
||||
store-uri="imap:foo"
|
||||
|
||||
@@ -85,6 +85,26 @@ public class ImapIdleChannelAdapterParserTests {
|
||||
assertEquals(Boolean.TRUE, receiverAccessor.getPropertyValue("shouldDeleteMessages"));
|
||||
assertEquals(Boolean.TRUE, receiverAccessor.getPropertyValue("shouldMarkMessagesAsRead"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void simpleAdapterWithMarkeMessagesAsReadFalse() {
|
||||
Object adapter = context.getBean("simpleAdapterMarkAsReadFalse");
|
||||
assertEquals(ImapIdleChannelAdapter.class, adapter.getClass());
|
||||
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
|
||||
Object channel = context.getBean("channel");
|
||||
assertSame(channel, adapterAccessor.getPropertyValue("outputChannel"));
|
||||
assertNull(adapterAccessor.getPropertyValue("taskExecutor"));
|
||||
assertEquals(Boolean.FALSE, adapterAccessor.getPropertyValue("autoStartup"));
|
||||
Object receiver = adapterAccessor.getPropertyValue("mailReceiver");
|
||||
assertEquals(ImapMailReceiver.class, receiver.getClass());
|
||||
DirectFieldAccessor receiverAccessor = new DirectFieldAccessor(receiver);
|
||||
Object url = receiverAccessor.getPropertyValue("url");
|
||||
assertEquals(new URLName("imap:foo"), url);
|
||||
Properties properties = (Properties) receiverAccessor.getPropertyValue("javaMailProperties");
|
||||
assertEquals(0, properties.size());
|
||||
assertEquals(Boolean.TRUE, receiverAccessor.getPropertyValue("shouldDeleteMessages"));
|
||||
assertEquals(Boolean.FALSE, receiverAccessor.getPropertyValue("shouldMarkMessagesAsRead"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void customAdapter() {
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
xmlns:si="http://www.springframework.org/schema/integration"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
xmlns:util="http://www.springframework.org/schema/util"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
|
||||
http://www.springframework.org/schema/integration/mail http://www.springframework.org/schema/integration/mail/spring-integration-mail.xsd
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-2.0.xsd
|
||||
http://www.springframework.org/schema/integration/mail http://www.springframework.org/schema/integration/mail/spring-integration-mail-2.0.xsd
|
||||
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
|
||||
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
|
||||
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
|
||||
@@ -95,6 +95,10 @@
|
||||
<mail:imap-idle-channel-adapter id="imapIdleWithoutStoreUri" channel="testChannel" should-delete-messages="false" auto-startup="false"/>
|
||||
|
||||
<mail:inbound-channel-adapter id="pop3ShouldMarkAsReadTrue" channel="testChannel" protocol="pop3" should-delete-messages="false" auto-startup="false" should-mark-messages-as-read="true"/>
|
||||
|
||||
<mail:inbound-channel-adapter id="pop3ShouldMarkAsReadFalse" channel="testChannel" protocol="pop3" should-delete-messages="false" auto-startup="false" should-mark-messages-as-read="false"/>
|
||||
|
||||
<mail:inbound-channel-adapter id="imapShouldMarkAsReadTrue" channel="testChannel" protocol="imap" should-delete-messages="false" auto-startup="false" should-mark-messages-as-read="true"/>
|
||||
|
||||
|
||||
<!-- COMMON CONFIGURATION -->
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user