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: [email protected]
For additional commands, e-mail: [email protected]