You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ad...@apache.org on 2017/07/13 11:26:01 UTC

[1/2] james-project git commit: JAMES-2092 Fix Eclipse warnings

Repository: james-project
Updated Branches:
  refs/heads/master 33419f67a -> c4e25df08


JAMES-2092 Fix Eclipse warnings


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

Branch: refs/heads/master
Commit: c4e25df0828fe61960e56a5dde390283afbef5bb
Parents: 3c6ff2c
Author: Antoine Duprat <ad...@linagora.com>
Authored: Fri Jul 7 10:46:15 2017 +0200
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Thu Jul 13 11:22:15 2017 +0200

----------------------------------------------------------------------
 .../apache/james/mailbox/model/SearchQuery.java |  1 -
 .../mail/CassandraAnnotationMapper.java         |  1 -
 mailbox/elasticsearch/pom.xml                   |  1 -
 .../elasticsearch/MailboxMappingFactory.java    |  4 +---
 .../mailbox/hbase/mail/HBaseMessageMapper.java  |  1 -
 .../inmemory/mail/InMemoryMailboxMapper.java    |  1 -
 .../james/mailbox/store/ResultHeader.java       |  1 -
 .../comparator/AbstractHeaderComparator.java    |  1 -
 .../AbstractMessageIdManagerSideEffectTest.java | 17 ---------------
 mailbox/tika/pom.xml                            |  1 -
 .../james/transport/mailets/ClamAVScan.java     | 22 +++++++++-----------
 .../AbstractMessageRangeProcessor.java          |  1 -
 .../james/imap/processor/AppendProcessor.java   |  1 -
 .../james/imap/processor/MyRightsProcessor.java |  1 -
 .../imap/processor/SystemMessageProcessor.java  |  1 -
 .../imap/processor/base/UidMsnConverter.java    |  1 -
 .../processor/base/SelectedMailboxImplTest.java |  6 +++---
 .../james/core/MimeMessageWrapperTest.java      |  1 -
 .../modules/mailbox/CassandraMailboxModule.java |  1 -
 .../util/concurrency/ConcurrentTestRunner.java  |  6 +++---
 .../sieve/cassandra/CassandraSieveDAO.java      |  2 --
 .../apache/james/transport/mailets/Sieve.java   |  9 --------
 .../apache/james/jmap/model/MailboxFactory.java |  1 -
 .../apache/james/jmap/model/MessageFactory.java |  1 -
 .../netty/AbstractConfigurableAsyncServer.java  |  1 -
 .../activemq/ActiveMQMailQueueBlobTest.java     |  1 -
 .../queue/jms/AbstractJMSMailQueueTest.java     |  2 --
 27 files changed, 17 insertions(+), 70 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
