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 ma...@apache.org on 2016/07/25 13:41:11 UTC

[2/2] james-project git commit: MAILBOX-272 Add users in ES indexer

MAILBOX-272 Add users in ES indexer


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/c981e8a3
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/c981e8a3
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/c981e8a3

Branch: refs/heads/master
Commit: c981e8a399efe6b01e558a67669caee6fd646165
Parents: e456c07
Author: Antoine Duprat <ad...@linagora.com>
Authored: Fri Jul 22 13:22:46 2016 +0200
Committer: Matthieu Baechler <ma...@linagora.com>
Committed: Mon Jul 25 15:38:55 2016 +0200

----------------------------------------------------------------------
 mailbox/elasticsearch/pom.xml                   |   6 +
 .../elasticsearch/NodeMappingFactory.java       |   4 +
 ...lasticSearchListeningMessageSearchIndex.java |  11 +-
 .../elasticsearch/json/IndexableMessage.java    |  12 +-
 .../json/JsonMessageConstants.java              |   1 +
 .../json/MessageToElasticSearchJson.java        |   6 +-
 .../elasticsearch/query/QueryConverter.java     |  12 +-
 .../search/ElasticSearchSearcher.java           |  10 +-
 ...hListeningMailboxMessageSearchIndexTest.java |  13 +-
 .../MailboxMessageToElasticSearchJsonTest.java  |  39 +-
 .../lucene/search/LuceneMessageSearchIndex.java |   3 +
 .../LuceneMailboxMessageSearchIndexTest.java    | 113 ++---
 .../store/search/LazyMessageSearchIndex.java    |   3 +
 .../mailbox/store/search/MessageSearches.java   |  80 ++--
 .../store/search/SimpleMessageSearchIndex.java  |  21 +-
 .../store/SearchUtilsMultipartMixedTest.java    |  65 ++-
 .../mailbox/store/SearchUtilsRFC822Test.java    |  31 +-
 .../james/mailbox/store/SearchUtilsTest.java    | 441 +++++++++----------
 .../search/AbstractMessageSearchIndexTest.java  |  23 +-
 .../store/src/test/resources/eml/htmlMail.json  |   5 +-
 mailbox/store/src/test/resources/eml/mail.json  |   5 +-
 .../src/test/resources/eml/nonTextual.json      |   5 +-
 .../src/test/resources/eml/pgpSignedMail.json   |   5 +-
 .../src/test/resources/eml/recursiveMail.json   |   5 +-
 .../store/src/test/resources/eml/spamMail.json  |   5 +-
 25 files changed, 514 insertions(+), 410 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/mailbox/elasticsearch/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/pom.xml b/mailbox/elasticsearch/pom.xml
index 864a95f..59df4ee 100644
--- a/mailbox/elasticsearch/pom.xml
+++ b/mailbox/elasticsearch/pom.xml
@@ -163,6 +163,12 @@
                     <artifactId>apache-james-mailbox-api</artifactId>
                 </dependency>
                 <dependency>
+                    <groupId>${project.groupId}</groupId>
+                    <artifactId>apache-james-mailbox-api</artifactId>
+                    <type>test-jar</type>
+                    <scope>test</scope>
+                </dependency>
+                <dependency>
                     <groupId>org.apache.james</groupId>
                     <artifactId>apache-james-mailbox-store</artifactId>
                 </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
