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 bt...@apache.org on 2016/04/06 11:21:55 UTC

[11/18] james-project git commit: MAILBOX-266 Updates should be bulked

MAILBOX-266 Updates should be bulked


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

Branch: refs/heads/master
Commit: 1bfa390f500eddd0e5d3cd3a448b1b637a45ce10
Parents: f43a4e3
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Mar 24 17:25:38 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:45 2016 +0700

----------------------------------------------------------------------
 .../elasticsearch/ElasticSearchIndexer.java     | 37 ++++++++--
 ...lasticSearchListeningMessageSearchIndex.java | 37 ++++++----
 .../elasticsearch/ElasticSearchIndexerTest.java | 25 ++++---
 ...hListeningMailboxMessageSearchIndexTest.java | 72 +++++---------------
 .../lucene/search/LuceneMessageSearchIndex.java | 14 +++-
 .../store/search/LazyMessageSearchIndex.java    | 10 ++-
 .../search/ListeningMessageSearchIndex.java     | 44 ++++--------
 7 files changed, 119 insertions(+), 120 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/1bfa390f/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
index 1b6017d..f4bbec4 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
@@ -18,18 +18,42 @@
  ****************************************************************/
 package org.apache.james.mailbox.elasticsearch;
 
+import java.util.List;
+
 import javax.inject.Inject;
 
+import org.elasticsearch.action.bulk.BulkRequestBuilder;
+import org.elasticsearch.action.bulk.BulkResponse;
 import org.elasticsearch.action.delete.DeleteResponse;
 import org.elasticsearch.action.index.IndexResponse;
-import org.elasticsearch.action.update.UpdateResponse;
 import org.elasticsearch.client.Client;
+import org.elasticsearch.common.Strings;
 import org.elasticsearch.index.query.QueryBuilder;
 
 import com.google.common.base.Preconditions;
 
 public class ElasticSearchIndexer {
 
+    public static class UpdatedRepresentation {
+        private final String id;
+        private final String updatedDocumentPart;
+
+        public UpdatedRepresentation(String id, String updatedDocumentPart) {
+            Preconditions.checkArgument(!Strings.isNullOrEmpty(id), "Updated id must be specified " + id);
+            Preconditions.checkArgument(!Strings.isNullOrEmpty(updatedDocumentPart), "Updated document must be specified");
+            this.id = id;
+            this.updatedDocumentPart = updatedDocumentPart;
+        }
+
+        public String getId() {
+            return id;
+        }
+
+        public String getUpdatedDocumentPart() {
+            return updatedDocumentPart;
+        }
+    }
+
     public static final String MAILBOX_INDEX = "mailbox";
     public static final String MESSAGE_TYPE = "message";
     
@@ -51,12 +75,13 @@ public class ElasticSearchIndexer {
         }
     }
 
