Author: eric
Date: Thu Jan 19 12:55:30 2012
New Revision: 1233331
URL: http://svn.apache.org/viewvc?rev=1233331&view=rev
Log:
Use a cursor on the result iterator and reread to be sure we get the remaining
batches (IMAP-350)
Modified:
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java
Modified:
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java
URL:
http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java?rev=1233331&r1=1233330&r2=1233331&view=diff
==============================================================================
---
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java
(original)
+++
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java
Thu Jan 19 12:55:30 2012
@@ -28,11 +28,11 @@ import org.apache.james.mailbox.Content;
import org.apache.james.mailbox.Headers;
import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.MessageRange;
-import org.apache.james.mailbox.MimeDescriptor;
import org.apache.james.mailbox.MessageRange.Type;
import org.apache.james.mailbox.MessageResult;
import org.apache.james.mailbox.MessageResult.FetchGroup;
import org.apache.james.mailbox.MessageResultIterator;
+import org.apache.james.mailbox.MimeDescriptor;
import org.apache.james.mailbox.store.mail.MessageMapper;
import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -45,6 +45,7 @@ public class StoreMessageResultIterator<
private Mailbox<Id> mailbox;
private FetchGroup group;
private long from;
+ private long cursor;
private long to;
private int batchSize;
private Type type;
@@ -57,6 +58,7 @@ public class StoreMessageResultIterator<
this.group = group;
this.mapper = mapper;
this.from = range.getUidFrom();
+ this.cursor = this.from;
this.to = range.getUidTo();
this.batchSize = batchSize;
this.type = range.getType();
@@ -112,34 +114,36 @@ public class StoreMessageResultIterator<
public boolean hasNext() {
if (!done && (next == null || !next.hasNext())) {
try {
- MessageRange range;
- switch (type) {
- default:
- case ALL:
- range = MessageRange.all();
- break;
- case FROM:
- range = MessageRange.from(from);
- break;
- case ONE:
- range = MessageRange.one(from);
- break;
- case RANGE:
- range = MessageRange.range(from, to);
- break;
- }
-
- next = mapper.findInMailbox(mailbox, range, ftype, batchSize);
- if (!next.hasNext()) {
- done = true;
- }
+ readBatch();
} catch (MailboxException e) {
this.exception = e;
done = true;
}
- return !done;
- } else {
- return !done;
+ }
+ return !done;
+ }
+
+ private void readBatch() throws MailboxException {
+ MessageRange range;
+ switch (type) {
+ default:
+ case ALL:
+ // In case of all, we start on cursor and don't specify a to
+ range = MessageRange.from(cursor);
+ break;
+ case FROM:
+ range = MessageRange.from(cursor);
+ break;
+ case ONE:
+ range = MessageRange.one(cursor);
+ break;
+ case RANGE:
+ range = MessageRange.range(cursor, to);
+ break;
+ }
+ next = mapper.findInMailbox(mailbox, range, ftype, batchSize);
+ if (!next.hasNext()) {
+ done = true;
}
}
@@ -149,16 +153,16 @@ public class StoreMessageResultIterator<
final Message<Id> message = next.next();
MessageResult result;
try {
-
result = ResultUtils.loadMessageResult(message, group);
+ cursor = result.getUid();
} catch (MailboxException e) {
result = new UnloadedMessageResult<Id>(message, e);
}
+ cursor++;
// move the start UID behind the last fetched message UID if needed
- if (!next.hasNext()) {
- from = result.getUid() + 1;
- if (result.getUid() >= to || from > to) {
+ if (hasNext()) {
+ if (cursor > to) {
done = true;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]