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 491dca8cde..56e73b4bf9 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 @@ -16,6 +16,8 @@ package org.springframework.integration.mail; +import java.util.ArrayList; +import java.util.List; import java.util.Properties; import javax.mail.Authenticator; @@ -34,6 +36,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.integration.context.IntegrationObjectSupport; import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; /** * Base class for {@link MailReceiver} implementations. @@ -228,15 +231,17 @@ public abstract class AbstractMailReceiver extends IntegrationObjectSupport impl this.fetchMessages(messages); } - Message[] copiedMessages = new Message[messages.length]; + List copiedMessages = new ArrayList(); for (int i = 0; i < messages.length; i++) { - this.setAdditionalFlags(messages[i]); - copiedMessages[i] = new MimeMessage((MimeMessage) messages[i]); + if (!messages[i].isExpunged()){ + this.setAdditionalFlags(messages[i]); + copiedMessages.add(new MimeMessage((MimeMessage) messages[i])); + } } if (this.shouldDeleteMessages()) { this.deleteMessages(messages); } - return copiedMessages; + return copiedMessages.toArray(new Message[]{}); } catch (Exception e) { throw new org.springframework.integration.MessagingException( 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/ImapMailReceiverTests.java similarity index 80% rename from spring-integration-mail/src/test/java/org/springframework/integration/mail/AbstractMailReceiverTests.java rename to spring-integration-mail/src/test/java/org/springframework/integration/mail/ImapMailReceiverTests.java index 999b1d0255..904048326a 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/ImapMailReceiverTests.java @@ -26,17 +26,19 @@ import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.springframework.beans.DirectFieldAccessor; +import static junit.framework.Assert.assertEquals; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; /** * @author Oleg Zhurakousky * */ -public class AbstractMailReceiverTests { +public class ImapMailReceiverTests { @Test public void receieveAndMarkAsReadDontDelete() throws Exception{ @@ -183,4 +185,43 @@ public class AbstractMailReceiverTests { verify(msg2, times(1)).setFlag(Flag.SEEN, true); verify(receiver, times(0)).deleteMessages((Message[]) Mockito.any()); } + @Test + /* + * This test emulates https://jira.springsource.org/browse/INT-1415 + */ + public void receieveAndDontMarkAsReadWithOneMessageExpanged() throws Exception{ + AbstractMailReceiver receiver = new ImapMailReceiver(); + ((ImapMailReceiver)receiver).setShouldMarkMessagesAsRead(false); + receiver = spy(receiver); + receiver.afterPropertiesSet(); + Message msg1 = mock(MimeMessage.class); + Message msg2 = mock(MimeMessage.class); + when(msg2.isExpunged()).thenReturn(true); + final Message[] messages = new Message[]{msg1, msg2}; + doAnswer(new Answer() { + 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_ONLY mode"); + } + return null; + } + }).when(receiver).openFolder(); + + doAnswer(new Answer() { + public Object answer(InvocationOnMock invocation) throws Throwable { + return messages; + } + }).when(receiver).searchForNewMessages(); + + doAnswer(new Answer() { + public Object answer(InvocationOnMock invocation) throws Throwable { + return null; + } + }).when(receiver).fetchMessages(messages); + receiver.afterPropertiesSet(); + Message[] receievedMessages = receiver.receive(); + assertEquals(1, receievedMessages.length); + } }