You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ad...@apache.org on 2016/10/10 10:34:25 UTC
[07/11] james-project git commit: JAMES-1825 use a MessageUid strong
type instead of long in the whole code base
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 <te...@localhost>");
headersTestSubject.put("Cc", "test211 <te...@localhost>, test6 <te...@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 <us...@domain.org>");
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,"Harry@example.org"));
- 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,"ser-from@domain.or"));
- 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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org