index f74da92..91bf2e6 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
@@ -192,6 +192,10 @@ public class NodeMappingFactory {
                                 .field(TYPE, STRING)
                                 .field(INDEX, NOT_ANALYZED)
                             .endObject()
+                            .startObject(JsonMessageConstants.USERS)
+                                .field(TYPE, STRING)
+                                .field(INDEX, NOT_ANALYZED)
+                            .endObject()
                             .startObject(JsonMessageConstants.PROPERTIES)
                                 .field(TYPE, NESTED)
                                 .startObject(PROPERTIES)

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/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 dc7e301..957826d 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
@@ -29,8 +29,8 @@ 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.MailboxSession;
 import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer;
 import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
 import org.apache.james.mailbox.elasticsearch.json.MessageToElasticSearchJson;
@@ -48,6 +48,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 
 public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSearchIndex {
@@ -80,9 +81,10 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
     
     @Override
     public Iterator<Long> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException {
+        Preconditions.checkArgument(session != null, "'session' is mandatory");
         MailboxId mailboxId = mailbox.getMailboxId();
         return searcher
-                .search(ImmutableList.of(mailboxId), searchQuery)
+                .search(ImmutableList.of(session.getUser()), ImmutableList.of(mailboxId), searchQuery)
                 .get(mailboxId)
                 .iterator();
     }
@@ -90,13 +92,14 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
     @Override
     public Map<MailboxId, Collection<Long>> search(MailboxSession session, MultimailboxesSearchQuery searchQuery)
             throws MailboxException {
-        return searcher.search(searchQuery.getMailboxIds(), searchQuery.getSearchQuery()).asMap();
+        Preconditions.checkArgument(session != null, "'session' is mandatory");
+        return searcher.search(ImmutableList.of(session.getUser()), searchQuery.getMailboxIds(), searchQuery.getSearchQuery()).asMap();
     }
 
     @Override
     public void add(MailboxSession session, Mailbox mailbox, MailboxMessage message) throws MailboxException {
         try {
-            indexer.indexMessage(indexIdFor(mailbox, message.getUid()), messageToElasticSearchJson.convertToJson(message));
+            indexer.indexMessage(indexIdFor(mailbox, message.getUid()), messageToElasticSearchJson.convertToJson(message, ImmutableList.of(session.getUser())));
         } catch (Exception e) {
             LOGGER.error("Error when indexing message " + message.getUid(), e);
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
index 9174dcd..5b1cec1 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
@@ -28,6 +28,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import org.apache.james.mailbox.MailboxSession.User;
 import org.apache.james.mailbox.elasticsearch.query.DateResolutionFormater;
 import org.apache.james.mailbox.store.extractor.TextExtractor;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -35,17 +36,20 @@ import org.apache.james.mailbox.store.mail.model.Property;
 import org.apache.james.mime4j.MimeException;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.steveash.guavate.Guavate;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Throwables;
 import com.google.common.collect.Multimap;
 
 public class IndexableMessage {
 
-    public static IndexableMessage from(MailboxMessage message, TextExtractor textExtractor, ZoneId zoneId) {
+    public static IndexableMessage from(MailboxMessage message, List<User> users, TextExtractor textExtractor, ZoneId zoneId) {
         Preconditions.checkNotNull(message.getMailboxId());
+        Preconditions.checkArgument(!users.isEmpty());
         IndexableMessage indexableMessage = new IndexableMessage();
         try {
             MimePart parsingResult = new MimePartParser(message, textExtractor).parse();
+            indexableMessage.users = users.stream().map(User::getUserName).collect(Guavate.toImmutableList());
             indexableMessage.bodyText = parsingResult.locateFirstTextualBody();
             indexableMessage.setFlattenedAttachments(parsingResult);
             indexableMessage.copyHeaderFields(parsingResult.getHeaderCollection(), getSanitizedInternalDate(message, zoneId));
@@ -101,6 +105,7 @@ public class IndexableMessage {
 
     private Long id;
     private String mailboxId;
+    private List<String> users;
     private long modSeq;
     private long size;
     private String date;
@@ -135,6 +140,11 @@ public class IndexableMessage {
         return mailboxId;
     }
 
+    @JsonProperty(JsonMessageConstants.USERS)
+    public List<String> getUsers() {
+        return users;
+    }
+
     @JsonProperty(JsonMessageConstants.MODSEQ)
     public long getModSeq() {
         return modSeq;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/JsonMessageConstants.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/JsonMessageConstants.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/JsonMessageConstants.java
index 23937ca..56361e8 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/JsonMessageConstants.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/JsonMessageConstants.java
@@ -26,6 +26,7 @@ public interface JsonMessageConstants {
      */
     String ID = "id";
     String MAILBOX_ID = "mailboxId";
+    String USERS = "users";
     String IS_UNREAD = "isUnread";
     String IS_FLAGGED = "isFlagged";
     String IS_ANSWERED = "isAnswered";

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
index 01f8a00..a35825e 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
@@ -20,10 +20,12 @@
 package org.apache.james.mailbox.elasticsearch.json;
 
 import java.time.ZoneId;
+import java.util.List;
 
 import javax.inject.Inject;
 import javax.mail.Flags;
 
+import org.apache.james.mailbox.MailboxSession.User;
 import org.apache.james.mailbox.store.extractor.TextExtractor;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
@@ -52,9 +54,9 @@ public class MessageToElasticSearchJson {
         this(textExtractor, ZoneId.systemDefault());
     }
 
-    public String convertToJson(MailboxMessage message) throws JsonProcessingException {
+    public String convertToJson(MailboxMessage message, List<User> users) throws JsonProcessingException {
         Preconditions.checkNotNull(message);
-        return mapper.writeValueAsString(IndexableMessage.from(message, textExtractor, zoneId));
+        return mapper.writeValueAsString(IndexableMessage.from(message, users, textExtractor, zoneId));
     }
 
     public String getUpdatedJsonMessagePart(Flags flags, long modSeq) throws JsonProcessingException {

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/QueryConverter.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/QueryConverter.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/QueryConverter.java
index 762522f..0757b34 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/QueryConverter.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/QueryConverter.java
@@ -27,6 +27,7 @@ import java.util.List;
 
 import javax.inject.Inject;
 
+import org.apache.james.mailbox.MailboxSession.User;
 import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.SearchQuery;
@@ -45,8 +46,9 @@ public class QueryConverter {
         this.criterionConverter = criterionConverter;
     }
 
-    public QueryBuilder from(SearchQuery searchQuery, Collection<MailboxId> mailboxIds) {
+    public QueryBuilder from(SearchQuery searchQuery, List<User> users, Collection<MailboxId> mailboxIds) {
         QueryBuilder queryBuilder = generateQueryBuilder(searchQuery);
+        queryBuilder = addUsersFilter(queryBuilder, users);
         return addMailboxFilters(queryBuilder, mailboxIds);
     }
 
@@ -61,6 +63,14 @@ public class QueryConverter {
         }
     }
 
+    private QueryBuilder addUsersFilter(QueryBuilder queryBuilder, List<User> users) {
+        ImmutableList<String> usernames = users.stream()
+                .map(User::getUserName)
+                .collect(Guavate.toImmutableList());
+        return boolQuery().must(queryBuilder)
+            .filter(termsQuery(JsonMessageConstants.USERS, usernames));
+    }
+
     private QueryBuilder addMailboxFilters(QueryBuilder queryBuilder, Collection<MailboxId> mailboxIds) {
         if (mailboxIds.isEmpty()) {
             return queryBuilder;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
index 8a9a1d8..9edaa41 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.elasticsearch.search;
 
 import java.util.Collection;
+import java.util.List;
 import java.util.Optional;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
@@ -27,6 +28,7 @@ import java.util.stream.StreamSupport;
 import javax.inject.Inject;
 
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.james.mailbox.MailboxSession.User;
 import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer;
 import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
 import org.apache.james.mailbox.elasticsearch.query.QueryConverter;
@@ -70,13 +72,13 @@ public class ElasticSearchSearcher {
         this.mailboxIdFactory = mailboxIdFactory;
     }
     
-    public Multimap<MailboxId, Long> search(Collection<MailboxId> mailboxIds, SearchQuery searchQuery) throws MailboxException {
-        return new ScrollIterable(client, getSearchRequestBuilder(client, mailboxIds, searchQuery)).stream()
+    public Multimap<MailboxId, Long> search(List<User> users, Collection<MailboxId> mailboxIds, SearchQuery searchQuery) throws MailboxException {
+        return new ScrollIterable(client, getSearchRequestBuilder(client, users, mailboxIds, searchQuery)).stream()
             .flatMap(this::transformResponseToUidStream)
             .collect(Guavate.toImmutableListMultimap(Pair::getLeft, Pair::getRight));
     }
     
-    private SearchRequestBuilder getSearchRequestBuilder(Client client, Collection<MailboxId> mailboxIds, SearchQuery searchQuery) {
+    private SearchRequestBuilder getSearchRequestBuilder(Client client, List<User> users, Collection<MailboxId> mailboxIds, SearchQuery searchQuery) {
         return searchQuery.getSorts()
             .stream()
             .reduce(
@@ -84,7 +86,7 @@ public class ElasticSearchSearcher {
                     .setTypes(ElasticSearchIndexer.MESSAGE_TYPE)
                     .setScroll(TIMEOUT)
                     .addFields(JsonMessageConstants.ID, JsonMessageConstants.MAILBOX_ID)
-                    .setQuery(queryConverter.from(searchQuery, mailboxIds))
+                    .setQuery(queryConverter.from(searchQuery, users, mailboxIds))
                     .setSize(size),
                 (searchBuilder, sort) -> searchBuilder.addSort(SortConverter.convertSort(sort)),
                 (partialResult1, partialResult2) -> partialResult1);

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
index 0039eb9..639eeb5 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
@@ -32,6 +32,7 @@ import java.util.List;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MailboxSession.User;
 import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer;
 import org.apache.james.mailbox.elasticsearch.json.MessageToElasticSearchJson;
 import org.apache.james.mailbox.elasticsearch.search.ElasticSearchSearcher;
@@ -70,7 +71,8 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
 
         indexer = control.createMock(ElasticSearchIndexer.class);
 
-        expect(messageToElasticSearchJson.convertToJson(anyObject(MailboxMessage.class))).andReturn("json content").anyTimes();
+        List<User> users = anyObject();
+        expect(messageToElasticSearchJson.convertToJson(anyObject(MailboxMessage.class), users)).andReturn("json content").anyTimes();
         expect(messageToElasticSearchJson.getUpdatedJsonMessagePart(anyObject(Flags.class), anyLong())).andReturn("json updated content").anyTimes();
 
         testee = new ElasticSearchListeningMessageSearchIndex(mapperFactory, indexer, elasticSearchSearcher, messageToElasticSearchJson);
@@ -78,9 +80,12 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
     
     @Test
     public void addShouldIndex() throws Exception {
+        MailboxSession.User user = control.createMock(MailboxSession.User.class);
         MailboxSession session = control.createMock(MailboxSession.class);
+        expect(session.getUser())
+            .andReturn(user);
+
         Mailbox mailbox = control.createMock(Mailbox.class);
-        
         long messageId = 1;
         TestId mailboxId = TestId.of(12);
         expect(mailbox.getMailboxId()).andReturn(mailboxId);
@@ -103,7 +108,11 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
     
     @Test
     public void addShouldNotPropagateExceptionWhenExceptionOccurs() throws Exception {
+        MailboxSession.User user = control.createMock(MailboxSession.User.class);
         MailboxSession session = control.createMock(MailboxSession.class);
+        expect(session.getUser())
+            .andReturn(user);
+
         Mailbox mailbox = control.createMock(Mailbox.class);
         
         long messageId = 1;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MailboxMessageToElasticSearchJsonTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MailboxMessageToElasticSearchJsonTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MailboxMessageToElasticSearchJsonTest.java
index da899ea..ce43184 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MailboxMessageToElasticSearchJsonTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MailboxMessageToElasticSearchJsonTest.java
@@ -22,6 +22,7 @@ package org.apache.james.mailbox.elasticsearch.json;
 import static net.javacrumbs.jsonunit.core.Option.IGNORING_ARRAY_ORDER;
 import static net.javacrumbs.jsonunit.core.Option.IGNORING_VALUES;
 import static net.javacrumbs.jsonunit.fluent.JsonFluentAssert.assertThatJson;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.io.IOException;
 import java.nio.charset.Charset;
@@ -33,6 +34,8 @@ import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.FlagsBuilder;
+import org.apache.james.mailbox.MailboxSession.User;
+import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.store.TestId;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -44,6 +47,7 @@ import org.junit.Test;
 
 import com.google.common.base.Charsets;
 import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
 
 public class MailboxMessageToElasticSearchJsonTest {
 
@@ -69,6 +73,24 @@ public class MailboxMessageToElasticSearchJsonTest {
     }
 
     @Test
+    public void convertToJsonShouldThrowWhenNoUser() throws Exception {
+        MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
+                new DefaultTextExtractor(),
+                ZoneId.of("Europe/Paris"));
+        MailboxMessage spamMail = new SimpleMailboxMessage(date,
+                SIZE,
+                BODY_START_OCTET,
+                new SharedByteArrayInputStream("message".getBytes(Charsets.UTF_8)),
+                new Flags(),
+                propertyBuilder,
+                MAILBOX_ID);
+        ImmutableList<User> users = ImmutableList.of();
+
+        assertThatThrownBy(() -> messageToElasticSearchJson.convertToJson(spamMail, users))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
     public void spamEmailShouldBeWellConvertedToJson() throws IOException {
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
             new DefaultTextExtractor(),
@@ -81,7 +103,7 @@ public class MailboxMessageToElasticSearchJsonTest {
             propertyBuilder,
             MAILBOX_ID);
         spamMail.setModSeq(MOD_SEQ);
-        assertThatJson(messageToElasticSearchJson.convertToJson(spamMail))
+        assertThatJson(messageToElasticSearchJson.convertToJson(spamMail, ImmutableList.of(new MockMailboxSession("username").getUser())))
             .when(IGNORING_ARRAY_ORDER)
             .isEqualTo(IOUtils.toString(ClassLoader.getSystemResource("eml/spamMail.json"), CHARSET));
     }
@@ -100,7 +122,7 @@ public class MailboxMessageToElasticSearchJsonTest {
             MAILBOX_ID);
         htmlMail.setModSeq(MOD_SEQ);
         htmlMail.setUid(UID);
-        assertThatJson(messageToElasticSearchJson.convertToJson(htmlMail))
+        assertThatJson(messageToElasticSearchJson.convertToJson(htmlMail, ImmutableList.of(new MockMailboxSession("username").getUser())))
             .when(IGNORING_ARRAY_ORDER)
             .isEqualTo(IOUtils.toString(ClassLoader.getSystemResource("eml/htmlMail.json")));
     }
@@ -119,7 +141,7 @@ public class MailboxMessageToElasticSearchJsonTest {
             MAILBOX_ID);
         pgpSignedMail.setModSeq(MOD_SEQ);
         pgpSignedMail.setUid(UID);
-        assertThatJson(messageToElasticSearchJson.convertToJson(pgpSignedMail))
+        assertThatJson(messageToElasticSearchJson.convertToJson(pgpSignedMail, ImmutableList.of(new MockMailboxSession("username").getUser())))
             .when(IGNORING_ARRAY_ORDER)
             .isEqualTo(IOUtils.toString(ClassLoader.getSystemResource("eml/pgpSignedMail.json")));
     }
@@ -138,7 +160,8 @@ public class MailboxMessageToElasticSearchJsonTest {
             MAILBOX_ID);
         mail.setModSeq(MOD_SEQ);
         mail.setUid(UID);
-        assertThatJson(messageToElasticSearchJson.convertToJson(mail))
+        assertThatJson(messageToElasticSearchJson.convertToJson(mail, 
+                ImmutableList.of(new MockMailboxSession("user1").getUser(), new MockMailboxSession("user2").getUser())))
             .when(IGNORING_ARRAY_ORDER).when(IGNORING_VALUES)
             .isEqualTo(IOUtils.toString(ClassLoader.getSystemResource("eml/mail.json")));
     }
@@ -157,7 +180,7 @@ public class MailboxMessageToElasticSearchJsonTest {
             MAILBOX_ID);
         recursiveMail.setModSeq(MOD_SEQ);
         recursiveMail.setUid(UID);
-        assertThatJson(messageToElasticSearchJson.convertToJson(recursiveMail))
+        assertThatJson(messageToElasticSearchJson.convertToJson(recursiveMail, ImmutableList.of(new MockMailboxSession("username").getUser())))
             .when(IGNORING_ARRAY_ORDER).when(IGNORING_VALUES)
             .isEqualTo(IOUtils.toString(ClassLoader.getSystemResource("eml/recursiveMail.json")));
     }
@@ -176,7 +199,7 @@ public class MailboxMessageToElasticSearchJsonTest {
             MAILBOX_ID);
         mailWithNoInternalDate.setModSeq(MOD_SEQ);
         mailWithNoInternalDate.setUid(UID);
-        assertThatJson(messageToElasticSearchJson.convertToJson(mailWithNoInternalDate))
+        assertThatJson(messageToElasticSearchJson.convertToJson(mailWithNoInternalDate, ImmutableList.of(new MockMailboxSession("username").getUser())))
             .when(IGNORING_ARRAY_ORDER)
             .when(IGNORING_VALUES)
             .isEqualTo(IOUtils.toString(ClassLoader.getSystemResource("eml/recursiveMail.json")));
@@ -201,7 +224,7 @@ public class MailboxMessageToElasticSearchJsonTest {
         } catch(Exception exception) {
             throw Throwables.propagate(exception);
         }
-        messageToElasticSearchJson.convertToJson(mailWithNoMailboxId);
+        messageToElasticSearchJson.convertToJson(mailWithNoMailboxId, ImmutableList.of(new MockMailboxSession("username").getUser()));
     }
 
     @Test
@@ -243,7 +266,7 @@ public class MailboxMessageToElasticSearchJsonTest {
             propertyBuilder,
             MAILBOX_ID);
         spamMail.setModSeq(MOD_SEQ);
-        assertThatJson(messageToElasticSearchJson.convertToJson(spamMail))
+        assertThatJson(messageToElasticSearchJson.convertToJson(spamMail, ImmutableList.of(new MockMailboxSession("username").getUser())))
             .when(IGNORING_ARRAY_ORDER)
             .isEqualTo(IOUtils.toString(ClassLoader.getSystemResource("eml/nonTextual.json"), CHARSET));
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/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 9eb0388..b998dfa 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
@@ -115,6 +115,7 @@ import org.apache.lucene.store.LockObtainFailedException;
 import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.Version;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.LinkedHashMultimap;
 import com.google.common.collect.Multimap;
@@ -428,6 +429,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
      * @see org.apache.james.mailbox.store.search.MessageSearchIndex#search(org.apache.james.mailbox.MailboxSession, org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.model.SearchQuery)
      */
     public Iterator<Long> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException {
+        Preconditions.checkArgument(session != null, "'session' is mandatory");
         MailboxId mailboxId = mailbox.getMailboxId();
         Multimap<MailboxId, Long> results = 
                 searchMultimap(
@@ -441,6 +443,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
 
     @Override
     public Map<MailboxId, Collection<Long>> search(MailboxSession session, MultimailboxesSearchQuery searchQuery) throws MailboxException {
+        Preconditions.checkArgument(session != null, "'session' is mandatory");
         return searchMultimap(session, searchQuery).asMap();
     }
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/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 9b1417a..09cf3c3 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
@@ -33,6 +33,8 @@ import java.util.Map;
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
@@ -56,7 +58,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     private SimpleMailbox mailbox = new SimpleMailbox(0);
     private SimpleMailbox mailbox2 = new SimpleMailbox(1);
     private SimpleMailbox mailbox3 = new SimpleMailbox(2);
-
+    private MailboxSession session;
 
     private static final String FROM_ADDRESS = "Harry <ha...@example.org>";
 
@@ -121,7 +123,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         builder.mailboxId = mailbox3.getMailboxId();
         
         index.add(null, mailbox3, builder.build());
-                
+
+        session = new MockMailboxSession("username");
     }
     
 
@@ -130,7 +133,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void bodySearchShouldMatchPhraseInBody() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains(CUSTARD));
-        Iterator<Long> result = index.search(null, mailbox3, query);
+        Iterator<Long> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(10L);
     }
 
@@ -138,7 +141,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void bodySearchShouldNotMatchAbsentPhraseInBody() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains(CUSTARD + CUSTARD));
-        Iterator<Long> result = index.search(null, mailbox3, query);
+        Iterator<Long> result = index.search(session, mailbox3, query);
         assertThat(result).isEmpty();
     }
     
@@ -146,7 +149,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void bodySearchShouldBeCaseInsensitive() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains(RHUBARD));
-        Iterator<Long> result = index.search(null, mailbox3, query);
+        Iterator<Long> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(10L);
     }
 
@@ -154,7 +157,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void bodySearchNotMatchPhraseOnlyInFrom() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains(FROM_ADDRESS));
-        Iterator<Long> result = index.search(null, mailbox3, query);
+        Iterator<Long> result = index.search(session, mailbox3, query);
         assertThat(result).isEmpty();
     }
 
@@ -162,7 +165,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void bodySearchShouldNotMatchPhraseOnlyInSubject() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains(SUBJECT_PART));
-        Iterator<Long> result = index.search(null, mailbox3, query);
+        Iterator<Long> result = index.search(session, mailbox3, query);
         assertThat(result).isEmpty();
     }
 
@@ -170,7 +173,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void textSearchShouldMatchPhraseInBody() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains(CUSTARD));
-        Iterator<Long> result = index.search(null, mailbox3, query);
+        Iterator<Long> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(10L);
     }
 
@@ -178,7 +181,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void textSearchShouldNotAbsentMatchPhraseInBody() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains(CUSTARD + CUSTARD));
-        Iterator<Long> result = index.search(null, mailbox3, query);
+        Iterator<Long> result = index.search(session, mailbox3, query);
         assertThat(result).isEmpty();
     }
 
@@ -186,7 +189,7 @@ 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(null, mailbox3, query);
+        Iterator<Long> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(10L);
     }
 
@@ -194,7 +197,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void addressSearchShouldMatchToFullAddress() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.address(AddressType.To,FROM_ADDRESS));
-        Iterator<Long> result = index.search(null, mailbox3, query);
+        Iterator<Long> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(10L);
     }
 
@@ -202,7 +205,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void addressSearchShouldMatchToDisplayName() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.address(AddressType.To,"Harry"));
-        Iterator<Long> result = index.search(null, mailbox3, query);
+        Iterator<Long> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(10L);
     }
     
