// Caller is responsible for filtering out Appointments/Tasks marked private if the requester // is not the mailbox owner. public Iterator<? extends MailItem> getMailItems( UserServletContext context, long startTime, long endTime, long chunkSize) throws ServiceException { if (context.requestedItems != null) { return context.getRequestedItems(); } assert (context.target != null); String query = context.getQueryString(); if (query != null) { if (context.target instanceof Folder) { Folder f = (Folder) context.target; if (f.getId() != Mailbox.ID_FOLDER_USER_ROOT) { query = "in:" + f.getPath() + " " + query; } } Set<MailItem.Type> types; if (context.getTypesString() == null) { types = getDefaultSearchTypes(); } else { try { types = MailItem.Type.setOf(context.getTypesString()); } catch (IllegalArgumentException e) { throw MailServiceException.INVALID_TYPE(e.getMessage()); } } ZimbraQueryResults results = context.targetMailbox.index.search( context.opContext, query, types, SortBy.DATE_DESC, context.getOffset() + context.getLimit()); return new QueryResultIterator(results); } else if (context.target instanceof Folder) { Collection<? extends MailItem> items = getMailItemsFromFolder(context, (Folder) context.target, startTime, endTime, chunkSize); return items != null ? items.iterator() : null; } else { ArrayList<MailItem> result = new ArrayList<MailItem>(); result.add(context.target); return result.iterator(); } }