INT-1375, moved 'shouldMarkMessagesAsRead' attribute to ImapMailReceiver, added additional test for when attribute is not set onthe namespace (e.g., null in other words)

This commit is contained in:
Oleg Zhurakousky
2010-09-17 09:17:11 -04:00
parent 86a2fed240
commit 6421c1cf78
5 changed files with 102 additions and 54 deletions

View File

@@ -27,12 +27,10 @@ import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.URLName;
import javax.mail.Flags.Flag;
import javax.mail.internet.MimeMessage;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.integration.context.IntegrationObjectSupport;
import org.springframework.util.Assert;
@@ -64,7 +62,7 @@ public abstract class AbstractMailReceiver extends IntegrationObjectSupport impl
private volatile boolean shouldDeleteMessages = false;
private volatile Boolean shouldMarkMessagesAsRead;
private volatile int folderOpenMode = Folder.READ_ONLY;
private volatile Properties javaMailProperties = new Properties();
@@ -150,21 +148,6 @@ public abstract class AbstractMailReceiver extends IntegrationObjectSupport impl
public void setShouldDeleteMessages(boolean shouldDeleteMessages) {
this.shouldDeleteMessages = shouldDeleteMessages;
}
/**
* Check if messages should be marked as read
* @return
*/
public Boolean isShouldMarkMessagesAsRead() {
return shouldMarkMessagesAsRead;
}
/**
* Specify is messages should be marked as read
* @return
*/
public void setShouldMarkMessagesAsRead(Boolean shouldMarkMessagesAsRead) {
this.shouldMarkMessagesAsRead = shouldMarkMessagesAsRead;
}
/**
* Indicates whether the mail messages should be deleted after being received.
*/
@@ -223,14 +206,9 @@ public abstract class AbstractMailReceiver extends IntegrationObjectSupport impl
if (logger.isDebugEnabled()) {
logger.debug("opening folder [" + MailTransportUtils.toPasswordProtectedString(this.url) + "]");
}
if (this.shouldDeleteMessages() || this.shouldMarkMessagesAsRead) {
this.folder.open(Folder.READ_WRITE);
}
else {
this.folder.open(Folder.READ_ONLY);
}
this.folder.open(folderOpenMode);
}
public synchronized Message[] receive() {
try {
this.openFolder();
@@ -252,9 +230,7 @@ public abstract class AbstractMailReceiver extends IntegrationObjectSupport impl
Message[] copiedMessages = new Message[messages.length];
for (int i = 0; i < messages.length; i++) {
if (this.shouldMarkMessagesAsRead != null && this.shouldMarkMessagesAsRead) {
messages[i].setFlag(Flag.SEEN, true);
}
this.setAdditionalFlags(messages[i]);
copiedMessages[i] = new MimeMessage((MimeMessage) messages[i]);
}
if (this.shouldDeleteMessages()) {
@@ -313,4 +289,12 @@ public abstract class AbstractMailReceiver extends IntegrationObjectSupport impl
public String toString() {
return this.url.toString();
}
protected void setAdditionalFlags(Message message) throws MessagingException {
// nothing at the base class
}
void setFolderOpenMode(int folderOpenMode) {
this.folderOpenMode = folderOpenMode;
}
}

View File

@@ -17,6 +17,7 @@
package org.springframework.integration.mail;
import javax.mail.Flags;
import javax.mail.Flags.Flag;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
@@ -45,7 +46,7 @@ import com.sun.mail.imap.IMAPFolder;
* @author Oleg Zhurakousky
*/
public class ImapMailReceiver extends AbstractMailReceiver {
private volatile boolean shouldMarkMessagesAsRead = true;;
private final MessageCountListener messageCountListener = new SimpleMessageCountListener();
@@ -65,7 +66,20 @@ public class ImapMailReceiver extends AbstractMailReceiver {
}
}
/**
* Check if messages should be marked as read
* @return
*/
public Boolean isShouldMarkMessagesAsRead() {
return shouldMarkMessagesAsRead;
}
/**
* Specify is messages should be marked as read
* @return
*/
public void setShouldMarkMessagesAsRead(Boolean shouldMarkMessagesAsRead) {
this.shouldMarkMessagesAsRead = shouldMarkMessagesAsRead;
}
/**
* This method is unique to the IMAP receiver and only works if IMAP IDLE
* is supported (see RFC 2177 for more detail).
@@ -161,7 +175,20 @@ public class ImapMailReceiver extends AbstractMailReceiver {
}
}
}
/**
*
*/
protected void onInit() throws Exception {
this.setShouldMarkMessagesAsRead(this.isShouldMarkMessagesAsRead() == null ? true : this.isShouldMarkMessagesAsRead());
if (this.shouldMarkMessagesAsRead){
this.setFolderOpenMode(Folder.READ_WRITE);
}
}
/**
*
*/
protected void setAdditionalFlags(Message message) throws MessagingException{
if (this.shouldMarkMessagesAsRead) {
message.setFlag(Flag.SEEN, true);
}
}
}

View File

@@ -152,7 +152,7 @@ public class MailReceiverFactoryBean implements FactoryBean<MailReceiver>, Dispo
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);
((ImapMailReceiver)receiver).setShouldMarkMessagesAsRead(this.shouldMarkMessagesAsRead);
}
}
return receiver;

View File

