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

Reply via email to