index ebfd6f1..911063b 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
@@ -36,7 +36,6 @@ import org.apache.james.mailbox.MessageUid;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
 
 /**
  * <p>

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java
index 92aca6d..2cea9d4 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java
@@ -33,7 +33,6 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.apache.james.backends.cassandra.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.table.CassandraAnnotationTable;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/mailbox/elasticsearch/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/pom.xml b/mailbox/elasticsearch/pom.xml
index 6c527af..b564a86 100644
--- a/mailbox/elasticsearch/pom.xml
+++ b/mailbox/elasticsearch/pom.xml
@@ -215,7 +215,6 @@
                 <dependency>
                     <groupId>com.github.steveash.guavate</groupId>
                     <artifactId>guavate</artifactId>
-                    <version>1.0.0</version>
                 </dependency>
                 <dependency>
                     <groupId>com.google.guava</groupId>

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/MailboxMappingFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/MailboxMappingFactory.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/MailboxMappingFactory.java
index e87f575..142736c 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/MailboxMappingFactory.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/MailboxMappingFactory.java
@@ -32,6 +32,7 @@ import static org.apache.james.backends.es.NodeMappingFactory.NOT_ANALYZED;
 import static org.apache.james.backends.es.NodeMappingFactory.PROPERTIES;
 import static org.apache.james.backends.es.NodeMappingFactory.RAW;
 import static org.apache.james.backends.es.NodeMappingFactory.SNOWBALL;
+import static org.apache.james.backends.es.NodeMappingFactory.STRING;
 import static org.apache.james.backends.es.NodeMappingFactory.TYPE;
 import static org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants.BCC;
 import static org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants.CC;
@@ -63,9 +64,6 @@ import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
 
 import java.io.IOException;
 
-import static org.apache.james.backends.es.NodeMappingFactory.STRING;
-
-import org.apache.james.backends.es.IndexCreationFactory;
 import org.apache.james.backends.es.NodeMappingFactory;
 import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants.EMailer;
 import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants.Property;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMessageMapper.java b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMessageMapper.java
index 10e65ae..6c0843f 100644
--- a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMessageMapper.java
+++ b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMessageMapper.java
@@ -48,7 +48,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
-import javax.annotation.Nullable;
 import javax.mail.Flags;
 
 import org.apache.hadoop.conf.Configuration;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
index b85cdef..7e7eb8e 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
@@ -35,7 +35,6 @@ import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 
 import com.google.common.base.Objects;
-import com.google.common.base.Optional;
 
 public class InMemoryMailboxMapper implements MailboxMapper {
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/mailbox/store/src/main/java/org/apache/james/mailbox/store/ResultHeader.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/ResultHeader.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/ResultHeader.java
index d01c13f..f289fe9 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/ResultHeader.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/ResultHeader.java
@@ -27,7 +27,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.Charset;
 
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MessageResult;
 
 public final class ResultHeader implements MessageResult.Header {

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/AbstractHeaderComparator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/AbstractHeaderComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/AbstractHeaderComparator.java
index 37f2c0f..7c76209 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/AbstractHeaderComparator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/AbstractHeaderComparator.java
@@ -23,7 +23,6 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.Locale;
 
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MessageResult.Header;
 import org.apache.james.mailbox.store.ResultUtils;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
index 5aa005e..8c84b8a 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
@@ -30,7 +30,6 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
 import java.util.List;
-import java.util.Map;
 
 import javax.mail.Flags;
 
@@ -61,8 +60,6 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
 
 public abstract class AbstractMessageIdManagerSideEffectTest {
@@ -149,11 +146,6 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        MessageResult messageResult = FluentIterable
-            .from(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session))
-            .filter(inMailbox(mailbox1.getMailboxId()))
-            .get(0);
-
         verify(dispatcher).added(eq(session), eq(mailbox1), any(MailboxMessage.class));
         verifyNoMoreInteractions(dispatcher);
     }
@@ -325,15 +317,6 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         when(quotaManager.getStorageQuota(any(QuotaRoot.class))).thenReturn(QuotaImpl.unlimited());
     }
 
-    private Predicate<MessageResult> inMailbox(final MailboxId mailboxId) {
-        return new Predicate<MessageResult>() {
-            @Override
-            public boolean apply(MessageResult input) {
-                return input.getMailboxId().equals(mailboxId);
-            }
-        };
-    }
-
     private SimpleMessageMetaData fromMessageResult(MessageId messageId, MessageResult messageResult) {
         return new SimpleMessageMetaData(messageResult.getUid(), messageResult.getModSeq(), messageResult.getFlags(), messageResult.getSize(), messageResult.getInternalDate(), messageId);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/mailbox/tika/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/tika/pom.xml b/mailbox/tika/pom.xml
index 37fa418..5598582 100644
--- a/mailbox/tika/pom.xml
+++ b/mailbox/tika/pom.xml
@@ -209,7 +209,6 @@
                 <dependency>
                     <groupId>org.testcontainers</groupId>
                     <artifactId>testcontainers</artifactId>
-                    <version>1.3.1</version>
                     <scope>test</scope>
                 </dependency>
                 <dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/mailet/standard/src/main/java/org/apache/james/transport/mailets/ClamAVScan.java
----------------------------------------------------------------------
diff --git a/mailet/standard/src/main/java/org/apache/james/transport/mailets/ClamAVScan.java b/mailet/standard/src/main/java/org/apache/james/transport/mailets/ClamAVScan.java
index e8fe602..5d3fc8e 100644
--- a/mailet/standard/src/main/java/org/apache/james/transport/mailets/ClamAVScan.java
+++ b/mailet/standard/src/main/java/org/apache/james/transport/mailets/ClamAVScan.java
@@ -20,26 +20,14 @@
 
 package org.apache.james.transport.mailets;
 
-import org.apache.commons.io.IOUtils;
-import org.apache.mailet.Experimental;
-import org.apache.mailet.Mail;
-import org.apache.mailet.MailAddress;
-import org.apache.mailet.base.GenericMailet;
-import org.apache.mailet.base.RFC2822Headers;
-
-import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
 import java.io.BufferedOutputStream;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
-import java.io.Reader;
 import java.io.StringWriter;
-import java.io.Writer;
 import java.net.ConnectException;
 import java.net.InetAddress;
 import java.net.Socket;
@@ -48,6 +36,16 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.mailet.Experimental;
+import org.apache.mailet.Mail;
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.base.GenericMailet;
+import org.apache.mailet.base.RFC2822Headers;
+
 
 /**
  * <P>Does an antivirus scan check using a ClamAV daemon (CLAMD)</P>

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
index 7a58e67..8663bb4 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
@@ -43,7 +43,6 @@ import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.metrics.api.MetricFactory;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
 
 public abstract class AbstractMessageRangeProcessor<M extends AbstractMessageRangeRequest> extends AbstractMailboxProcessor<M> {
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
index 5bc46fd..d57adf5 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
@@ -46,7 +46,6 @@ import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.metrics.api.MetricFactory;
-import org.slf4j.Logger;
 
 public class AppendProcessor extends AbstractMailboxProcessor<AppendRequest> {
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/protocols/imap/src/main/java/org/apache/james/imap/processor/MyRightsProcessor.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/MyRightsProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/MyRightsProcessor.java
index d011ff5..2f1c89a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/MyRightsProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/MyRightsProcessor.java
@@ -40,7 +40,6 @@ import org.apache.james.mailbox.model.MailboxACL.MailboxACLRights;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.SimpleMailboxACL.Rfc4314Rights;
 import org.apache.james.metrics.api.MetricFactory;
-import org.slf4j.Logger;
 
 /**
  * MYRIGHTS Processor.

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/protocols/imap/src/main/java/org/apache/james/imap/processor/SystemMessageProcessor.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SystemMessageProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SystemMessageProcessor.java
index 07f881c..2e1c28e 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SystemMessageProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SystemMessageProcessor.java
@@ -27,7 +27,6 @@ import org.apache.james.imap.processor.base.AbstractChainedProcessor;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.slf4j.Logger;
 
 /**
  * Processes system messages unrelated to IMAP.

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/protocols/imap/src/main/java/org/apache/james/imap/processor/base/UidMsnConverter.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/base/UidMsnConverter.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/base/UidMsnConverter.java
index 9e09053..fe8c519 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/base/UidMsnConverter.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/base/UidMsnConverter.java
@@ -21,7 +21,6 @@ package org.apache.james.imap.processor.base;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.TreeSet;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
index 33c61e4..8d005d6 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
@@ -146,10 +146,10 @@ public class SelectedMailboxImplTest {
         };
     }
 
-    private Answer generateEmitEventAnswer(final AtomicInteger success) {
-        return new Answer() {
+    private Answer<Iterator<MessageUid>> generateEmitEventAnswer(final AtomicInteger success) {
+        return new Answer<Iterator<MessageUid>>() {
             @Override
-            public Object answer(InvocationOnMock invocation) throws Throwable {
+            public Iterator<MessageUid> answer(InvocationOnMock invocation) throws Throwable {
                 Object[] args = invocation.getArguments();
                 final MailboxListener mailboxListener = (MailboxListener) args[1];
                 executorService.submit(new Runnable() {

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/server/container/core/src/test/java/org/apache/james/core/MimeMessageWrapperTest.java
----------------------------------------------------------------------
diff --git a/server/container/core/src/test/java/org/apache/james/core/MimeMessageWrapperTest.java b/server/container/core/src/test/java/org/apache/james/core/MimeMessageWrapperTest.java
index 75a29ba..449eedc 100644
--- a/server/container/core/src/test/java/org/apache/james/core/MimeMessageWrapperTest.java
+++ b/server/container/core/src/test/java/org/apache/james/core/MimeMessageWrapperTest.java
@@ -21,7 +21,6 @@ package org.apache.james.core;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 import java.io.BufferedReader;
 import java.io.ByteArrayOutputStream;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
index 2d06dbb..eefecf2 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
@@ -33,7 +33,6 @@ import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
 import org.apache.james.mailbox.cassandra.CassandraSubscriptionManager;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/server/container/util/src/main/java/org/apache/james/util/concurrency/ConcurrentTestRunner.java
----------------------------------------------------------------------
diff --git a/server/container/util/src/main/java/org/apache/james/util/concurrency/ConcurrentTestRunner.java b/server/container/util/src/main/java/org/apache/james/util/concurrency/ConcurrentTestRunner.java
index cc06686..ff50490 100644
--- a/server/container/util/src/main/java/org/apache/james/util/concurrency/ConcurrentTestRunner.java
+++ b/server/container/util/src/main/java/org/apache/james/util/concurrency/ConcurrentTestRunner.java
@@ -75,7 +75,7 @@ public class ConcurrentTestRunner {
     private final CountDownLatch countDownLatch;
     private final BiConsumer biConsumer;
     private final ExecutorService executorService;
-    private final List<Future> futures;
+    private final List<Future<?>> futures;
 
     public ConcurrentTestRunner(int threadCount, int operationCount, BiConsumer biConsumer) {
         Preconditions.checkArgument(threadCount > 0, "Thread count should be strictly positive");
@@ -86,7 +86,7 @@ public class ConcurrentTestRunner {
         this.countDownLatch = new CountDownLatch(threadCount);
         this.biConsumer = biConsumer;
         this.executorService = Executors.newFixedThreadPool(threadCount);
-        this.futures = new ArrayList<Future>();
+        this.futures = new ArrayList<Future<?>>();
     }
 
     public ConcurrentTestRunner run() {
@@ -97,7 +97,7 @@ public class ConcurrentTestRunner {
     }
 
     public ConcurrentTestRunner assertNoException() throws ExecutionException, InterruptedException {
-        for (Future future: futures) {
+        for (Future<?> future: futures) {
             future.get();
         }
         return this;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java
index f15dba5..9e3c7aa 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java
@@ -33,11 +33,9 @@ import static org.apache.james.sieve.cassandra.tables.CassandraSieveTable.SIZE;
 import static org.apache.james.sieve.cassandra.tables.CassandraSieveTable.TABLE_NAME;
 import static org.apache.james.sieve.cassandra.tables.CassandraSieveTable.USER_NAME;
 
-
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java
index 21225b0..4f61488 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java
@@ -19,30 +19,21 @@
 
 package org.apache.james.transport.mailets;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javax.inject.Inject;
 import javax.mail.MessagingException;
 
 import org.apache.commons.logging.Log;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.sieverepository.api.SieveRepository;
-import org.apache.james.transport.mailets.delivery.MailStore;
 import org.apache.james.transport.mailets.jsieve.CommonsLoggingAdapter;
 import org.apache.james.transport.mailets.jsieve.ResourceLocator;
 import org.apache.james.transport.mailets.jsieve.delivery.SieveExecutor;
 import org.apache.james.transport.mailets.jsieve.delivery.SievePoster;
 import org.apache.james.user.api.UsersRepository;
-import org.apache.james.user.api.UsersRepositoryException;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailAddress;
 import org.apache.mailet.base.GenericMailet;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-
 /**
  * Execute Sieve scripts for incoming emails, and set the result of the execution as attributes of the mail
  */

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
index 6f4e9b1..119de23 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
@@ -35,7 +35,6 @@ import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
index 18f4695..b5e5e1d 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
@@ -21,7 +21,6 @@ package org.apache.james.jmap.model;
 import java.io.IOException;
 import java.io.InputStream;
 import java.time.Instant;
