use of com.zimbra.soap.mail.message.OpenIMAPFolderResponse in project zm-mailbox by Zimbra.
the class TestZClient method testOpenImapFolder.
@Test
public void testOpenImapFolder() throws Exception {
Mailbox mbox = TestUtil.getMailbox(USER_NAME);
ZMailbox zmbox = TestUtil.getZMailbox(USER_NAME);
Folder folder = mbox.createFolder(null, "TestOpenImapFolder", new Folder.FolderOptions().setDefaultView(MailItem.Type.MESSAGE));
ItemIdentifier folderId = folder.getFolderItemIdentifier();
List<ImapMessage> expected = new LinkedList<ImapMessage>();
for (int i = 1; i <= 10; i++) {
Message msg = TestUtil.addMessage(mbox, folderId.id, String.format("imap message %s", i), System.currentTimeMillis());
expected.add(new ImapMessage(msg));
}
// test pagination
OpenIMAPFolderParams params = new OpenIMAPFolderParams(folderId);
// test fetching all results
params.setLimit(100);
OpenIMAPFolderResponse result = zmbox.fetchImapFolderChunk(params);
assertEquals(10, result.getImapMessageInfo().size());
assertFalse(result.getHasMore());
// test fetching first 5
params.setLimit(5);
result = zmbox.fetchImapFolderChunk(params);
List<ImapMessageInfo> messages = result.getImapMessageInfo();
assertEquals(5, messages.size());
for (int i = 0; i < messages.size(); i++) {
assertEquals(messages.get(i).getId(), expected.get(i).getMsgId());
}
assertTrue(result.getHasMore());
// test fetching 5 items starting at 3rd item, (more results left)
Integer cursorId = expected.get(2).getMsgId();
params.setCursorId(String.valueOf(cursorId));
result = zmbox.fetchImapFolderChunk(params);
messages = result.getImapMessageInfo();
assertEquals(5, messages.size());
for (int i = 0; i < messages.size(); i++) {
assertEquals(messages.get(i).getId(), expected.get(i + 3).getMsgId());
}
assertTrue(result.getHasMore());
// test fetching 5 items starting at 7th item, exhausting all results
cursorId = expected.get(6).getMsgId();
params.setCursorId(String.valueOf(cursorId));
result = zmbox.fetchImapFolderChunk(params);
messages = result.getImapMessageInfo();
assertEquals(3, messages.size());
for (int i = 0; i < messages.size(); i++) {
assertEquals(messages.get(i).getId(), expected.get(i + 7).getMsgId());
}
assertFalse(result.getHasMore());
// test getting all messages in batches of 3, so pagination is used
List<ImapMessageInfo> actual = zmbox.openImapFolder(folderId, 3);
Collections.sort(expected);
Collections.sort(actual);
assertEquals("expected and actual lists have different lengths", expected.size(), actual.size());
for (int i = 0; i < expected.size(); i++) {
assertEquals(expected.get(i).getImapUid(), actual.get(i).getImapUid());
}
}
use of com.zimbra.soap.mail.message.OpenIMAPFolderResponse in project zm-mailbox by Zimbra.
the class OpenImapFolder method handle.
@Override
public Element handle(Element request, Map<String, Object> context) throws ServiceException {
ZimbraSoapContext zsc = getZimbraSoapContext(context);
Mailbox mbox = getRequestedMailbox(zsc);
OperationContext octxt = getOperationContext(zsc, context);
OpenIMAPFolderRequest req = zsc.elementToJaxb(request);
OpenIMAPFolderResponse resp = new OpenIMAPFolderResponse();
ItemId folderId = new ItemId(req.getFolderId(), zsc);
if (!folderId.belongsTo(mbox)) {
ZimbraLog.imap.info("Proxying request: OpenImapFolder folder=%s", folderId);
return proxyRequest(request, context, folderId.getAccountId());
}
int limit = req.getLimit();
ImapCursorInfo cursor = req.getCursor();
Integer cursorMsgId = null;
if (cursor != null) {
cursorMsgId = new ItemId(cursor.getId(), mbox.getAccountId()).getId();
}
Pair<List<ImapMessage>, Boolean> openFolderResults = mbox.openImapFolder(octxt, folderId.getId(), limit, cursorMsgId);
List<ImapMessage> msgs = openFolderResults.getFirst();
boolean hasMore = openFolderResults.getSecond();
Integer msgId = null;
for (ImapMessage msg : msgs) {
msgId = msg.getMsgId();
int imapUid = msg.getImapUid();
String type = msg.getType().toString();
int flags = msg.getFlags();
String tags = msg.getTags() == null ? null : Joiner.on(",").join(msg.getTags());
ImapMessageInfo info = new ImapMessageInfo(msgId, imapUid, type, flags, tags);
resp.addImapMessageInfo(info);
}
if (hasMore && msgId != null) {
resp.setCursor(new ImapCursorInfo(msgId.toString()));
}
resp.setHasMore(hasMore);
return zsc.jaxbToElement(resp);
}
use of com.zimbra.soap.mail.message.OpenIMAPFolderResponse in project zm-mailbox by Zimbra.
the class ZMailbox method openImapFolder.
/**
* Iterate OpenImapFolderRequests until all results have been returned
* @param params
* @return
* @throws ServiceException
*/
public List<ImapMessageInfo> openImapFolder(ItemIdentifier folderId, int chunkSize) throws ServiceException {
List<ImapMessageInfo> msgs = new ArrayList<ImapMessageInfo>();
String cursorId = null;
OpenIMAPFolderResponse folderInfo = null;
do {
OpenIMAPFolderParams params = new OpenIMAPFolderParams(folderId);
params.setLimit(chunkSize);
if (cursorId != null) {
params.setCursorId(cursorId);
}
folderInfo = fetchImapFolderChunk(params);
List<ImapMessageInfo> results = folderInfo.getImapMessageInfo();
if (results.isEmpty()) {
break;
} else {
ImapCursorInfo cursor = folderInfo.getCursor();
if (cursor == null) {
// fall back to last message of this results page
cursorId = String.valueOf(results.get(results.size() - 1).getId());
} else {
cursorId = cursor.getId();
}
msgs.addAll(results);
}
} while (folderInfo.getHasMore());
return msgs;
}
Aggregations