@@ -210,7 +213,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void addressSearchShouldMatchToEmail() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.address(AddressType.To,"Harry@example.org"));
-        Iterator<Long> result = index.search(null, mailbox3, query);
+        Iterator<Long> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(10L);
     }
     
@@ -218,7 +221,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void addressSearchShouldMatchFrom() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.address(AddressType.From,"ser-from@domain.or"));
-        Iterator<Long> result = index.search(null, mailbox3, query);
+        Iterator<Long> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(10L);
     }
 
@@ -226,7 +229,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void textSearchShouldMatchPhraseOnlyInToHeader() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains(FROM_ADDRESS));
-        Iterator<Long> result = index.search(null, mailbox3, query);
+        Iterator<Long> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(10L);
     }
     
@@ -234,7 +237,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void textSearchShouldMatchPhraseOnlyInSubjectHeader() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains(SUBJECT_PART));
-        Iterator<Long> result = index.search(null, mailbox3, query);
+        Iterator<Long> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(10L);
     }
     
@@ -242,7 +245,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void searchAllShouldMatchAllMailboxEmails() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
-        Iterator<Long> result = index.search(null, mailbox2, query);
+        Iterator<Long> result = index.search(session, mailbox2, query);
         assertThat(result).containsExactly(1L);
     }
 
