Author: matthieu Date: Fri Dec 11 12:34:56 2015 New Revision: 1719392 URL: http://svn.apache.org/viewvc?rev=1719392&view=rev Log: JAMES-1644 prevent StoreMessageResultIterator from throwing on next when there are elements
Modified: james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageResultIteratorTest.java Modified: james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java?rev=1719392&r1=1719391&r2=1719392&view=diff ============================================================================== --- james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java (original) +++ james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java Fri Dec 11 12:34:56 2015 @@ -150,8 +150,9 @@ public class StoreMessageResultIterator< @Override public MessageResult next() { - if (next == null || !next.hasNext()) + if (!hasNext()) { throw new NoSuchElementException(); + } final Message<Id> message = next.next(); MessageResult result; Modified: james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageResultIteratorTest.java URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageResultIteratorTest.java?rev=1719392&r1=1719391&r2=1719392&view=diff ============================================================================== --- james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageResultIteratorTest.java (original) +++ james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageResultIteratorTest.java Fri Dec 11 12:34:56 2015 @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.NoSuchElementException; import java.util.Set; import javax.mail.Flags; @@ -46,124 +47,134 @@ import org.junit.Test; public class StoreMessageResultIteratorTest { - @Test - public void testBatching() { - MessageRange range = MessageRange.range(1, 10); - int batchSize = 3; - StoreMessageResultIterator<TestId> it = new StoreMessageResultIterator<TestId>(new MessageMapper<TestId>() { + private final class TestFetchGroup implements FetchGroup { + @Override + public Set<PartContentDescriptor> getPartContentDescriptors() { + return null; + } + + @Override + public int content() { + return FetchGroup.MINIMAL; + } + } - @Override - public void endRequest() { - throw new UnsupportedOperationException(); - } + private final class TestMessageMapper implements MessageMapper<TestId> { + - @Override - public <T> T execute(Transaction<T> transaction) throws MailboxException { - throw new UnsupportedOperationException(); - } + private final MessageRange messageRange; - @Override - public Iterator<Message<TestId>> findInMailbox(Mailbox<TestId> mailbox, MessageRange set, - org.apache.james.mailbox.store.mail.MessageMapper.FetchType type, int limit) - throws MailboxException { - long start = set.getUidFrom(); - long end = set.getUidTo(); - long calcEnd = start + limit; - if (calcEnd > end) { - calcEnd = end + 1; - } - - List<Message<TestId>> messages = new ArrayList<Message<TestId>>(); - long i = start; - while (i < calcEnd) { - long uid = i; - SimpleMessage<TestId> m = new SimpleMessage<TestId>(null, 0, 0, new SharedByteArrayInputStream( - "".getBytes()), new Flags(), new PropertyBuilder(), TestId.of(1L)); - m.setUid(uid); - messages.add(m); - i++; + public TestMessageMapper(MessageRange messageRange) { + this.messageRange = messageRange; + } + + @Override + public void endRequest() { + throw new UnsupportedOperationException(); + } + + @Override + public <T> T execute(Transaction<T> transaction) throws MailboxException { + throw new UnsupportedOperationException(); + } + + @Override + public Iterator<Message<TestId>> findInMailbox(Mailbox<TestId> mailbox, MessageRange set, + org.apache.james.mailbox.store.mail.MessageMapper.FetchType type, int limit) + throws MailboxException { + + long start = set.getUidFrom(); + long end = Math.min(start + limit, set.getUidTo()); + + List<Message<TestId>> messages = new ArrayList<Message<TestId>>(); + + for (long uid: MessageRange.range(start, end)) { + if (messageRange.includes(uid)) { + messages.add(createMessage(uid)); } - return messages.iterator(); - } - - @Override - public Map<Long, MessageMetaData> expungeMarkedForDeletionInMailbox(Mailbox<TestId> mailbox, MessageRange set) - throws MailboxException { - throw new UnsupportedOperationException(); - - } - - @Override - public long countMessagesInMailbox(Mailbox<TestId> mailbox) throws MailboxException { - throw new UnsupportedOperationException(); - } + return messages.iterator(); + } - @Override - public long countUnseenMessagesInMailbox(Mailbox<TestId> mailbox) throws MailboxException { - throw new UnsupportedOperationException(); - } + private SimpleMessage<TestId> createMessage(long uid) { + SimpleMessage<TestId> message = new SimpleMessage<TestId>(null, 0, 0, new SharedByteArrayInputStream( + "".getBytes()), new Flags(), new PropertyBuilder(), TestId.of(1L)); + message.setUid(uid); + return message; + } + + @Override + public Map<Long, MessageMetaData> expungeMarkedForDeletionInMailbox(Mailbox<TestId> mailbox, MessageRange set) + throws MailboxException { + throw new UnsupportedOperationException(); + + } + + @Override + public long countMessagesInMailbox(Mailbox<TestId> mailbox) throws MailboxException { + throw new UnsupportedOperationException(); + + } + + @Override + public long countUnseenMessagesInMailbox(Mailbox<TestId> mailbox) throws MailboxException { + throw new UnsupportedOperationException(); + } + + @Override + public void delete(Mailbox<TestId> mailbox, Message<TestId> message) throws MailboxException { + throw new UnsupportedOperationException(); + } + + @Override + public Long findFirstUnseenMessageUid(Mailbox<TestId> mailbox) throws MailboxException { + throw new UnsupportedOperationException(); + } + + @Override + public List<Long> findRecentMessageUidsInMailbox(Mailbox<TestId> mailbox) throws MailboxException { + throw new UnsupportedOperationException(); + + } + + @Override + public MessageMetaData add(Mailbox<TestId> mailbox, Message<TestId> message) throws MailboxException { + throw new UnsupportedOperationException(); + } + + @Override + public Iterator<UpdatedFlags> updateFlags(Mailbox<TestId> mailbox, FlagsUpdateCalculator calculator, MessageRange set) throws MailboxException { + throw new UnsupportedOperationException(); + } + + @Override + public MessageMetaData copy(Mailbox<TestId> mailbox, Message<TestId> original) throws MailboxException { + throw new UnsupportedOperationException(); + + } + + @Override + public long getLastUid(Mailbox<TestId> mailbox) throws MailboxException { + throw new UnsupportedOperationException(); + } + + @Override + public long getHighestModSeq(Mailbox<TestId> mailbox) throws MailboxException { + throw new UnsupportedOperationException(); + } + + @Override + public MessageMetaData move(Mailbox<TestId> mailbox, Message<TestId> original) throws MailboxException { + throw new UnsupportedOperationException(); - @Override - public void delete(Mailbox<TestId> mailbox, Message<TestId> message) throws MailboxException { - throw new UnsupportedOperationException(); - } - - @Override - public Long findFirstUnseenMessageUid(Mailbox<TestId> mailbox) throws MailboxException { - throw new UnsupportedOperationException(); - } - - @Override - public List<Long> findRecentMessageUidsInMailbox(Mailbox<TestId> mailbox) throws MailboxException { - throw new UnsupportedOperationException(); - - } - - @Override - public MessageMetaData add(Mailbox<TestId> mailbox, Message<TestId> message) throws MailboxException { - throw new UnsupportedOperationException(); - } - - @Override - public Iterator<UpdatedFlags> updateFlags(Mailbox<TestId> mailbox, FlagsUpdateCalculator calculator, MessageRange set) throws MailboxException { - throw new UnsupportedOperationException(); - } - - @Override - public MessageMetaData copy(Mailbox<TestId> mailbox, Message<TestId> original) throws MailboxException { - throw new UnsupportedOperationException(); - - } - - @Override - public long getLastUid(Mailbox<TestId> mailbox) throws MailboxException { - throw new UnsupportedOperationException(); - } - - @Override - public long getHighestModSeq(Mailbox<TestId> mailbox) throws MailboxException { - throw new UnsupportedOperationException(); - } - - @Override - public MessageMetaData move(Mailbox<TestId> mailbox, Message<TestId> original) throws MailboxException { - throw new UnsupportedOperationException(); - - } - - }, null, range, batchSize, new FetchGroup() { - - @Override - public Set<PartContentDescriptor> getPartContentDescriptors() { - return null; - } + } + } - @Override - public int content() { - return FetchGroup.MINIMAL; - } - }); + @Test + public void testBatching() { + MessageRange range = MessageRange.range(1, 10); + int batchSize = 3; + StoreMessageResultIterator<TestId> it = new StoreMessageResultIterator<TestId>(new TestMessageMapper(MessageRange.all()), null, range, batchSize, new TestFetchGroup()); assertThat(it).extracting(new Extractor<MessageResult, Long>(){ @Override @@ -173,4 +184,29 @@ public class StoreMessageResultIteratorT }).containsExactly(1l, 2l, 3l, 4l, 5l, 6l, 7l, 8l, 9l, 10l); } + @Test + public void nextShouldReturnFirstElement() { + MessageRange range = MessageRange.one(1); + int batchSize = 42; + StoreMessageResultIterator<TestId> iterator = new StoreMessageResultIterator<TestId>(new TestMessageMapper(range), null, range, batchSize, new TestFetchGroup()); + assertThat(iterator.next()).isNotNull(); + } + + @Test(expected=NoSuchElementException.class) + public void nextShouldThrowWhenNoElement() { + MessageRange messages = MessageRange.one(1); + MessageRange findRange = MessageRange.one(2); + int batchSize = 42; + StoreMessageResultIterator<TestId> iterator = new StoreMessageResultIterator<TestId>(new TestMessageMapper(messages), null, findRange, batchSize, new TestFetchGroup()); + iterator.next(); + } + + @Test + public void hasNextShouldReturnFalseWhenNoElement() { + MessageRange messages = MessageRange.one(1); + MessageRange findRange = MessageRange.one(2); + int batchSize = 42; + StoreMessageResultIterator<TestId> iterator = new StoreMessageResultIterator<TestId>(new TestMessageMapper(messages), null, findRange, batchSize, new TestFetchGroup()); + assertThat(iterator.hasNext()).isFalse(); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org