-import java.time.ZoneId;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java b/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java
index c1ebb81..d72d53e 100644
--- a/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java
+++ b/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java
@@ -337,7 +337,6 @@ public abstract class AbstractConfigurableAsyncServer extends AbstractAsyncServe
      * @throws ConfigurationException
      */
     protected void configureHelloName(Configuration handlerConfiguration) throws ConfigurationException {
-        StringBuilder infoBuffer;
         String hostName;
         try {
             hostName = InetAddress.getLocalHost().getHostName();

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
index b360913..a85b831 100644
--- a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
+++ b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
@@ -26,7 +26,6 @@ import java.io.InputStream;
 import org.apache.activemq.ActiveMQConnectionFactory;
 import org.apache.commons.io.FileUtils;
 import org.apache.james.filesystem.api.FileSystem;
-import org.apache.james.queue.jms.JMSMailQueue;
 
 import com.google.common.base.Throwables;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/c4e25df0/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/AbstractJMSMailQueueTest.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/AbstractJMSMailQueueTest.java b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/AbstractJMSMailQueueTest.java
index 52b1aef..1e8b0c5 100644
--- a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/AbstractJMSMailQueueTest.java
+++ b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/AbstractJMSMailQueueTest.java
@@ -30,7 +30,6 @@ import java.util.Enumeration;
 import java.util.Iterator;
 import java.util.Properties;
 import java.util.UUID;
-import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
 import javax.jms.ConnectionFactory;
@@ -49,7 +48,6 @@ import org.apache.james.queue.api.ManageableMailQueue.MailQueueIterator;
 import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailAddress;
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.slf4j.Logger;


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


[2/2] james-project git commit: JAMES-2092 Cache messages on events whenever possible

Posted by ad...@apache.org.
JAMES-2092 Cache messages on events whenever possible


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

Branch: refs/heads/master
Commit: 3c6ff2c69b0973b18aa0bd8c998c75b778d4a359
Parents: 33419f6
Author: benwa <bt...@linagora.com>
Authored: Fri Jul 7 10:37:57 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Thu Jul 13 11:22:15 2017 +0200

----------------------------------------------------------------------
 .../cassandra/CassandraMailboxManager.java      |   3 +-
 .../cassandra/CassandraMessageManager.java      |   5 +-
 ...istributedMailboxDelegatingListenerTest.java |  12 +-
 .../mailbox/hbase/HBaseMailboxManager.java      |   3 +-
 .../mailbox/hbase/HBaseMessageManager.java      |   5 +-
 .../james/mailbox/jcr/JCRMailboxManager.java    |   3 +-
 .../james/mailbox/jcr/JCRMessageManager.java    |   5 +-
 .../james/mailbox/jpa/JPAMessageManager.java    |   5 +-
 .../jpa/openjpa/OpenJPAMailboxManager.java      |   3 +-
 .../jpa/openjpa/OpenJPAMessageManager.java      |   9 +-
 .../inmemory/InMemoryMailboxManager.java        |   3 +-
 .../inmemory/InMemoryMessageManager.java        |   5 +-
 mailbox/store/pom.xml                           |   1 -
 .../mailbox/store/ImmutableMailboxMessage.java  | 261 +++++++++++++++++++
 .../mailbox/store/StoreMailboxManager.java      |   9 +-
 .../mailbox/store/StoreMessageIdManager.java    |   7 +-
 .../mailbox/store/StoreMessageManager.java      |  44 +++-
 .../james/mailbox/store/event/EventFactory.java |  13 +-
 .../store/event/MailboxEventDispatcher.java     |  18 +-
 .../store/json/event/EventConverter.java        |   6 +-
 .../search/ListeningMessageSearchIndex.java     |  43 ++-
 .../AbstractMessageIdManagerSideEffectTest.java |  23 +-
 ...elegatingMailboxListenerIntegrationTest.java |  10 +-
 .../mailbox/store/json/EventSerializerTest.java |   4 +-
 .../registrations/MailboxRegistrationTest.java  |   4 +-
 .../processor/base/SelectedMailboxImplTest.java |   4 +-
 .../org/apache/james/util/IteratorWrapper.java  |  60 +++++
 .../apache/james/util/IteratorWrapperTest.java  |  90 +++++++
 28 files changed, 577 insertions(+), 81 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
index 3656690..736ef6a 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
@@ -133,7 +133,8 @@ public class CassandraMailboxManager extends StoreMailboxManager {
             getQuotaRootResolver(),
             getMessageParser(),
             getMessageIdFactory(),
-            getBatchSizes());
+            getBatchSizes(),
+            getImmutableMailboxMessageFactory());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java
index 6d5c085..585e6e3 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java
@@ -30,6 +30,7 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.BatchSizes;
+import org.apache.james.mailbox.store.ImmutableMailboxMessage;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
@@ -46,9 +47,9 @@ public class CassandraMessageManager extends StoreMessageManager {
     public CassandraMessageManager(MailboxSessionMapperFactory mapperFactory, MessageSearchIndex index, 
             MailboxEventDispatcher dispatcher, MailboxPathLocker locker, Mailbox mailbox, QuotaManager quotaManager, 
             QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory,
-            BatchSizes batchSizes) throws MailboxException {
+            BatchSizes batchSizes, ImmutableMailboxMessage.Factory immutableMailboxMessageFactory) throws MailboxException {
         super(mapperFactory, index, dispatcher, locker, mailbox, new UnionMailboxACLResolver(), 
-                new SimpleGroupMembershipResolver(), quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes);
+                new SimpleGroupMembershipResolver(), quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes, immutableMailboxMessageFactory);
 
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/event/distributed/CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/event/distributed/CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/event/distributed/CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest.java
index efefb22..37cb6ed 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/event/distributed/CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/event/distributed/CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest.java
@@ -27,9 +27,11 @@ import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.modules.CassandraRegistrationModule;
 import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.mailbox.store.TestIdDeserializer;
@@ -40,12 +42,15 @@ import org.apache.james.mailbox.store.event.distributed.RegisteredDelegatingMail
 import org.apache.james.mailbox.store.json.MessagePackEventSerializer;
 import org.apache.james.mailbox.store.json.event.EventConverter;
 import org.apache.james.mailbox.store.json.event.MailboxConverter;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 import org.apache.james.mailbox.util.EventCollector;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
+import com.google.common.collect.ImmutableMap;
+
 /**
  Integration tests for RegisteredDelegatingMailboxListener using a cassandra back-end.
 
@@ -57,6 +62,7 @@ public class CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest {
     public static final MailboxPath MAILBOX_PATH_2 = new MailboxPath("#private", "user", "mbx.other");
     public static final int CASSANDRA_TIME_OUT_IN_S = 10;
     public static final int SCHEDULER_PERIOD_IN_S = 20;
+    public static final ImmutableMap<MessageUid, MailboxMessage> EMPTY_MESSAGE_CACHE = ImmutableMap.of();
 
     private CassandraCluster cassandra = CassandraCluster.create(new CassandraRegistrationModule());
     private RegisteredDelegatingMailboxListener registeredDelegatingMailboxListener1;
@@ -142,7 +148,8 @@ public class CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest {
     public void mailboxEventListenersShouldBeTriggeredIfRegistered() throws Exception {
         SimpleMailbox simpleMailbox = new SimpleMailbox(MAILBOX_PATH_1, 42);
         simpleMailbox.setMailboxId(TestId.of(52));
-        final MailboxListener.Event event = new EventFactory().added(mailboxSession, new TreeMap<>(), simpleMailbox);
+        TreeMap<MessageUid, MessageMetaData> uids = new TreeMap<>();
+        final MailboxListener.Event event = new EventFactory().added(mailboxSession, uids, simpleMailbox, EMPTY_MESSAGE_CACHE);
 
         registeredDelegatingMailboxListener1.event(event);
 
@@ -155,7 +162,8 @@ public class CassandraBasedRegisteredDistributedMailboxDelegatingListenerTest {
     public void onceEventListenersShouldBeTriggeredOnceAcrossTheCluster() {
         SimpleMailbox simpleMailbox = new SimpleMailbox(MAILBOX_PATH_1, 42);
         simpleMailbox.setMailboxId(TestId.of(52));
-        final MailboxListener.Event event = new EventFactory().added(mailboxSession, new TreeMap<>(), simpleMailbox);
+        TreeMap<MessageUid, MessageMetaData> uids = new TreeMap<>();
+        final MailboxListener.Event event = new EventFactory().added(mailboxSession, uids, simpleMailbox, EMPTY_MESSAGE_CACHE);
 
         registeredDelegatingMailboxListener1.event(event);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMailboxManager.java b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMailboxManager.java
index baeadb9..1540b7b 100644
--- a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMailboxManager.java
+++ b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMailboxManager.java
@@ -105,6 +105,7 @@ public class HBaseMailboxManager extends StoreMailboxManager {
             getQuotaRootResolver(),
             getMessageParser(),
             getMessageIdFactory(),
-            getBatchSizes());
+            getBatchSizes(),
+            getImmutableMailboxMessageFactory());
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMessageManager.java
----------------------------------------------------------------------
diff --git a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMessageManager.java b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMessageManager.java
index 00386b8..0b1c054 100644
--- a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMessageManager.java
+++ b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMessageManager.java
@@ -29,6 +29,7 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.BatchSizes;
+import org.apache.james.mailbox.store.ImmutableMailboxMessage;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
@@ -45,9 +46,9 @@ public class HBaseMessageManager extends StoreMessageManager {
     public HBaseMessageManager(MailboxSessionMapperFactory mapperFactory, MessageSearchIndex index,
             MailboxEventDispatcher dispatcher, MailboxPathLocker locker, Mailbox mailbox, MailboxACLResolver aclResolver,
             GroupMembershipResolver groupMembershipResolver, QuotaManager quotaManager, 
-            QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory, BatchSizes batchSizes) throws MailboxException {
+            QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory, BatchSizes batchSizes, ImmutableMailboxMessage.Factory immutableMailboxMessageFactory) throws MailboxException {
         super(mapperFactory, index, dispatcher, locker, mailbox, aclResolver, groupMembershipResolver, quotaManager, 
-                quotaRootResolver, messageParser, messageIdFactory, batchSizes);
+                quotaRootResolver, messageParser, messageIdFactory, batchSizes, immutableMailboxMessageFactory);
 
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java b/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
index c3105b7..e60ba33 100644
--- a/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
+++ b/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
@@ -77,7 +77,8 @@ public class JCRMailboxManager extends StoreMailboxManager implements JCRImapCon
             getQuotaRootResolver(),
             getMessageParser(),
             getMessageIdFactory(),
-            getBatchSizes());
+            getBatchSizes(),
+            getImmutableMailboxMessageFactory());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
----------------------------------------------------------------------
diff --git a/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java b/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
index fbf25e0..ee76bab 100644
--- a/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
+++ b/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.BatchSizes;
+import org.apache.james.mailbox.store.ImmutableMailboxMessage;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
@@ -56,10 +57,10 @@ public class JCRMessageManager extends StoreMessageManager {
     public JCRMessageManager(MailboxSessionMapperFactory mapperFactory, MessageSearchIndex index, 
             final MailboxEventDispatcher dispatcher, MailboxPathLocker locker, JCRMailbox mailbox, 
             MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, Logger log, 
-            QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory, BatchSizes batchSizes)
+            QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory, BatchSizes batchSizes, ImmutableMailboxMessage.Factory immutableMailboxMessageFactory)
                     throws MailboxException {
         super(mapperFactory, index, dispatcher, locker, mailbox, aclResolver, groupMembershipResolver, quotaManager, 
-                quotaRootResolver, messageParser, messageIdFactory, batchSizes);
+                quotaRootResolver, messageParser, messageIdFactory, batchSizes, immutableMailboxMessageFactory);
         this.log = log;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
index 2817940..ee023ac 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.BatchSizes;
+import org.apache.james.mailbox.store.ImmutableMailboxMessage;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
@@ -54,10 +55,10 @@ public class JPAMessageManager extends StoreMessageManager {
     			final MailboxEventDispatcher dispatcher, MailboxPathLocker locker, 
     			final Mailbox mailbox, MailboxACLResolver aclResolver, 
     			GroupMembershipResolver groupMembershipResolver, QuotaManager quotaManager,
-                QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory, BatchSizes batchSizes) throws MailboxException {
+                QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory, BatchSizes batchSizes, ImmutableMailboxMessage.Factory immutableMailboxMessageFactory) throws MailboxException {
     	
         super(mapperFactory, index, dispatcher, locker, mailbox, aclResolver, groupMembershipResolver,
-            quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes);
+            quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes, immutableMailboxMessageFactory);
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
index d6bb542..7944ec4 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
@@ -105,6 +105,7 @@ public class OpenJPAMailboxManager extends JPAMailboxManager {
             getQuotaRootResolver(),
             getMessageParser(),
             getMessageIdFactory(),
-            getBatchSizes());
+            getBatchSizes(),
+            getImmutableMailboxMessageFactory());
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
index 7091d36..ca545d5 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
@@ -38,6 +38,7 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.BatchSizes;
+import org.apache.james.mailbox.store.ImmutableMailboxMessage;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -64,9 +65,9 @@ public class OpenJPAMessageManager extends JPAMessageManager {
     		MailboxPathLocker locker, Mailbox mailbox, MailboxACLResolver aclResolver, 
     		GroupMembershipResolver groupMembershipResolver,
             QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, MessageParser messageParser,
-            MessageId.Factory messageIdFactory, BatchSizes batchSizes) throws MailboxException {
+            MessageId.Factory messageIdFactory, BatchSizes batchSizes, ImmutableMailboxMessage.Factory immutableMailboxMessageFactory) throws MailboxException {
         this(mapperFactory, index, dispatcher, locker,  mailbox, AdvancedFeature.None, aclResolver, 
-                groupMembershipResolver, quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes);
+                groupMembershipResolver, quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes, immutableMailboxMessageFactory);
     }
 
     public OpenJPAMessageManager(MailboxSessionMapperFactory mapperFactory, 
@@ -74,9 +75,9 @@ public class OpenJPAMessageManager extends JPAMessageManager {
     		MailboxPathLocker locker, Mailbox mailbox, AdvancedFeature f, 
     		MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver,
             QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, MessageParser messageParser,
-            MessageId.Factory messageIdFactory, BatchSizes batchSizes) throws MailboxException {
+            MessageId.Factory messageIdFactory, BatchSizes batchSizes, ImmutableMailboxMessage.Factory immutableMailboxMessageFactory) throws MailboxException {
     	
-        super(mapperFactory,  index, dispatcher, locker, mailbox, aclResolver, groupMembershipResolver, quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes);
+        super(mapperFactory,  index, dispatcher, locker, mailbox, aclResolver, groupMembershipResolver, quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes, immutableMailboxMessageFactory);
         this.feature = f;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
index 3b465ef..55584d8 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
@@ -87,6 +87,7 @@ public class InMemoryMailboxManager extends StoreMailboxManager {
             getQuotaRootResolver(),
             getMessageParser(),
             getMessageIdFactory(),
-            getBatchSizes());
+            getBatchSizes(),
+            getImmutableMailboxMessageFactory());
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
index b573b9b..161bd5c 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
@@ -11,6 +11,7 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.BatchSizes;
+import org.apache.james.mailbox.store.ImmutableMailboxMessage;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
@@ -22,8 +23,8 @@ public class InMemoryMessageManager extends StoreMessageManager {
 
     public InMemoryMessageManager(MailboxSessionMapperFactory mapperFactory, MessageSearchIndex index, MailboxEventDispatcher dispatcher, 
             MailboxPathLocker locker, Mailbox mailbox, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, 
-            QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory, BatchSizes batchSizes) throws MailboxException {
-        super(mapperFactory, index, dispatcher, locker, mailbox, aclResolver, groupMembershipResolver, quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes);
+            QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory, BatchSizes batchSizes, ImmutableMailboxMessage.Factory immutableMailboxMessageFactory) throws MailboxException {
+        super(mapperFactory, index, dispatcher, locker, mailbox, aclResolver, groupMembershipResolver, quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes, immutableMailboxMessageFactory);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/store/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/store/pom.xml b/mailbox/store/pom.xml
index 7cb4e31..95af179 100644
--- a/mailbox/store/pom.xml
+++ b/mailbox/store/pom.xml
@@ -39,7 +39,6 @@
         <dependency>
             <groupId>org.apache.james</groupId>
             <artifactId>james-server-util</artifactId>
-            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.james</groupId>

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/store/src/main/java/org/apache/james/mailbox/store/ImmutableMailboxMessage.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/ImmutableMailboxMessage.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/ImmutableMailboxMessage.java
new file mode 100644
index 0000000..1f2b4c5
--- /dev/null
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/ImmutableMailboxMessage.java
@@ -0,0 +1,261 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.mailbox.store;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.List;
+
+import javax.mail.Flags;
+import javax.mail.util.SharedByteArrayInputStream;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.NotImplementedException;
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MessageAttachment;
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.store.mail.model.FlagsBuilder;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.apache.james.mailbox.store.mail.model.Property;
+
+import com.google.common.collect.ImmutableList;
+
+public class ImmutableMailboxMessage implements MailboxMessage {
+
+    public static class Factory {
+
+        private final MailboxManager mailboxManager;
+
+        public Factory(MailboxManager mailboxManager) {
+            this.mailboxManager = mailboxManager;
+        }
+
+        public ImmutableMailboxMessage from(MailboxId mailboxId, MailboxMessage message) throws MailboxException {
+            try {
+                return new ImmutableMailboxMessage(message.getMessageId(),
+                        message.getInternalDate(),
+                        copy(message.getBodyContent()),
+                        message.getMediaType(),
+                        message.getSubType(),
+                        message.getBodyOctets(),
+                        message.getFullContentOctets(),
+                        message.getFullContentOctets() - message.getBodyOctets(),
+                        message.getTextualLineCount(),
+                        copy(message.getHeaderContent()),
+                        copy(message.getFullContent()),
+                        ImmutableList.copyOf(message.getProperties()),
+                        attachments(message),
+                        mailboxId,
+                        message.getUid(),
+                        message.getModSeq(),
+                        message.isAnswered(),
+                        message.isDeleted(),
+                        message.isDraft(),
+                        message.isFlagged(),
+                        message.isRecent(),
+                        message.isSeen(),
+                        message.createFlags().getUserFlags());
+            } catch (IOException e) {
+                throw new MailboxException("Unable to parse message", e);
+            }
+        }
+
+        private ImmutableList<MessageAttachment> attachments(MailboxMessage message) {
+            if (mailboxManager.getSupportedMessageCapabilities().contains(MailboxManager.MessageCapabilities.Attachment)) {
+                return ImmutableList.copyOf(message.getAttachments());
+            }
+            return ImmutableList.of();
+        }
+
+        private static SharedByteArrayInputStream copy(InputStream inputStream) throws IOException {
+            return new SharedByteArrayInputStream(IOUtils.toByteArray(inputStream));
+        }
+    }
+
+    private final MessageId messageId;
+    private final Date internalDate;
+    private final InputStream bodyContent;
+    private final String mediaType;
+    private final String subType;
+    private final long bodyOctets;
+    private final long fullContentOctets;
+    private final long headerOctets;
+    private final Long textualLineCount;
+    private final InputStream headerContent;
+    private final InputStream fullContent;
+    private final List<Property> properties;
+    private final List<MessageAttachment> attachments;
+    private final MailboxId mailboxId;
+    private final MessageUid uid;
+    private final long modSeq;
+    private final boolean answered;
+    private final boolean deleted;
+    private final boolean draft;
+    private final boolean flagged;
+    private final boolean recent;
+    private final boolean seen;
+    private final String[] userFlags;
+
+    private ImmutableMailboxMessage(MessageId messageId, Date internalDate, InputStream bodyContent, String mediaType, String subType, long bodyOctets, long fullContentOctets, long headerOctets, Long textualLineCount, InputStream headerContent,
+                                    InputStream fullContent, List<Property> properties, List<MessageAttachment> attachments, MailboxId mailboxId, MessageUid uid, long modSeq, boolean answered, boolean deleted, boolean draft, boolean flagged, boolean recent,
+                                    boolean seen, String[] userFlags) {
+        this.messageId = messageId;
+        this.internalDate = internalDate;
+        this.bodyContent = bodyContent;
+        this.mediaType = mediaType;
+        this.subType = subType;
+        this.bodyOctets = bodyOctets;
+        this.fullContentOctets = fullContentOctets;
+        this.headerOctets = headerOctets; 
+        this.textualLineCount = textualLineCount;
+        this.headerContent = headerContent;
+        this.fullContent = fullContent;
+        this.properties = properties;
+        this.attachments = attachments;
+        this.mailboxId = mailboxId;
+        this.uid = uid;
+        this.modSeq = modSeq;
+        this.answered = answered;
+        this.deleted = deleted;
+        this.draft = draft;
+        this.flagged = flagged;
+        this.recent = recent;
+        this.seen = seen;
+        this.userFlags = userFlags;
+    }
+
+    public MessageId getMessageId() {
+        return messageId;
+    }
+
+    public Date getInternalDate() {
+        return internalDate;
+    }
+
+    public InputStream getBodyContent() {
+        return bodyContent;
+    }
+
+    public String getMediaType() {
+        return mediaType;
+    }
+
+    public String getSubType() {
+        return subType;
+    }
+
+    public long getBodyOctets() {
+        return bodyOctets;
+    }
+
+    public long getFullContentOctets() {
+        return fullContentOctets;
+    }
+    
+    @Override
+    public long getHeaderOctets() {
+        return headerOctets;
+    }
+
+    public Long getTextualLineCount() {
+        return textualLineCount;
+    }
+
+    public InputStream getHeaderContent() {
+        return headerContent;
+    }
+
+    public InputStream getFullContent() {
+        return fullContent;
+    }
+
+    public List<Property> getProperties() {
+        return properties;
+    }
+
+    public List<MessageAttachment> getAttachments() {
+        return attachments;
+    }
+
+    public MailboxId getMailboxId() {
+        return mailboxId;
+    }
+
+    public MessageUid getUid() {
+        return uid;
+    }
+
+    public long getModSeq() {
+        return modSeq;
+    }
+
+    public boolean isAnswered() {
+        return answered;
+    }
+
+    public boolean isDeleted() {
+        return deleted;
+    }
+
+    public boolean isDraft() {
+        return draft;
+    }
+
+    public boolean isFlagged() {
+        return flagged;
+    }
+
+    public boolean isRecent() {
+        return recent;
+    }
+
+    public boolean isSeen() {
+        return seen;
+    }
+
+    @Override
+    public int compareTo(MailboxMessage o) {
+        throw new NotImplementedException();
+    }
+
+    @Override
+    public void setUid(MessageUid uid) {
+        throw new NotImplementedException();
+    }
+
+    @Override
+    public void setModSeq(long modSeq) {
+        throw new NotImplementedException();
+    }
+
+    @Override
+    public void setFlags(Flags flags) {
+        throw new NotImplementedException();
+    }
+
+    @Override
+    public Flags createFlags() {
+        return FlagsBuilder.createFlags(this, userFlags);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 1bc28df..355070b 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -140,6 +140,8 @@ public class StoreMailboxManager implements MailboxManager {
 
     private final int limitAnnotationSize;
 
+    private final ImmutableMailboxMessage.Factory immutableMailboxMessageFactory;
+
     @Inject
     public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, Authorizator authorizator, 
             MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, 
@@ -185,6 +187,7 @@ public class StoreMailboxManager implements MailboxManager {
         this.limitAnnotationSize = limitAnnotationSize;
         this.delegatingListener = delegatingListener;
         this.dispatcher = mailboxEventDispatcher;
+        this.immutableMailboxMessageFactory = new ImmutableMailboxMessage.Factory(this);
     }
 
     protected Factory getMessageIdFactory() {
@@ -223,6 +226,10 @@ public class StoreMailboxManager implements MailboxManager {
         return batchSizes;
     }
 
+    public ImmutableMailboxMessage.Factory getImmutableMailboxMessageFactory() {
+        return immutableMailboxMessageFactory;
+    }
+
     /**
      * Init the {@link MailboxManager}
      *
@@ -464,7 +471,7 @@ public class StoreMailboxManager implements MailboxManager {
     protected StoreMessageManager createMessageManager(Mailbox mailbox, MailboxSession session) throws MailboxException {
         return new StoreMessageManager(getMapperFactory(), getMessageSearchIndex(), getEventDispatcher(), 
                 getLocker(), mailbox, getAclResolver(), getGroupMembershipResolver(), getQuotaManager(), 
-                getQuotaRootResolver(), getMessageParser(), getMessageIdFactory(), getBatchSizes());
+                getQuotaRootResolver(), getMessageParser(), getMessageIdFactory(), getBatchSizes(), getImmutableMailboxMessageFactory());
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
index 9964d6c..7c883bb 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
@@ -229,18 +229,17 @@ public class StoreMessageIdManager implements MessageIdManager {
         MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession);
         for (MailboxId mailboxId : mailboxIds) {
             SimpleMailboxMessage copy = SimpleMailboxMessage.copy(mailboxId, mailboxMessage);
-            MessageMetaData metaData = save(mailboxSession, messageIdMapper, copy);
-            dispatcher.added(mailboxSession, metaData, mailboxMapper.findMailboxById(mailboxId));
+            save(mailboxSession, messageIdMapper, copy);
+            dispatcher.added(mailboxSession, mailboxMapper.findMailboxById(mailboxId), copy);
         }
     }
 
-    private MessageMetaData save(MailboxSession mailboxSession, MessageIdMapper messageIdMapper, MailboxMessage mailboxMessage) throws MailboxException {
+    private void save(MailboxSession mailboxSession, MessageIdMapper messageIdMapper, MailboxMessage mailboxMessage) throws MailboxException {
         long modSeq = mailboxSessionMapperFactory.getModSeqProvider().nextModSeq(mailboxSession, mailboxMessage.getMailboxId());
         MessageUid uid = mailboxSessionMapperFactory.getUidProvider().nextUid(mailboxSession, mailboxMessage.getMailboxId());
         mailboxMessage.setModSeq(modSeq);
         mailboxMessage.setUid(uid);
         messageIdMapper.save(mailboxMessage);
-        return new SimpleMessageMetaData(uid, modSeq, mailboxMessage.createFlags(), mailboxMessage.getFullContentOctets(), mailboxMessage.getInternalDate(), mailboxMessage.getMessageId());
     }
 
     private Function<MailboxMessage, MessageResult> messageResultConverter(final MessageResult.FetchGroup fetchGroup) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index 69233f7..137433c 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -91,6 +91,7 @@ import org.apache.james.mime4j.stream.EntityState;
 import org.apache.james.mime4j.stream.MimeConfig;
 import org.apache.james.mime4j.stream.MimeTokenStream;
 import org.apache.james.mime4j.stream.RecursionMode;
+import org.apache.james.util.IteratorWrapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -98,6 +99,7 @@ import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 
 /**
  * Base class for {@link org.apache.james.mailbox.MessageManager}
@@ -171,9 +173,12 @@ public class StoreMessageManager implements org.apache.james.mailbox.MessageMana
     
     private BatchSizes batchSizes = BatchSizes.defaultValues();
 
+    private final ImmutableMailboxMessage.Factory immutableMailboxMessageFactory;
+
     public StoreMessageManager(MailboxSessionMapperFactory mapperFactory, MessageSearchIndex index, MailboxEventDispatcher dispatcher, 
             MailboxPathLocker locker, Mailbox mailbox, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver,
-            QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory, BatchSizes batchSizes) 
+            QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory, BatchSizes batchSizes,
+            ImmutableMailboxMessage.Factory immutableMailboxMessageFactory) 
                     throws MailboxException {
         this.mailbox = mailbox;
         this.dispatcher = dispatcher;
@@ -187,6 +192,7 @@ public class StoreMessageManager implements org.apache.james.mailbox.MessageMana
         this.messageParser = messageParser;
         this.messageIdFactory = messageIdFactory;
         this.batchSizes = batchSizes;
+        this.immutableMailboxMessageFactory = immutableMailboxMessageFactory;
     }
 
     protected Factory getMessageIdFactory() {
@@ -427,12 +433,9 @@ public class StoreMessageManager implements org.apache.james.mailbox.MessageMana
                 public ComposedMessageId execute() throws MailboxException {
                     MessageMetaData data = appendMessageToStore(message, attachments, mailboxSession);
 
-                    SortedMap<MessageUid, MessageMetaData> uids = new TreeMap<MessageUid, MessageMetaData>();
-                    MessageUid messageUid = data.getUid();
-                    MailboxId mailboxId = getMailboxEntity().getMailboxId();
-                    uids.put(messageUid, data);
-                    dispatcher.added(mailboxSession, uids, getMailboxEntity());
-                    return new ComposedMessageId(mailboxId, data.getMessageId(), messageUid);
+                    Mailbox mailbox = getMailboxEntity();
+                    dispatcher.added(mailboxSession, mailbox, message);
+                    return new ComposedMessageId(mailbox.getMailboxId(), data.getMessageId(), data.getUid());
                 }
             }, true);
 
@@ -632,7 +635,6 @@ public class StoreMessageManager implements org.apache.james.mailbox.MessageMana
             @Override
             public List<MessageRange> execute() throws MailboxException {
                 SortedMap<MessageUid, MessageMetaData> copiedUids = copy(set, toMailbox, session);
-                dispatcher.added(session, copiedUids, toMailbox.getMailboxEntity());
                 return MessageRange.toRanges(new ArrayList<MessageUid>(copiedUids.keySet()));
             }
         }, true);
@@ -660,7 +662,6 @@ public class StoreMessageManager implements org.apache.james.mailbox.MessageMana
             @Override
             public List<MessageRange> execute() throws MailboxException {
                 SortedMap<MessageUid, MessageMetaData> movedUids = move(set, toMailbox, session);
-                dispatcher.added(session, movedUids, toMailbox.getMailboxEntity());
                 return MessageRange.toRanges(new ArrayList<MessageUid>(movedUids.keySet()));
             }
         }, true);
@@ -795,15 +796,32 @@ public class StoreMessageManager implements org.apache.james.mailbox.MessageMana
 
 
     private SortedMap<MessageUid, MessageMetaData> copy(MessageRange set, StoreMessageManager to, MailboxSession session) throws MailboxException {
-        Iterator<MailboxMessage> originalRows = retrieveOriginalRows(set, session);
-        return collectMetadata(to.copy(originalRows, session));
+        IteratorWrapper<MailboxMessage> originalRows = new IteratorWrapper<MailboxMessage>(retrieveOriginalRows(set, session));
+
+        SortedMap<MessageUid, MessageMetaData> copiedUids = collectMetadata(to.copy(originalRows, session));
+
+        ImmutableMap.Builder<MessageUid, MailboxMessage> messagesMap = ImmutableMap.builder();
+        for(MailboxMessage message: originalRows.getEntriesSeen()) {
+            messagesMap.put(message.getUid(), immutableMailboxMessageFactory.from(to.getMailboxEntity().getMailboxId(), message));
+        }
+        dispatcher.added(session, copiedUids, to.getMailboxEntity(), messagesMap.build());
+
+        return copiedUids;
     }
 
     private SortedMap<MessageUid, MessageMetaData> move(MessageRange set, StoreMessageManager to, MailboxSession session) throws MailboxException {
-        Iterator<MailboxMessage> originalRows = retrieveOriginalRows(set, session);
+        IteratorWrapper<MailboxMessage> originalRows = new IteratorWrapper<MailboxMessage>(retrieveOriginalRows(set, session));
+
         MoveResult moveResult = to.move(originalRows, session);
+        SortedMap<MessageUid, MessageMetaData> moveUids = collectMetadata(moveResult.getMovedMessages());
+
+        ImmutableMap.Builder<MessageUid, MailboxMessage> messagesMap = ImmutableMap.builder();
+        for(MailboxMessage message: originalRows.getEntriesSeen()) {
+            messagesMap.put(message.getUid(), immutableMailboxMessageFactory.from(to.getMailboxEntity().getMailboxId(), message));
+        }
+        dispatcher.added(session, moveUids, to.getMailboxEntity(), messagesMap.build());
         dispatcher.expunged(session, collectMetadata(moveResult.getOriginalMessages()), getMailboxEntity());
-        return collectMetadata(moveResult.getMovedMessages());
+        return moveUids;
     }
 
     private Iterator<MailboxMessage> retrieveOriginalRows(MessageRange set, MailboxSession session) throws MailboxException {

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
index f2da9e5..1cffdc4 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
@@ -31,6 +31,7 @@ import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.StoreMailboxPath;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -43,12 +44,14 @@ public class EventFactory {
 
     public final class AddedImpl extends MailboxListener.Added implements MailboxAware {
         private final Map<MessageUid, MessageMetaData> added;
+        private final Map<MessageUid, MailboxMessage> availableMessages;
         private final Mailbox mailbox;
 
-        public AddedImpl(MailboxSession session, Mailbox mailbox, SortedMap<MessageUid, MessageMetaData> uids) {
+        public AddedImpl(MailboxSession session, Mailbox mailbox, SortedMap<MessageUid, MessageMetaData> uids, Map<MessageUid, MailboxMessage> availableMessages) {
             super(session, new StoreMailboxPath(mailbox));
             this.added = ImmutableMap.copyOf(uids);
             this.mailbox = mailbox;
+            this.availableMessages = ImmutableMap.copyOf(availableMessages);
         }
 
         public List<MessageUid> getUids() {
@@ -62,6 +65,10 @@ public class EventFactory {
         public Mailbox getMailbox() {
             return mailbox;
         }
+
+        public Map<MessageUid, MailboxMessage> getAvailableMessages() {
+            return availableMessages;
+        }
     }
 
     public final class ExpungedImpl extends MailboxListener.Expunged implements MailboxAware {
@@ -167,8 +174,8 @@ public class EventFactory {
         }
     }
 
-    public MailboxListener.Added added(MailboxSession session, SortedMap<MessageUid, MessageMetaData> uids, Mailbox mailbox) {
-        return new AddedImpl(session, mailbox, uids);
+    public MailboxListener.Added added(MailboxSession session, SortedMap<MessageUid, MessageMetaData> uids, Mailbox mailbox, Map<MessageUid, MailboxMessage> cachedMessages) {
+        return new AddedImpl(session, mailbox, uids, cachedMessages);
     }
 
     public MailboxListener.Expunged expunged(MailboxSession session,  Map<MessageUid, MessageMetaData> uids, Mailbox mailbox) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxEventDispatcher.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxEventDispatcher.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxEventDispatcher.java
index 0d64ed9..91b7955 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxEventDispatcher.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxEventDispatcher.java
@@ -31,7 +31,9 @@ import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.UpdatedFlags;
+import org.apache.james.mailbox.store.SimpleMessageMetaData;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
@@ -69,15 +71,23 @@ public class MailboxEventDispatcher {
      * @param uids Sorted map with uids and message meta data
      * @param mailbox The mailbox
      */
-    public void added(MailboxSession session, SortedMap<MessageUid, MessageMetaData> uids, Mailbox mailbox) {
-        listener.event(eventFactory.added(session, uids, mailbox));
+    public void added(MailboxSession session, SortedMap<MessageUid, MessageMetaData> uids, Mailbox mailbox, Map<MessageUid, MailboxMessage> cachedMessages) {
+        listener.event(eventFactory.added(session, uids, mailbox, cachedMessages));
     }
 
-    public void added(MailboxSession session, MessageMetaData messageMetaData, Mailbox mailbox) {
+    public void added(MailboxSession session, Mailbox mailbox, MailboxMessage mailboxMessage) {
+        SimpleMessageMetaData messageMetaData = new SimpleMessageMetaData(mailboxMessage);
         SortedMap<MessageUid, MessageMetaData> metaDataMap = ImmutableSortedMap.<MessageUid, MessageMetaData>naturalOrder()
                 .put(messageMetaData.getUid(), messageMetaData)
                 .build();
-        added(session, metaDataMap, mailbox);
+        added(session, metaDataMap, mailbox, ImmutableMap.of(mailboxMessage.getUid(), mailboxMessage));
+    }
+
+    public void added(MailboxSession session, MessageMetaData messageMetaData, Mailbox mailbox) {
+        SortedMap<MessageUid, MessageMetaData> metaDataMap = ImmutableSortedMap.<MessageUid, MessageMetaData>naturalOrder()
+            .put(messageMetaData.getUid(), messageMetaData)
+            .build();
+        added(session, metaDataMap, mailbox, ImmutableMap.<MessageUid, MailboxMessage>of());
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/EventConverter.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/EventConverter.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/EventConverter.java
index 866c594..0621d55 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/EventConverter.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/EventConverter.java
@@ -42,9 +42,12 @@ import org.apache.james.mailbox.store.json.event.dto.MailboxSessionDataTransferO
 import org.apache.james.mailbox.store.json.event.dto.MessageMetaDataDataTransferObject;
 import org.apache.james.mailbox.store.json.event.dto.UpdatedFlagsDataTransferObject;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+
 public class EventConverter {
 
     private static final Logger LOG = LoggerFactory.getLogger(EventConverter.class);
@@ -98,7 +101,8 @@ public class EventConverter {
             case ADDED:
                 return eventFactory.added(eventDataTransferObject.getSession().getMailboxSession(),
                     retrieveMetadata(eventDataTransferObject.getMetaDataProxyMap()),
-                    mailbox);
+                    mailbox,
+                    ImmutableMap.<MessageUid, MailboxMessage>of());
             case DELETED:
                 return eventFactory.expunged(eventDataTransferObject.getSession().getMailboxSession(),
                     retrieveMetadata(eventDataTransferObject.getMetaDataProxyMap()),

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/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 11464d3..bd4521c 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
@@ -18,7 +18,6 @@
  ****************************************************************/
 package org.apache.james.mailbox.store.search;
 
-import java.util.Iterator;
 import java.util.List;
 
 import org.apache.james.mailbox.MailboxListener;
@@ -33,6 +32,8 @@ 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.Optional;
+
 /**
  * {@link MessageSearchIndex} which needs to get registered as global {@link MailboxListener} and so get
  * notified about message changes. This will then allow to update the underlying index.
@@ -41,6 +42,7 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
  */
 public abstract class ListeningMessageSearchIndex implements MessageSearchIndex, MailboxListener {
 
+    public static final int UNLIMITED = -1;
     private final MessageMapperFactory factory;
 
     public ListeningMessageSearchIndex(MessageMapperFactory factory) {
@@ -76,17 +78,11 @@ public abstract class ListeningMessageSearchIndex implements MessageSearchIndex,
                     EventFactory.AddedImpl added = (EventFactory.AddedImpl) event;
                     final Mailbox mailbox = added.getMailbox();
 
-                    for (MessageUid next : (Iterable<MessageUid>) added.getUids()) {
-                        Iterator<MailboxMessage> messages = factory.getMessageMapper(session).findInMailbox(mailbox, MessageRange.one(next), FetchType.Full, -1);
-                        while (messages.hasNext()) {
-                            MailboxMessage message = messages.next();
-                            try {
-                                add(session, mailbox, message);
-                            } catch (MailboxException e) {
-                                session.getLog().error("Unable to index message " + message.getUid() + " for mailbox " + mailbox, e);
-                            }
+                    for (final MessageUid next : (Iterable<MessageUid>) added.getUids()) {
+                        Optional<MailboxMessage> mailboxMessage = retrieveMailboxMessage(session, added, mailbox, next);
+                        if (mailboxMessage.isPresent()) {
+                            addMessage(session, mailbox, mailboxMessage.get());
                         }
-
                     }
                 } else if (event instanceof EventFactory.ExpungedImpl) {
                     EventFactory.ExpungedImpl expunged = (EventFactory.ExpungedImpl) event;
@@ -113,6 +109,31 @@ public abstract class ListeningMessageSearchIndex implements MessageSearchIndex,
         }
     }
 
+    private Optional<MailboxMessage> retrieveMailboxMessage(MailboxSession session, EventFactory.AddedImpl added, Mailbox mailbox, MessageUid next) {
+        Optional<MailboxMessage> firstChoice = Optional.fromNullable(added.getAvailableMessages().get(next));
+        if (firstChoice.isPresent()) {
+            return firstChoice;
+        } else {
+            try {
+                return Optional.of(factory.getMessageMapper(session)
+                    .findInMailbox(mailbox, MessageRange.one(next), FetchType.Full, UNLIMITED)
+                    .next());
+            } catch (Exception e) {
+                session.getLog().error(String.format("Could not retrieve message %d in mailbox %s",
+                    next, mailbox.getMailboxId().serialize()), e);
+                return Optional.absent();
+            }
+        }
+    }
+
+    private void addMessage(final MailboxSession session, final Mailbox mailbox, MailboxMessage message) {
+        try {
+            add(session, mailbox, message);
+        } catch (MailboxException e) {
+            session.getLog().error("Unable to index message " + message.getUid() + " for mailbox " + mailbox, e);
+        }
+    }
+
     /**
      * Add the {@link MailboxMessage} for the given {@link Mailbox} to the index
      *

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
index ec2dac1..5aa005e 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
 import java.util.List;
+import java.util.Map;
 
 import javax.mail.Flags;
 
@@ -52,6 +53,7 @@ import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.quota.QuotaImpl;
 import org.junit.After;
 import org.junit.Before;
@@ -151,9 +153,8 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
             .from(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session))
             .filter(inMailbox(mailbox1.getMailboxId()))
             .get(0);
-        SimpleMessageMetaData simpleMessageMetaData = fromMessageResult(messageId, messageResult);
 
-        verify(dispatcher).added(session, simpleMessageMetaData, mailbox1);
+        verify(dispatcher).added(eq(session), eq(mailbox1), any(MailboxMessage.class));
         verifyNoMoreInteractions(dispatcher);
     }
 
@@ -165,20 +166,10 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId(), mailbox3.getMailboxId()), session);
 
-        List<MessageResult> messageResults = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session);
-        MessageResult messageResultMailbox1 = FluentIterable
-            .from(messageResults)
-            .filter(inMailbox(mailbox1.getMailboxId()))
-            .get(0);
-        SimpleMessageMetaData metadataMailbox1 = fromMessageResult(messageId, messageResultMailbox1);
-        MessageResult messageResultMailbox3 = FluentIterable
-            .from(messageResults)
-            .filter(inMailbox(mailbox3.getMailboxId()))
-            .get(0);
-        SimpleMessageMetaData metadataMailbox3 = fromMessageResult(messageId, messageResultMailbox3);
+        messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session);
 
-        verify(dispatcher).added(session, metadataMailbox1, mailbox1);
-        verify(dispatcher).added(session, metadataMailbox3, mailbox3);
+        verify(dispatcher).added(eq(session), eq(mailbox1), any(MailboxMessage.class));
+        verify(dispatcher).added(eq(session), eq(mailbox3), any(MailboxMessage.class));
         verifyNoMoreInteractions(dispatcher);
     }
 
@@ -207,7 +198,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox3.getMailboxId()), session);
 
         verify(dispatcher).expunged(eq(session), any(SimpleMessageMetaData.class), eq(mailbox2));
-        verify(dispatcher).added(eq(session), any(SimpleMessageMetaData.class), eq(mailbox3));
+        verify(dispatcher).added(eq(session), eq(mailbox3), any(MailboxMessage.class));
         verifyNoMoreInteractions(dispatcher);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/distributed/BroadcastDelegatingMailboxListenerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/distributed/BroadcastDelegatingMailboxListenerIntegrationTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/distributed/BroadcastDelegatingMailboxListenerIntegrationTest.java
index daf5b2a..e360468 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/distributed/BroadcastDelegatingMailboxListenerIntegrationTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/distributed/BroadcastDelegatingMailboxListenerIntegrationTest.java
@@ -36,11 +36,14 @@ import org.apache.james.mailbox.store.event.EventFactory;
 import org.apache.james.mailbox.store.json.MessagePackEventSerializer;
 import org.apache.james.mailbox.store.json.event.EventConverter;
 import org.apache.james.mailbox.store.json.event.MailboxConverter;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 import org.apache.james.mailbox.util.EventCollector;
 import org.junit.Before;
 import org.junit.Test;
 
+import com.google.common.collect.ImmutableMap;
+
 /**
  Integration tests for BroadcastDelegatingMailboxListener.
 
@@ -51,6 +54,7 @@ public class BroadcastDelegatingMailboxListenerIntegrationTest {
     public static final MailboxPath MAILBOX_PATH_1 = new MailboxPath("#private", "user", "mbx");
     public static final MailboxPath MAILBOX_PATH_2 = new MailboxPath("#private", "user", "mbx.other");
     public static final String TOPIC = "TOPIC";
+    public static final ImmutableMap<MessageUid, MailboxMessage> EMPTY_MESSAGE_CACHE = ImmutableMap.<MessageUid, MailboxMessage>of();
     private BroadcastDelegatingMailboxListener broadcastDelegatingMailboxListener1;
     private BroadcastDelegatingMailboxListener broadcastDelegatingMailboxListener2;
     private BroadcastDelegatingMailboxListener broadcastDelegatingMailboxListener3;
@@ -114,7 +118,7 @@ public class BroadcastDelegatingMailboxListenerIntegrationTest {
     public void mailboxEventListenersShouldBeTriggeredIfRegistered() throws Exception {
         SimpleMailbox simpleMailbox = new SimpleMailbox(MAILBOX_PATH_1, 42);
         simpleMailbox.setMailboxId(TestId.of(52));
-        final MailboxListener.Event event = new EventFactory().added(mailboxSession, new TreeMap<MessageUid, MessageMetaData>(), simpleMailbox);
+        final MailboxListener.Event event = new EventFactory().added(mailboxSession, new TreeMap<MessageUid, MessageMetaData>(), simpleMailbox, EMPTY_MESSAGE_CACHE);
 
         broadcastDelegatingMailboxListener1.event(event);
 
@@ -127,7 +131,7 @@ public class BroadcastDelegatingMailboxListenerIntegrationTest {
     public void onceEventListenersShouldBeTriggeredOnceAcrossTheCluster() {
         SimpleMailbox simpleMailbox = new SimpleMailbox(MAILBOX_PATH_1, 42);
         simpleMailbox.setMailboxId(TestId.of(52));
-        final MailboxListener.Event event = new EventFactory().added(mailboxSession, new TreeMap<MessageUid, MessageMetaData>(), simpleMailbox);
+        final MailboxListener.Event event = new EventFactory().added(mailboxSession, new TreeMap<MessageUid, MessageMetaData>(), simpleMailbox, EMPTY_MESSAGE_CACHE);
 
         broadcastDelegatingMailboxListener1.event(event);
 
@@ -140,7 +144,7 @@ public class BroadcastDelegatingMailboxListenerIntegrationTest {
     public void eachEventListenersShouldBeTriggeredOnEachNode() {
         SimpleMailbox simpleMailbox = new SimpleMailbox(MAILBOX_PATH_1, 42);
         simpleMailbox.setMailboxId(TestId.of(52));
-        final MailboxListener.Event event = new EventFactory().added(mailboxSession, new TreeMap<MessageUid, MessageMetaData>(), simpleMailbox);
+        final MailboxListener.Event event = new EventFactory().added(mailboxSession, new TreeMap<MessageUid, MessageMetaData>(), simpleMailbox, EMPTY_MESSAGE_CACHE);
 
         broadcastDelegatingMailboxListener1.event(event);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/store/src/test/java/org/apache/james/mailbox/store/json/EventSerializerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/json/EventSerializerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/json/EventSerializerTest.java
index 900225a..76c1185 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/json/EventSerializerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/json/EventSerializerTest.java
@@ -38,10 +38,12 @@ import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.SimpleMessageMetaData;
 import org.apache.james.mailbox.store.event.EventFactory;
 import org.apache.james.mailbox.store.event.EventSerializer;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 import org.junit.Before;
 import org.junit.Test;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 
 public abstract class EventSerializerTest {
@@ -80,7 +82,7 @@ public abstract class EventSerializerTest {
     public void addedEventShouldBeWellConverted() throws Exception {
         TreeMap<MessageUid, MessageMetaData> treeMap = new TreeMap<MessageUid, MessageMetaData>();
         treeMap.put(UID, MESSAGE_META_DATA);
-        MailboxListener.Event event = eventFactory.added(mailboxSession, treeMap, mailbox);
+        MailboxListener.Event event = eventFactory.added(mailboxSession, treeMap, mailbox, ImmutableMap.<MessageUid, MailboxMessage>of());
         byte[] serializedEvent = serializer.serializeEvent(event);
         MailboxListener.Event deserializedEvent = serializer.deSerializeEvent(serializedEvent);
         assertThat(deserializedEvent.getMailboxPath()).isEqualTo(event.getMailboxPath());

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/registrations/MailboxRegistrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/registrations/MailboxRegistrationTest.java b/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/registrations/MailboxRegistrationTest.java
index 21992e2..480d3f4 100644
--- a/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/registrations/MailboxRegistrationTest.java
+++ b/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/registrations/MailboxRegistrationTest.java
@@ -37,10 +37,12 @@ import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.SimpleMessageMetaData;
 import org.apache.james.mailbox.store.event.EventFactory;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 import org.junit.Before;
 import org.junit.Test;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 
 public class MailboxRegistrationTest {
@@ -73,7 +75,7 @@ public class MailboxRegistrationTest {
     public void AddedEventsShouldNotBeReported() {
         TreeMap<MessageUid, MessageMetaData> treeMap = new TreeMap<MessageUid, MessageMetaData>();
         treeMap.put(UID, new SimpleMessageMetaData(UID, MOD_SEQ, new Flags(), SIZE, new Date(), new DefaultMessageId()));
-        MailboxListener.Event event = eventFactory.added(session, treeMap, MAILBOX);
+        MailboxListener.Event event = eventFactory.added(session, treeMap, MAILBOX, ImmutableMap.<MessageUid, MailboxMessage> of());
         mailboxRegistration.event(event);
         assertThat(mailboxRegistration.getImpactingEvents(UID)).isEmpty();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
index cdeef78..33c61e4 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
@@ -50,6 +50,7 @@ import org.apache.james.mailbox.store.SimpleMessageMetaData;
 import org.apache.james.mailbox.store.event.EventFactory;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -59,6 +60,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 
 
 public class SelectedMailboxImplTest {
@@ -169,6 +171,6 @@ public class SelectedMailboxImplTest {
     private void emitEvent(MailboxListener mailboxListener) {
         TreeMap<MessageUid, MessageMetaData> result = new TreeMap<MessageUid, MessageMetaData>();
         result.put(EMITTED_EVENT_UID, new SimpleMessageMetaData(EMITTED_EVENT_UID, MOD_SEQ, new Flags(), SIZE, new Date(), new DefaultMessageId()));
-        mailboxListener.event(new EventFactory().added(mock(MailboxSession.class), result, mailbox));
+        mailboxListener.event(new EventFactory().added(mock(MailboxSession.class), result, mailbox, ImmutableMap.<MessageUid, MailboxMessage> of()));
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/server/container/util/src/main/java/org/apache/james/util/IteratorWrapper.java
----------------------------------------------------------------------
diff --git a/server/container/util/src/main/java/org/apache/james/util/IteratorWrapper.java b/server/container/util/src/main/java/org/apache/james/util/IteratorWrapper.java
new file mode 100644
index 0000000..486e796
--- /dev/null
+++ b/server/container/util/src/main/java/org/apache/james/util/IteratorWrapper.java
@@ -0,0 +1,60 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.util;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+public class IteratorWrapper<U> implements Iterator<U> {
+
+    private final Iterator<U> underlying;
+    private final List<U> entriesSeen;
+
+    public IteratorWrapper(Iterator<U> underlying) {
+        Preconditions.checkNotNull(underlying);
+        this.underlying = underlying;
+        this.entriesSeen = new ArrayList<U>();
+    }
+
+    public List<U> getEntriesSeen() {
+        return ImmutableList.copyOf(entriesSeen);
+    }
+
+    @Override
+    public boolean hasNext() {
+        return underlying.hasNext();
+    }
+
+    @Override
+    public U next() {
+        U next = underlying.next();
+        entriesSeen.add(next);
+        return next;
+    }
+
+    @Override
+    public void remove() {
+        underlying.remove();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c6ff2c6/server/container/util/src/test/java/org/apache/james/util/IteratorWrapperTest.java
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/java/org/apache/james/util/IteratorWrapperTest.java b/server/container/util/src/test/java/org/apache/james/util/IteratorWrapperTest.java
new file mode 100644
index 0000000..61d7f2d
--- /dev/null
+++ b/server/container/util/src/test/java/org/apache/james/util/IteratorWrapperTest.java
@@ -0,0 +1,90 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.util;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import com.google.common.collect.ImmutableList;
+
+public class IteratorWrapperTest {
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Test
+    public void getEntriesSeenShouldReturnEmptyWhenNotConsumed() {
+        ImmutableList<Integer> originalData = ImmutableList.of(1, 2, 3);
+        IteratorWrapper<Integer> integerIteratorWrapper = new IteratorWrapper<Integer>(originalData.iterator());
+
+        assertThat(integerIteratorWrapper.getEntriesSeen()).isEmpty();
+    }
+
+    @Test
+    public void getEntriesSeenShouldReturnViewOfConsumedData() {
+        ImmutableList<Integer> originalData = ImmutableList.of(1, 2, 3);
+        IteratorWrapper<Integer> integerIteratorWrapper = new IteratorWrapper<Integer>(originalData.iterator());
+
+        consume(integerIteratorWrapper);
+
+        assertThat(integerIteratorWrapper.getEntriesSeen())
+            .containsExactlyElementsOf(originalData);
+    }
+
+    @Test
+    public void getEntriesSeenShouldReturnViewOfConsumedDataWhenPartiallyConsumed() {
+        ImmutableList<Integer> originalData = ImmutableList.of(1, 2, 3);
+        IteratorWrapper<Integer> integerIteratorWrapper = new IteratorWrapper<Integer>(originalData.iterator());
+
+        integerIteratorWrapper.next();
+        integerIteratorWrapper.next();
+
+        assertThat(integerIteratorWrapper.getEntriesSeen())
+            .containsOnly(1, 2);
+    }
+
+    @Test
+    public void getEntriesSeenShouldReturnEmptyWhenSuppliedEmpty() {
+        ImmutableList<Integer> originalData = ImmutableList.of();
+        IteratorWrapper<Integer> integerIteratorWrapper = new IteratorWrapper<Integer>(originalData.iterator());
+
+        consume(integerIteratorWrapper);
+
+        assertThat(integerIteratorWrapper.getEntriesSeen())
+            .containsExactlyElementsOf(originalData);
+    }
+
+    @Test
+    public void constructorShouldThrowOnNull() {
+        expectedException.expect(NullPointerException.class);
+
+        new IteratorWrapper<Integer>(null);
+    }
+
+    private void consume(IteratorWrapper<Integer> integerIteratorWrapper) {
+        while (integerIteratorWrapper.hasNext()) {
+            integerIteratorWrapper.next();
+        }
+    }
+
+}


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