@@ -15,6 +15,7 @@
*/
package org.springframework.integration.mail;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Flags.Flag;
import javax.mail.internet.MimeMessage;
@@ -23,6 +24,7 @@ import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.springframework.beans.DirectFieldAccessor;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
@@ -39,14 +41,20 @@ public class AbstractMailReceiverTests {
@Test
public void receieveAndMarkAsReadDontDelete() throws Exception{
AbstractMailReceiver receiver = new ImapMailReceiver();
receiver.setShouldMarkMessagesAsRead(true);
((ImapMailReceiver)receiver).setShouldMarkMessagesAsRead(true);
receiver = spy(receiver);
receiver.afterPropertiesSet();
Message msg1 = mock(MimeMessage.class);
Message msg2 = mock(MimeMessage.class);
final Message[] messages = new Message[]{msg1, msg2};
doAnswer(new Answer<Object>() {
public Object answer(InvocationOnMock invocation) throws Throwable {
// just to avoid the exception
DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock());
int folderOpenMode = (Integer) accessor.getPropertyValue("folderOpenMode");
if (folderOpenMode != Folder.READ_WRITE){
throw new IllegalArgumentException("Folder had to be open in READ_WRITE mode");
}
return null;
}
}).when(receiver).openFolder();
@@ -70,15 +78,20 @@ public class AbstractMailReceiverTests {
@Test
public void receieveMarkAsReadAndDelete() throws Exception{
AbstractMailReceiver receiver = new ImapMailReceiver();
receiver.setShouldMarkMessagesAsRead(true);
((ImapMailReceiver)receiver).setShouldMarkMessagesAsRead(true);
receiver.setShouldDeleteMessages(true);
receiver = spy(receiver);
receiver.afterPropertiesSet();
Message msg1 = mock(MimeMessage.class);
Message msg2 = mock(MimeMessage.class);
final Message[] messages = new Message[]{msg1, msg2};
doAnswer(new Answer<Object>() {
public Object answer(InvocationOnMock invocation) throws Throwable {
// just to avoid the exception
DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock());
int folderOpenMode = (Integer) accessor.getPropertyValue("folderOpenMode");
if (folderOpenMode != Folder.READ_WRITE){
throw new IllegalArgumentException("Folder had to be open in READ_WRITE mode");
}
return null;
}
}).when(receiver).openFolder();
@@ -102,14 +115,19 @@ public class AbstractMailReceiverTests {
@Test
public void receieveAndDontMarkAsRead() throws Exception{
AbstractMailReceiver receiver = new ImapMailReceiver();
receiver.setShouldMarkMessagesAsRead(false);
((ImapMailReceiver)receiver).setShouldMarkMessagesAsRead(false);
receiver = spy(receiver);
receiver.afterPropertiesSet();
Message msg1 = mock(MimeMessage.class);
Message msg2 = mock(MimeMessage.class);
final Message[] messages = new Message[]{msg1, msg2};
doAnswer(new Answer<Object>() {
public Object answer(InvocationOnMock invocation) throws Throwable {
// just to avoid the exception
DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock());
int folderOpenMode = (Integer) accessor.getPropertyValue("folderOpenMode");
if (folderOpenMode == Folder.READ_WRITE){
throw new IllegalArgumentException("Folder had to be open in READ_ONLY mode");
}
return null;
}
}).when(receiver).openFolder();
@@ -130,4 +148,39 @@ public class AbstractMailReceiverTests {
verify(msg1, times(0)).setFlag(Flag.SEEN, true);
verify(msg2, times(0)).setFlag(Flag.SEEN, true);
}
@Test
public void receieveAndIgnoreMarkAsReadDontDelete() throws Exception{
AbstractMailReceiver receiver = new ImapMailReceiver();
receiver = spy(receiver);
receiver.afterPropertiesSet();
Message msg1 = mock(MimeMessage.class);
Message msg2 = mock(MimeMessage.class);
final Message[] messages = new Message[]{msg1, msg2};
doAnswer(new Answer<Object>() {
public Object answer(InvocationOnMock invocation) throws Throwable {
DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock());
int folderOpenMode = (Integer) accessor.getPropertyValue("folderOpenMode");
if (folderOpenMode != Folder.READ_WRITE){
throw new IllegalArgumentException("Folder had to be open in READ_WRITE mode");
}
return null;
}
}).when(receiver).openFolder();
doAnswer(new Answer<Object>() {
public Object answer(InvocationOnMock invocation) throws Throwable {
return messages;
}
}).when(receiver).searchForNewMessages();
doAnswer(new Answer<Object>() {
public Object answer(InvocationOnMock invocation) throws Throwable {
return null;
}
}).when(receiver).fetchMessages(messages);
receiver.receive();
verify(msg1, times(1)).setFlag(Flag.SEEN, true);
verify(msg2, times(1)).setFlag(Flag.SEEN, true);
verify(receiver, times(0)).deleteMessages((Message[]) Mockito.any());
}
}

View File

@@ -64,22 +64,6 @@ public class InboundChannelAdapterParserTests {
assertTrue(value);
}
@Test
public void pop3IgnoreMarkAsReadWithTrue() {
AbstractMailReceiver receiver = this.getReceiver("pop3ShouldMarkAsReadTrue");
assertEquals(Pop3MailReceiver.class, receiver.getClass());
Boolean value = (Boolean) new DirectFieldAccessor(receiver).getPropertyValue("shouldMarkMessagesAsRead");
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");