@@ -250,7 +253,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void searchBodyInAllMailboxesShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains("My Body"));
-        Map<MailboxId, Collection<Long>> result = index.search(null, MultimailboxesSearchQuery.from(query).build());
+        Map<MailboxId, Collection<Long>> 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);
@@ -260,7 +263,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void searchBodyInSpecificMailboxesShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains("My Body"));
-        Map<MailboxId, Collection<Long>> result = index.search(null, 
+        Map<MailboxId, Collection<Long>> result = index.search(session, 
                 MultimailboxesSearchQuery.from(query).inMailboxes(mailbox.id, mailbox3.id).build());
         assertThat(result).hasSize(1);
         assertThat(result.get(mailbox.id)).containsExactly(1L);
@@ -271,7 +274,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void searchAllShouldMatchAllUserEmails() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
-        Map<MailboxId, Collection<Long>> result = index.search(null, MultimailboxesSearchQuery.from(query).build());
+        Map<MailboxId, Collection<Long>> result = index.search(session, MultimailboxesSearchQuery.from(query).build());
         assertThat(result).hasSize(3);
     }
     
@@ -279,7 +282,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void flagSearchShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.flagIsSet(Flag.DELETED));
-        Iterator<Long> result = index.search(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(2L, 3L);
     }
     
