http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java ---------------------------------------------------------------------- diff --git a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java index 09cf3c3..a45e9fc 100644 --- a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java +++ b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java @@ -34,6 +34,7 @@ import javax.mail.Flags; import javax.mail.Flags.Flag; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.mock.MockMailboxSession; import org.apache.james.mailbox.model.MailboxACL; import org.apache.james.mailbox.model.MailboxId; @@ -72,6 +73,12 @@ public class LuceneMailboxMessageSearchIndexTest { + "It has " + RHUBARD + ".\r\n" + "It has " + CUSTARD + ".\r\n" + "It needs naught else.\r\n"; + private MessageUid uid1; + private MessageUid uid2; + private MessageUid uid3; + private MessageUid uid4; + private MessageUid uid5; + protected boolean useLenient() { return true; } @@ -98,28 +105,34 @@ public class LuceneMailboxMessageSearchIndexTest { headersTestSubject.put("From", "test12 <test12@localhost>"); headersTestSubject.put("Cc", "test211 <test21@localhost>, test6 <test6@foobar>"); - SimpleMailboxMembership m2 = new SimpleMailboxMembership(mailbox2.getMailboxId(),1, 0, new Date(), 20, new Flags(Flag.ANSWERED), "My Body".getBytes(), headersSubject); - index.add(null, mailbox2, m2); - - SimpleMailboxMembership m = new SimpleMailboxMembership(mailbox.getMailboxId(),1, 0, new Date(), 200, new Flags(Flag.ANSWERED), "My Body".getBytes(), headersSubject); + uid1 = MessageUid.of(1); + SimpleMailboxMembership m = new SimpleMailboxMembership(mailbox.getMailboxId(), uid1, 0, new Date(), 200, new Flags(Flag.ANSWERED), "My Body".getBytes(), headersSubject); index.add(null, mailbox, m); + + uid2 = MessageUid.of(1); + SimpleMailboxMembership m2 = new SimpleMailboxMembership(mailbox2.getMailboxId(), uid2, 0, new Date(), 20, new Flags(Flag.ANSWERED), "My Body".getBytes(), headersSubject); + index.add(null, mailbox2, m2); + uid3 = MessageUid.of(2); Calendar cal = Calendar.getInstance(); cal.set(1980, 2, 10); - SimpleMailboxMembership m3 = new SimpleMailboxMembership(mailbox.getMailboxId(),2, 0, cal.getTime(), 20, new Flags(Flag.DELETED), "My Otherbody".getBytes(), headersTest); + SimpleMailboxMembership m3 = new SimpleMailboxMembership(mailbox.getMailboxId(), uid3, 0, cal.getTime(), 20, new Flags(Flag.DELETED), "My Otherbody".getBytes(), headersTest); index.add(null, mailbox, m3); + + uid4 = MessageUid.of(3); Calendar cal2 = Calendar.getInstance(); cal2.set(8000, 2, 10); - SimpleMailboxMembership m4 = new SimpleMailboxMembership(mailbox.getMailboxId(),3, 0, cal2.getTime(), 20, new Flags(Flag.DELETED), "My Otherbody2".getBytes(), headersTestSubject); + SimpleMailboxMembership m4 = new SimpleMailboxMembership(mailbox.getMailboxId(), uid4, 0, cal2.getTime(), 20, new Flags(Flag.DELETED), "My Otherbody2".getBytes(), headersTestSubject); index.add(null, mailbox, m4); + uid5 = MessageUid.of(10); MessageBuilder builder = new MessageBuilder(); builder.header("From", "test <[email protected]>"); builder.header("To", FROM_ADDRESS); builder.header("Subject", "A " + SUBJECT_PART + " Multipart Mail"); builder.header("Date", "Thu, 14 Feb 2008 12:00:00 +0000 (GMT)"); builder.body = Charset.forName("us-ascii").encode(BODY).array(); - builder.uid = 10; + builder.uid = uid5; builder.mailboxId = mailbox3.getMailboxId(); index.add(null, mailbox3, builder.build()); @@ -133,15 +146,15 @@ public class LuceneMailboxMessageSearchIndexTest { public void bodySearchShouldMatchPhraseInBody() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.bodyContains(CUSTARD)); - Iterator<Long> result = index.search(session, mailbox3, query); - assertThat(result).containsExactly(10L); + Iterator<MessageUid> result = index.search(session, mailbox3, query); + assertThat(result).containsExactly(uid5); } @Test public void bodySearchShouldNotMatchAbsentPhraseInBody() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.bodyContains(CUSTARD + CUSTARD)); - Iterator<Long> result = index.search(session, mailbox3, query); + Iterator<MessageUid> result = index.search(session, mailbox3, query); assertThat(result).isEmpty(); } @@ -149,15 +162,15 @@ public class LuceneMailboxMessageSearchIndexTest { public void bodySearchShouldBeCaseInsensitive() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.bodyContains(RHUBARD)); - Iterator<Long> result = index.search(session, mailbox3, query); - assertThat(result).containsExactly(10L); + Iterator<MessageUid> result = index.search(session, mailbox3, query); + assertThat(result).containsExactly(uid5); } @Test public void bodySearchNotMatchPhraseOnlyInFrom() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.bodyContains(FROM_ADDRESS)); - Iterator<Long> result = index.search(session, mailbox3, query); + Iterator<MessageUid> result = index.search(session, mailbox3, query); assertThat(result).isEmpty(); } @@ -165,7 +178,7 @@ public class LuceneMailboxMessageSearchIndexTest { public void bodySearchShouldNotMatchPhraseOnlyInSubject() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.bodyContains(SUBJECT_PART)); - Iterator<Long> result = index.search(session, mailbox3, query); + Iterator<MessageUid> result = index.search(session, mailbox3, query); assertThat(result).isEmpty(); } @@ -173,15 +186,15 @@ public class LuceneMailboxMessageSearchIndexTest { public void textSearchShouldMatchPhraseInBody() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.mailContains(CUSTARD)); - Iterator<Long> result = index.search(session, mailbox3, query); - assertThat(result).containsExactly(10L); + Iterator<MessageUid> result = index.search(session, mailbox3, query); + assertThat(result).containsExactly(uid5); } @Test public void textSearchShouldNotAbsentMatchPhraseInBody() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.mailContains(CUSTARD + CUSTARD)); - Iterator<Long> result = index.search(session, mailbox3, query); + Iterator<MessageUid> result = index.search(session, mailbox3, query); assertThat(result).isEmpty(); } @@ -189,84 +202,84 @@ public class LuceneMailboxMessageSearchIndexTest { public void textSearchMatchShouldBeCaseInsensitive() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.mailContains(RHUBARD.toLowerCase(Locale.US))); - Iterator<Long> result = index.search(session, mailbox3, query); - assertThat(result).containsExactly(10L); + Iterator<MessageUid> result = index.search(session, mailbox3, query); + assertThat(result).containsExactly(uid5); } @Test public void addressSearchShouldMatchToFullAddress() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.address(AddressType.To,FROM_ADDRESS)); - Iterator<Long> result = index.search(session, mailbox3, query); - assertThat(result).containsExactly(10L); + Iterator<MessageUid> result = index.search(session, mailbox3, query); + assertThat(result).containsExactly(uid5); } @Test public void addressSearchShouldMatchToDisplayName() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.address(AddressType.To,"Harry")); - Iterator<Long> result = index.search(session, mailbox3, query); - assertThat(result).containsExactly(10L); + Iterator<MessageUid> result = index.search(session, mailbox3, query); + assertThat(result).containsExactly(uid5); } @Test public void addressSearchShouldMatchToEmail() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.address(AddressType.To,"[email protected]")); - Iterator<Long> result = index.search(session, mailbox3, query); - assertThat(result).containsExactly(10L); + Iterator<MessageUid> result = index.search(session, mailbox3, query); + assertThat(result).containsExactly(uid5); } @Test public void addressSearchShouldMatchFrom() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.address(AddressType.From,"[email protected]")); - Iterator<Long> result = index.search(session, mailbox3, query); - assertThat(result).containsExactly(10L); + Iterator<MessageUid> result = index.search(session, mailbox3, query); + assertThat(result).containsExactly(uid5); } @Test public void textSearchShouldMatchPhraseOnlyInToHeader() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.mailContains(FROM_ADDRESS)); - Iterator<Long> result = index.search(session, mailbox3, query); - assertThat(result).containsExactly(10L); + Iterator<MessageUid> result = index.search(session, mailbox3, query); + assertThat(result).containsExactly(uid5); } @Test public void textSearchShouldMatchPhraseOnlyInSubjectHeader() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.mailContains(SUBJECT_PART)); - Iterator<Long> result = index.search(session, mailbox3, query); - assertThat(result).containsExactly(10L); + Iterator<MessageUid> result = index.search(session, mailbox3, query); + assertThat(result).containsExactly(uid5); } @Test public void searchAllShouldMatchAllMailboxEmails() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); - Iterator<Long> result = index.search(session, mailbox2, query); - assertThat(result).containsExactly(1L); + Iterator<MessageUid> result = index.search(session, mailbox2, query); + assertThat(result).containsExactly(uid2); } @Test public void searchBodyInAllMailboxesShouldMatch() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.bodyContains("My Body")); - Map<MailboxId, Collection<Long>> result = index.search(session, MultimailboxesSearchQuery.from(query).build()); + Map<MailboxId, Collection<MessageUid>> result = index.search(session, MultimailboxesSearchQuery.from(query).build()); assertThat(result).hasSize(2); - assertThat(result.get(mailbox.id)).containsExactly(1L); - assertThat(result.get(mailbox2.id)).containsExactly(1L); + assertThat(result.get(mailbox.id)).containsExactly(uid1); + assertThat(result.get(mailbox2.id)).containsExactly(uid2); } @Test public void searchBodyInSpecificMailboxesShouldMatch() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.bodyContains("My Body")); - Map<MailboxId, Collection<Long>> result = index.search(session, + Map<MailboxId, Collection<MessageUid>> result = index.search(session, MultimailboxesSearchQuery.from(query).inMailboxes(mailbox.id, mailbox3.id).build()); assertThat(result).hasSize(1); - assertThat(result.get(mailbox.id)).containsExactly(1L); + assertThat(result.get(mailbox.id)).containsExactly(uid1); } @@ -274,7 +287,7 @@ public class LuceneMailboxMessageSearchIndexTest { public void searchAllShouldMatchAllUserEmails() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); - Map<MailboxId, Collection<Long>> result = index.search(session, MultimailboxesSearchQuery.from(query).build()); + Map<MailboxId, Collection<MessageUid>> result = index.search(session, MultimailboxesSearchQuery.from(query).build()); assertThat(result).hasSize(3); } @@ -282,48 +295,48 @@ public class LuceneMailboxMessageSearchIndexTest { public void flagSearchShouldMatch() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.flagIsSet(Flag.DELETED)); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(2L, 3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid3, uid4); } @Test public void bodySearchShouldMatchSeveralEmails() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.bodyContains("body")); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L, 2L, 3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1, uid3, uid4); } @Test public void textSearchShouldMatchSeveralEmails() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.mailContains("body")); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L, 2L, 3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1, uid3, uid4); } @Test public void headerSearchShouldMatch() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.headerContains("Subject", "test")); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L, 3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1, uid4); } @Test public void headerExistsShouldMatch() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.headerExists("Subject")); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L, 3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1, uid4); } @Test public void flagUnsetShouldMatch() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.flagIsUnSet(Flag.DRAFT)); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L, 2L, 3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1, uid3, uid4); } @Test @@ -333,8 +346,8 @@ public class LuceneMailboxMessageSearchIndexTest { cal.setTime(new Date()); query.andCriteria(SearchQuery.internalDateBefore(cal.getTime(), DateResolution.Day)); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(2L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid3); } @@ -344,8 +357,8 @@ public class LuceneMailboxMessageSearchIndexTest { Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); query.andCriteria(SearchQuery.internalDateAfter(cal.getTime(), DateResolution.Day)); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid4); } @@ -356,8 +369,8 @@ public class LuceneMailboxMessageSearchIndexTest { Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); query.andCriteria(SearchQuery.internalDateOn(cal.getTime(), DateResolution.Day)); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1); } @Test @@ -365,9 +378,9 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); - query.andCriteria(SearchQuery.uid(new SearchQuery.NumericRange[] {new SearchQuery.NumericRange(1)})); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L); + query.andCriteria(SearchQuery.uid(new SearchQuery.UidRange[] {new SearchQuery.UidRange(uid1)})); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1); } @Test @@ -375,41 +388,41 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); - query.andCriteria(SearchQuery.uid(new SearchQuery.NumericRange[] {new SearchQuery.NumericRange(1), new SearchQuery.NumericRange(2,3)})); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L, 2L, 3L); + query.andCriteria(SearchQuery.uid(new SearchQuery.UidRange[] {new SearchQuery.UidRange(uid1), new SearchQuery.UidRange(uid3,uid4)})); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1, uid3, uid4); } @Test public void sizeEqualsShouldMatch() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.sizeEquals(200)); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1); } @Test public void sizeLessThanShouldMatch() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.sizeLessThan(200)); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(2L, 3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid3, uid4); } @Test public void sizeGreaterThanShouldMatch() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.sizeGreaterThan(6)); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L, 2L, 3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1, uid3, uid4); } @Test public void uidShouldBeSorted() throws Exception { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L, 2L, 3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1, uid3, uid4); } @Test @@ -417,8 +430,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.Uid, true))); query.andCriteria(SearchQuery.all()); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(3L, 2L, 1L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid4, uid3, uid1); } @Test @@ -426,8 +439,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.SentDate, false))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(2L, 3L, 1L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid3, uid4, uid1); } @Test @@ -435,8 +448,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.SentDate, true))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L, 3L, 2L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1, uid4, uid3); } @Test @@ -444,8 +457,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.BaseSubject, false))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(2L, 1L, 3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid3, uid1, uid4); } @Test @@ -453,8 +466,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.BaseSubject, true))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(3L, 1L, 2L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid4, uid1, uid3); } @Test @@ -462,8 +475,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.MailboxFrom, false))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(2L, 3L, 1L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid3, uid4, uid1); } @Test @@ -471,8 +484,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.MailboxFrom, true))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L, 3L, 2L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1, uid4, uid3); } @Test @@ -480,8 +493,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.MailboxCc, false))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L, 2L, 3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1, uid3, uid4); } @Test @@ -489,8 +502,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.MailboxCc, true))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(2L, 3L, 1L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid3, uid4, uid1); } @Test @@ -498,8 +511,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.MailboxTo, false))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(3L, 1L, 2L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid4, uid1, uid3); } @Test @@ -507,8 +520,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.MailboxTo, true))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(2L, 1L, 3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid3, uid1, uid4); } @Test @@ -516,8 +529,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.DisplayTo, false))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(3L, 1L, 2L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid4, uid1, uid3); } @Test @@ -525,8 +538,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.DisplayTo, true))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(2L, 1L, 3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid3, uid1, uid4); } @Test @@ -534,8 +547,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.DisplayFrom, false))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(2L, 3L, 1L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid3, uid4, uid1); } @Test @@ -543,8 +556,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.DisplayFrom, true))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L, 3L, 2L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1, uid4, uid3); } @Test @@ -552,8 +565,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.Arrival, false))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(2L, 1L, 3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid3, uid1, uid4); } @Test @@ -561,8 +574,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.Arrival, true))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(3L, 1L, 2L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid4, uid1, uid3); } @Test @@ -570,8 +583,8 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.Size, false))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(2L, 3L, 1L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid3, uid4, uid1); } @Test @@ -579,16 +592,16 @@ public class LuceneMailboxMessageSearchIndexTest { SearchQuery query = new SearchQuery(); query.andCriteria(SearchQuery.all()); query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.Size, true))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(1L, 2L, 3L); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid1, uid3, uid4); } @Test public void notOperatorShouldReverseMatching() throws Exception { SearchQuery query = new SearchQuery(); - query.andCriteria(SearchQuery.not(SearchQuery.uid(new SearchQuery.NumericRange[] { new SearchQuery.NumericRange(1)}))); - Iterator<Long> result = index.search(session, mailbox, query); - assertThat(result).containsExactly(2L, 3L); + query.andCriteria(SearchQuery.not(SearchQuery.uid(new SearchQuery.UidRange[] { new SearchQuery.UidRange(uid1)}))); + Iterator<MessageUid> result = index.search(session, mailbox, query); + assertThat(result).containsExactly(uid3, uid4); } private final class SimpleMailbox implements Mailbox {
http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java ---------------------------------------------------------------------- diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java index 0c8c308..12e0d4c 100644 --- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java +++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java @@ -46,6 +46,7 @@ import org.apache.commons.lang.ArrayUtils; import org.apache.james.mailbox.MailboxPathLocker; import org.apache.james.mailbox.MailboxPathLocker.LockAwareExecution; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.model.MailboxACL; import org.apache.james.mailbox.model.MailboxACL.MailboxACLEntryKey; @@ -53,6 +54,9 @@ import org.apache.james.mailbox.model.MailboxACL.MailboxACLRights; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.model.SimpleMailboxACL; +import com.google.common.base.Function; +import com.google.common.base.Optional; + public class MaildirFolder { public static final String VALIDITY_FILE = "james-uidvalidity"; @@ -69,7 +73,7 @@ public class MaildirFolder { private final File uidFile; private final File aclFile; - private long lastUid = -1; + private Optional<MessageUid> lastUid; private int messageCount = 0; private long uidValidity = -1; private MailboxACL acl; @@ -93,6 +97,7 @@ public class MaildirFolder { this.aclFile = new File(rootFolder, ACL_FILE); this.locker = locker; this.path = path; + this.lastUid = Optional.absent(); } private MaildirMessageName newMaildirMessageName(MaildirFolder folder, String fullName) { @@ -181,20 +186,22 @@ public class MaildirFolder { /** * Returns the nextUid value and increases it. - * @return nextUid */ - private long getNextUid() { - return ++lastUid; + private MessageUid getNextUid() { + MessageUid nextUid = lastUid.transform(new Function<MessageUid, MessageUid>() { + @Override + public MessageUid apply(MessageUid input) { + return input.next(); + }}).or(MessageUid.MIN_VALUE); + lastUid = Optional.of(nextUid); + return nextUid; } /** * Returns the last uid used in this mailbox - * @param session - * @return lastUid - * @throws MailboxException */ - public long getLastUid(MailboxSession session) throws MailboxException { - if (lastUid == -1) { + public Optional<MessageUid> getLastUid(MailboxSession session) throws MailboxException { + if (!lastUid.isPresent()) { readLastUid(session); } return lastUid; @@ -328,7 +335,7 @@ public class MaildirFolder { * @return The {@link MaildirMessageName} that belongs to the uid * @throws IOException If the uidlist file cannot be found or read */ - public MaildirMessageName getMessageNameByUid(final MailboxSession session, final Long uid) throws MailboxException { + public MaildirMessageName getMessageNameByUid(final MailboxSession session, final MessageUid uid) throws MailboxException { return locker.executeWithLock(session, path, new LockAwareExecution<MaildirMessageName>() { @@ -340,7 +347,7 @@ public class MaildirFolder { try { fileReader = new FileReader(uidList); reader = new BufferedReader(fileReader); - String uidString = String.valueOf(uid); + String uidString = String.valueOf(uid.asLong()); String line = reader.readLine(); // the header int lineNumber = 1; while ((line = reader.readLine()) != null) { @@ -380,13 +387,13 @@ public class MaildirFolder { * @return a {@link Map} whith all uids in the given range and associated {@link MaildirMessageName}s * @throws MailboxException if there is a problem with the uid list file */ - public SortedMap<Long, MaildirMessageName> getUidMap(final MailboxSession session, final long from, final long to) + public SortedMap<MessageUid, MaildirMessageName> getUidMap(final MailboxSession session, final MessageUid from, final MessageUid to) throws MailboxException { - return locker.executeWithLock(session, path, new LockAwareExecution<SortedMap<Long, MaildirMessageName>>() { + return locker.executeWithLock(session, path, new LockAwareExecution<SortedMap<MessageUid, MaildirMessageName>>() { @Override - public SortedMap<Long, MaildirMessageName> execute() throws MailboxException { - final SortedMap<Long, MaildirMessageName> uidMap = new TreeMap<Long, MaildirMessageName>(); + public SortedMap<MessageUid, MaildirMessageName> execute() throws MailboxException { + final SortedMap<MessageUid, MaildirMessageName> uidMap = new TreeMap<MessageUid, MaildirMessageName>(); File uidList = uidFile; @@ -413,11 +420,11 @@ public class MaildirFolder { }, true); } - public SortedMap<Long, MaildirMessageName> getUidMap(MailboxSession session, FilenameFilter filter, long from, long to) + public SortedMap<MessageUid, MaildirMessageName> getUidMap(MailboxSession session, FilenameFilter filter, MessageUid from, MessageUid to) throws MailboxException { - SortedMap<Long, MaildirMessageName> allUids = getUidMap(session, from, to); - SortedMap<Long, MaildirMessageName> filteredUids = new TreeMap<Long, MaildirMessageName>(); - for (Entry<Long, MaildirMessageName> entry : allUids.entrySet()) { + SortedMap<MessageUid, MaildirMessageName> allUids = getUidMap(session, from, to); + SortedMap<MessageUid, MaildirMessageName> filteredUids = new TreeMap<MessageUid, MaildirMessageName>(); + for (Entry<MessageUid, MaildirMessageName> entry : allUids.entrySet()) { if (filter.accept(null, entry.getValue().getFullName())) filteredUids.put(entry.getKey(), entry.getValue()); } @@ -436,14 +443,15 @@ public class MaildirFolder { * @return A {@link Map} with all uids and associated {@link MaildirMessageName}s * @throws MailboxException if there is a problem with the uid list file */ - public SortedMap<Long, MaildirMessageName> getUidMap(MailboxSession session, FilenameFilter filter, int limit) throws MailboxException { - SortedMap<Long, MaildirMessageName> allUids = getUidMap(session, 0, -1); - SortedMap<Long, MaildirMessageName> filteredUids = new TreeMap<Long, MaildirMessageName>(); + public SortedMap<MessageUid, MaildirMessageName> getUidMap(MailboxSession session, FilenameFilter filter, int limit) throws MailboxException { + MessageUid to = null; + SortedMap<MessageUid, MaildirMessageName> allUids = getUidMap(session, MessageUid.MIN_VALUE, to); + SortedMap<MessageUid, MaildirMessageName> filteredUids = new TreeMap<MessageUid, MaildirMessageName>(); int theLimit = limit; if (limit < 1) theLimit = allUids.size(); int counter = 0; - for (Entry<Long, MaildirMessageName> entry : allUids.entrySet()) { + for (Entry<MessageUid, MaildirMessageName> entry : allUids.entrySet()) { if (counter >= theLimit) break; if (filter.accept(null, entry.getValue().getFullName())) { @@ -461,15 +469,15 @@ public class MaildirFolder { * @return A {@link Map} with all uids and associated {@link MaildirMessageName}s of recent messages * @throws MailboxException If there is a problem with the uid list file */ - public SortedMap<Long, MaildirMessageName> getRecentMessages(final MailboxSession session) throws MailboxException { + public SortedMap<MessageUid, MaildirMessageName> getRecentMessages(final MailboxSession session) throws MailboxException { final String[] recentFiles = getNewFolder().list(); final LinkedList<String> lines = new LinkedList<String>(); final int theLimit = recentFiles.length; - return locker.executeWithLock(session, path, new LockAwareExecution<SortedMap<Long, MaildirMessageName>>() { + return locker.executeWithLock(session, path, new LockAwareExecution<SortedMap<MessageUid, MaildirMessageName>>() { @Override - public SortedMap<Long, MaildirMessageName> execute() throws MailboxException { - final SortedMap<Long, MaildirMessageName> recentMessages = new TreeMap<Long, MaildirMessageName>(); + public SortedMap<MessageUid, MaildirMessageName> execute() throws MailboxException { + final SortedMap<MessageUid, MaildirMessageName> recentMessages = new TreeMap<MessageUid, MaildirMessageName>(); File uidList = uidFile; @@ -482,7 +490,7 @@ public class MaildirFolder { messageCount = curFiles.length + newFiles.length; String[] allFiles = (String[]) ArrayUtils.addAll(curFiles, newFiles); for (String file : allFiles) - lines.add(String.valueOf(getNextUid()) + " " + file); + lines.add(String.valueOf(getNextUid().asLong()) + " " + file); PrintWriter pw = new PrintWriter(uidList); try { pw.println(createUidListHeader()); @@ -525,7 +533,7 @@ public class MaildirFolder { continue; } - Long uid = Long.valueOf(line.substring(0, gap)); + MessageUid uid = MessageUid.of(Long.valueOf(line.substring(0, gap))); String name = line.substring(gap + 1, line.length()); for (String recentFile : recentFiles) { if (recentFile.equals(name)) { @@ -548,27 +556,25 @@ public class MaildirFolder { /** * Creates and returns a uid map (uid -> {@link MaildirMessageName}) and writes it to the disk * @return The uid map - * @throws MailboxException */ - private Map<Long, MaildirMessageName> createUidFile() throws MailboxException { - final Map<Long, MaildirMessageName> uidMap = new TreeMap<Long, MaildirMessageName>(); + private Map<MessageUid, MaildirMessageName> createUidFile() throws MailboxException { + final Map<MessageUid, MaildirMessageName> uidMap = new TreeMap<MessageUid, MaildirMessageName>(); File uidList = uidFile; PrintWriter pw = null; try { if (!uidList.createNewFile()) throw new IOException("Could not create file " + uidList); - lastUid = 0; + lastUid = Optional.absent(); String[] curFiles = curFolder.list(); String[] newFiles = newFolder.list(); messageCount = curFiles.length + newFiles.length; String[] allFiles = (String[]) ArrayUtils.addAll(curFiles, newFiles); for (String file : allFiles) uidMap.put(getNextUid(), newMaildirMessageName(MaildirFolder.this, file)); - //uidMap = new TreeMap<Long, MaildirMessageName>(uidMap); pw = new PrintWriter(uidList); pw.println(createUidListHeader()); - for (Entry<Long, MaildirMessageName> entry : uidMap.entrySet()) - pw.println(String.valueOf(entry.getKey()) + " " + entry.getValue().getFullName()); + for (Entry<MessageUid, MaildirMessageName> entry : uidMap.entrySet()) + pw.println(String.valueOf(entry.getKey().asLong()) + " " + entry.getValue().getFullName()); } catch (IOException e) { throw new MailboxException("Unable to create uid file", e); } finally { @@ -578,13 +584,13 @@ public class MaildirFolder { return uidMap; } - private Map<Long, MaildirMessageName> updateUidFile() throws MailboxException { - final Map<Long, MaildirMessageName> uidMap = new TreeMap<Long, MaildirMessageName>(); + private Map<MessageUid, MaildirMessageName> updateUidFile() throws MailboxException { + final Map<MessageUid, MaildirMessageName> uidMap = new TreeMap<MessageUid, MaildirMessageName>(); File uidList = uidFile; String[] curFiles = curFolder.list(); String[] newFiles = newFolder.list(); messageCount = curFiles.length + newFiles.length; - HashMap<String, Long> reverseUidMap = new HashMap<String, Long>(messageCount); + HashMap<String, MessageUid> reverseUidMap = new HashMap<String, MessageUid>(messageCount); FileReader fileReader = null; BufferedReader reader = null; PrintWriter pw = null; @@ -603,7 +609,7 @@ public class MaildirFolder { // there must be some issues in the file if no gap can be found throw new MailboxException("Corrupted entry in uid-file " + uidList + " line " + lineNumber++); } - Long uid = Long.valueOf(line.substring(0, gap)); + MessageUid uid = MessageUid.of(Long.valueOf(line.substring(0, gap))); String name = line.substring(gap + 1, line.length()); reverseUidMap.put(stripMetaFromName(name), uid); } @@ -611,15 +617,15 @@ public class MaildirFolder { String[] allFiles = (String[]) ArrayUtils.addAll(curFiles, newFiles); for (String file : allFiles) { MaildirMessageName messageName = newMaildirMessageName(MaildirFolder.this, file); - Long uid = reverseUidMap.get(messageName.getBaseName()); + MessageUid uid = reverseUidMap.get(messageName.getBaseName()); if (uid == null) uid = getNextUid(); uidMap.put(uid, messageName); } pw = new PrintWriter(uidList); pw.println(createUidListHeader()); - for (Entry<Long, MaildirMessageName> entry : uidMap.entrySet()) - pw.println(String.valueOf(entry.getKey()) + " " + entry.getValue().getFullName()); + for (Entry<MessageUid, MaildirMessageName> entry : uidMap.entrySet()) + pw.println(String.valueOf(entry.getKey().asLong()) + " " + entry.getValue().getFullName()); } catch (IOException e) { throw new MailboxException("Unable to update uid file", e); } finally { @@ -630,8 +636,8 @@ public class MaildirFolder { return uidMap; } - private Map<Long, MaildirMessageName> readUidFile(MailboxSession session, long from, long to) throws MailboxException { - final Map<Long, MaildirMessageName> uidMap = new HashMap<Long, MaildirMessageName>(); + private Map<MessageUid, MaildirMessageName> readUidFile(MailboxSession session, MessageUid from, MessageUid to) throws MailboxException { + final Map<MessageUid, MaildirMessageName> uidMap = new HashMap<MessageUid, MaildirMessageName>(); File uidList = uidFile; FileReader fileReader = null; @@ -654,11 +660,12 @@ public class MaildirFolder { session.getLog().info("Corrupted entry in uid-file " + uidList + " line " + lineNumber++); continue; } - - Long uid = Long.valueOf(line.substring(0, gap)); - if (uid >= from) { - if (to != -1 && uid > to) + + MessageUid uid = MessageUid.of(Long.valueOf(line.substring(0, gap))); + if (uid.compareTo(from) >= 0) { + if (to != null && uid.compareTo(to) > 0) { break; + } String name = line.substring(gap + 1, line.length()); uidMap.put(uid, newMaildirMessageName(MaildirFolder.this, name)); } @@ -677,17 +684,17 @@ public class MaildirFolder { /** * Sorts the given map and returns a subset which is constricted by a lower and an upper limit. - * @param source The source map + * @param map The source map * @param from The lower limit * @param to The upper limit; <code>-1</code> disables the upper limit. * @return The sorted subset */ - private SortedMap<Long, MaildirMessageName> truncateMap(Map<Long, MaildirMessageName> source, long from, long to) { - TreeMap<Long, MaildirMessageName> sortedMap; - if (source instanceof TreeMap<?, ?>) sortedMap = (TreeMap<Long, MaildirMessageName>) source; - else sortedMap = new TreeMap<Long, MaildirMessageName>(source); - if (to != -1) - return sortedMap.subMap(from, to + 1); + private SortedMap<MessageUid, MaildirMessageName> truncateMap(Map<MessageUid, MaildirMessageName> map, MessageUid from, MessageUid to) { + TreeMap<MessageUid, MaildirMessageName> sortedMap; + if (map instanceof TreeMap<?, ?>) sortedMap = (TreeMap<MessageUid, MaildirMessageName>) map; + else sortedMap = new TreeMap<MessageUid, MaildirMessageName>(map); + if (to != null) + return sortedMap.subMap(from, to.next()); return sortedMap.tailMap(from); } @@ -710,7 +717,7 @@ public class MaildirFolder { if (version != 1) throw new IOException("Cannot read uidlists with versions other than 1."); int gap2 = line.indexOf(" ", gap1 + 1); - lastUid = Long.valueOf(line.substring(gap1 + 1, gap2)); + lastUid = Optional.of(MessageUid.of(Long.valueOf(line.substring(gap1 + 1, gap2)))); messageCount = Integer.valueOf(line.substring(gap2 + 1, line.length())); } @@ -719,7 +726,14 @@ public class MaildirFolder { * @return the line which ought to be the header */ private String createUidListHeader() { - return "1 " + String.valueOf(lastUid) + " " + String.valueOf(messageCount); + Long last = lastUid.transform(new Function<MessageUid, Long>() { + @Override + public Long apply(MessageUid input) { + return input.asLong(); + } + + }).or(0L); + return "1 " + String.valueOf(last) + " " + String.valueOf(messageCount); } /** @@ -741,15 +755,14 @@ public class MaildirFolder { * @param session * @param name The name of the message's file * @return The uid of the message - * @throws IOException */ - public long appendMessage(MailboxSession session, final String name) throws MailboxException { - return locker.executeWithLock(session, path, new LockAwareExecution<Long>() { + public MessageUid appendMessage(MailboxSession session, final String name) throws MailboxException { + return locker.executeWithLock(session, path, new LockAwareExecution<MessageUid>() { @Override - public Long execute() throws MailboxException { + public MessageUid execute() throws MailboxException { File uidList = uidFile; - long uid = -1; + MessageUid uid = null; FileReader fileReader = null; BufferedReader reader = null; PrintWriter pw = null; @@ -765,7 +778,7 @@ public class MaildirFolder { while ((line = reader.readLine()) != null) lines.add(line); uid = getNextUid(); - lines.add(String.valueOf(uid) + " " + name); + lines.add(String.valueOf(uid.asLong()) + " " + name); messageCount++; pw = new PrintWriter(uidList); pw.println(createUidListHeader()); @@ -782,8 +795,8 @@ public class MaildirFolder { ArrayList<String> lines = new ArrayList<String>(); String[] allFiles = (String[]) ArrayUtils.addAll(curFiles, newFiles); for (String file : allFiles) { - long theUid = getNextUid(); - lines.add(String.valueOf(theUid) + " " + file); + MessageUid theUid = getNextUid(); + lines.add(String.valueOf(theUid.asLong()) + " " + file); // the listed names already include the message to append if (file.equals(name)) uid = theUid; @@ -800,7 +813,7 @@ public class MaildirFolder { IOUtils.closeQuietly(reader); IOUtils.closeQuietly(fileReader); } - if (uid == -1) { + if (uid == null) { throw new MailboxException("Unable to append msg"); } else { return uid; @@ -817,7 +830,7 @@ public class MaildirFolder { * @param messageName * @throws MailboxException */ - public void update(MailboxSession session, final long uid, final String messageName) throws MailboxException { + public void update(MailboxSession session, final MessageUid uid, final String messageName) throws MailboxException { locker.executeWithLock(session, path, new LockAwareExecution<Void>() { @Override @@ -833,8 +846,9 @@ public class MaildirFolder { readUidListHeader(line); ArrayList<String> lines = new ArrayList<String>(); while ((line = reader.readLine()) != null) { - if (uid == Long.valueOf(line.substring(0, line.indexOf(" ")))) - line = String.valueOf(uid) + " " + messageName; + if (uid.equals(MessageUid.of(Long.valueOf(line.substring(0, line.indexOf(" ")))))) { + line = String.valueOf(uid.asLong()) + " " + messageName; + } lines.add(line); } writer = new PrintWriter(uidList); @@ -861,7 +875,7 @@ public class MaildirFolder { * @return The {@link MaildirMessageName} of the deleted message * @throws MailboxException If the file cannot be deleted of there is a problem with the uid list */ - public MaildirMessageName delete(final MailboxSession session, final long uid) throws MailboxException { + public MaildirMessageName delete(final MailboxSession session, final MessageUid uid) throws MailboxException { return locker.executeWithLock(session, path, new LockAwareExecution<MaildirMessageName>() { @Override @@ -888,7 +902,7 @@ public class MaildirFolder { continue; } - if (uid == Long.valueOf(line.substring(0, line.indexOf(" ")))) { + if (uid.equals(MessageUid.of(Long.valueOf(line.substring(0, line.indexOf(" ")))))) { deletedMessage = newMaildirMessageName(MaildirFolder.this, line.substring(gap + 1, line.length())); messageCount--; } http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java ---------------------------------------------------------------------- diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java index ee21117..5b90a01 100644 --- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java +++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java @@ -24,6 +24,7 @@ import java.util.Locale; import org.apache.james.mailbox.MailboxPathLocker; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MailboxNotFoundException; import org.apache.james.mailbox.model.MailboxConstants; @@ -34,6 +35,9 @@ import org.apache.james.mailbox.store.mail.UidProvider; import org.apache.james.mailbox.store.mail.model.Mailbox; import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox; +import com.google.common.base.Function; +import com.google.common.base.Optional; + public class MaildirStore implements UidProvider, ModSeqProvider { public static final String PATH_USER = "%user"; @@ -237,13 +241,15 @@ public class MaildirStore implements UidProvider, ModSeqProvider { return getFolderName(mailboxPath.getNamespace(), mailboxPath.getUser(), mailboxPath.getName()); } - /** - * @see org.apache.james.mailbox.store.mail.UidProvider#nextUid(org.apache.james.mailbox.MailboxSession, org.apache.james.mailbox.store.mail.model.Mailbox) - */ @Override - public long nextUid(MailboxSession session, Mailbox mailbox) throws MailboxException { + public MessageUid nextUid(MailboxSession session, Mailbox mailbox) throws MailboxException { try { - return createMaildirFolder(mailbox).getLastUid(session) +1; + return createMaildirFolder(mailbox).getLastUid(session).transform(new Function<MessageUid, MessageUid>() { + @Override + public MessageUid apply(MessageUid input) { + return input.next(); + } + }).or(MessageUid.MIN_VALUE); } catch (MailboxException e) { throw new MailboxException("Unable to generate next uid", e); } @@ -264,7 +270,7 @@ public class MaildirStore implements UidProvider, ModSeqProvider { } @Override - public long lastUid(MailboxSession session, Mailbox mailbox) throws MailboxException { + public Optional<MessageUid> lastUid(MailboxSession session, Mailbox mailbox) throws MailboxException { return createMaildirFolder(mailbox).getLastUid(session); } http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java ---------------------------------------------------------------------- diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java index 86924f5..d00220a 100644 --- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java +++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java @@ -36,6 +36,7 @@ import javax.mail.Flags.Flag; import org.apache.commons.io.FileUtils; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.maildir.MaildirFolder; import org.apache.james.mailbox.maildir.MaildirMessageName; @@ -62,9 +63,6 @@ public class MaildirMessageMapper extends AbstractMessageMapper { this.maildirStore = maildirStore; } - /** - * @see org.apache.james.mailbox.store.mail.MessageMapper#countMessagesInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox) - */ @Override public long countMessagesInMailbox(Mailbox mailbox) throws MailboxException { MaildirFolder folder = maildirStore.createMaildirFolder(mailbox); @@ -78,9 +76,6 @@ public class MaildirMessageMapper extends AbstractMessageMapper { return newFiles.length + curFiles.length; } - /** - * @see org.apache.james.mailbox.store.mail.MessageMapper#countUnseenMessagesInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox) - */ @Override public long countUnseenMessagesInMailbox(Mailbox mailbox) throws MailboxException { MaildirFolder folder = maildirStore.createMaildirFolder(mailbox); @@ -94,10 +89,6 @@ public class MaildirMessageMapper extends AbstractMessageMapper { return newUnseenMessages.length + unseenMessages.length; } - /** - * @see org.apache.james.mailbox.store.mail.MessageMapper#delete(org.apache.james.mailbox.store.mail.model.Mailbox, - * MailboxMessage) - */ @Override public void delete(Mailbox mailbox, MailboxMessage message) throws MailboxException { MaildirFolder folder = maildirStore.createMaildirFolder(mailbox); @@ -108,25 +99,20 @@ public class MaildirMessageMapper extends AbstractMessageMapper { } } - /** - * @see org.apache.james.mailbox.store.mail.MessageMapper#findInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox, - * org.apache.james.mailbox.model.MessageRange, - * org.apache.james.mailbox.store.mail.MessageMapper.FetchType, int) - */ @Override public Iterator<MailboxMessage> findInMailbox(Mailbox mailbox, MessageRange set, FetchType fType, int max) throws MailboxException { final List<MailboxMessage> results; - final long from = set.getUidFrom(); - final long to = set.getUidTo(); + final MessageUid from = set.getUidFrom(); + final MessageUid to = set.getUidTo(); final Type type = set.getType(); switch (type) { default: case ALL: - results = findMessagesInMailboxBetweenUIDs(mailbox, null, 0, -1, max); + results = findMessagesInMailboxBetweenUIDs(mailbox, null, MessageUid.MIN_VALUE, null, max); break; case FROM: - results = findMessagesInMailboxBetweenUIDs(mailbox, null, from, -1, max); + results = findMessagesInMailboxBetweenUIDs(mailbox, null, from, null, max); break; case ONE: results = findMessageInMailboxWithUID(mailbox, from); @@ -139,22 +125,16 @@ public class MaildirMessageMapper extends AbstractMessageMapper { } - /** - * @see org.apache.james.mailbox.store.mail.MessageMapper#findRecentMessageUidsInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox) - */ @Override - public List<Long> findRecentMessageUidsInMailbox(Mailbox mailbox) throws MailboxException { + public List<MessageUid> findRecentMessageUidsInMailbox(Mailbox mailbox) throws MailboxException { MaildirFolder folder = maildirStore.createMaildirFolder(mailbox); - SortedMap<Long, MaildirMessageName> recentMessageNames = folder.getRecentMessages(mailboxSession); - return new ArrayList<Long>(recentMessageNames.keySet()); + SortedMap<MessageUid, MaildirMessageName> recentMessageNames = folder.getRecentMessages(mailboxSession); + return new ArrayList<MessageUid>(recentMessageNames.keySet()); } - /** - * @see org.apache.james.mailbox.store.mail.MessageMapper#findFirstUnseenMessageUid(org.apache.james.mailbox.store.mail.model.Mailbox) - */ @Override - public Long findFirstUnseenMessageUid(Mailbox mailbox) throws MailboxException { + public MessageUid findFirstUnseenMessageUid(Mailbox mailbox) throws MailboxException { List<MailboxMessage> result = findMessagesInMailbox(mailbox, MaildirMessageName.FILTER_UNSEEN_MESSAGES, 1); if (result.isEmpty()) { return null; @@ -214,7 +194,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper { updatedFlags.add(new UpdatedFlags(member.getUid(), modSeq, originalFlags, newFlags)); - long uid = member.getUid(); + MessageUid uid = member.getUid(); folder.update(mailboxSession, uid, newMessageName); } } catch (IOException e) { @@ -227,11 +207,11 @@ public class MaildirMessageMapper extends AbstractMessageMapper { } @Override - public Map<Long, MessageMetaData> expungeMarkedForDeletionInMailbox(Mailbox mailbox, MessageRange set) + public Map<MessageUid, MessageMetaData> expungeMarkedForDeletionInMailbox(Mailbox mailbox, MessageRange set) throws MailboxException { List<MailboxMessage> results = new ArrayList<MailboxMessage>(); - final long from = set.getUidFrom(); - final long to = set.getUidTo(); + final MessageUid from = set.getUidFrom(); + final MessageUid to = set.getUidTo(); final Type type = set.getType(); switch (type) { default: @@ -239,7 +219,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper { results = findMessagesInMailbox(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, -1); break; case FROM: - results = findMessagesInMailboxBetweenUIDs(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, from, -1, + results = findMessagesInMailboxBetweenUIDs(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, from, null, -1); break; case ONE: @@ -250,9 +230,9 @@ public class MaildirMessageMapper extends AbstractMessageMapper { -1); break; } - Map<Long, MessageMetaData> uids = new HashMap<Long, MessageMetaData>(); + Map<MessageUid, MessageMetaData> uids = new HashMap<MessageUid, MessageMetaData>(); for (MailboxMessage m : results) { - long uid = m.getUid(); + MessageUid uid = m.getUid(); uids.put(uid, new SimpleMessageMetaData(m)); delete(mailbox, m); } @@ -271,13 +251,8 @@ public class MaildirMessageMapper extends AbstractMessageMapper { throw new UnsupportedOperationException("Not implemented - see https://issues.apache.org/jira/browse/IMAP-370"); } - /** - * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#copy(org.apache - * .james.mailbox.store.mail.model.Mailbox, long, long, - * MailboxMessage) - */ @Override - protected MessageMetaData copy(Mailbox mailbox, long uid, long modSeq, MailboxMessage original) + protected MessageMetaData copy(Mailbox mailbox, MessageUid uid, long modSeq, MailboxMessage original) throws MailboxException { SimpleMailboxMessage theCopy = SimpleMailboxMessage.copy(mailbox.getMailboxId(), original); Flags flags = theCopy.createFlags(); @@ -293,7 +268,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper { @Override protected MessageMetaData save(Mailbox mailbox, MailboxMessage message) throws MailboxException { MaildirFolder folder = maildirStore.createMaildirFolder(mailbox); - long uid = 0; + MessageUid uid = MessageUid.MIN_VALUE; // a new message // save file to "tmp" folder File tmpFolder = folder.getTmpFolder(); @@ -377,28 +352,28 @@ public class MaildirMessageMapper extends AbstractMessageMapper { } - private List<MailboxMessage> findMessageInMailboxWithUID(Mailbox mailbox, long uid) + private List<MailboxMessage> findMessageInMailboxWithUID(Mailbox mailbox, MessageUid from) throws MailboxException { MaildirFolder folder = maildirStore.createMaildirFolder(mailbox); try { - MaildirMessageName messageName = folder.getMessageNameByUid(mailboxSession, uid); + MaildirMessageName messageName = folder.getMessageNameByUid(mailboxSession, from); ArrayList<MailboxMessage> messages = new ArrayList<MailboxMessage>(); if (messageName != null && messageName.getFile().exists()) { - messages.add(new MaildirMailboxMessage(mailbox, uid, messageName)); + messages.add(new MaildirMailboxMessage(mailbox, from, messageName)); } return messages; } catch (IOException e) { - throw new MailboxException("Failure while search for MailboxMessage with uid " + uid + " in Mailbox " + mailbox, e); + throw new MailboxException("Failure while search for MailboxMessage with uid " + from + " in Mailbox " + mailbox, e); } } private List<MailboxMessage> findMessagesInMailboxBetweenUIDs(Mailbox mailbox, FilenameFilter filter, - long from, long to, int max) throws MailboxException { + MessageUid from, MessageUid to, int max) throws MailboxException { MaildirFolder folder = maildirStore.createMaildirFolder(mailbox); int cur = 0; - SortedMap<Long, MaildirMessageName> uidMap = null; + SortedMap<MessageUid, MaildirMessageName> uidMap = null; try { if (filter != null) uidMap = folder.getUidMap(mailboxSession, filter, from, to); @@ -406,7 +381,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper { uidMap = folder.getUidMap(mailboxSession, from, to); ArrayList<MailboxMessage> messages = new ArrayList<MailboxMessage>(); - for (Entry<Long, MaildirMessageName> entry : uidMap.entrySet()) { + for (Entry<MessageUid, MaildirMessageName> entry : uidMap.entrySet()) { messages.add(new MaildirMailboxMessage(mailbox, entry.getKey(), entry.getValue())); if (max != -1) { cur++; @@ -425,10 +400,10 @@ public class MaildirMessageMapper extends AbstractMessageMapper { throws MailboxException { MaildirFolder folder = maildirStore.createMaildirFolder(mailbox); try { - SortedMap<Long, MaildirMessageName> uidMap = folder.getUidMap(mailboxSession, filter, limit); + SortedMap<MessageUid, MaildirMessageName> uidMap = folder.getUidMap(mailboxSession, filter, limit); ArrayList<MailboxMessage> filtered = new ArrayList<MailboxMessage>(uidMap.size()); - for (Entry<Long, MaildirMessageName> entry : uidMap.entrySet()) + for (Entry<MessageUid, MaildirMessageName> entry : uidMap.entrySet()) filtered.add(new MaildirMailboxMessage(mailbox, entry.getKey(), entry.getValue())); return filtered; } catch (IOException e) { @@ -437,7 +412,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper { } - private List<MailboxMessage> findDeletedMessageInMailboxWithUID(Mailbox mailbox, long uid) + private List<MailboxMessage> findDeletedMessageInMailboxWithUID(Mailbox mailbox, MessageUid uid) throws MailboxException { MaildirFolder folder = maildirStore.createMaildirFolder(mailbox); try { http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java ---------------------------------------------------------------------- diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java index ca5ff52..ec0c361 100644 --- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java +++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java @@ -24,6 +24,7 @@ import java.io.IOException; import javax.mail.Flags; +import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.maildir.MaildirFolder; import org.apache.james.mailbox.maildir.MaildirId; import org.apache.james.mailbox.maildir.MaildirMessageName; @@ -39,15 +40,15 @@ public class MaildirMailboxMessage extends DelegatingMailboxMessage { private boolean recent; private boolean seen; private final Mailbox mailbox; - private long uid; + private MessageUid uid; protected boolean newMessage; private long modSeq; - public MaildirMailboxMessage(Mailbox mailbox, long uid, MaildirMessageName messageName) throws IOException { + public MaildirMailboxMessage(Mailbox mailbox, MessageUid messageUid, MaildirMessageName messageName) throws IOException { super(new MaildirMessage(messageName)); this.mailbox = mailbox; - setUid(uid); + setUid(messageUid); setModSeq(messageName.getFile().lastModified()); Flags flags = messageName.getFlags(); @@ -74,12 +75,12 @@ public class MaildirMailboxMessage extends DelegatingMailboxMessage { } @Override - public long getUid() { + public MessageUid getUid() { return uid; } @Override - public void setUid(long uid) { + public void setUid(MessageUid uid) { this.uid = uid; } http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java ---------------------------------------------------------------------- diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java index ea8c926..9d2a5a6 100644 --- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java +++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java @@ -31,6 +31,7 @@ import javax.mail.Flags; import javax.mail.Flags.Flag; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.inmemory.InMemoryId; import org.apache.james.mailbox.model.MessageMetaData; @@ -45,38 +46,34 @@ import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage; public class InMemoryMessageMapper extends AbstractMessageMapper { - private final Map<InMemoryId, Map<Long, MailboxMessage>> mailboxByUid; + private final Map<InMemoryId, Map<MessageUid, MailboxMessage>> mailboxByUid; private static final int INITIAL_SIZE = 256; public InMemoryMessageMapper(MailboxSession session, UidProvider uidProvider, ModSeqProvider modSeqProvider) { super(session, uidProvider, modSeqProvider); - this.mailboxByUid = new ConcurrentHashMap<InMemoryId, Map<Long, MailboxMessage>>(INITIAL_SIZE); + this.mailboxByUid = new ConcurrentHashMap<InMemoryId, Map<MessageUid, MailboxMessage>>(INITIAL_SIZE); } - private Map<Long, MailboxMessage> getMembershipByUidForMailbox(Mailbox mailbox) { + private Map<MessageUid, MailboxMessage> getMembershipByUidForMailbox(Mailbox mailbox) { return getMembershipByUidForId((InMemoryId) mailbox.getMailboxId()); } - private Map<Long, MailboxMessage> getMembershipByUidForId(InMemoryId id) { - Map<Long, MailboxMessage> membershipByUid = mailboxByUid.get(id); + private Map<MessageUid, MailboxMessage> getMembershipByUidForId(InMemoryId id) { + Map<MessageUid, MailboxMessage> membershipByUid = mailboxByUid.get(id); if (membershipByUid == null) { - membershipByUid = new ConcurrentHashMap<Long, MailboxMessage>(INITIAL_SIZE); + membershipByUid = new ConcurrentHashMap<MessageUid, MailboxMessage>(INITIAL_SIZE); mailboxByUid.put(id, membershipByUid); } return membershipByUid; } - /** - * @see org.apache.james.mailbox.store.mail.MessageMapper#countMessagesInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox) - */ + @Override public long countMessagesInMailbox(Mailbox mailbox) throws MailboxException { return getMembershipByUidForMailbox(mailbox).size(); } - /** - * @see org.apache.james.mailbox.store.mail.MessageMapper#countUnseenMessagesInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox) - */ + @Override public long countUnseenMessagesInMailbox(Mailbox mailbox) throws MailboxException { long count = 0; for (MailboxMessage member : getMembershipByUidForMailbox(mailbox).values()) { @@ -87,10 +84,7 @@ public class InMemoryMessageMapper extends AbstractMessageMapper { return count; } - /** - * @see org.apache.james.mailbox.store.mail.MessageMapper#delete(org.apache.james.mailbox.store.mail.model.Mailbox, - * MailboxMessage) - */ + @Override public void delete(Mailbox mailbox, MailboxMessage message) throws MailboxException { getMembershipByUidForMailbox(mailbox).remove(message.getUid()); } @@ -98,53 +92,22 @@ public class InMemoryMessageMapper extends AbstractMessageMapper { @Override public MessageMetaData move(Mailbox mailbox, MailboxMessage original) throws MailboxException { InMemoryId originalMailboxId = (InMemoryId) original.getMailboxId(); - long uid = original.getUid(); + MessageUid uid = original.getUid(); MessageMetaData messageMetaData = copy(mailbox, original); getMembershipByUidForId(originalMailboxId).remove(uid); return messageMetaData; } - /** - * @see org.apache.james.mailbox.store.mail.MessageMapper#findInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox, - * org.apache.james.mailbox.model.MessageRange, - * org.apache.james.mailbox.store.mail.MessageMapper.FetchType, int) - */ + @Override public Iterator<MailboxMessage> findInMailbox(Mailbox mailbox, MessageRange set, FetchType ftype, int max) throws MailboxException { - List<MailboxMessage> results; - final MessageRange.Type type = set.getType(); - switch (type) { - case ALL: - results = new ArrayList<MailboxMessage>(getMembershipByUidForMailbox(mailbox).values()); - break; - case FROM: - results = new ArrayList<MailboxMessage>(getMembershipByUidForMailbox(mailbox).values()); - for (Iterator<MailboxMessage> it = results.iterator(); it.hasNext();) { - if (it.next().getUid() < set.getUidFrom()) { - it.remove(); - } + List<MailboxMessage> results = new ArrayList<MailboxMessage>(getMembershipByUidForMailbox(mailbox).values()); + for (Iterator<MailboxMessage> it = results.iterator(); it.hasNext();) { + if (!set.includes(it.next().getUid())) { + it.remove(); } - break; - case RANGE: - results = new ArrayList<MailboxMessage>(getMembershipByUidForMailbox(mailbox).values()); - for (Iterator<MailboxMessage> it = results.iterator(); it.hasNext();) { - final long uid = it.next().getUid(); - if (uid < set.getUidFrom() || uid > set.getUidTo()) { - it.remove(); - } - } - break; - case ONE: - results = new ArrayList<MailboxMessage>(1); - final MailboxMessage member = getMembershipByUidForMailbox(mailbox).get(set.getUidFrom()); - if (member != null) { - results.add(member); - } - break; - default: - results = new ArrayList<MailboxMessage>(); - break; } + Collections.sort(results); if (max > 0 && results.size() > max) { @@ -153,11 +116,9 @@ public class InMemoryMessageMapper extends AbstractMessageMapper { return results.iterator(); } - /** - * @see org.apache.james.mailbox.store.mail.MessageMapper#findRecentMessageUidsInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox) - */ - public List<Long> findRecentMessageUidsInMailbox(Mailbox mailbox) throws MailboxException { - final List<Long> results = new ArrayList<Long>(); + @Override + public List<MessageUid> findRecentMessageUidsInMailbox(Mailbox mailbox) throws MailboxException { + final List<MessageUid> results = new ArrayList<MessageUid>(); for (MailboxMessage member : getMembershipByUidForMailbox(mailbox).values()) { if (member.isRecent()) { results.add(member.getUid()); @@ -168,10 +129,8 @@ public class InMemoryMessageMapper extends AbstractMessageMapper { return results; } - /** - * @see org.apache.james.mailbox.store.mail.MessageMapper#findFirstUnseenMessageUid(org.apache.james.mailbox.store.mail.model.Mailbox) - */ - public Long findFirstUnseenMessageUid(Mailbox mailbox) throws MailboxException { + @Override + public MessageUid findFirstUnseenMessageUid(Mailbox mailbox) throws MailboxException { List<MailboxMessage> memberships = new ArrayList<MailboxMessage>(getMembershipByUidForMailbox(mailbox).values()); Collections.sort(memberships); for (MailboxMessage m : memberships) { @@ -183,9 +142,9 @@ public class InMemoryMessageMapper extends AbstractMessageMapper { } @Override - public Map<Long, MessageMetaData> expungeMarkedForDeletionInMailbox(Mailbox mailbox, MessageRange set) + public Map<MessageUid, MessageMetaData> expungeMarkedForDeletionInMailbox(Mailbox mailbox, MessageRange set) throws MailboxException { - final Map<Long, MessageMetaData> filteredResult = new HashMap<Long, MessageMetaData>(); + final Map<MessageUid, MessageMetaData> filteredResult = new HashMap<MessageUid, MessageMetaData>(); Iterator<MailboxMessage> it = findInMailbox(mailbox, set, FetchType.Metadata, -1); while (it.hasNext()) { @@ -203,18 +162,13 @@ public class InMemoryMessageMapper extends AbstractMessageMapper { mailboxByUid.clear(); } - /** - * Do nothing - */ + @Override public void endRequest() { // Do nothing } - /** - * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox, - * long, long, MailboxMessage) - */ - protected MessageMetaData copy(Mailbox mailbox, long uid, long modSeq, MailboxMessage original) + @Override + protected MessageMetaData copy(Mailbox mailbox, MessageUid uid, long modSeq, MailboxMessage original) throws MailboxException { SimpleMailboxMessage message = SimpleMailboxMessage.copy(mailbox.getMailboxId(), original); message.setUid(uid); @@ -227,10 +181,7 @@ public class InMemoryMessageMapper extends AbstractMessageMapper { return save(mailbox, message); } - /** - * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#save(org.apache.james.mailbox.store.mail.model.Mailbox, - * MailboxMessage) - */ + @Override protected MessageMetaData save(Mailbox mailbox, MailboxMessage message) throws MailboxException { SimpleMailboxMessage copy = SimpleMailboxMessage.copy(mailbox.getMailboxId(), message); copy.setUid(message.getUid()); @@ -240,23 +191,17 @@ public class InMemoryMessageMapper extends AbstractMessageMapper { return new SimpleMessageMetaData(message); } - /** - * Do nothing - */ + @Override protected void begin() throws MailboxException { } - /** - * Do nothing - */ + @Override protected void commit() throws MailboxException { } - /** - * Do nothing - */ + @Override protected void rollback() throws MailboxException { } } http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryUidProvider.java ---------------------------------------------------------------------- diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryUidProvider.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryUidProvider.java index d9004e8..c942068 100644 --- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryUidProvider.java +++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryUidProvider.java @@ -24,35 +24,45 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicLong; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.inmemory.InMemoryId; import org.apache.james.mailbox.store.mail.UidProvider; import org.apache.james.mailbox.store.mail.model.Mailbox; +import com.google.common.base.Optional; + public class InMemoryUidProvider implements UidProvider{ private final ConcurrentMap<InMemoryId, AtomicLong> map = new ConcurrentHashMap<InMemoryId, AtomicLong>(); @Override - public long nextUid(MailboxSession session, Mailbox mailbox) throws MailboxException { - return getLast((InMemoryId) mailbox.getMailboxId()).incrementAndGet(); + public MessageUid nextUid(MailboxSession session, Mailbox mailbox) throws MailboxException { + InMemoryId mailboxId = (InMemoryId) mailbox.getMailboxId(); + AtomicLong uid = getLast(mailboxId); + if (uid != null) { + return MessageUid.of(uid.incrementAndGet()); + } + AtomicLong initialUid = new AtomicLong(MessageUid.MIN_VALUE.asLong()); + AtomicLong previousUid = map.putIfAbsent(mailboxId, initialUid); + if (previousUid != null) { + return MessageUid.of(previousUid.incrementAndGet()); + } else { + return MessageUid.MIN_VALUE; + } } @Override - public long lastUid(MailboxSession session, Mailbox mailbox) throws MailboxException { - return getLast((InMemoryId) mailbox.getMailboxId()).get(); + public Optional<MessageUid> lastUid(MailboxSession session, Mailbox mailbox) throws MailboxException { + AtomicLong last = getLast((InMemoryId) mailbox.getMailboxId()); + if (last == null) { + return Optional.absent(); + } + return Optional.of(MessageUid.of(last.get())); } private AtomicLong getLast(InMemoryId id) { - AtomicLong uid = map.get(id); - if (uid == null) { - uid = new AtomicLong(0); - AtomicLong u = map.putIfAbsent(id, uid); - if (u != null) { - uid = u; - } - } - return uid; + return map.get(id); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