-    public UpdateResponse updateMessage(String id, String docUpdated) {
-        checkArgument(docUpdated);
+    public BulkResponse updateMessages(List<UpdatedRepresentation> updatedDocumentParts) {
+        Preconditions.checkNotNull(updatedDocumentParts);
         try (Client client = clientProvider.get()) {
-            return client.prepareUpdate(MAILBOX_INDEX, MESSAGE_TYPE, id)
-                .setDoc(docUpdated)
-                .get();
+            BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
+            updatedDocumentParts.forEach(updatedDocumentPart -> bulkRequestBuilder.add(client.prepareUpdate(MAILBOX_INDEX, MESSAGE_TYPE, updatedDocumentPart.getId())
+                .setDoc(updatedDocumentPart.getUpdatedDocumentPart())));
+            return bulkRequestBuilder.get();
         }
     }
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/1bfa390f/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 b7f34fe..68d9fd6 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,9 +21,10 @@ package org.apache.james.mailbox.elasticsearch.events;
 import static org.elasticsearch.index.query.QueryBuilders.termQuery;
 
 import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.inject.Inject;
-import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer;
@@ -34,6 +35,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageRange.Type;
 import org.apache.james.mailbox.model.SearchQuery;
+import org.apache.james.mailbox.model.UpdatedFlags;
 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.MailboxId;
@@ -42,6 +44,8 @@ import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+
 public class ElasticSearchListeningMessageSearchIndex<Id extends MailboxId> extends ListeningMessageSearchIndex<Id> {
 
     private final static Logger LOGGER = LoggerFactory.getLogger(ElasticSearchListeningMessageSearchIndex.class);
@@ -95,19 +99,28 @@ public class ElasticSearchListeningMessageSearchIndex<Id extends MailboxId> exte
     }
 
     @Override
-    public void update(MailboxSession session, Mailbox<Id> mailbox, MessageRange range, Flags flags, long modseq) throws MailboxException {
-        range.forEach(messageId -> {
-            try {
-                indexer.updateMessage(
-                    indexIdFor(mailbox, messageId),
-                    messageToElasticSearchJson.getUpdatedJsonMessagePart(flags, modseq));
-            } catch (Exception e) {
-                LOGGER.error("Error when updating index for message " + messageId, e);
-            }
-        });
+    public void update(MailboxSession session, Mailbox<Id> mailbox, List<UpdatedFlags> updatedFlagsList) throws MailboxException {
+        try {
+            indexer.updateMessages(updatedFlagsList.stream()
+                .map(updatedFlags -> createUpdatedDocumentPartFromUpdatedFlags(mailbox, updatedFlags))
+                .collect(Collectors.toList()));
+        } catch (Exception e) {
+            LOGGER.error("Error when updating index on mailbox {}", mailbox.getMailboxId().serialize(), e);
+        }
+    }
 
+    private ElasticSearchIndexer.UpdatedRepresentation createUpdatedDocumentPartFromUpdatedFlags(Mailbox<Id> mailbox, UpdatedFlags updatedFlags) {
+        try {
+            return new ElasticSearchIndexer.UpdatedRepresentation(
+                indexIdFor(mailbox, updatedFlags.getUid()),
+                    messageToElasticSearchJson.getUpdatedJsonMessagePart(
+                        updatedFlags.getNewFlags(),
+                        updatedFlags.getModSeq()));
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException("Error while creating updatedDocumentParts", e);
+        }
     }
-    
+
     private String indexIdFor(Mailbox<Id> mailbox, long messageId) {
         return String.join(ID_SEPARATOR, mailbox.getMailboxId().serialize(), String.valueOf(messageId));
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/1bfa390f/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
index e05eced..43fc26b 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
@@ -89,14 +89,14 @@ public class ElasticSearchIndexerTest {
     }
     
     @Test
-    public void updateMessage() throws Exception {
+    public void updateMessages() throws Exception {
         String messageId = "1";
         String content = "{\"message\": \"trying out Elasticsearch\",\"field\":\"Should be unchanged\"}";
 
         testee.indexMessage(messageId, content);
         embeddedElasticSearch.awaitForElasticSearch();
 
-        testee.updateMessage(messageId, "{\"message\": \"mastering out Elasticsearch\"}");
+        testee.updateMessages(Lists.newArrayList(new ElasticSearchIndexer.UpdatedRepresentation(messageId, "{\"message\": \"mastering out Elasticsearch\"}")));
         embeddedElasticSearch.awaitForElasticSearch();
 
         try (Client client = node.client()) {
@@ -115,16 +115,25 @@ public class ElasticSearchIndexerTest {
             assertThat(searchResponse.getHits().getTotalHits()).isEqualTo(1);
         }
     }
-    
+
     @Test(expected=IllegalArgumentException.class)
     public void updateMessageShouldThrowWhenJsonIsNull() throws InterruptedException {
-        String messageId = "1:2";
-        String content = "{\"message\": \"trying out Elasticsearch\"}";
+        testee.updateMessages(Lists.newArrayList(new ElasticSearchIndexer.UpdatedRepresentation("1", null)));
+    }
 
-        testee.indexMessage(messageId, content);
-        embeddedElasticSearch.awaitForElasticSearch();
+    @Test(expected=IllegalArgumentException.class)
+    public void updateMessageShouldThrowWhenIdIsNull() throws InterruptedException {
+        testee.updateMessages(Lists.newArrayList(new ElasticSearchIndexer.UpdatedRepresentation(null, "{\"message\": \"mastering out Elasticsearch\"}")));
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void updateMessageShouldThrowWhenJsonIsEmpty() throws InterruptedException {
+        testee.updateMessages(Lists.newArrayList(new ElasticSearchIndexer.UpdatedRepresentation("1", "")));
+    }
 
-        testee.updateMessage("1", null);
+    @Test(expected=IllegalArgumentException.class)
+    public void updateMessageShouldThrowWhenIdIsEmpty() throws InterruptedException {
+        testee.updateMessages(Lists.newArrayList(new ElasticSearchIndexer.UpdatedRepresentation("", "{\"message\": \"mastering out Elasticsearch\"}")));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/1bfa390f/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 76922b0..f15b1ad 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
@@ -27,8 +27,8 @@ import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.expectLastCall;
 
 import java.io.IOException;
-import java.util.stream.IntStream;
 import java.util.stream.LongStream;
+import java.util.List;
 
 import javax.mail.Flags;
 
@@ -37,20 +37,21 @@ import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer;
 import org.apache.james.mailbox.elasticsearch.json.MessageToElasticSearchJson;
 import org.apache.james.mailbox.elasticsearch.search.ElasticSearchSearcher;
 import org.apache.james.mailbox.model.MessageRange;
+import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.TestId;
 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 org.easymock.IMocksControl;
 import org.elasticsearch.ElasticsearchException;
+import org.elasticsearch.action.bulk.BulkResponse;
 import org.elasticsearch.action.delete.DeleteResponse;
 import org.elasticsearch.action.index.IndexResponse;
-import org.elasticsearch.action.update.UpdateResponse;
 import org.junit.Before;
 import org.junit.Test;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.google.common.base.Throwables;
+import com.google.common.collect.Lists;
 
 public class ElasticSearchListeningMailboxMessageSearchIndexTest {
 
@@ -89,7 +90,7 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
         long messageId = 1;
         TestId mailboxId = TestId.of(12);
         expect(mailbox.getMailboxId()).andReturn(mailboxId);
-        MailboxMessage<TestId> message = mockedMessage(messageId, mailboxId);
+        MailboxMessage<TestId> message = mockedMessage(messageId);
         
         IndexResponse expectedIndexResponse = control.createMock(IndexResponse.class);
         expect(indexer.indexMessage(eq(mailboxId.serialize() + ":" + messageId), anyString()))
@@ -101,7 +102,7 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
     }
 
     @SuppressWarnings("unchecked")
-    private MailboxMessage<TestId> mockedMessage(long messageId, TestId mailboxId) throws IOException {
+    private MailboxMessage<TestId> mockedMessage(long messageId) throws IOException {
         MailboxMessage<TestId> message = control.createMock(MailboxMessage.class);
         expect(message.getUid()).andReturn(messageId).anyTimes();
         return message;
@@ -115,7 +116,7 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
         
         long messageId = 1;
         TestId mailboxId = TestId.of(12);
-        MailboxMessage<TestId> message = mockedMessage(messageId, mailboxId);
+        MailboxMessage<TestId> message = mockedMessage(messageId);
         expect(mailbox.getMailboxId()).andReturn(mailboxId);
         
         expect(indexer.indexMessage(eq(mailboxId.serialize() + ":" + messageId), anyString()))
@@ -192,59 +193,21 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
         MailboxSession session = control.createMock(MailboxSession.class);
 
         Mailbox<TestId> mailbox = control.createMock(Mailbox.class);
-        Flags flags = new Flags();
 
+        Flags flags = new Flags();
         long messageId = 1;
+        UpdatedFlags updatedFlags = new UpdatedFlags(messageId, MODSEQ, flags, flags);
         TestId mailboxId = TestId.of(12);
-        MessageRange messageRange = MessageRange.one(messageId);
 
         expectLastCall();
         expect(mailbox.getMailboxId()).andReturn(mailboxId);
         
-        UpdateResponse expectedUpdateResponse = control.createMock(UpdateResponse.class);
-        expect(indexer.updateMessage(eq(mailboxId.serialize() + ":" + messageId), anyString()))
-            .andReturn(expectedUpdateResponse);
+        BulkResponse expectedBulkResponse = control.createMock(BulkResponse.class);
+        expect(indexer.updateMessages(anyObject(List.class)))
+            .andReturn(expectedBulkResponse);
         
         control.replay();
-        testee.update(session, mailbox, messageRange, flags, MODSEQ);
-        control.verify();
-    }
-
-    @Test
-    @SuppressWarnings("unchecked")
-    public void updateShouldWorkWhenMultipleMessageIds() throws Exception {
-        MailboxSession session = control.createMock(MailboxSession.class);
-
-        Mailbox<TestId> mailbox = control.createMock(Mailbox.class);
-        Flags flags = new Flags();
-
-        long firstMessageId = 1;
-        long lastMessageId = 10;
-        MessageRange messageRange = MessageRange.range(firstMessageId, lastMessageId);
-        
-        TestId mailboxId = TestId.of(12);
-
-        IntStream.range(1, 11).forEach(
-            (uid) -> {
-                try {
-
-                    expectLastCall();
-
-                    expect(mailbox.getMailboxId()).andReturn(mailboxId);
-
-                    UpdateResponse expectedUpdateResponse = control.createMock(UpdateResponse.class);
-                    expect(indexer.updateMessage(eq(mailboxId.serialize() + ":" + uid), anyString()))
-
-                        .andReturn(expectedUpdateResponse);
-                } catch (Exception e) {
-                    Throwables.propagate(e);
-                }
-            }
-        );
-        
-        
-        control.replay();
-        testee.update(session, mailbox, messageRange, flags, MODSEQ);
+        testee.update(session, mailbox, Lists.newArrayList(updatedFlags));
         control.verify();
     }
 
@@ -255,19 +218,18 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
 
         Mailbox<TestId> mailbox = control.createMock(Mailbox.class);
         Flags flags = new Flags();
-
         long messageId = 1;
+        UpdatedFlags updatedFlags = new UpdatedFlags(messageId, MODSEQ, flags, flags);
         TestId mailboxId = TestId.of(12);
-        MessageRange messageRange = MessageRange.one(messageId);
 
         expectLastCall();
-        expect(mailbox.getMailboxId()).andReturn(mailboxId);
+        expect(mailbox.getMailboxId()).andReturn(mailboxId).times(2);
 
-        expect(indexer.updateMessage(eq(mailboxId.serialize() + ":" + messageId), anyString()))
+        expect(indexer.updateMessages(anyObject(List.class)))
             .andThrow(new ElasticsearchException(""));
         
         control.replay();
-        testee.update(session, mailbox, messageRange, flags, MODSEQ);
+        testee.update(session, mailbox, Lists.newArrayList(updatedFlags));
         control.verify();
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/1bfa390f/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 e44fa4b..2382399 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
@@ -56,6 +56,7 @@ import org.apache.james.mailbox.model.SearchQuery.HeaderOperator;
 import org.apache.james.mailbox.model.SearchQuery.NumericOperator;
 import org.apache.james.mailbox.model.SearchQuery.NumericRange;
 import org.apache.james.mailbox.model.SearchQuery.UidCriterion;
+import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
 import org.apache.james.mailbox.store.mail.model.MailboxId;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -1204,15 +1205,22 @@ public class LuceneMessageSearchIndex<Id extends MailboxId> extends ListeningMes
     }
 
     /**
-     * @see org.apache.james.mailbox.store.search.ListeningMessageSearchIndex#update(org.apache.james.mailbox.MailboxSession, org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.model.MessageRange, javax.mail.Flags)
+     * @see ListeningMessageSearchIndex#update
      */
-    public void update(MailboxSession session, Mailbox<Id> mailbox, MessageRange range, Flags f, long modSeq) throws MailboxException {
+    @Override
+    public void update(MailboxSession session, Mailbox<Id> mailbox, List<UpdatedFlags> updatedFlagsList) throws MailboxException {
+        for (UpdatedFlags updatedFlags : updatedFlagsList) {
+            update(mailbox, updatedFlags.getUid(), updatedFlags.getNewFlags());
+        }
+    }
+
+    private void update(Mailbox<Id> mailbox, long uid, Flags f) throws MailboxException {
         IndexSearcher searcher = null;
         try {
             searcher = new IndexSearcher(IndexReader.open(writer, true));
             BooleanQuery query = new BooleanQuery();
             query.add(new TermQuery(new Term(MAILBOX_ID_FIELD, mailbox.getMailboxId().serialize())), BooleanClause.Occur.MUST);
-            query.add(createQuery(range), BooleanClause.Occur.MUST);
+            query.add(createQuery(MessageRange.one(uid)), BooleanClause.Occur.MUST);
             query.add( new PrefixQuery(new Term(FLAGS_FIELD, "")), BooleanClause.Occur.MUST);
 
             TopDocs docs = searcher.search(query, 100000);

http://git-wip-us.apache.org/repos/asf/james-project/blob/1bfa390f/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 e149713..3f80259 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,14 +19,14 @@
 package org.apache.james.mailbox.store.search;
 
 import java.util.Iterator;
+import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 
-import javax.mail.Flags;
-
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.SearchQuery;
+import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.model.MailboxId;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -102,10 +102,8 @@ public class LazyMessageSearchIndex<Id extends MailboxId> extends ListeningMessa
         return index.search(session, mailbox, searchQuery);
     }
 
-
     @Override
-    public void update(MailboxSession session, Mailbox<Id> mailbox, MessageRange range, Flags flags, long modSeq) throws MailboxException {
-        index.update(session, mailbox, range, flags, modSeq);
+    public void update(MailboxSession session, Mailbox<Id> mailbox, List<UpdatedFlags> updatedFlagsList) throws MailboxException {
+        index.update(session, mailbox, updatedFlagsList);
     }
-
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/1bfa390f/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
index 2bb2936..b894319 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
@@ -21,8 +21,6 @@ package org.apache.james.mailbox.store.search;
 import java.util.Iterator;
 import java.util.List;
 
-import javax.mail.Flags;
-
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -79,12 +77,10 @@ public abstract class ListeningMessageSearchIndex<Id extends MailboxId> implemen
                 if (event instanceof EventFactory.AddedImpl) {
                     EventFactory.AddedImpl added = (EventFactory.AddedImpl) event;
                     final Mailbox<Id> mailbox = added.getMailbox();
-                    Iterator<Long> uids = added.getUids().iterator();
 
-                    while (uids.hasNext()) {
-                        long next = uids.next();
+                    for (Long next : (Iterable<Long>) added.getUids()) {
                         Iterator<MailboxMessage<Id>> messages = factory.getMessageMapper(session).findInMailbox(mailbox, MessageRange.one(next), FetchType.Full, -1);
-                        while(messages.hasNext()) {
+                        while (messages.hasNext()) {
                             MailboxMessage<Id> message = messages.next();
                             try {
                                 add(session, mailbox, message);
@@ -110,14 +106,10 @@ public abstract class ListeningMessageSearchIndex<Id extends MailboxId> implemen
                     EventFactory.FlagsUpdatedImpl flagsUpdated = (EventFactory.FlagsUpdatedImpl) event;
                     final Mailbox<Id> mailbox = flagsUpdated.getMailbox();
 
-                    Iterator<UpdatedFlags> flags = flagsUpdated.getUpdatedFlags().iterator();
-                    while(flags.hasNext()) {
-                        UpdatedFlags uFlags = flags.next();
-                        try {
-                            update(session, mailbox, MessageRange.one(uFlags.getUid()), uFlags.getNewFlags(), uFlags.getModSeq());
-                        } catch (MailboxException e) {
-                            session.getLog().debug("Unable to update flags for message " + uFlags.getUid() + " in index for mailbox " + mailbox, e);
-                        }
+                    try {
+                        update(session, mailbox, flagsUpdated.getUpdatedFlags());
+                    } catch (MailboxException e) {
+                        session.getLog().debug("Unable to update flags in index for mailbox " + mailbox, e);
                     }
                 }
             } else if (event instanceof EventFactory.MailboxDeletionImpl) {
@@ -131,18 +123,11 @@ public abstract class ListeningMessageSearchIndex<Id extends MailboxId> implemen
     }
 
     /**
-     * Never closed
-     */
-    public boolean isClosed() {
-        return false;
-    }
-
-    /**
      * Add the {@link MailboxMessage} for the given {@link Mailbox} to the index
      *
-     * @param session
-     * @param mailbox
-     * @param message
+     * @param session The mailbox session performing the message addition
+     * @param mailbox mailbox on which the message addition was performed
+     * @param message The added message
      * @throws MailboxException
      */
     public abstract void add(MailboxSession session, Mailbox<Id> mailbox, MailboxMessage<Id> message) throws MailboxException;
@@ -159,13 +144,12 @@ public abstract class ListeningMessageSearchIndex<Id extends MailboxId> implemen
     
     
     /**
-     * Update the {@link MessageRange} for the given {@link Mailbox} with the new {@link Flags} in the index
+     * Update the messages concerned by the updated flags list for the given {@link Mailbox}
      *
-     * @param session
-     * @param mailbox
-     * @param range
-     * @param flags
+     * @param session session that performed the update
+     * @param mailbox mailbox containing the updated messages
+     * @param updatedFlagsList list of flags that were updated
      * @throws MailboxException
      */
-    public abstract void update(MailboxSession session, Mailbox<Id> mailbox, MessageRange range, Flags flags, long modseq) throws MailboxException;
+    public abstract void update(MailboxSession session, Mailbox<Id> mailbox, List<UpdatedFlags> updatedFlagsList) throws MailboxException;
 }


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