MAILBOX-273 require multimailbox search capability for jmap
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/7a6a4c19 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/7a6a4c19 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/7a6a4c19 Branch: refs/heads/master Commit: 7a6a4c193d35b23ff2e4e326a858b9be237a44ef Parents: 41cd544 Author: Matthieu Baechler <[email protected]> Authored: Tue Jul 19 18:35:31 2016 +0200 Committer: Matthieu Baechler <[email protected]> Committed: Mon Jul 25 10:13:31 2016 +0200 ---------------------------------------------------------------------- .../org/apache/james/mailbox/MailboxManager.java | 6 ++++++ .../ElasticSearchListeningMessageSearchIndex.java | 7 +++++++ .../lucene/search/LuceneMessageSearchIndex.java | 8 ++++++++ .../james/mailbox/store/StoreMailboxManager.java | 6 ++++++ .../store/search/LazyMessageSearchIndex.java | 7 +++++++ .../mailbox/store/search/MessageSearchIndex.java | 4 ++++ .../store/search/SimpleMessageSearchIndex.java | 7 +++++++ .../processor/base/MailboxEventAnalyserTest.java | 5 +++++ .../apache/james/JamesCapabilitiesServerTest.java | 16 ++++++++++++++++ .../main/java/org/apache/james/jmap/JMAPModule.java | 2 ++ .../jmap/FirstUserConnectionFilterThreadTest.java | 5 +++++ 11 files changed, 73 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/7a6a4c19/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java ---------------------------------------------------------------------- diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java index 1d60bcf..8cc0ea6 100644 --- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java @@ -88,7 +88,13 @@ public interface MailboxManager extends RequestAware, MailboxListenerSupport { } EnumSet<MessageCapabilities> getSupportedMessageCapabilities(); + + enum SearchCapabilities { + MultimailboxSearch + } + EnumSet<SearchCapabilities> getSupportedSearchCapabilities(); + /** * Return the delimiter to use for folders http://git-wip-us.apache.org/repos/asf/james-project/blob/7a6a4c19/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java ---------------------------------------------------------------------- diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java index b967e7c..dc7e301 100644 --- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java +++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java @@ -21,6 +21,7 @@ package org.apache.james.mailbox.elasticsearch.events; import static org.elasticsearch.index.query.QueryBuilders.termQuery; import java.util.Collection; +import java.util.EnumSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -29,6 +30,7 @@ import java.util.stream.Collectors; import javax.inject.Inject; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MailboxManager.SearchCapabilities; import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer; import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants; import org.apache.james.mailbox.elasticsearch.json.MessageToElasticSearchJson; @@ -72,6 +74,11 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe } @Override + public EnumSet<SearchCapabilities> getSupportedCapabilities() { + return EnumSet.of(SearchCapabilities.MultimailboxSearch); + } + + @Override public Iterator<Long> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException { MailboxId mailboxId = mailbox.getMailboxId(); return searcher http://git-wip-us.apache.org/repos/asf/james-project/blob/7a6a4c19/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java ---------------------------------------------------------------------- diff --git a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java index 13ce4ac..9eb0388 100644 --- a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java +++ b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Date; +import java.util.EnumSet; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -39,6 +40,7 @@ import java.util.TimeZone; import javax.mail.Flags; import javax.mail.Flags.Flag; +import org.apache.james.mailbox.MailboxManager.SearchCapabilities; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.UnsupportedSearchException; @@ -366,6 +368,12 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex { return ListenerType.EACH_NODE; } + + @Override + public EnumSet<SearchCapabilities> getSupportedCapabilities() { + return EnumSet.noneOf(SearchCapabilities.class); + } + /** * Set the max count of results which will get returned from a query. The default is {@link #DEFAULT_MAX_QUERY_RESULTS} * http://git-wip-us.apache.org/repos/asf/james-project/blob/7a6a4c19/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java index 1d671af..84f24ae 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java @@ -209,6 +209,12 @@ public class StoreMailboxManager implements MailboxManager { return EnumSet.noneOf(MessageCapabilities.class); } + @Override + public EnumSet<SearchCapabilities> getSupportedSearchCapabilities() { + return index.getSupportedCapabilities(); + } + + /** * Return the {@link DelegatingMailboxListener} which is used by this {@link MailboxManager} * http://git-wip-us.apache.org/repos/asf/james-project/blob/7a6a4c19/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java index 82704f9..4096c8e 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java @@ -19,11 +19,13 @@ package org.apache.james.mailbox.store.search; import java.util.Collection; +import java.util.EnumSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.apache.james.mailbox.MailboxManager.SearchCapabilities; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.UnsupportedSearchException; @@ -60,6 +62,11 @@ public class LazyMessageSearchIndex extends ListeningMessageSearchIndex { public ListenerType getType() { return index.getType(); } + + @Override + public EnumSet<SearchCapabilities> getSupportedCapabilities() { + return EnumSet.noneOf(SearchCapabilities.class); + } @Override public void add(MailboxSession session, Mailbox mailbox, MailboxMessage message) throws MailboxException { http://git-wip-us.apache.org/repos/asf/james-project/blob/7a6a4c19/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java index b120b3a..3dcfcca 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java @@ -20,9 +20,11 @@ package org.apache.james.mailbox.store.search; import java.util.Collection; +import java.util.EnumSet; import java.util.Iterator; import java.util.Map; +import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.model.MailboxId; @@ -49,4 +51,6 @@ public interface MessageSearchIndex { */ Map<MailboxId, Collection<Long>> search(MailboxSession session, MultimailboxesSearchQuery searchQuery) throws MailboxException; + EnumSet<MailboxManager.SearchCapabilities> getSupportedCapabilities(); + } http://git-wip-us.apache.org/repos/asf/james-project/blob/7a6a4c19/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java index e4712c2..4a2e8d1 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java @@ -19,6 +19,7 @@ package org.apache.james.mailbox.store.search; import java.util.Collection; +import java.util.EnumSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -27,6 +28,7 @@ import java.util.TreeSet; import javax.inject.Inject; +import org.apache.james.mailbox.MailboxManager.SearchCapabilities; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.UnsupportedSearchException; @@ -61,6 +63,11 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex { this.factory = factory; } + @Override + public EnumSet<SearchCapabilities> getSupportedCapabilities() { + return EnumSet.noneOf(SearchCapabilities.class); + } + /** * Walks down the query tree's conjunctions to find a UidCriterion * @param crits - list of Criterion to search from http://git-wip-us.apache.org/repos/asf/james-project/blob/7a6a4c19/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java ---------------------------------------------------------------------- diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java index 036ad33..29a6643 100644 --- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java +++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java @@ -87,6 +87,11 @@ public class MailboxEventAnalyserTest { return EnumSet.noneOf(MessageCapabilities.class); } + @Override + public EnumSet<SearchCapabilities> getSupportedSearchCapabilities() { + return EnumSet.noneOf(SearchCapabilities.class); + } + public boolean hasCapability(MailboxCapabilities capability) { return false; } http://git-wip-us.apache.org/repos/asf/james-project/blob/7a6a4c19/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java ---------------------------------------------------------------------- diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java index b0f9feb..3eeeff8 100644 --- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java +++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java @@ -106,6 +106,20 @@ public class JamesCapabilitiesServerTest { assertThatThrownBy(() -> server.start()).isInstanceOf(IllegalArgumentException.class); } + + @Test + public void startShouldFailWhenNoMultimailboxSearchCapability() throws Exception { + MailboxManager mailboxManager = mock(MailboxManager.class); + when(mailboxManager.getSupportedMailboxCapabilities()) + .thenReturn(EnumSet.allOf(MailboxManager.MailboxCapabilities.class)); + when(mailboxManager.getSupportedMessageCapabilities()) + .thenReturn(EnumSet.allOf(MailboxManager.MessageCapabilities.class)); + when(mailboxManager.getSupportedSearchCapabilities()) + .thenReturn(EnumSet.noneOf(MailboxManager.SearchCapabilities.class)); + server = createCassandraJamesServer(mailboxManager); + + assertThatThrownBy(() -> server.start()).isInstanceOf(IllegalArgumentException.class); + } @Test public void startShouldSucceedWhenRequiredCapabilities() throws Exception { @@ -113,6 +127,8 @@ public class JamesCapabilitiesServerTest { when(mailboxManager.hasCapability(MailboxManager.MailboxCapabilities.Move)).thenReturn(true); when(mailboxManager.getSupportedMessageCapabilities()) .thenReturn(EnumSet.of(MailboxManager.MessageCapabilities.Attachment)); + when(mailboxManager.getSupportedSearchCapabilities()) + .thenReturn(EnumSet.of(MailboxManager.SearchCapabilities.MultimailboxSearch)); server = createCassandraJamesServer(mailboxManager); server.start(); http://git-wip-us.apache.org/repos/asf/james-project/blob/7a6a4c19/server/container/guice/guice-common/src/main/java/org/apache/james/jmap/JMAPModule.java ---------------------------------------------------------------------- diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/jmap/JMAPModule.java b/server/container/guice/guice-common/src/main/java/org/apache/james/jmap/JMAPModule.java index 247c70d..93bb11c 100644 --- a/server/container/guice/guice-common/src/main/java/org/apache/james/jmap/JMAPModule.java +++ b/server/container/guice/guice-common/src/main/java/org/apache/james/jmap/JMAPModule.java @@ -106,6 +106,8 @@ public class JMAPModule extends AbstractModule { "MOVE support in MailboxManager is required by JMAP Module"); Preconditions.checkArgument(mailboxManager.getSupportedMessageCapabilities().contains(MailboxManager.MessageCapabilities.Attachment), "Attachment support in MailboxManager is required by JMAP Module"); + Preconditions.checkArgument(mailboxManager.getSupportedSearchCapabilities().contains(MailboxManager.SearchCapabilities.MultimailboxSearch), + "Multimailbox search in MailboxManager is required by JMAP Module"); } @Override http://git-wip-us.apache.org/repos/asf/james-project/blob/7a6a4c19/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java index 8dc4628..8b4c273 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java @@ -92,6 +92,11 @@ public class FirstUserConnectionFilterThreadTest { } @Override + public EnumSet<SearchCapabilities> getSupportedSearchCapabilities() { + return EnumSet.noneOf(SearchCapabilities.class); + } + + @Override public void startProcessingRequest(MailboxSession session) { } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