@@ -287,7 +290,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void bodySearchShouldMatchSeveralEmails() throws Exception {    
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains("body"));
-        Iterator<Long> result = index.search(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L, 2L, 3L);
     }
     
@@ -295,7 +298,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void textSearchShouldMatchSeveralEmails() throws Exception {    
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains("body"));
-        Iterator<Long> result = index.search(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L, 2L, 3L);
     }
     
@@ -303,7 +306,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void headerSearchShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.headerContains("Subject", "test"));
-        Iterator<Long> result = index.search(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L, 3L);
     }
     
@@ -311,7 +314,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void headerExistsShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.headerExists("Subject"));
-        Iterator<Long> result = index.search(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L, 3L);
     }
     
@@ -319,7 +322,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void flagUnsetShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.flagIsUnSet(Flag.DRAFT));
-        Iterator<Long> result = index.search(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L, 2L, 3L);
     }
     
@@ -330,7 +333,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         cal.setTime(new Date());
         query.andCriteria(SearchQuery.internalDateBefore(cal.getTime(), DateResolution.Day));
         
-        Iterator<Long> result = index.search(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(2L);
     }
     
@@ -341,7 +344,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         Calendar cal = Calendar.getInstance();
         cal.setTime(new Date());
         query.andCriteria(SearchQuery.internalDateAfter(cal.getTime(), DateResolution.Day));
-        Iterator<Long> result = index.search(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(3L);
     }
     
@@ -353,7 +356,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         Calendar cal = Calendar.getInstance();
         cal.setTime(new Date());
         query.andCriteria(SearchQuery.internalDateOn(cal.getTime(), DateResolution.Day));
-        Iterator<Long> result = index.search(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L);
     }
     
@@ -363,7 +366,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         Calendar cal = Calendar.getInstance();
         cal.setTime(new Date());
         query.andCriteria(SearchQuery.uid(new SearchQuery.NumericRange[] {new SearchQuery.NumericRange(1)}));
-        Iterator<Long> result = index.search(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L);
     }
     
@@ -373,7 +376,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L, 2L, 3L);
     }
     
@@ -381,7 +384,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void sizeEqualsShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.sizeEquals(200));
-        Iterator<Long> result = index.search(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L);
     }
     
@@ -389,7 +392,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void sizeLessThanShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.sizeLessThan(200));
-        Iterator<Long> result = index.search(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(2L, 3L);
     }
     
@@ -397,7 +400,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void sizeGreaterThanShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.sizeGreaterThan(6));
-        Iterator<Long> result = index.search(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L, 2L, 3L);
     }
     
@@ -405,7 +408,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void uidShouldBeSorted() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
-        Iterator<Long> result = index.search(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L, 2L, 3L);
     }
     
@@ -414,7 +417,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(3L, 2L, 1L);
     }
     
@@ -423,7 +426,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(2L, 3L, 1L);
     }
     
@@ -432,7 +435,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L, 3L, 2L);
     }
 
@@ -441,7 +444,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(2L, 1L, 3L);
     }
     
@@ -450,7 +453,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(3L, 1L, 2L);
     }
     
@@ -459,7 +462,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(2L, 3L, 1L);
     }
     
@@ -468,7 +471,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L, 3L, 2L);
     }
     
@@ -477,7 +480,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L, 2L, 3L);
     }
     
@@ -486,7 +489,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(2L, 3L, 1L);
     }
     
@@ -495,7 +498,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(3L, 1L, 2L);
     }
     
@@ -504,7 +507,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(2L, 1L, 3L);
     }
     
@@ -513,7 +516,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(3L, 1L, 2L);
     }
     
@@ -522,7 +525,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(2L, 1L, 3L);
     }
     
@@ -531,7 +534,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(2L, 3L, 1L);
     }
     
@@ -540,7 +543,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L, 3L, 2L);
     }
     
@@ -549,7 +552,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(2L, 1L, 3L);
     }
     
@@ -558,7 +561,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(3L, 1L, 2L);
     }
     
@@ -567,7 +570,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(2L, 3L, 1L);
     }
     
@@ -576,7 +579,7 @@ 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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(1L, 2L, 3L);
     }
     
@@ -584,7 +587,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     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(null, mailbox, query);
+        Iterator<Long> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(2L, 3L);
     }
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/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 4096c8e..72b905b 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
@@ -38,6 +38,8 @@ import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
+import com.google.common.base.Preconditions;
+
 /**
  * {@link ListeningMessageSearchIndex} implementation which wraps another {@link ListeningMessageSearchIndex} and will forward all calls to it.
  * 
@@ -91,6 +93,7 @@ public class LazyMessageSearchIndex extends ListeningMessageSearchIndex {
      */
     @Override
     public Iterator<Long> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException {
+        Preconditions.checkArgument(session != null, "'session' is mandatory");
         MailboxId id = mailbox.getMailboxId();
         
         Object done = indexed.get(id);

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
index 13863e0..75aa957 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
@@ -36,6 +36,7 @@ import java.util.TreeSet;
 
 import javax.mail.Flags;
 
+import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.UnsupportedSearchException;
 import org.apache.james.mailbox.model.MessageResult.Header;
@@ -58,7 +59,6 @@ import org.apache.james.mime4j.field.address.LenientAddressParser;
 import org.apache.james.mime4j.field.datetime.parser.DateTimeParser;
 import org.apache.james.mime4j.field.datetime.parser.ParseException;
 import org.apache.james.mime4j.utils.search.MessageMatcher;
-import org.slf4j.Logger;
 
 import com.google.common.collect.Lists;
 
@@ -69,16 +69,12 @@ public class MessageSearches implements Iterable<Long> {
 
     private Iterator<MailboxMessage> messages;
     private SearchQuery query;
-    private Logger log;
+    private MailboxSession session;
 
-    public MessageSearches(Iterator<MailboxMessage> messages, SearchQuery query) {
-        this(messages, query, null);
-    }
-
-    public MessageSearches(Iterator<MailboxMessage> messages, SearchQuery query, Logger log) {
+    public MessageSearches(Iterator<MailboxMessage> messages, SearchQuery query, MailboxSession session) {
         this.messages = messages;
         this.query = query;
-        this.log = log;
+        this.session = session;
     }
 
     /**
@@ -92,11 +88,13 @@ public class MessageSearches implements Iterable<Long> {
         while (messages.hasNext()) {
             MailboxMessage m = messages.next();
             try {
-                if (isMatch(query, m, log)) {
+                if (isMatch(query, m)) {
                     matched.add(m);
                 }
             } catch (MailboxException e) {
-                log.debug("Unable to search message " + m.getUid(), e);
+                if (session != null && session.getLog() != null) {
+                    session.getLog().debug("Unable to search message " + m.getUid(), e);
+                }
             }
         }
         Set<Long> uids = new HashSet<Long>();
@@ -114,19 +112,17 @@ public class MessageSearches implements Iterable<Long> {
      *            <code>SearchQuery</code>, not null
      * @param message
      *            <code>MailboxMessage</code>, not null
-     * @param log
-     *            the logger to use
      * @return <code>true</code> if the row matches the given criteria,
      *         <code>false</code> otherwise
      * @throws MailboxException
      */
-    protected boolean isMatch(SearchQuery query, MailboxMessage message, Logger log) throws MailboxException {
+    protected boolean isMatch(SearchQuery query, MailboxMessage message) throws MailboxException {
         final List<SearchQuery.Criterion> criteria = query.getCriterias();
         final Collection<Long> recentMessageUids = query.getRecentMessageUids();
         boolean result = true;
         if (criteria != null) {
             for (SearchQuery.Criterion criterion : criteria) {
-                if (!isMatch(criterion, message, recentMessageUids, log)) {
+                if (!isMatch(criterion, message, recentMessageUids)) {
                     result = false;
                     break;
                 }
@@ -144,14 +140,12 @@ public class MessageSearches implements Iterable<Long> {
      *            <code>MailboxMessage</code>, not null
      * @param recentMessageUids
      *            collection of recent message uids
-     * @param log
-     *            the logger to use
      * @return <code>true</code> if the row matches the given criterion,
      *         <code>false</code> otherwise
      * @throws MailboxException
      */
     public boolean isMatch(SearchQuery.Criterion criterion, MailboxMessage message,
-            final Collection<Long> recentMessageUids, Logger log) throws MailboxException {
+            final Collection<Long> recentMessageUids) throws MailboxException {
         final boolean result;
         if (criterion instanceof SearchQuery.InternalDateCriterion) {
             result = matches((SearchQuery.InternalDateCriterion) criterion, message);
@@ -159,7 +153,7 @@ public class MessageSearches implements Iterable<Long> {
             result = matches((SearchQuery.SizeCriterion) criterion, message);
         } else if (criterion instanceof SearchQuery.HeaderCriterion) {
             try {
-                result = matches((SearchQuery.HeaderCriterion) criterion, message, log);
+                result = matches((SearchQuery.HeaderCriterion) criterion, message);
             } catch (IOException e) {
                 throw new MailboxException("Unable to search header", e);
             }
@@ -170,11 +164,11 @@ public class MessageSearches implements Iterable<Long> {
         } else if (criterion instanceof SearchQuery.CustomFlagCriterion) {
             result = matches((SearchQuery.CustomFlagCriterion) criterion, message, recentMessageUids);
         } else if (criterion instanceof SearchQuery.TextCriterion) {
-            result = matches((SearchQuery.TextCriterion) criterion, message, log);
+            result = matches((SearchQuery.TextCriterion) criterion, message);
         } else if (criterion instanceof SearchQuery.AllCriterion) {
             result = true;
         } else if (criterion instanceof SearchQuery.ConjunctionCriterion) {
-            result = matches((SearchQuery.ConjunctionCriterion) criterion, message, recentMessageUids, log);
+            result = matches((SearchQuery.ConjunctionCriterion) criterion, message, recentMessageUids);
         } else if (criterion instanceof SearchQuery.ModSeqCriterion) {
             result = matches((SearchQuery.ModSeqCriterion) criterion, message);
         } else {
@@ -183,16 +177,16 @@ public class MessageSearches implements Iterable<Long> {
         return result;
     }
 
-    protected boolean matches(SearchQuery.TextCriterion criterion, MailboxMessage message, Logger log)
+    protected boolean matches(SearchQuery.TextCriterion criterion, MailboxMessage message)
             throws MailboxException {
         try {
             final SearchQuery.ContainsOperator operator = criterion.getOperator();
             final String value = operator.getValue();
             switch (criterion.getType()) {
             case BODY:
-                return bodyContains(value, message, log);
+                return bodyContains(value, message);
             case FULL:
-                return messageContains(value, message, log);
+                return messageContains(value, message);
             default:
                 throw new UnsupportedSearchException();
             }
@@ -203,47 +197,47 @@ public class MessageSearches implements Iterable<Long> {
         }
     }
 
-    protected boolean bodyContains(String value, MailboxMessage message, Logger log) throws IOException, MimeException {
+    protected boolean bodyContains(String value, MailboxMessage message) throws IOException, MimeException {
         final InputStream input = message.getFullContent();
-        return isInMessage(value, input, false, log);
+        return isInMessage(value, input, false);
     }
 
-    protected boolean isInMessage(String value, InputStream input, boolean header, Logger log) throws IOException, MimeException {
+    protected boolean isInMessage(String value, InputStream input, boolean header) throws IOException, MimeException {
         MessageMatcher.MessageMatcherBuilder builder = MessageMatcher.builder()
             .searchContents(Lists.<CharSequence>newArrayList(value))
             .caseInsensitive(true)
             .includeHeaders(header);
-        if (log != null) {
-            builder.logger(log);
+        if (session != null && session.getLog() != null) {
+            builder.logger(session.getLog());
         }
         return builder.build().messageMatches(input);
     }
 
-    protected boolean messageContains(String value, MailboxMessage message, Logger log) throws IOException, MimeException {
+    protected boolean messageContains(String value, MailboxMessage message) throws IOException, MimeException {
         final InputStream input = message.getFullContent();
-        return isInMessage(value, input, true, log);
+        return isInMessage(value, input, true);
     }
 
     private boolean matches(SearchQuery.ConjunctionCriterion criterion, MailboxMessage message,
-            final Collection<Long> recentMessageUids, Logger log) throws MailboxException {
+            final Collection<Long> recentMessageUids) throws MailboxException {
         final List<SearchQuery.Criterion> criteria = criterion.getCriteria();
         switch (criterion.getType()) {
         case NOR:
-            return nor(criteria, message, recentMessageUids, log);
+            return nor(criteria, message, recentMessageUids);
         case OR:
-            return or(criteria, message, recentMessageUids, log);
+            return or(criteria, message, recentMessageUids);
         case AND:
-            return and(criteria, message, recentMessageUids, log);
+            return and(criteria, message, recentMessageUids);
         default:
             return false;
         }
     }
 
     private boolean and(List<SearchQuery.Criterion> criteria, MailboxMessage message,
-            final Collection<Long> recentMessageUids, Logger log) throws MailboxException {
+            final Collection<Long> recentMessageUids) throws MailboxException {
         boolean result = true;
         for (SearchQuery.Criterion criterion : criteria) {
-            boolean matches = isMatch(criterion, message, recentMessageUids, log);
+            boolean matches = isMatch(criterion, message, recentMessageUids);
             if (!matches) {
                 result = false;
                 break;
@@ -253,10 +247,10 @@ public class MessageSearches implements Iterable<Long> {
     }
 
     private boolean or(List<SearchQuery.Criterion> criteria, MailboxMessage message,
-            final Collection<Long> recentMessageUids, Logger log) throws MailboxException {
+            final Collection<Long> recentMessageUids) throws MailboxException {
         boolean result = false;
         for (SearchQuery.Criterion criterion : criteria) {
-            boolean matches = isMatch(criterion, message, recentMessageUids, log);
+            boolean matches = isMatch(criterion, message, recentMessageUids);
             if (matches) {
                 result = true;
                 break;
@@ -266,10 +260,10 @@ public class MessageSearches implements Iterable<Long> {
     }
 
     private boolean nor(List<SearchQuery.Criterion> criteria, MailboxMessage message,
-            final Collection<Long> recentMessageUids, Logger log) throws MailboxException {
+            final Collection<Long> recentMessageUids) throws MailboxException {
         boolean result = true;
         for (SearchQuery.Criterion criterion : criteria) {
-            boolean matches = isMatch(criterion, message, recentMessageUids, log);
+            boolean matches = isMatch(criterion, message, recentMessageUids);
             if (matches) {
                 result = false;
                 break;
@@ -325,7 +319,7 @@ public class MessageSearches implements Iterable<Long> {
         return result;
     }
 
-    private boolean matches(SearchQuery.HeaderCriterion criterion, MailboxMessage message, Logger log)
+    private boolean matches(SearchQuery.HeaderCriterion criterion, MailboxMessage message)
             throws MailboxException, IOException {
         SearchQuery.HeaderOperator operator = criterion.getOperator();
         String headerName = criterion.getHeaderName();
@@ -337,7 +331,7 @@ public class MessageSearches implements Iterable<Long> {
         } else if (operator instanceof SearchQuery.ExistsOperator) {
             result = exists(headerName, message);
         } else if (operator instanceof SearchQuery.AddressOperator) {
-            result = matchesAddress((SearchQuery.AddressOperator) operator, headerName, message, log);
+            result = matchesAddress((SearchQuery.AddressOperator) operator, headerName, message);
         } else {
             throw new UnsupportedSearchException();
         }
@@ -355,7 +349,7 @@ public class MessageSearches implements Iterable<Long> {
      * @throws IOException
      */
     private boolean matchesAddress(SearchQuery.AddressOperator operator, String headerName,
-                                   MailboxMessage message, Logger log) throws MailboxException, IOException {
+                                   MailboxMessage message) throws MailboxException, IOException {
         String text = operator.getAddress().toUpperCase(Locale.ENGLISH);
         List<Header> headers = ResultUtils.createHeaders(message);
         for (Header header : headers) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/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 7d05a49..7dccf41 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
@@ -48,6 +48,7 @@ import org.apache.james.mailbox.store.mail.MessageMapperFactory;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableMultimap.Builder;
@@ -99,6 +100,7 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
     
     @Override
     public Iterator<Long> search(MailboxSession session, Mailbox mailbox, SearchQuery query) throws MailboxException {
+        Preconditions.checkArgument(session != null, "'session' is mandatory");
         return searchMultimap(session, ImmutableList.of(mailbox), query)
                 .get(mailbox.getMailboxId())
                 .iterator();
@@ -114,6 +116,9 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
     }
     
     private Multimap<MailboxId, Long> searchMultimap(MailboxSession session, Mailbox mailbox, SearchQuery query) throws MailboxException {
+        if (!isMatchingUser(session, mailbox)) {
+            return ImmutableMultimap.of();
+        }
         MessageMapper mapper = messageMapperFactory.getMessageMapper(session);
 
         final SortedSet<MailboxMessage> hitSet = new TreeSet<MailboxMessage>();
@@ -139,15 +144,13 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
         }
         
         // MessageSearches does the filtering for us
-        if (session == null) {
-            return ImmutableMultimap.<MailboxId, Long>builder()
-                        .putAll(mailbox.getMailboxId(), ImmutableList.copyOf(new MessageSearches(hitSet.iterator(), query).iterator()))
-                        .build();
-        } else {
-            return ImmutableMultimap.<MailboxId, Long>builder()
-                        .putAll(mailbox.getMailboxId(), ImmutableList.copyOf(new MessageSearches(hitSet.iterator(), query, session.getLog()).iterator()))
-                        .build();
-        }
+        return ImmutableMultimap.<MailboxId, Long>builder()
+                    .putAll(mailbox.getMailboxId(), ImmutableList.copyOf(new MessageSearches(hitSet.iterator(), query, session).iterator()))
+                    .build();
+    }
+
+    private boolean isMatchingUser(MailboxSession session, Mailbox mailbox) {
+        return mailbox.getUser().equals(session.getUser().getUserName());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsMultipartMixedTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsMultipartMixedTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsMultipartMixedTest.java
index 7b87e5c..d350e33 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsMultipartMixedTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsMultipartMixedTest.java
@@ -31,8 +31,6 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.search.MessageSearches;
 import org.junit.Before;
 import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class SearchUtilsMultipartMixedTest {
 
@@ -112,7 +110,6 @@ public class SearchUtilsMultipartMixedTest {
 
 
     Collection<Long> recent;
-    private Logger log = LoggerFactory.getLogger(this.getClass());
     @Before
     public void setUp() throws Exception {
         final MessageBuilder builder = new MessageBuilder();
@@ -131,94 +128,94 @@ public class SearchUtilsMultipartMixedTest {
     @Test
     public void testShouldNotFindWhatIsNotThere() throws Exception {
         assertFalse(new MessageSearches().isMatch(SearchQuery.bodyContains("BOGUS"), row,
-                recent, log));
+                recent));
         assertFalse(new MessageSearches().isMatch(SearchQuery.mailContains("BOGUS"), row,
-                recent, log));
+                recent));
     }
 
     @Test
     public void testBodyShouldFindTextInBody() throws Exception {
         assertTrue(new MessageSearches().isMatch(SearchQuery
-                .bodyContains(SAMPLE_INNER_MAIL_BODY_ONE), row, recent, log));
+                .bodyContains(SAMPLE_INNER_MAIL_BODY_ONE), row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.bodyContains(SAMPLE_PART_ONE),
-                row, recent, log));
+                row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.bodyContains(SAMPLE_PART_TWO),
-                row, recent, log));
+                row, recent));
     }
 
     @Test
     public void testBodyShouldFindTextInBodyCaseInsensitive() throws Exception {
         assertTrue(new MessageSearches().isMatch(SearchQuery
-                .bodyContains(SAMPLE_INNER_MAIL_BODY_ONE), row, recent, log));
+                .bodyContains(SAMPLE_INNER_MAIL_BODY_ONE), row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.bodyContains(SAMPLE_PART_ONE),
-                row, recent, log));
+                row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.bodyContains(SAMPLE_PART_TWO),
-                row, recent, log));
+                row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery
                 .bodyContains(SAMPLE_INNER_MAIL_BODY_ONE.toLowerCase()), row,
-                recent, log));
+                recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.bodyContains(SAMPLE_PART_ONE
-                .toLowerCase()), row, recent, log));
+                .toLowerCase()), row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.bodyContains(SAMPLE_PART_TWO
-                .toLowerCase()), row, recent, log));
+                .toLowerCase()), row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery
                 .bodyContains(SAMPLE_INNER_MAIL_BODY_ONE.toUpperCase()), row,
-                recent, log));
+                recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.bodyContains(SAMPLE_PART_ONE
-                .toUpperCase()), row, recent, log));
+                .toUpperCase()), row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.bodyContains(SAMPLE_PART_TWO
-                .toUpperCase()), row, recent, log));
+                .toUpperCase()), row, recent));
     }
 
     @Test
     public void testBodyShouldNotFindTextInHeaders() throws Exception {
         assertFalse(new MessageSearches().isMatch(SearchQuery
-                .bodyContains(SAMPLE_INNER_MAIL_FIELD), row, recent, log));
+                .bodyContains(SAMPLE_INNER_MAIL_FIELD), row, recent));
         assertFalse(new MessageSearches().isMatch(SearchQuery
-                .bodyContains(SAMPLE_PART_TWO_FIELD), row, recent, log));
+                .bodyContains(SAMPLE_PART_TWO_FIELD), row, recent));
     }
 
     @Test
     public void testTextShouldFindTextInBody() throws Exception {
         assertTrue(new MessageSearches().isMatch(SearchQuery
-                .mailContains(SAMPLE_INNER_MAIL_BODY_ONE), row, recent, log));
+                .mailContains(SAMPLE_INNER_MAIL_BODY_ONE), row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.mailContains(SAMPLE_PART_ONE),
-                row, recent, log));
+                row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.mailContains(SAMPLE_PART_TWO),
-                row, recent, log));
+                row, recent));
     }
 
     @Test
     public void testTextShouldFindTextInBodyCaseInsensitive() throws Exception {
         assertTrue(new MessageSearches().isMatch(SearchQuery
-                .mailContains(SAMPLE_INNER_MAIL_BODY_ONE), row, recent, log));
+                .mailContains(SAMPLE_INNER_MAIL_BODY_ONE), row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.mailContains(SAMPLE_PART_ONE),
-                row, recent, log));
+                row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.mailContains(SAMPLE_PART_TWO),
-                row, recent, log));
+                row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery
                 .mailContains(SAMPLE_INNER_MAIL_BODY_ONE.toLowerCase()), row,
-                recent, log));
+                recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.mailContains(SAMPLE_PART_ONE
-                .toLowerCase()), row, recent, log));
+                .toLowerCase()), row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.mailContains(SAMPLE_PART_TWO
-                .toLowerCase()), row, recent, log));
+                .toLowerCase()), row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery
                 .mailContains(SAMPLE_INNER_MAIL_BODY_ONE.toUpperCase()), row,
-                recent, log));
+                recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.mailContains(SAMPLE_PART_ONE
-                .toUpperCase()), row, recent, log));
+                .toUpperCase()), row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.mailContains(SAMPLE_PART_TWO
-                .toUpperCase()), row, recent, log));
+                .toUpperCase()), row, recent));
     }
 
     @Test
     public void testTextShouldFindTextInHeaders() throws Exception {
         assertTrue(new MessageSearches().isMatch(SearchQuery
-                .mailContains(SAMPLE_INNER_MAIL_FIELD), row, recent, log));
+                .mailContains(SAMPLE_INNER_MAIL_FIELD), row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery
-                .mailContains(SAMPLE_INNER_MAIL_BODY_ONE), row, recent, log));
+                .mailContains(SAMPLE_INNER_MAIL_BODY_ONE), row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery
-                .mailContains(SAMPLE_PART_TWO_FIELD), row, recent, log));
+                .mailContains(SAMPLE_PART_TWO_FIELD), row, recent));
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c981e8a3/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsRFC822Test.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsRFC822Test.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsRFC822Test.java
index d8c7e58..c06c191 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsRFC822Test.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsRFC822Test.java
@@ -31,8 +31,6 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.search.MessageSearches;
 import org.junit.Before;
 import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class SearchUtilsRFC822Test {
 
@@ -50,7 +48,6 @@ public class SearchUtilsRFC822Test {
 
     MailboxMessage row;
 
-    private Logger log = LoggerFactory.getLogger(getClass());
     Collection<Long> recent;
 
     @Before
@@ -69,52 +66,52 @@ public class SearchUtilsRFC822Test {
     @Test
     public void testBodyShouldMatchPhraseInBody() throws Exception {
         assertTrue(new MessageSearches().isMatch(SearchQuery.bodyContains(CUSTARD), row,
-                recent, log));
+                recent));
         assertFalse(new MessageSearches().isMatch(SearchQuery
-                .bodyContains(CUSTARD + CUSTARD), row, recent, log));
+                .bodyContains(CUSTARD + CUSTARD), row, recent));
     }
 
     @Test
     public void testBodyMatchShouldBeCaseInsensitive() throws Exception {
         assertTrue(new MessageSearches().isMatch(SearchQuery.bodyContains(RHUBARD), row,
-                recent, log));
+                recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.bodyContains(RHUBARD
-                .toLowerCase()), row, recent, log));
+                .toLowerCase()), row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.bodyContains(RHUBARD
-                .toLowerCase()), row, recent, log));
+                .toLowerCase()), row, recent));
     }
 
     @Test
     public void testBodyShouldNotMatchPhraseOnlyInHeader() throws Exception {
         assertFalse(new MessageSearches().isMatch(SearchQuery.bodyContains(FROM_ADDRESS),
-                row, recent, log));
+                row, recent));
         assertFalse(new MessageSearches().isMatch(SearchQuery.bodyContains(SUBJECT_PART),
-                row, recent, log));
+                row, recent));
     }
 
     @Test
     public void testTextShouldMatchPhraseInBody() throws Exception {
         assertTrue(new MessageSearches().isMatch(SearchQuery.mailContains(CUSTARD), row,
-                recent, log));
+                recent));
         assertFalse(new MessageSearches().isMatch(SearchQuery
-                .mailContains(CUSTARD + CUSTARD), row, recent, log));
+                .mailContains(CUSTARD + CUSTARD), row, recent));
     }
 
     @Test
     public void testTextMatchShouldBeCaseInsensitive() throws Exception {
         assertTrue(new MessageSearches().isMatch(SearchQuery.mailContains(RHUBARD), row,
-                recent, log));
+                recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.mailContains(RHUBARD
-                .toLowerCase()), row, recent, log));
+                .toLowerCase()), row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.mailContains(RHUBARD
-                .toLowerCase()), row, recent, log));
+                .toLowerCase()), row, recent));
     }
 
     @Test
     public void testBodyShouldMatchPhraseOnlyInHeader() throws Exception {
         assertTrue(new MessageSearches().isMatch(SearchQuery.mailContains(FROM_ADDRESS),
-                row, recent, log));
+                row, recent));
         assertTrue(new MessageSearches().isMatch(SearchQuery.mailContains(SUBJECT_PART),
-                row, recent, log));
+                row, recent));
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org