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 ro...@apache.org on 2017/01/09 09:13:29 UTC

[1/6] james-project git commit: MAILBOX-279: Enable MESSAGE for JPAMappersTest

Repository: james-project
Updated Branches:
  refs/heads/master 84c66946d -> 97de26382


MAILBOX-279: Enable MESSAGE for JPAMappersTest


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

Branch: refs/heads/master
Commit: fc42d06656ca68a060334bc31c89c1ce986b7258
Parents: a377d43
Author: Quynh Nguyen <qn...@linagora.com>
Authored: Wed Dec 7 14:15:47 2016 +0700
Committer: Quynh Nguyen <qn...@linagora.com>
Committed: Mon Jan 9 15:11:51 2017 +0700

----------------------------------------------------------------------
 .../mailbox/jpa/mail/JPAMapperProvider.java     |  14 +-
 .../jpa/mail/TransactionalMessageMapper.java    | 157 +++++++++++++++++++
 2 files changed, 169 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/fc42d066/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
index 54fb56b..37887a9 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
@@ -37,8 +37,10 @@ import org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMailboxMessage;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMailboxMessage;
 import org.apache.james.mailbox.jpa.user.model.JPASubscription;
+import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.mail.AnnotationMapper;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
@@ -60,7 +62,15 @@ public class JPAMapperProvider implements MapperProvider {
 
     @Override
     public MessageMapper createMessageMapper() throws MailboxException {
-        throw new NotImplementedException();
+        EntityManagerFactory entityManagerFactory = createEntityManagerFactory();
+        JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
+
+        JPAMessageMapper messageMapper = new JPAMessageMapper(new MockMailboxSession("benwa"), 
+            new JPAUidProvider(locker, entityManagerFactory), 
+            new JPAModSeqProvider(locker, entityManagerFactory), 
+            entityManagerFactory);
+
+        return new TransactionalMessageMapper((JPAMessageMapper)messageMapper);
     }
 
     @Override
@@ -127,7 +137,7 @@ public class JPAMapperProvider implements MapperProvider {
 
     @Override
     public List<Capabilities> getNotImplemented() {
-        return ImmutableList.of(Capabilities.MESSAGE, Capabilities.ATTACHMENT, Capabilities.MOVE, Capabilities.UNIQUE_MESSAGE_ID);
+        return ImmutableList.of(Capabilities.ATTACHMENT, Capabilities.MOVE, Capabilities.UNIQUE_MESSAGE_ID);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/fc42d066/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
new file mode 100644
index 0000000..4f105d9
--- /dev/null
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
@@ -0,0 +1,157 @@
+/****************************************************************
+ * 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.jpa.mail;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.NotImplementedException;
+import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MessageMetaData;
+import org.apache.james.mailbox.model.MessageRange;
+import org.apache.james.mailbox.model.UpdatedFlags;
+import org.apache.james.mailbox.store.FlagsUpdateCalculator;
+import org.apache.james.mailbox.store.mail.MessageMapper;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Throwables;
+
+public class TransactionalMessageMapper implements MessageMapper {
+    private final JPAMessageMapper wrapped;
+
+    public TransactionalMessageMapper(JPAMessageMapper wrapped) {
+        this.wrapped = wrapped;
+    }
+    @Override
+    public void endRequest() {
+        throw new NotImplementedException();
+    }
+
+    @Override
+    public <T> T execute(Transaction<T> transaction) throws MailboxException {
+        throw new NotImplementedException();
+    }
+
+    @Override
+    public Iterator<MailboxMessage> findInMailbox(Mailbox mailbox, MessageRange set, FetchType type, int limit)
+            throws MailboxException {
+        return wrapped.findInMailbox(mailbox, set, type, limit);
+    }
+
+    @Override
+    public Map<MessageUid, MessageMetaData> expungeMarkedForDeletionInMailbox(final Mailbox mailbox, final MessageRange set)
+            throws MailboxException {
+        Map<MessageUid, MessageMetaData> data = wrapped.execute(new Transaction<Map<MessageUid, MessageMetaData>>() {
+            @Override
+            public Map<MessageUid, MessageMetaData> run() throws MailboxException {
+                return wrapped.expungeMarkedForDeletionInMailbox(mailbox, set);
+            }
+        });
+        return data;
+    }
+
+    @Override
+    public long countMessagesInMailbox(Mailbox mailbox) throws MailboxException {
+        return wrapped.countMessagesInMailbox(mailbox);
+    }
+
+    @Override
+    public long countUnseenMessagesInMailbox(Mailbox mailbox) throws MailboxException {
+        return wrapped.countUnseenMessagesInMailbox(mailbox);
+    }
+
+    @Override
+    public void delete(final Mailbox mailbox, final MailboxMessage message) throws MailboxException {
+        try {
+            wrapped.execute(new VoidTransaction() {
+                @Override
+                public void runVoid() throws MailboxException {
+                    wrapped.delete(mailbox, message);
+                }
+            });
+        } catch (MailboxException e) {
+            Throwables.propagate(e);
+        }
+    }
+
+    @Override
+    public MessageUid findFirstUnseenMessageUid(Mailbox mailbox) throws MailboxException {
+        return wrapped.findFirstUnseenMessageUid(mailbox);
+    }
+
+    @Override
+    public List<MessageUid> findRecentMessageUidsInMailbox(Mailbox mailbox) throws MailboxException {
+        return wrapped.findRecentMessageUidsInMailbox(mailbox);
+    }
+
+    @Override
+    public MessageMetaData add(final Mailbox mailbox, final MailboxMessage message) throws MailboxException {
+        MessageMetaData data = wrapped.execute(new Transaction<MessageMetaData>() {
+            @Override
+            public MessageMetaData run() throws MailboxException {
+                return wrapped.add(mailbox, message);
+            }
+        });
+        return data;
+    }
+
+    @Override
+    public Iterator<UpdatedFlags> updateFlags(final Mailbox mailbox, final FlagsUpdateCalculator flagsUpdateCalculator,
+            final MessageRange set) throws MailboxException {
+        Iterator<UpdatedFlags> data = wrapped.execute(new Transaction<Iterator<UpdatedFlags>>() {
+            @Override
+            public Iterator<UpdatedFlags> run() throws MailboxException {
+                return wrapped.updateFlags(mailbox, flagsUpdateCalculator, set);
+            }
+        });
+        return data;
+    }
+
+    @Override
+    public MessageMetaData copy(final Mailbox mailbox, final MailboxMessage original) throws MailboxException {
+        MessageMetaData data = wrapped.execute(new Transaction<MessageMetaData>() {
+            @Override
+            public MessageMetaData run() throws MailboxException {
+                return wrapped.copy(mailbox, original);
+            }
+        });
+        return data;
+    }
+
+    @Override
+    public MessageMetaData move(Mailbox mailbox, MailboxMessage original) throws MailboxException {
+        return wrapped.move(mailbox, original);
+    }
+
+    @Override
+    public Optional<MessageUid> getLastUid(Mailbox mailbox) throws MailboxException {
+        return wrapped.getLastUid(mailbox);
+    }
+
+    @Override
+    public long getHighestModSeq(Mailbox mailbox) throws MailboxException {
+        return wrapped.getHighestModSeq(mailbox);
+    }
+
+}


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


[5/6] james-project git commit: MAILBOX-279: change the method name getNotImplemented to getSupportCapabilities and its behavior

Posted by ro...@apache.org.
MAILBOX-279: change the method name getNotImplemented to getSupportCapabilities and its behavior


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

Branch: refs/heads/master
Commit: 60f9dcdfee876d1e5940d8346c6f972205ae7133
Parents: 1ccb1ec
Author: Quynh Nguyen <qn...@linagora.com>
Authored: Thu Dec 8 18:11:42 2016 +0700
Committer: Quynh Nguyen <qn...@linagora.com>
Committed: Mon Jan 9 15:18:03 2017 +0700

----------------------------------------------------------------------
 .../james/mailbox/cassandra/mail/CassandraMapperProvider.java    | 4 ++--
 .../org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java     | 4 ++--
 .../james/mailbox/inmemory/mail/InMemoryMapperProvider.java      | 4 ++--
 .../james/mailbox/store/mail/model/AnnotationMapperTest.java     | 2 +-
 .../james/mailbox/store/mail/model/AttachmentMapperTest.java     | 2 +-
 .../james/mailbox/store/mail/model/ListMessageAssertTest.java    | 2 +-
 .../apache/james/mailbox/store/mail/model/MailboxMapperTest.java | 2 +-
 .../apache/james/mailbox/store/mail/model/MapperProvider.java    | 2 +-
 .../james/mailbox/store/mail/model/MessageIdMapperTest.java      | 2 +-
 .../apache/james/mailbox/store/mail/model/MessageMapperTest.java | 2 +-
 .../apache/james/mailbox/store/mail/model/MessageMoveTest.java   | 2 +-
 .../store/mail/model/MessageWithAttachmentMapperTest.java        | 4 ++--
 12 files changed, 16 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/60f9dcdf/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
index 21adfe6..2516944 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
@@ -134,8 +134,8 @@ public class CassandraMapperProvider implements MapperProvider {
     }
 
     @Override
-    public List<Capabilities> getNotImplemented() {
-        return ImmutableList.of();
+    public List<Capabilities> getSupportedCapabilities() {
+        return ImmutableList.copyOf(Capabilities.values());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/60f9dcdf/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
index 37887a9..df37f39 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
@@ -136,8 +136,8 @@ public class JPAMapperProvider implements MapperProvider {
     }
 
     @Override
-    public List<Capabilities> getNotImplemented() {
-        return ImmutableList.of(Capabilities.ATTACHMENT, Capabilities.MOVE, Capabilities.UNIQUE_MESSAGE_ID);
+    public List<Capabilities> getSupportedCapabilities() {
+        return ImmutableList.of(Capabilities.ANNOTATION, Capabilities.MAILBOX, Capabilities.MESSAGE);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/60f9dcdf/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java
index 2bcf079..bc33491 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java
@@ -93,8 +93,8 @@ public class InMemoryMapperProvider implements MapperProvider {
     }
 
     @Override
-    public List<Capabilities> getNotImplemented() {
-        return ImmutableList.of(Capabilities.UNIQUE_MESSAGE_ID);
+    public List<Capabilities> getSupportedCapabilities() {
+        return ImmutableList.copyOf(Capabilities.values());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/60f9dcdf/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java
index fdefd97..f634ac6 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java
@@ -65,7 +65,7 @@ public class AnnotationMapperTest<T extends MapperProvider> {
     @Contract.Inject
     public final void setProducer(IProducer<T> producer) throws MailboxException {
         T newInstance = producer.newInstance();
-        Assume.assumeFalse(newInstance.getNotImplemented().contains(MapperProvider.Capabilities.ANNOTATION));
+        Assume.assumeTrue(newInstance.getSupportedCapabilities().contains(MapperProvider.Capabilities.ANNOTATION));
 
         this.producer = producer;
         this.annotationMapper = newInstance.createAnnotationMapper();

http://git-wip-us.apache.org/repos/asf/james-project/blob/60f9dcdf/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
index 3640b8a..10706f8 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
@@ -52,7 +52,7 @@ public class AttachmentMapperTest<T extends MapperProvider> {
     public final void setProducer(IProducer<T> producer) throws MailboxException {
         this.producer = producer;
         T newInstance = producer.newInstance();
-        Assume.assumeFalse(newInstance.getNotImplemented().contains(MapperProvider.Capabilities.ATTACHMENT));
+        Assume.assumeTrue(newInstance.getSupportedCapabilities().contains(MapperProvider.Capabilities.ATTACHMENT));
         this.attachmentMapper = newInstance.createAttachmentMapper();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/60f9dcdf/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
index b123739..a465c65 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
@@ -34,7 +34,7 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.store.TestId;
+import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;

http://git-wip-us.apache.org/repos/asf/james-project/blob/60f9dcdf/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
index c5bf105..36bbf79 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
@@ -89,7 +89,7 @@ public class MailboxMapperTest<T extends MapperProvider> {
     @Contract.Inject
     public final void setProducer(IProducer<T> producer) throws MailboxException {
         this.mapperProvider = producer.newInstance();
-        Assume.assumeFalse(mapperProvider.getNotImplemented().contains(MapperProvider.Capabilities.MAILBOX));
+        Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.MAILBOX));
 
         this.producer = producer;
         this.mailboxMapper = mapperProvider.createMailboxMapper();

http://git-wip-us.apache.org/repos/asf/james-project/blob/60f9dcdf/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MapperProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MapperProvider.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MapperProvider.java
index bbeb072..b6b8f74 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MapperProvider.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MapperProvider.java
@@ -41,7 +41,7 @@ public interface MapperProvider {
         UNIQUE_MESSAGE_ID
     }
 
-    List<Capabilities> getNotImplemented();
+    List<Capabilities> getSupportedCapabilities();
 
     MailboxMapper createMailboxMapper() throws MailboxException;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/60f9dcdf/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
index a8b3da0..ebb4b92 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
@@ -87,7 +87,7 @@ public class MessageIdMapperTest<T extends MapperProvider> {
     public final void setProducer(IProducer<T> producer) throws MailboxException {
         this.producer = producer;
         this.mapperProvider = producer.newInstance();
-        Assume.assumeFalse(mapperProvider.getNotImplemented().contains(MapperProvider.Capabilities.UNIQUE_MESSAGE_ID));
+        Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.UNIQUE_MESSAGE_ID));
 
         this.mapperProvider.ensureMapperPrepared();
         this.sut = mapperProvider.createMessageIdMapper();

http://git-wip-us.apache.org/repos/asf/james-project/blob/60f9dcdf/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
index c45b5b7..ec87df8 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
@@ -92,7 +92,7 @@ public class MessageMapperTest<T extends MapperProvider> {
         this.mapperProvider = producer.newInstance();
         this.mapperProvider.ensureMapperPrepared();
 
-        Assume.assumeFalse(mapperProvider.getNotImplemented().contains(MapperProvider.Capabilities.MESSAGE));
+        Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.MESSAGE));
 
         this.messageMapper = mapperProvider.createMessageMapper();
         this.mailboxMapper = mapperProvider.createMailboxMapper();

http://git-wip-us.apache.org/repos/asf/james-project/blob/60f9dcdf/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java
index 5a7e8ae..f3eae89 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java
@@ -70,7 +70,7 @@ public class MessageMoveTest<T extends MapperProvider> {
         this.producer = producer;
         this.mapperProvider = producer.newInstance();
         this.mapperProvider.ensureMapperPrepared();
-        Assume.assumeFalse(mapperProvider.getNotImplemented().contains(MapperProvider.Capabilities.MOVE));
+        Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.MOVE));
         this.messageMapper = mapperProvider.createMessageMapper();
         Assume.assumeNotNull(messageMapper);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/60f9dcdf/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
index ff9242d..6844d36 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
@@ -82,8 +82,8 @@ public class MessageWithAttachmentMapperTest<T extends MapperProvider> {
         this.mapperProvider = producer.newInstance();
         this.mapperProvider.ensureMapperPrepared();
 
-        Assume.assumeFalse(mapperProvider.getNotImplemented().contains(MapperProvider.Capabilities.MESSAGE));
-        Assume.assumeFalse(mapperProvider.getNotImplemented().contains(MapperProvider.Capabilities.ATTACHMENT));
+        Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.MESSAGE));
+        Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.ATTACHMENT));
 
         this.messageMapper = mapperProvider.createMessageMapper();
         this.attachmentMapper = mapperProvider.createAttachmentMapper();


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


[4/6] james-project git commit: MAILBOX-279: JPAMappersTest should work with MESSAGE

Posted by ro...@apache.org.
MAILBOX-279: JPAMappersTest should work with MESSAGE


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

Branch: refs/heads/master
Commit: 1ccb1eca78ae2c20d4c2b3ed9d984ec54de40b14
Parents: fc42d06
Author: Quynh Nguyen <qn...@linagora.com>
Authored: Wed Dec 7 14:16:43 2016 +0700
Committer: Quynh Nguyen <qn...@linagora.com>
Committed: Mon Jan 9 15:16:52 2017 +0700

----------------------------------------------------------------------
 .../mailbox/jpa/mail/JPAMailboxMapper.java      |  10 +-
 .../mailbox/jpa/mail/JPAMessageMapper.java      |  43 ++--
 .../mailbox/jpa/mail/model/JPAMailbox.java      |   9 +-
 .../openjpa/AbstractJPAMailboxMessage.java      |  29 +--
 .../jpa/mail/TransactionalMessageMapper.java    |  42 ++--
 .../mailbox/store/mail/MessageMetadata.java     |  69 ------
 .../james/mailbox/store/mail/MessageUtils.java  | 118 ++++++++++
 .../mailbox/store/mail/MessageUtilsTest.java    | 117 ++++++++++
 .../store/mail/model/ListMessageAssert.java     | 145 ++++++++++++
 .../store/mail/model/ListMessageAssertTest.java | 230 +++++++++++++++++++
 .../mail/model/ListMessagePropertiesAssert.java |  99 ++++++++
 .../model/ListMessagePropertiesAssertTest.java  |  97 ++++++++
 .../store/mail/model/MessageMapperTest.java     | 136 ++++++-----
 .../model/MessageWithAttachmentMapperTest.java  |   3 +-
 14 files changed, 944 insertions(+), 203 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/1ccb1eca/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
index d2d883b..7fe207a 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
@@ -77,12 +77,10 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM
     public void save(Mailbox mailbox) throws MailboxException {
         try {
             this.lastMailboxName = mailbox.getName();
-            if (mailbox instanceof JPAMailbox) {
-                getEntityManager().persist(mailbox);
-            } else {
-                JPAMailbox persistedData = new JPAMailbox(mailbox);
-                getEntityManager().persist(persistedData);
-                mailbox.setMailboxId(persistedData.getMailboxId());
+            JPAMailbox persistedMailbox = JPAMailbox.from(mailbox);
+            getEntityManager().persist(mailbox);
+            if (!(mailbox instanceof JPAMailbox)) {
+                mailbox.setMailboxId(persistedMailbox.getMailboxId());
             }
         } catch (PersistenceException e) {
             throw new MailboxException("Save of mailbox " + mailbox.getName() +" failed", e);

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ccb1eca/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
index b7542c6..ac581a0 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
@@ -45,7 +45,8 @@ import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.FlagsUpdateCalculator;
 import org.apache.james.mailbox.store.SimpleMessageMetaData;
 import org.apache.james.mailbox.store.mail.MessageMapper;
-import org.apache.james.mailbox.store.mail.MessageMetadata;
+import org.apache.james.mailbox.store.mail.MessageUtils;
+import org.apache.james.mailbox.store.mail.MessageUtils.MessageChangedFlags;
 import org.apache.james.mailbox.store.mail.ModSeqProvider;
 import org.apache.james.mailbox.store.mail.UidProvider;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -59,11 +60,12 @@ import com.google.common.collect.ImmutableList;
  * JPA implementation of a {@link MessageMapper}. This class is not thread-safe!
  */
 public class JPAMessageMapper extends JPATransactionalMapper implements MessageMapper {
-    private final MessageMetadata messageMetadataMapper;
+    private static final int UNLIMIT_MAX_SIZE = -1;
+    private final MessageUtils messageMetadataMapper;
 
     public JPAMessageMapper(MailboxSession mailboxSession, UidProvider uidProvider, ModSeqProvider modSeqProvider, EntityManagerFactory entityManagerFactory) {
         super(entityManagerFactory);
-        this.messageMetadataMapper = new MessageMetadata(mailboxSession, uidProvider, modSeqProvider);
+        this.messageMetadataMapper = new MessageUtils(mailboxSession, uidProvider, modSeqProvider);
     }
 
     /**
@@ -249,30 +251,15 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
     @Override
     public Iterator<UpdatedFlags> updateFlags(Mailbox mailbox, FlagsUpdateCalculator flagsUpdateCalculator,
             MessageRange set) throws MailboxException {
-        ImmutableList.Builder<UpdatedFlags> updatedFlags = ImmutableList.builder();
-        Iterator<MailboxMessage> messages = findInMailbox(mailbox, set, FetchType.Metadata, -1);
-        
-        long modSeq = -1;
-        if (messages.hasNext()) {
-            modSeq = messageMetadataMapper.nextModSeq(mailbox);
-        }
-        while(messages.hasNext()) {
-            MailboxMessage member = messages.next();
-            Flags originalFlags = member.createFlags();
-            member.setFlags(flagsUpdateCalculator.buildNewFlags(originalFlags));
-            Flags newFlags = member.createFlags();
-            if (UpdatedFlags.flagsChanged(originalFlags, newFlags)) {
-                member.setModSeq(modSeq);
-                save(mailbox, member);
-            }
+        Iterator<MailboxMessage> messages = findInMailbox(mailbox, set, FetchType.Metadata, UNLIMIT_MAX_SIZE);
+
+        MessageChangedFlags messageChangedFlags = messageMetadataMapper.updateFlags(mailbox, flagsUpdateCalculator, messages);
 
-            UpdatedFlags uFlags = new UpdatedFlags(member.getUid(), member.getModSeq(), originalFlags, newFlags);
-            
-            updatedFlags.add(uFlags);
-            
+        for (MailboxMessage mailboxMessage : messageChangedFlags.getChangedFlags()) {
+            save(mailbox, mailboxMessage);
         }
 
-        return updatedFlags.build().iterator();
+        return messageChangedFlags.getUpdatedFlags();
     }
 
     @Override
@@ -293,12 +280,8 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
     private MessageMetaData copy(Mailbox mailbox, MessageUid uid, long modSeq, MailboxMessage original)
             throws MailboxException {
         MailboxMessage copy;
-        JPAMailbox currentMailbox;
-        if (mailbox instanceof JPAMailbox) {
-            currentMailbox = (JPAMailbox) mailbox;
-        } else {
-            currentMailbox = new JPAMailbox(mailbox);
-        }
+        JPAMailbox currentMailbox = JPAMailbox.from(mailbox);
+
         if (original instanceof JPAStreamingMailboxMessage) {
             copy = new JPAStreamingMailboxMessage(currentMailbox, uid, modSeq, original);
         } else if (original instanceof JPAEncryptedMailboxMessage) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ccb1eca/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java
index 95adcd7..f47f222 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java
@@ -96,6 +96,13 @@ public class JPAMailbox implements Mailbox {
     @Column(name = "MAILBOX_HIGHEST_MODSEQ", nullable = true)
     private long highestModSeq;
     
+    public static JPAMailbox from(Mailbox mailbox) {
+        if (mailbox instanceof JPAMailbox) {
+            return (JPAMailbox) mailbox;
+        }
+        return new JPAMailbox(mailbox);
+    }
+
     /**
      * JPA only
      */
@@ -230,5 +237,5 @@ public class JPAMailbox implements Mailbox {
     @Override
     public void setACL(MailboxACL acl) {
     }
-    
+
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ccb1eca/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
index 48896d7..8df5a47 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
@@ -61,6 +61,8 @@ import org.apache.openjpa.persistence.jdbc.ElementJoinColumn;
 import org.apache.openjpa.persistence.jdbc.ElementJoinColumns;
 import org.apache.openjpa.persistence.jdbc.Index;
 
+import com.google.common.base.Objects;
+
 /**
  * Abstract base class for JPA based implementations of
  * {@link DelegatingMailboxMessage}
@@ -297,32 +299,17 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
 
     @Override
     public int hashCode() {
-        final int PRIME = 31;
-        int result = 1;
-        result = PRIME * result + (int) (getMailboxId().getRawId() ^ (getMailboxId().getRawId() >>> 32));
-        result = PRIME * result + (int) (uid ^ (uid >>> 32));
-        return result;
+        return Objects.hashCode(getMailboxId().getRawId(), uid);
     }
 
     @Override
     public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        final AbstractJPAMailboxMessage other = (AbstractJPAMailboxMessage) obj;
-        if (getMailboxId() != null) {
-            if (!getMailboxId().equals(other.getMailboxId()))
-                return false;
-        } else {
-            if (other.getMailboxId() != null)
-                return false;
+        if (obj instanceof AbstractJPAMailboxMessage) {
+            AbstractJPAMailboxMessage other = (AbstractJPAMailboxMessage) obj;
+            return Objects.equal(getMailboxId(), other.getMailboxId())
+                    && Objects.equal(uid, other.getUid());
         }
-        if (uid != other.uid)
-            return false;
-        return true;
+        return false;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ccb1eca/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
index 4f105d9..1e0715a 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
@@ -38,10 +38,10 @@ import com.google.common.base.Optional;
 import com.google.common.base.Throwables;
 
 public class TransactionalMessageMapper implements MessageMapper {
-    private final JPAMessageMapper wrapped;
+    private final JPAMessageMapper messageMapper;
 
-    public TransactionalMessageMapper(JPAMessageMapper wrapped) {
-        this.wrapped = wrapped;
+    public TransactionalMessageMapper(JPAMessageMapper messageMapper) {
+        this.messageMapper = messageMapper;
     }
     @Override
     public void endRequest() {
@@ -56,16 +56,16 @@ public class TransactionalMessageMapper implements MessageMapper {
     @Override
     public Iterator<MailboxMessage> findInMailbox(Mailbox mailbox, MessageRange set, FetchType type, int limit)
             throws MailboxException {
-        return wrapped.findInMailbox(mailbox, set, type, limit);
+        return messageMapper.findInMailbox(mailbox, set, type, limit);
     }
 
     @Override
     public Map<MessageUid, MessageMetaData> expungeMarkedForDeletionInMailbox(final Mailbox mailbox, final MessageRange set)
             throws MailboxException {
-        Map<MessageUid, MessageMetaData> data = wrapped.execute(new Transaction<Map<MessageUid, MessageMetaData>>() {
+        Map<MessageUid, MessageMetaData> data = messageMapper.execute(new Transaction<Map<MessageUid, MessageMetaData>>() {
             @Override
             public Map<MessageUid, MessageMetaData> run() throws MailboxException {
-                return wrapped.expungeMarkedForDeletionInMailbox(mailbox, set);
+                return messageMapper.expungeMarkedForDeletionInMailbox(mailbox, set);
             }
         });
         return data;
@@ -73,21 +73,21 @@ public class TransactionalMessageMapper implements MessageMapper {
 
     @Override
     public long countMessagesInMailbox(Mailbox mailbox) throws MailboxException {
-        return wrapped.countMessagesInMailbox(mailbox);
+        return messageMapper.countMessagesInMailbox(mailbox);
     }
 
     @Override
     public long countUnseenMessagesInMailbox(Mailbox mailbox) throws MailboxException {
-        return wrapped.countUnseenMessagesInMailbox(mailbox);
+        return messageMapper.countUnseenMessagesInMailbox(mailbox);
     }
 
     @Override
     public void delete(final Mailbox mailbox, final MailboxMessage message) throws MailboxException {
         try {
-            wrapped.execute(new VoidTransaction() {
+            messageMapper.execute(new VoidTransaction() {
                 @Override
                 public void runVoid() throws MailboxException {
-                    wrapped.delete(mailbox, message);
+                    messageMapper.delete(mailbox, message);
                 }
             });
         } catch (MailboxException e) {
@@ -97,20 +97,20 @@ public class TransactionalMessageMapper implements MessageMapper {
 
     @Override
     public MessageUid findFirstUnseenMessageUid(Mailbox mailbox) throws MailboxException {
-        return wrapped.findFirstUnseenMessageUid(mailbox);
+        return messageMapper.findFirstUnseenMessageUid(mailbox);
     }
 
     @Override
     public List<MessageUid> findRecentMessageUidsInMailbox(Mailbox mailbox) throws MailboxException {
-        return wrapped.findRecentMessageUidsInMailbox(mailbox);
+        return messageMapper.findRecentMessageUidsInMailbox(mailbox);
     }
 
     @Override
     public MessageMetaData add(final Mailbox mailbox, final MailboxMessage message) throws MailboxException {
-        MessageMetaData data = wrapped.execute(new Transaction<MessageMetaData>() {
+        MessageMetaData data = messageMapper.execute(new Transaction<MessageMetaData>() {
             @Override
             public MessageMetaData run() throws MailboxException {
-                return wrapped.add(mailbox, message);
+                return messageMapper.add(mailbox, message);
             }
         });
         return data;
@@ -119,10 +119,10 @@ public class TransactionalMessageMapper implements MessageMapper {
     @Override
     public Iterator<UpdatedFlags> updateFlags(final Mailbox mailbox, final FlagsUpdateCalculator flagsUpdateCalculator,
             final MessageRange set) throws MailboxException {
-        Iterator<UpdatedFlags> data = wrapped.execute(new Transaction<Iterator<UpdatedFlags>>() {
+        Iterator<UpdatedFlags> data = messageMapper.execute(new Transaction<Iterator<UpdatedFlags>>() {
             @Override
             public Iterator<UpdatedFlags> run() throws MailboxException {
-                return wrapped.updateFlags(mailbox, flagsUpdateCalculator, set);
+                return messageMapper.updateFlags(mailbox, flagsUpdateCalculator, set);
             }
         });
         return data;
@@ -130,10 +130,10 @@ public class TransactionalMessageMapper implements MessageMapper {
 
     @Override
     public MessageMetaData copy(final Mailbox mailbox, final MailboxMessage original) throws MailboxException {
-        MessageMetaData data = wrapped.execute(new Transaction<MessageMetaData>() {
+        MessageMetaData data = messageMapper.execute(new Transaction<MessageMetaData>() {
             @Override
             public MessageMetaData run() throws MailboxException {
-                return wrapped.copy(mailbox, original);
+                return messageMapper.copy(mailbox, original);
             }
         });
         return data;
@@ -141,17 +141,17 @@ public class TransactionalMessageMapper implements MessageMapper {
 
     @Override
     public MessageMetaData move(Mailbox mailbox, MailboxMessage original) throws MailboxException {
-        return wrapped.move(mailbox, original);
+        return messageMapper.move(mailbox, original);
     }
 
     @Override
     public Optional<MessageUid> getLastUid(Mailbox mailbox) throws MailboxException {
-        return wrapped.getLastUid(mailbox);
+        return messageMapper.getLastUid(mailbox);
     }
 
     @Override
     public long getHighestModSeq(Mailbox mailbox) throws MailboxException {
-        return wrapped.getHighestModSeq(mailbox);
+        return messageMapper.getHighestModSeq(mailbox);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ccb1eca/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMetadata.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMetadata.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMetadata.java
deleted file mode 100644
index 1907cf0..0000000
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMetadata.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/****************************************************************
- * 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.mail;
-
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.store.mail.model.Mailbox;
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-
-import com.google.common.base.Optional;
-
-public class MessageMetadata {
-    private final MailboxSession mailboxSession;
-    private final UidProvider uidProvider;
-    private final ModSeqProvider modSeqProvider;
-
-    public MessageMetadata(MailboxSession mailboxSession, UidProvider uidProvider, ModSeqProvider modSeqProvider) {
-        this.mailboxSession = mailboxSession;
-        this.uidProvider = uidProvider;
-        this.modSeqProvider = modSeqProvider;
-    }
-    
-    public long getHighestModSeq(Mailbox mailbox) throws MailboxException {
-        return modSeqProvider.highestModSeq(mailboxSession, mailbox);
-    }
-
-    public Optional<MessageUid> getLastUid(Mailbox mailbox) throws MailboxException {
-        return uidProvider.lastUid(mailboxSession, mailbox);
-    }
-    
-
-    public MessageUid nextUid(Mailbox mailbox) throws MailboxException {
-        return uidProvider.nextUid(mailboxSession, mailbox);
-    }
-
-    public long nextModSeq(Mailbox mailbox) throws MailboxException {
-        if (modSeqProvider != null) {
-            return modSeqProvider.nextModSeq(mailboxSession, mailbox);
-        }
-        return -1;
-    }
-
-    public void enrichMessage(Mailbox mailbox, MailboxMessage message) throws MailboxException { 
-        message.setUid(nextUid(mailbox));
-        
-        if (modSeqProvider != null) {
-            message.setModSeq(nextModSeq(mailbox));
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ccb1eca/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java
new file mode 100644
index 0000000..7cdcab0
--- /dev/null
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java
@@ -0,0 +1,118 @@
+/****************************************************************
+ * 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.mail;
+
+import java.util.Iterator;
+import java.util.List;
+
+import javax.mail.Flags;
+
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.UpdatedFlags;
+import org.apache.james.mailbox.store.FlagsUpdateCalculator;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+public class MessageUtils {
+    private final MailboxSession mailboxSession;
+    private final UidProvider uidProvider;
+    private final ModSeqProvider modSeqProvider;
+
+    public MessageUtils(MailboxSession mailboxSession, UidProvider uidProvider, ModSeqProvider modSeqProvider) {
+        Preconditions.checkNotNull(uidProvider);
+        Preconditions.checkNotNull(modSeqProvider);
+        this.mailboxSession = mailboxSession;
+        this.uidProvider = uidProvider;
+        this.modSeqProvider = modSeqProvider;
+    }
+    
+    public long getHighestModSeq(Mailbox mailbox) throws MailboxException {
+        return modSeqProvider.highestModSeq(mailboxSession, mailbox);
+    }
+
+    public Optional<MessageUid> getLastUid(Mailbox mailbox) throws MailboxException {
+        return uidProvider.lastUid(mailboxSession, mailbox);
+    }
+    
+
+    public MessageUid nextUid(Mailbox mailbox) throws MailboxException {
+        return uidProvider.nextUid(mailboxSession, mailbox);
+    }
+
+    public long nextModSeq(Mailbox mailbox) throws MailboxException {
+        return modSeqProvider.nextModSeq(mailboxSession, mailbox);
+    }
+
+    public void enrichMessage(Mailbox mailbox, MailboxMessage message) throws MailboxException { 
+        message.setUid(nextUid(mailbox));
+        message.setModSeq(nextModSeq(mailbox));
+    }
+
+    public MessageChangedFlags updateFlags(Mailbox mailbox, FlagsUpdateCalculator flagsUpdateCalculator, 
+            Iterator<MailboxMessage> messages) throws MailboxException {
+        ImmutableList.Builder<UpdatedFlags> updatedFlags = ImmutableList.builder();
+        ImmutableList.Builder<MailboxMessage> changedFlags = ImmutableList.builder();
+
+        long modSeq = nextModSeq(mailbox);
+
+        while(messages.hasNext()) {
+            MailboxMessage member = messages.next();
+            Flags originalFlags = member.createFlags();
+            member.setFlags(flagsUpdateCalculator.buildNewFlags(originalFlags));
+            Flags newFlags = member.createFlags();
+            if (UpdatedFlags.flagsChanged(originalFlags, newFlags)) {
+                member.setModSeq(modSeq);
+                changedFlags.add(member);
+            }
+
+            UpdatedFlags uFlags = new UpdatedFlags(member.getUid(), member.getModSeq(), originalFlags, newFlags);
+
+            updatedFlags.add(uFlags);
+
+        }
+
+        return new MessageChangedFlags(updatedFlags.build().iterator(), changedFlags.build());
+    }
+
+    
+    public class MessageChangedFlags {
+        private final Iterator<UpdatedFlags> updatedFlags;
+        private final List<MailboxMessage> changedFlags;
+
+        public MessageChangedFlags(Iterator<UpdatedFlags> updatedFlags, List<MailboxMessage> changedFlags) {
+            this.updatedFlags = updatedFlags;
+            this.changedFlags = changedFlags;
+        }
+
+        public Iterator<UpdatedFlags> getUpdatedFlags() {
+            return updatedFlags;
+        }
+
+        public List<MailboxMessage> getChangedFlags() {
+            return changedFlags;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ccb1eca/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java
new file mode 100644
index 0000000..a58d645
--- /dev/null
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java
@@ -0,0 +1,117 @@
+/****************************************************************
+ * 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.mail;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Date;
+
+import javax.mail.Flags;
+import javax.mail.util.SharedByteArrayInputStream;
+
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.mock.MockMailboxSession;
+import org.apache.james.mailbox.model.MessageId;
+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.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+public class MessageUtilsTest {
+    private static final MailboxSession mailboxSession = new MockMailboxSession("user");
+    private static final MessageUid MESSAGE_UID = MessageUid.of(1);
+    private static final MessageId MESSAGE_ID = new DefaultMessageId();
+    private static final int BODY_START = 16;
+    private static final String CONTENT = "anycontent";
+    
+    @Mock private ModSeqProvider modSeqProvider;
+    @Mock private UidProvider uidProvider;
+    @Mock private Mailbox mailbox;
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    private MessageUtils messageUtils;
+    private MailboxMessage message;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        messageUtils = new MessageUtils(mailboxSession, uidProvider, modSeqProvider);
+        message = new SimpleMailboxMessage(MESSAGE_ID, new Date(), CONTENT.length(), BODY_START, new SharedByteArrayInputStream(CONTENT.getBytes()), new Flags(), new PropertyBuilder(), mailbox.getMailboxId());
+    }
+    @Test
+    public void newInstanceShouldFailWhenNullUidProvider() {
+        expectedException.expect(NullPointerException.class);
+        new MessageUtils(mailboxSession, null, modSeqProvider);
+    }
+    
+    @Test
+    public void newInstanceShouldFailWhenNullModSeqProvider() {
+        expectedException.expect(NullPointerException.class);
+        new MessageUtils(mailboxSession, uidProvider, null);
+    }
+    
+    @Test
+    public void getHighestModSeqShouldCallModSeqProvider() throws Exception {
+        messageUtils.getHighestModSeq(mailbox);
+        verify(modSeqProvider).highestModSeq(eq(mailboxSession), eq(mailbox));
+    }
+    
+    @Test
+    public void nextModSeqShouldCallModSeqProvider() throws Exception {
+        messageUtils.nextModSeq(mailbox);
+        verify(modSeqProvider).nextModSeq(eq(mailboxSession), eq(mailbox));
+    }
+    
+    @Test
+    public void getLastUidShouldCallUidProvider() throws Exception {
+        messageUtils.getLastUid(mailbox);
+        verify(uidProvider).lastUid(eq(mailboxSession), eq(mailbox));
+    }
+    
+    @Test
+    public void nextUidShouldCallUidProvider() throws Exception {
+        messageUtils.nextUid(mailbox);
+        verify(uidProvider).nextUid(eq(mailboxSession), eq(mailbox));
+    }
+    
+    @Test
+    public void enrichMesageShouldEnrichUidAndModSeq() throws Exception {
+        when(uidProvider.nextUid(eq(mailboxSession), eq(mailbox))).thenReturn(MESSAGE_UID);
+        when(modSeqProvider.nextModSeq(eq(mailboxSession), eq(mailbox))).thenReturn(11L);
+
+        messageUtils.enrichMessage(mailbox, message);
+        
+        assertThat(message.getUid()).isEqualTo(MESSAGE_UID);
+        assertThat(message.getModSeq()).isEqualTo(11L);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ccb1eca/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssert.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssert.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssert.java
new file mode 100644
index 0000000..7772ea1
--- /dev/null
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssert.java
@@ -0,0 +1,145 @@
+/****************************************************************
+ * 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.mail.model;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MessageId;
+
+import com.google.common.base.Function;
+import com.google.common.base.Objects;
+import com.google.common.base.Throwables;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Lists;
+
+public class ListMessageAssert {
+    private final List<MailboxMessage> actual;
+
+    private final List<InnerMessage> messageToInnerMessage(List<MailboxMessage> messages) {
+        return FluentIterable.from(messages).transform(new Function<MailboxMessage, InnerMessage>() {
+            @Override
+            public InnerMessage apply(MailboxMessage input) {
+                try {
+                    return new InnerMessage(input.getMessageId(), input.getUid(), input.getMailboxId(), input.getInternalDate(), input.getBodyOctets(), 
+                            input.getFullContentOctets(), input.getMediaType(), input.getSubType(), IOUtils.toString(input.getFullContent()));
+                } catch (IOException e) {
+                    Throwables.propagate(e);
+                    return null;
+                }
+            }
+            
+        }).toList();
+    }
+
+    private ListMessageAssert(List<MailboxMessage> actual) {
+        this.actual = actual;
+    }
+
+    public static ListMessageAssert assertMessages(List<MailboxMessage> actual) {
+        return new ListMessageAssert(actual);
+    }
+
+    public void containOnly(MailboxMessage... expecteds) throws IOException {
+        assertThat(messageToInnerMessage(actual)).containsOnlyElementsOf(messageToInnerMessage(Lists.newArrayList(expecteds)));
+    }
+
+    private final class InnerMessage {
+        private final MessageUid uid;
+        private final MailboxId mailboxId;
+        private final Date internalDate;
+        private final long bodyOctets;
+        private final long fullContentOctets;
+        private final String mediaType;
+        private final String subType;
+        private final String content;
+
+        public InnerMessage(MessageId id, MessageUid uid, MailboxId mailboxId, Date internalDate, long bodyOctets,
+                long fullContentOctets, String mediaType, String subType, String content) {
+            this.uid = uid;
+            this.mailboxId = mailboxId;
+            this.internalDate = internalDate;
+            this.bodyOctets = bodyOctets;
+            this.fullContentOctets = fullContentOctets;
+            this.mediaType = mediaType;
+            this.subType = subType;
+            this.content = content;
+        }
+
+        public MessageUid getUid() {
+            return uid;
+        }
+
+        public MailboxId getMailboxId() {
+            return mailboxId;
+        }
+
+        public Date getInternalDate() {
+            return internalDate;
+        }
+
+        public long getBodyOctets() {
+            return bodyOctets;
+        }
+
+        public long getFullContentOctets() {
+            return fullContentOctets;
+        }
+
+        public String getMediaType() {
+            return mediaType;
+        }
+
+        public String getSubType() {
+            return subType;
+        }
+
+        public String getContent() {
+            return content;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hashCode(uid, mailboxId, internalDate, bodyOctets, fullContentOctets, mediaType, subType, content);
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof InnerMessage) {
+                InnerMessage o = (InnerMessage)obj;
+                return Objects.equal(uid, o.getUid())
+                    && Objects.equal(mailboxId, o.getMailboxId())
+                    && Objects.equal(internalDate, o.getInternalDate())
+                    && Objects.equal(bodyOctets, o.getBodyOctets())
+                    && Objects.equal(fullContentOctets, o.getFullContentOctets())
+                    && Objects.equal(mediaType, o.getMediaType())
+                    && Objects.equal(subType, o.getSubType())
+                    && Objects.equal(content, o.getContent());
+            }
+            return false;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ccb1eca/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
new file mode 100644
index 0000000..b123739
--- /dev/null
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
@@ -0,0 +1,230 @@
+/****************************************************************
+ * 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.mail.model;
+
+import static org.apache.james.mailbox.store.mail.model.ListMessageAssert.assertMessages;
+
+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.james.mailbox.MessageUid;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.model.MessageAttachment;
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.store.TestId;
+import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableList;
+
+public class ListMessageAssertTest {
+    private static final String BODY_CONTENT2 = "Subject: Test2 \n\nBody2\n.\n";
+    private static final String BODY_CONTENT1 = "Subject: Test1 \n\nBody1\n.\n";
+    private static final int BODY_START = 16;
+    private static final int UID_VALIDITY = 42;
+    private static final MailboxId MAILBOX_ID = TestId.of(1);
+    private static final MessageUid MESSAGE_UID = MessageUid.of(2);
+    private static final MessageId MESSAGE_ID = new DefaultMessageId();
+    private static final Date INTERNAL_DATE = new Date();
+
+    private Mailbox benwaInboxMailbox;
+
+    private MailboxMessage message1;
+    private MailboxMessage message2;
+    
+    @Before
+    public void setUp() {
+        benwaInboxMailbox = createMailbox(new MailboxPath("#private", "user", "INBOX"));
+
+        message1 = createMessage(benwaInboxMailbox, MESSAGE_ID, BODY_CONTENT1, BODY_START, new PropertyBuilder());
+        message2 = createMessage(benwaInboxMailbox, MESSAGE_ID, BODY_CONTENT2, BODY_START, new PropertyBuilder());
+    }
+
+    @Test
+    public void containsOnlyShouldWork() throws IOException {
+        List<MailboxMessage> actual = ImmutableList.of(message1, message2);
+        assertMessages(actual).containOnly(createMailboxMessage(MAILBOX_ID, MESSAGE_ID, MESSAGE_UID, INTERNAL_DATE, BODY_CONTENT1, BODY_START, new PropertyBuilder()),
+                createMailboxMessage(MAILBOX_ID, MESSAGE_ID, MESSAGE_UID, INTERNAL_DATE, BODY_CONTENT2, BODY_START, new PropertyBuilder()));
+    }
+
+    @Test(expected = AssertionError.class)
+    public void containsOnlyShouldThrowExceptionWhenHavingElementDoesNotBelongToList() throws IOException {
+        List<MailboxMessage> actual = ImmutableList.of(message1);
+        assertMessages(actual).containOnly(createMailboxMessage(MAILBOX_ID, MESSAGE_ID, MESSAGE_UID, INTERNAL_DATE, BODY_CONTENT2, BODY_START, new PropertyBuilder()));
+    }
+
+    private MailboxMessage createMailboxMessage(final MailboxId mailboxId, final MessageId messageId, final MessageUid uid,
+            final Date internalDate, final String content, final int bodyStart, final PropertyBuilder propertyBuilder) {
+        return new MailboxMessage() {
+            @Override
+            public MailboxId getMailboxId() {
+                return mailboxId;
+            }
+
+            @Override
+            public MessageUid getUid() {
+                return uid;
+            }
+
+            @Override
+            public void setUid(MessageUid uid) {
+
+            }
+
+            @Override
+            public void setModSeq(long modSeq) {
+
+            }
+
+            @Override
+            public long getModSeq() {
+                return 0;
+            }
+
+            @Override
+            public boolean isAnswered() {
+                return false;
+            }
+
+            @Override
+            public boolean isDeleted() {
+                return false;
+            }
+
+            @Override
+            public boolean isDraft() {
+                return false;
+            }
+
+            @Override
+            public boolean isFlagged() {
+                return false;
+            }
+
+            @Override
+            public boolean isRecent() {
+                return false;
+            }
+
+            @Override
+            public boolean isSeen() {
+                return false;
+            }
+
+            @Override
+            public void setFlags(Flags flags) {
+
+            }
+
+            @Override
+            public Flags createFlags() {
+                return null;
+            }
+
+            @Override
+            public int compareTo(MailboxMessage o) {
+                return 0;
+            }
+
+            @Override
+            public MessageId getMessageId() {
+                return messageId;
+            }
+
+            @Override
+            public Date getInternalDate() {
+                return internalDate;
+            }
+
+            @Override
+            public InputStream getBodyContent() throws IOException {
+                return null;
+            }
+
+            @Override
+            public String getMediaType() {
+                return null;
+            }
+
+            @Override
+            public String getSubType() {
+                return null;
+            }
+
+            @Override
+            public long getBodyOctets() {
+                return content.length() - bodyStart;
+            }
+
+            @Override
+            public long getFullContentOctets() {
+                return content.length();
+            }
+
+            @Override
+            public Long getTextualLineCount() {
+                return null;
+            }
+
+            @Override
+            public InputStream getHeaderContent() throws IOException {
+                return null;
+            }
+
+            @Override
+            public InputStream getFullContent() throws IOException {
+                return new SharedByteArrayInputStream(content.getBytes());
+            }
+
+            @Override
+            public List<Property> getProperties() {
+                return null;
+            }
+
+            @Override
+            public List<MessageAttachment> getAttachments() {
+                return null;
+            }
+        };
+    }
+
+    private SimpleMailbox createMailbox(MailboxPath mailboxPath) {
+        SimpleMailbox mailbox = new SimpleMailbox(mailboxPath, UID_VALIDITY);
+        mailbox.setMailboxId(MAILBOX_ID);
+
+        return mailbox;
+    }
+
+    private MailboxMessage createMessage(Mailbox mailbox, MessageId messageId, String content, int bodyStart, PropertyBuilder propertyBuilder) {
+        SimpleMailboxMessage simpleMailboxMessage = new SimpleMailboxMessage(messageId, INTERNAL_DATE, content.length(), bodyStart, new SharedByteArrayInputStream(content.getBytes()), new Flags(), propertyBuilder, mailbox.getMailboxId());
+        simpleMailboxMessage.setUid(MESSAGE_UID);
+        return simpleMailboxMessage;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ccb1eca/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessagePropertiesAssert.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessagePropertiesAssert.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessagePropertiesAssert.java
new file mode 100644
index 0000000..4c22bdd
--- /dev/null
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessagePropertiesAssert.java
@@ -0,0 +1,99 @@
+/****************************************************************
+ * 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.mail.model;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.List;
+
+import com.google.common.base.Function;
+import com.google.common.base.Objects;
+import com.google.common.collect.FluentIterable;
+
+public class ListMessagePropertiesAssert {
+    private final List<InnerProperty> propertiesToInnerProperties(List<Property> properties) {
+        return FluentIterable.from(properties)
+            .transform(propertyToInnerProperty())
+            .toList();
+    }
+
+    private final Function<Property, InnerProperty> propertyToInnerProperty() {
+        return new Function<Property, InnerProperty>() {
+            @Override
+            public InnerProperty apply(Property input) {
+                return new InnerProperty(input.getNamespace(), input.getLocalName(), input.getValue());
+            }
+        };
+    }
+
+    public static ListMessagePropertiesAssert assertProperties(List<Property> actual) {
+        return new ListMessagePropertiesAssert(actual);
+    }
+
+    private final List<Property> actual;
+
+    private ListMessagePropertiesAssert(List<Property> actual) {
+        this.actual = actual;
+    }
+
+    public void containsOnly(List<Property> expected) {
+        assertThat(propertiesToInnerProperties(actual)).containsOnlyElementsOf(propertiesToInnerProperties(expected));
+    }
+    
+    private final class InnerProperty {
+        private final String namespace;
+        private final String name;
+        private final String value;
+
+        public InnerProperty(String namespace, String name, String value) {
+            this.namespace = namespace;
+            this.name = name;
+            this.value = value;
+        }
+
+        public String getNamespace() {
+            return namespace;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public String getValue() {
+            return value;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hashCode(namespace, name, value);
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof InnerProperty) {
+                InnerProperty o = (InnerProperty)obj;
+                return Objects.equal(namespace, o.getNamespace())
+                    && Objects.equal(name, o.getName())
+                    && Objects.equal(value, o.getValue());
+            }
+            return false;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ccb1eca/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessagePropertiesAssertTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessagePropertiesAssertTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessagePropertiesAssertTest.java
new file mode 100644
index 0000000..ba33af8
--- /dev/null
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessagePropertiesAssertTest.java
@@ -0,0 +1,97 @@
+/****************************************************************
+ * 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.mail.model;
+
+import static org.apache.james.mailbox.store.mail.model.ListMessagePropertiesAssert.assertProperties;
+
+import java.util.List;
+
+import org.apache.james.mailbox.store.SimpleProperty;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableList;
+
+public class ListMessagePropertiesAssertTest {
+    private static final String OTHER_VALUE = "US-ASCII";
+    private static final String OTHER_LOCAL_NAME = StandardNames.MIME_CONTENT_TYPE_PARAMETER_CHARSET_NAME;
+    private static final String OTHER_NAMESPACE = StandardNames.MIME_CONTENT_TYPE_PARAMETER_SPACE;
+    private static final String VALUE = "7bit";
+    private static final String LOCAL_NAME = StandardNames.MIME_CONTENT_TRANSFER_ENCODING_NAME;
+    private static final String NAMESPACE = StandardNames.NAMESPACE_RFC_2045;
+
+    private static final Property PROPERTY1 = new SimpleProperty(NAMESPACE, LOCAL_NAME, VALUE);
+    private static final Property PROPERTY2 = new SimpleProperty(OTHER_NAMESPACE, OTHER_LOCAL_NAME, OTHER_VALUE);
+    
+    private List<Property> actual;
+    
+    @Before
+    public void setUp() {
+        actual = ImmutableList.of(PROPERTY1, PROPERTY2);
+    }
+    
+    @Test
+    public void containsOnlyShouldWork() {
+        assertProperties(actual).containsOnly(ImmutableList.of(createProperty(NAMESPACE, LOCAL_NAME, VALUE),
+            createProperty(OTHER_NAMESPACE, OTHER_LOCAL_NAME, OTHER_VALUE)));
+    }
+    
+    @Test(expected = AssertionError.class)
+    public void containsOnlyShouldFailWhenNotEnoughElement() {
+        assertProperties(actual).containsOnly(ImmutableList.of(createProperty(NAMESPACE, LOCAL_NAME, VALUE)));
+    }
+
+    @Test(expected = AssertionError.class)
+    public void containsOnlyShouldFailWhenNamespaceMismatch() {
+        assertProperties(actual).containsOnly(ImmutableList.of(createProperty(NAMESPACE, LOCAL_NAME, VALUE),
+            createProperty(OTHER_NAMESPACE, LOCAL_NAME, VALUE)));
+    }
+
+    @Test(expected = AssertionError.class)
+    public void containsOnlyShouldFailWhenNameMismatch() {
+        assertProperties(actual).containsOnly(ImmutableList.of(createProperty(NAMESPACE, LOCAL_NAME, VALUE),
+            createProperty(NAMESPACE, OTHER_LOCAL_NAME, VALUE)));
+    }
+
+    @Test(expected = AssertionError.class)
+    public void containsOnlyShouldFailWhenValueMismatch() {
+        assertProperties(actual).containsOnly(ImmutableList.of(createProperty(NAMESPACE, LOCAL_NAME, VALUE),
+            createProperty(NAMESPACE, LOCAL_NAME, OTHER_VALUE)));
+    }
+
+    private Property createProperty(final String namespace, final String name, final String value) {
+        return new Property() {
+            @Override
+            public String getValue() {
+                return value;
+            }
+            
+            @Override
+            public String getNamespace() {
+                return namespace;
+            }
+            
+            @Override
+            public String getLocalName() {
+                return name;
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ccb1eca/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
index d42a1cf..c45b5b7 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
@@ -19,6 +19,9 @@
 
 package org.apache.james.mailbox.store.mail.model;
 
+import static org.apache.james.mailbox.store.mail.model.ListMessageAssert.assertMessages;
+import static org.apache.james.mailbox.store.mail.model.ListMessagePropertiesAssert.assertProperties;
+import static org.apache.james.mailbox.store.mail.model.MessageAssert.assertThat;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.IOException;
@@ -33,13 +36,13 @@ import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
 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.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.FlagsUpdateCalculator;
+import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
@@ -54,6 +57,7 @@ import org.xenei.junit.contract.ContractTest;
 import org.xenei.junit.contract.IProducer;
 
 import com.google.common.base.Optional;
+import com.google.common.collect.Lists;
 
 @Contract(MapperProvider.class)
 public class MessageMapperTest<T extends MapperProvider> {
@@ -67,16 +71,17 @@ public class MessageMapperTest<T extends MapperProvider> {
     private IProducer<T> producer;
     private MapperProvider mapperProvider;
     private MessageMapper messageMapper;
+    private MailboxMapper mailboxMapper;
 
     private SimpleMailbox benwaInboxMailbox;
     private SimpleMailbox benwaWorkMailbox;
     
-    private SimpleMailboxMessage message1;
-    private SimpleMailboxMessage message2;
-    private SimpleMailboxMessage message3;
-    private SimpleMailboxMessage message4;
-    private SimpleMailboxMessage message5;
-    private SimpleMailboxMessage message6;
+    private MailboxMessage message1;
+    private MailboxMessage message2;
+    private MailboxMessage message3;
+    private MailboxMessage message4;
+    private MailboxMessage message5;
+    private MailboxMessage message6;
 
     @Rule
     public ExpectedException expected = ExpectedException.none();
@@ -90,7 +95,12 @@ public class MessageMapperTest<T extends MapperProvider> {
         Assume.assumeFalse(mapperProvider.getNotImplemented().contains(MapperProvider.Capabilities.MESSAGE));
 
         this.messageMapper = mapperProvider.createMessageMapper();
+        this.mailboxMapper = mapperProvider.createMailboxMapper();
 
+        initData();
+    }
+
+    private void initData() throws MailboxException {
         benwaInboxMailbox = createMailbox(new MailboxPath("#private", "benwa", "INBOX"));
         benwaWorkMailbox = createMailbox( new MailboxPath("#private", "benwa", "INBOX"+DELIMITER+"work"));
 
@@ -139,7 +149,10 @@ public class MessageMapperTest<T extends MapperProvider> {
     @ContractTest
     public void mailboxUnSeenCountShouldBeDecrementedAfterAMessageIsMarkedSeen() throws MailboxException {
         saveMessages();
-        messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE), message1.getUid().toRange()).hasNext();
+        FlagsUpdateCalculator newFlags = new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE);
+
+        messageMapper.updateFlags(benwaInboxMailbox, newFlags, message1.getUid().toRange());
+
         assertThat(messageMapper.countUnseenMessagesInMailbox(benwaInboxMailbox)).isEqualTo(4);
     }
 
@@ -170,8 +183,9 @@ public class MessageMapperTest<T extends MapperProvider> {
         saveMessages();
         message6.setUid(messageMapper.getLastUid(benwaInboxMailbox).get().next());
         messageMapper.delete(benwaInboxMailbox, message6);
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT))
-            .containsOnly(message1, message2, message3, message4, message5);
+
+        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT);
+        assertMessages(Lists.newArrayList(retrievedMessageIterator)).containOnly(message1, message2, message3, message4, message5);
     }
 
     @ContractTest
@@ -184,8 +198,8 @@ public class MessageMapperTest<T extends MapperProvider> {
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Full;
         int limit =10;
-        MessageAssert.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(message1.getUid()), fetchType, limit).next())
-            .isEqualTo(message1, fetchType);
+        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(message1.getUid()), fetchType, limit).next())
+            .isEqualToWithoutAttachment(message1, fetchType);
     }
 
     @ContractTest
@@ -193,16 +207,17 @@ public class MessageMapperTest<T extends MapperProvider> {
         saveMessages();
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper
                 .findInMailbox(benwaInboxMailbox, MessageRange.range(message1.getUid(), message4.getUid()), MessageMapper.FetchType.Full, LIMIT);
-        assertThat(retrievedMessageIterator).containsOnly(message1, message2, message3, message4);
-    }
 
+        assertMessages(Lists.newArrayList(retrievedMessageIterator)).containOnly(message1, message2, message3, message4);
+    }
+    
     @ContractTest
     public void messagesCanBeRetrievedInMailboxWithRangeTypeRangeContainingAHole() throws MailboxException, IOException {
         saveMessages();
         messageMapper.delete(benwaInboxMailbox, message3);
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper
             .findInMailbox(benwaInboxMailbox, MessageRange.range(message1.getUid(), message4.getUid()), MessageMapper.FetchType.Full, LIMIT);
-        assertThat(retrievedMessageIterator).containsOnly(message1, message2, message4);
+        assertMessages(Lists.newArrayList(retrievedMessageIterator)).containOnly(message1, message2, message4);
     }
 
     @ContractTest
@@ -210,7 +225,7 @@ public class MessageMapperTest<T extends MapperProvider> {
         saveMessages();
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper
                 .findInMailbox(benwaInboxMailbox, MessageRange.from(message3.getUid()), MessageMapper.FetchType.Full, LIMIT);
-        assertThat(retrievedMessageIterator).containsOnly(message3, message4, message5);
+        assertMessages(Lists.newArrayList(retrievedMessageIterator)).containOnly(message3, message4, message5);
     }
 
     @ContractTest
@@ -219,14 +234,14 @@ public class MessageMapperTest<T extends MapperProvider> {
         messageMapper.delete(benwaInboxMailbox, message4);
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper
                 .findInMailbox(benwaInboxMailbox, MessageRange.from(message3.getUid()), MessageMapper.FetchType.Full, LIMIT);
-        assertThat(retrievedMessageIterator).containsOnly(message3, message5);
+        assertMessages(Lists.newArrayList(retrievedMessageIterator)).containOnly(message3, message5);
     }
 
     @ContractTest
     public void messagesCanBeRetrievedInMailboxWithRangeTypeAll() throws MailboxException, IOException {
         saveMessages();
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT))
-            .containsOnly(message1, message2, message3, message4, message5);
+        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT);
+        assertMessages(Lists.newArrayList(retrievedMessageIterator)).containOnly(message1, message2, message3, message4, message5);
     }
 
     @ContractTest
@@ -235,7 +250,7 @@ public class MessageMapperTest<T extends MapperProvider> {
         messageMapper.delete(benwaInboxMailbox, message1);
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper
                 .findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT);
-        assertThat(retrievedMessageIterator).containsOnly(message2, message3, message4, message5);
+        assertMessages(Lists.newArrayList(retrievedMessageIterator)).containOnly(message2, message3, message4, message5);
     }
 
     @ContractTest
@@ -243,7 +258,7 @@ public class MessageMapperTest<T extends MapperProvider> {
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Metadata;
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(message1.getUid()), fetchType, LIMIT);
-        MessageAssert.assertThat(retrievedMessageIterator.next()).isEqualTo(message1, fetchType);
+        assertThat(retrievedMessageIterator.next()).isEqualTo(message1, fetchType);
         assertThat(retrievedMessageIterator).isEmpty();
     }
 
@@ -252,7 +267,7 @@ public class MessageMapperTest<T extends MapperProvider> {
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Headers;
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(message1.getUid()), fetchType, LIMIT);
-        MessageAssert.assertThat(retrievedMessageIterator.next()).isEqualTo(message1, fetchType);
+        assertThat(retrievedMessageIterator.next()).isEqualTo(message1, fetchType);
         assertThat(retrievedMessageIterator).isEmpty();
     }
 
@@ -261,7 +276,7 @@ public class MessageMapperTest<T extends MapperProvider> {
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Body;
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(message1.getUid()), fetchType, LIMIT);
-        MessageAssert.assertThat(retrievedMessageIterator.next()).isEqualTo(message1, fetchType);
+        assertThat(retrievedMessageIterator.next()).isEqualToWithoutAttachment(message1, fetchType);
         assertThat(retrievedMessageIterator).isEmpty();
     }
 
@@ -315,8 +330,9 @@ public class MessageMapperTest<T extends MapperProvider> {
     public void expungeMarkedForDeletionInMailboxShouldReturnEmptyResultWhenNoMessageInMailboxIsDeleted() throws MailboxException, IOException {
         saveMessages();
         assertThat(messageMapper.expungeMarkedForDeletionInMailbox(benwaInboxMailbox, MessageRange.all())).isEmpty();
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT))
-            .containsOnly(message1, message2, message3, message4, message5);
+        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT);
+
+        assertMessages(Lists.newArrayList(retrievedMessageIterator)).containOnly(message1, message2, message3, message4, message5);
     }
 
     @ContractTest
@@ -331,8 +347,10 @@ public class MessageMapperTest<T extends MapperProvider> {
     public void expungeShouldModifyUnderlyingStorageWithRangeAll() throws MailboxException, IOException {
         saveMessages();
         markThenPerformExpunge(MessageRange.all());
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT))
-            .containsOnly(message2, message3, message5);
+
+        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT);
+
+        assertMessages(Lists.newArrayList(retrievedMessageIterator)).containOnly(message2, message3, message5);
     }
 
     @ContractTest
@@ -347,8 +365,10 @@ public class MessageMapperTest<T extends MapperProvider> {
     public void expungeShouldModifyUnderlyingStorageWithRangeOne() throws MailboxException, IOException {
         saveMessages();
         markThenPerformExpunge(MessageRange.one(message1.getUid()));
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT))
-            .containsOnly(message4, message2, message3, message5);
+
+        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT);
+
+        assertMessages(Lists.newArrayList(retrievedMessageIterator)).containOnly(message4, message2, message3, message5);
     }
 
     @ContractTest
@@ -363,8 +383,10 @@ public class MessageMapperTest<T extends MapperProvider> {
     public void expungeShouldModifyUnderlyingStorageWithRangeFrom() throws MailboxException, IOException {
         saveMessages();
         markThenPerformExpunge(MessageRange.from(message3.getUid()));
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT))
-            .containsOnly(message1, message2, message3, message5);
+
+        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT);
+
+        assertMessages(Lists.newArrayList(retrievedMessageIterator)).containOnly(message1, message2, message3, message5);
     }
 
     @ContractTest
@@ -379,8 +401,10 @@ public class MessageMapperTest<T extends MapperProvider> {
     public void expungeShouldModifyUnderlyingStorageWithRange() throws MailboxException, IOException {
         saveMessages();
         markThenPerformExpunge(MessageRange.range(message3.getUid(), message5.getUid()));
-        assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT))
-            .containsOnly(message1, message2, message3, message5);
+
+        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT);
+
+        assertMessages(Lists.newArrayList(retrievedMessageIterator)).containOnly(message1, message2, message3, message5);
     }
 
     @ContractTest
@@ -455,7 +479,7 @@ public class MessageMapperTest<T extends MapperProvider> {
             LIMIT)
             .next();
 
-        MessageAssert.assertThat(result).isEqualToWithoutUid(message7, MessageMapper.FetchType.Full);
+        assertThat(result).isEqualToWithoutUidAndAttachment(message7, MessageMapper.FetchType.Full);
         assertThat(result.getUid()).isEqualTo(messageMapper.getLastUid(benwaInboxMailbox).get());
     }
 
@@ -516,14 +540,16 @@ public class MessageMapperTest<T extends MapperProvider> {
     public void flagsReplacementShouldReplaceStoredMessageFlags() throws MailboxException {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.FLAGGED), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid()));
-        MessageAssert.assertThat(retrieveMessageFromStorage(message1)).hasFlags(new Flags(Flags.Flag.FLAGGED));
+        assertThat(retrieveMessageFromStorage(message1)).hasFlags(new Flags(Flags.Flag.FLAGGED));
     }
 
     @ContractTest
     public void flagsReplacementShouldReturnAnUpdatedFlagHighlightingTheReplacement() throws MailboxException {
         saveMessages();
         long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
-        assertThat(messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.FLAGGED), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid())))
+        Iterator<UpdatedFlags> updatedFlags = messageMapper.updateFlags(benwaInboxMailbox, 
+                new FlagsUpdateCalculator(new Flags(Flags.Flag.FLAGGED), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid()));
+        assertThat(Lists.newArrayList(updatedFlags))
             .containsOnly(new UpdatedFlags(message1.getUid(), modSeq + 1, new Flags(), new Flags(Flags.Flag.FLAGGED)));
     }
 
@@ -541,7 +567,7 @@ public class MessageMapperTest<T extends MapperProvider> {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.FLAGGED), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid()));
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.ADD), MessageRange.one(message1.getUid()));
-        MessageAssert.assertThat(retrieveMessageFromStorage(message1)).hasFlags(new FlagsBuilder().add(Flags.Flag.SEEN, Flags.Flag.FLAGGED).build());
+        assertThat(retrieveMessageFromStorage(message1)).hasFlags(new FlagsBuilder().add(Flags.Flag.SEEN, Flags.Flag.FLAGGED).build());
     }
 
     @ContractTest
@@ -558,7 +584,7 @@ public class MessageMapperTest<T extends MapperProvider> {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new FlagsBuilder().add(Flags.Flag.FLAGGED, Flags.Flag.SEEN).build(), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid()));
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REMOVE), MessageRange.one(message1.getUid()));
-        MessageAssert.assertThat(retrieveMessageFromStorage(message1)).hasFlags(new Flags(Flags.Flag.FLAGGED));
+        assertThat(retrieveMessageFromStorage(message1)).hasFlags(new Flags(Flags.Flag.FLAGGED));
     }
 
     @ContractTest
@@ -589,27 +615,29 @@ public class MessageMapperTest<T extends MapperProvider> {
         propBuilder.setProperty(StandardNames.NAMESPACE_RFC_2045, StandardNames.MIME_CONTENT_TRANSFER_ENCODING_NAME, "7bit");
         propBuilder.setProperty(StandardNames.MIME_CONTENT_TYPE_PARAMETER_SPACE, StandardNames.MIME_CONTENT_TYPE_PARAMETER_CHARSET_NAME, "US-ASCII");
 
-        SimpleMailboxMessage messageWithProperties = createMessage(benwaWorkMailbox, mapperProvider.generateMessageId(), "Subject: messagePropertiesShouldBeStored \n\nBody\n.\n", BODY_START, propBuilder);
+        MailboxMessage messageWithProperties = createMessage(benwaWorkMailbox, mapperProvider.generateMessageId(), "Subject: messagePropertiesShouldBeStored \n\nBody\n.\n", BODY_START, propBuilder);
         MessageMetaData messageMetaData = messageMapper.add(benwaInboxMailbox, messageWithProperties);
         MailboxMessage message = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(messageMetaData.getUid()), FetchType.Body, 1).next();
-        assertThat(message.getProperties()).containsOnlyElementsOf(propBuilder.toProperties());
-    }
 
+        assertProperties(message.getProperties()).containsOnly(propBuilder.toProperties());
+    }
+    
     @ContractTest
     public void messagePropertiesShouldBeStoredWhenDuplicateEntries() throws Exception {
         PropertyBuilder propBuilder = new PropertyBuilder();
         propBuilder.setProperty(StandardNames.MIME_CONTENT_LANGUAGE_SPACE, StandardNames.MIME_CONTENT_LANGUAGE_NAME, "us");
         propBuilder.setProperty(StandardNames.MIME_CONTENT_LANGUAGE_SPACE, StandardNames.MIME_CONTENT_LANGUAGE_NAME, "fr");
 
-        SimpleMailboxMessage messageWithProperties = createMessage(benwaWorkMailbox, mapperProvider.generateMessageId(), "Subject: messagePropertiesShouldBeStoredWhenDuplicateEntries \n\nBody\n.\n", BODY_START, propBuilder);
+        MailboxMessage messageWithProperties = createMessage(benwaWorkMailbox, mapperProvider.generateMessageId(), "Subject: messagePropertiesShouldBeStoredWhenDuplicateEntries \n\nBody\n.\n", BODY_START, propBuilder);
         MessageMetaData messageMetaData = messageMapper.add(benwaInboxMailbox, messageWithProperties);
         MailboxMessage message = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(messageMetaData.getUid()), FetchType.Body, 1).next();
-        assertThat(message.getProperties()).containsOnlyElementsOf(propBuilder.toProperties());
+
+        assertProperties(message.getProperties()).containsOnly(propBuilder.toProperties());
     }
 
     @ContractTest
     public void messagePropertiesShouldBeStoredWhenNoProperty() throws Exception {
-        SimpleMailboxMessage messageWithProperties = createMessage(benwaWorkMailbox, mapperProvider.generateMessageId(), "Subject: messagePropertiesShouldBeStoredWhenNoProperty \n\nBody\n.\n", BODY_START, new PropertyBuilder());
+        MailboxMessage messageWithProperties = createMessage(benwaWorkMailbox, mapperProvider.generateMessageId(), "Subject: messagePropertiesShouldBeStoredWhenNoProperty \n\nBody\n.\n", BODY_START, new PropertyBuilder());
         MessageMetaData messageMetaData = messageMapper.add(benwaInboxMailbox, messageWithProperties);
         MailboxMessage message = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(messageMetaData.getUid()), FetchType.Body, 1).next();
         assertThat(message.getProperties()).isEmpty();
@@ -621,7 +649,7 @@ public class MessageMapperTest<T extends MapperProvider> {
         PropertyBuilder propBuilder = new PropertyBuilder();
         propBuilder.setTextualLineCount(textualLineCount);
 
-        SimpleMailboxMessage messageWithProperties = createMessage(benwaWorkMailbox, mapperProvider.generateMessageId(), "Subject: messagePropertiesShouldBeStoredWhenDuplicateEntries \n\nBody\n.\n", BODY_START, propBuilder);
+        MailboxMessage messageWithProperties = createMessage(benwaWorkMailbox, mapperProvider.generateMessageId(), "Subject: messagePropertiesShouldBeStoredWhenDuplicateEntries \n\nBody\n.\n", BODY_START, propBuilder);
         MessageMetaData messageMetaData = messageMapper.add(benwaInboxMailbox, messageWithProperties);
         MailboxMessage message = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(messageMetaData.getUid()), FetchType.Body, 1).next();
         assertThat(message.getTextualLineCount()).isEqualTo(textualLineCount);
@@ -633,7 +661,7 @@ public class MessageMapperTest<T extends MapperProvider> {
         PropertyBuilder propBuilder = new PropertyBuilder();
         propBuilder.setMediaType(mediaType);
 
-        SimpleMailboxMessage messageWithProperties = createMessage(benwaWorkMailbox, mapperProvider.generateMessageId(), "Subject: messagePropertiesShouldBeStoredWhenDuplicateEntries \n\nBody\n.\n", BODY_START, propBuilder);
+        MailboxMessage messageWithProperties = createMessage(benwaWorkMailbox, mapperProvider.generateMessageId(), "Subject: messagePropertiesShouldBeStoredWhenDuplicateEntries \n\nBody\n.\n", BODY_START, propBuilder);
         MessageMetaData messageMetaData = messageMapper.add(benwaInboxMailbox, messageWithProperties);
         MailboxMessage message = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(messageMetaData.getUid()), FetchType.Body, 1).next();
         assertThat(message.getMediaType()).isEqualTo(mediaType);
@@ -645,7 +673,7 @@ public class MessageMapperTest<T extends MapperProvider> {
         PropertyBuilder propBuilder = new PropertyBuilder();
         propBuilder.setSubType(subType);
 
-        SimpleMailboxMessage messageWithProperties = createMessage(benwaWorkMailbox, mapperProvider.generateMessageId(), "Subject: messagePropertiesShouldBeStoredWhenDuplicateEntries \n\nBody\n.\n", BODY_START, propBuilder);
+        MailboxMessage messageWithProperties = createMessage(benwaWorkMailbox, mapperProvider.generateMessageId(), "Subject: messagePropertiesShouldBeStoredWhenDuplicateEntries \n\nBody\n.\n", BODY_START, propBuilder);
         MessageMetaData messageMetaData = messageMapper.add(benwaInboxMailbox, messageWithProperties);
         MailboxMessage message = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(messageMetaData.getUid()), FetchType.Body, 1).next();
         assertThat(message.getSubType()).isEqualTo(subType);
@@ -655,7 +683,7 @@ public class MessageMapperTest<T extends MapperProvider> {
     public void userFlagsShouldBeSupported() throws Exception {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(USER_FLAG), FlagsUpdateMode.ADD), MessageRange.one(message1.getUid()));
-        MessageAssert.assertThat(retrieveMessageFromStorage(message1)).hasFlags(new Flags(USER_FLAG));
+        assertThat(retrieveMessageFromStorage(message1)).hasFlags(new Flags(USER_FLAG));
     }
 
     @ContractTest
@@ -670,7 +698,7 @@ public class MessageMapperTest<T extends MapperProvider> {
     public void messagesShouldBeSavedWithTheirUserFlags() throws Exception {
         MailboxMessage message = SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message1);
         messageMapper.add(benwaInboxMailbox, message);
-        MessageAssert.assertThat(retrieveMessageFromStorage(message)).hasFlags(new Flags(USER_FLAG));
+        assertThat(retrieveMessageFromStorage(message)).hasFlags(new Flags(USER_FLAG));
     }
 
     private Map<MessageUid, MessageMetaData> markThenPerformExpunge(MessageRange range) throws MailboxException {
@@ -679,10 +707,12 @@ public class MessageMapperTest<T extends MapperProvider> {
         return messageMapper.expungeMarkedForDeletionInMailbox(benwaInboxMailbox, range);
     }
 
-    private SimpleMailbox createMailbox(MailboxPath mailboxPath) {
+    private SimpleMailbox createMailbox(MailboxPath mailboxPath) throws MailboxException {
         SimpleMailbox mailbox = new SimpleMailbox(mailboxPath, UID_VALIDITY);
-        MailboxId id = mapperProvider.generateId();
-        mailbox.setMailboxId(id);
+        mailbox.setMailboxId(mapperProvider.generateId());
+        
+        mailboxMapper.save(mailbox);
+
         return mailbox;
     }
     
@@ -705,7 +735,7 @@ public class MessageMapperTest<T extends MapperProvider> {
         return messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(message.getUid()), MessageMapper.FetchType.Metadata, LIMIT).next();
     }
     
-    private SimpleMailboxMessage createMessage(Mailbox mailbox, MessageId messageId, String content, int bodyStart, PropertyBuilder propertyBuilder) {
+    private MailboxMessage createMessage(Mailbox mailbox, MessageId messageId, String content, int bodyStart, PropertyBuilder propertyBuilder) {
         return new SimpleMailboxMessage(messageId, new Date(), content.length(), bodyStart, new SharedByteArrayInputStream(content.getBytes()), new Flags(), propertyBuilder, mailbox.getMailboxId());
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ccb1eca/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
index 5497d14..ff9242d 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
@@ -183,8 +183,7 @@ public class MessageWithAttachmentMapperTest<T extends MapperProvider> {
     public void messagesCanBeRetrievedInMailboxWithRangeTypeOne() throws MailboxException, IOException{
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Full;
-        int limit =10;
-        assertThat(messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith1Attachment.getUid()), fetchType, limit).next())
+        assertThat(messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith1Attachment.getUid()), fetchType, LIMIT).next())
             .isEqualTo(messageWith1Attachment, fetchType);
     }
 


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


[6/6] james-project git commit: Merge remote-tracking branch 'quynhn/MAILBOX-279'

Posted by ro...@apache.org.
Merge remote-tracking branch 'quynhn/MAILBOX-279'


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

Branch: refs/heads/master
Commit: 97de263826738ddcd1906428dcff88846d7fb874
Parents: 84c6694 60f9dcd
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Mon Jan 9 10:12:49 2017 +0100
Committer: Raphael Ouazana <ra...@linagora.com>
Committed: Mon Jan 9 10:12:49 2017 +0100

----------------------------------------------------------------------
 .../cassandra/mail/CassandraMapperProvider.java |   4 +-
 .../mailbox/jpa/mail/JPAMailboxMapper.java      |  10 +-
 .../mailbox/jpa/mail/JPAMessageMapper.java      | 158 ++++++-------
 .../mailbox/jpa/mail/model/JPAMailbox.java      |   9 +-
 .../openjpa/AbstractJPAMailboxMessage.java      |  29 +--
 .../mailbox/jpa/mail/JPAMapperProvider.java     |  16 +-
 .../jpa/mail/TransactionalMessageMapper.java    | 157 +++++++++++++
 .../inmemory/mail/InMemoryMapperProvider.java   |   4 +-
 .../james/mailbox/store/mail/MessageUtils.java  | 118 ++++++++++
 .../mailbox/store/mail/MessageUtilsTest.java    | 117 ++++++++++
 .../store/mail/model/AnnotationMapperTest.java  |   2 +-
 .../store/mail/model/AttachmentMapperTest.java  |   2 +-
 .../store/mail/model/ListMessageAssert.java     | 145 ++++++++++++
 .../store/mail/model/ListMessageAssertTest.java | 230 +++++++++++++++++++
 .../mail/model/ListMessagePropertiesAssert.java |  99 ++++++++
 .../model/ListMessagePropertiesAssertTest.java  |  97 ++++++++
 .../store/mail/model/MailboxMapperTest.java     |   2 +-
 .../store/mail/model/MapperProvider.java        |   2 +-
 .../mailbox/store/mail/model/MessageAssert.java |  40 ++--
 .../store/mail/model/MessageIdMapperTest.java   |   2 +-
 .../store/mail/model/MessageMapperTest.java     | 138 ++++++-----
 .../store/mail/model/MessageMoveTest.java       |   2 +-
 .../model/MessageWithAttachmentMapperTest.java  |  54 +++--
 23 files changed, 1232 insertions(+), 205 deletions(-)
----------------------------------------------------------------------



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


[3/6] james-project git commit: MAILBOX-279: JPAMessageMapper will extends JPATransactionalMapper as the standard for all JPA

Posted by ro...@apache.org.
MAILBOX-279: JPAMessageMapper will extends JPATransactionalMapper as the standard for all JPA


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

Branch: refs/heads/master
Commit: a377d4386db26b57ae34f9a08d7599a0e85e5584
Parents: d4debb5
Author: Quynh Nguyen <qn...@linagora.com>
Authored: Wed Dec 7 14:11:50 2016 +0700
Committer: Quynh Nguyen <qn...@linagora.com>
Committed: Mon Jan 9 15:11:51 2017 +0700

----------------------------------------------------------------------
 .../mailbox/jpa/mail/JPAMessageMapper.java      | 175 ++++++++++---------
 .../mailbox/store/mail/MessageMetadata.java     |  69 ++++++++
 2 files changed, 165 insertions(+), 79 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/a377d438/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
index 84c4c22..b7542c6 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
@@ -23,9 +23,8 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
-import javax.persistence.EntityManager;
+import javax.mail.Flags;
 import javax.persistence.EntityManagerFactory;
-import javax.persistence.EntityTransaction;
 import javax.persistence.PersistenceException;
 import javax.persistence.Query;
 
@@ -33,6 +32,7 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.JPAId;
+import org.apache.james.mailbox.jpa.JPATransactionalMapper;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMailboxMessage;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAEncryptedMailboxMessage;
@@ -41,85 +41,29 @@ import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMailboxMessag
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageRange.Type;
+import org.apache.james.mailbox.model.UpdatedFlags;
+import org.apache.james.mailbox.store.FlagsUpdateCalculator;
 import org.apache.james.mailbox.store.SimpleMessageMetaData;
-import org.apache.james.mailbox.store.mail.AbstractMessageMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
+import org.apache.james.mailbox.store.mail.MessageMetadata;
 import org.apache.james.mailbox.store.mail.ModSeqProvider;
 import org.apache.james.mailbox.store.mail.UidProvider;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.openjpa.persistence.ArgumentException;
 
+import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 
 /**
  * JPA implementation of a {@link MessageMapper}. This class is not thread-safe!
  */
-public class JPAMessageMapper extends AbstractMessageMapper implements MessageMapper {
-    protected EntityManagerFactory entityManagerFactory;
-    protected EntityManager entityManager;
-
-    public JPAMessageMapper(MailboxSession session, UidProvider uidProvider,
-            ModSeqProvider modSeqProvider, EntityManagerFactory entityManagerFactory) {
-        super(session, uidProvider, modSeqProvider);
-        this.entityManagerFactory = entityManagerFactory;
-    }
-
-    /**
-     * Return the currently used {@link EntityManager} or a new one if none
-     * exists.
-     * 
-     * @return entitymanger
-     */
-    public EntityManager getEntityManager() {
-        if (entityManager != null)
-            return entityManager;
-        entityManager = entityManagerFactory.createEntityManager();
-        return entityManager;
-    }
+public class JPAMessageMapper extends JPATransactionalMapper implements MessageMapper {
+    private final MessageMetadata messageMetadataMapper;
 
-    /**
-     * @see org.apache.james.mailbox.store.transaction.TransactionalMapper#begin()
-     */
-    protected void begin() throws MailboxException {
-        try {
-            getEntityManager().getTransaction().begin();
-        } catch (PersistenceException e) {
-            throw new MailboxException("Begin of transaction failed", e);
-        }
-    }
-
-    /**
-     * Commit the Transaction and close the EntityManager
-     */
-    protected void commit() throws MailboxException {
-        try {
-            getEntityManager().getTransaction().commit();
-        } catch (PersistenceException e) {
-            throw new MailboxException("Commit of transaction failed", e);
-        }
-    }
-
-    /**
-     * @see org.apache.james.mailbox.store.transaction.TransactionalMapper#rollback()
-     */
-    protected void rollback() throws MailboxException {
-        EntityTransaction transaction = entityManager.getTransaction();
-        // check if we have a transaction to rollback
-        if (transaction.isActive()) {
-            getEntityManager().getTransaction().rollback();
-        }
-    }
-
-    /**
-     * Close open {@link EntityManager}
-     */
-    public void endRequest() {
-        if (entityManager != null) {
-            if (entityManager.isOpen())
-                entityManager.close();
-            entityManager = null;
-        }
+    public JPAMessageMapper(MailboxSession mailboxSession, UidProvider uidProvider, ModSeqProvider modSeqProvider, EntityManagerFactory entityManagerFactory) {
+        super(entityManagerFactory);
+        this.messageMetadataMapper = new MessageMetadata(mailboxSession, uidProvider, modSeqProvider);
     }
 
     /**
@@ -127,6 +71,7 @@ public class JPAMessageMapper extends AbstractMessageMapper implements MessageMa
      *      org.apache.james.mailbox.model.MessageRange,
      *      org.apache.james.mailbox.store.mail.MessageMapper.FetchType, int)
      */
+    @Override
     public Iterator<MailboxMessage> findInMailbox(Mailbox mailbox, MessageRange set, FetchType fType, int max)
             throws MailboxException {
         try {
@@ -191,12 +136,22 @@ public class JPAMessageMapper extends AbstractMessageMapper implements MessageMa
      */
     public void delete(Mailbox mailbox, MailboxMessage message) throws MailboxException {
         try {
-            getEntityManager().remove(message);
+            AbstractJPAMailboxMessage jpaMessage = getEntityManager().find(AbstractJPAMailboxMessage.class, buildKey(mailbox, message));
+            getEntityManager().remove(jpaMessage);
+
         } catch (PersistenceException e) {
             throw new MailboxException("Delete of message " + message + " failed in mailbox " + mailbox, e);
         }
     }
 
+    private AbstractJPAMailboxMessage.MailboxIdUidKey buildKey(Mailbox mailbox, MailboxMessage message) {
+        JPAId mailboxId = (JPAId) mailbox.getMailboxId();
+        AbstractJPAMailboxMessage.MailboxIdUidKey key = new AbstractJPAMailboxMessage.MailboxIdUidKey();
+        key.mailbox = mailboxId.getRawId();
+        key.uid = message.getUid().asLong();
+        return key;
+    }
+
     @Override
     @SuppressWarnings("unchecked")
     public MessageUid findFirstUnseenMessageUid(Mailbox mailbox) throws MailboxException {
@@ -262,8 +217,8 @@ public class JPAMessageMapper extends AbstractMessageMapper implements MessageMa
             default:
             case ALL:
                 results = findDeletedMessagesInMailbox(mailboxId);
-                data = createMetaData(results);
                 deleteDeletedMessagesInMailbox(mailboxId);
+                data = createMetaData(results);
                 break;
             }
 
@@ -285,15 +240,71 @@ public class JPAMessageMapper extends AbstractMessageMapper implements MessageMa
     }
 
     @Override
-    protected MessageMetaData copy(Mailbox mailbox, MessageUid uid, long modSeq, MailboxMessage original)
+    public MessageMetaData add(Mailbox mailbox, MailboxMessage message) throws MailboxException {
+        messageMetadataMapper.enrichMessage(mailbox, message);
+
+        return save(mailbox, message);
+    }
+
+    @Override
+    public Iterator<UpdatedFlags> updateFlags(Mailbox mailbox, FlagsUpdateCalculator flagsUpdateCalculator,
+            MessageRange set) throws MailboxException {
+        ImmutableList.Builder<UpdatedFlags> updatedFlags = ImmutableList.builder();
+        Iterator<MailboxMessage> messages = findInMailbox(mailbox, set, FetchType.Metadata, -1);
+        
+        long modSeq = -1;
+        if (messages.hasNext()) {
+            modSeq = messageMetadataMapper.nextModSeq(mailbox);
+        }
+        while(messages.hasNext()) {
+            MailboxMessage member = messages.next();
+            Flags originalFlags = member.createFlags();
+            member.setFlags(flagsUpdateCalculator.buildNewFlags(originalFlags));
+            Flags newFlags = member.createFlags();
+            if (UpdatedFlags.flagsChanged(originalFlags, newFlags)) {
+                member.setModSeq(modSeq);
+                save(mailbox, member);
+            }
+
+            UpdatedFlags uFlags = new UpdatedFlags(member.getUid(), member.getModSeq(), originalFlags, newFlags);
+            
+            updatedFlags.add(uFlags);
+            
+        }
+
+        return updatedFlags.build().iterator();
+    }
+
+    @Override
+    public MessageMetaData copy(Mailbox mailbox, MailboxMessage original) throws MailboxException {
+        return copy(mailbox, messageMetadataMapper.nextUid(mailbox), messageMetadataMapper.nextModSeq(mailbox), original);  
+    }
+
+    @Override
+    public Optional<MessageUid> getLastUid(Mailbox mailbox) throws MailboxException {
+        return messageMetadataMapper.getLastUid(mailbox);
+    }
+
+    @Override
+    public long getHighestModSeq(Mailbox mailbox) throws MailboxException {
+        return messageMetadataMapper.getHighestModSeq(mailbox);
+    }
+
+    private MessageMetaData copy(Mailbox mailbox, MessageUid uid, long modSeq, MailboxMessage original)
             throws MailboxException {
         MailboxMessage copy;
+        JPAMailbox currentMailbox;
+        if (mailbox instanceof JPAMailbox) {
+            currentMailbox = (JPAMailbox) mailbox;
+        } else {
+            currentMailbox = new JPAMailbox(mailbox);
+        }
         if (original instanceof JPAStreamingMailboxMessage) {
-            copy = new JPAStreamingMailboxMessage((JPAMailbox) mailbox, uid, modSeq, original);
+            copy = new JPAStreamingMailboxMessage(currentMailbox, uid, modSeq, original);
         } else if (original instanceof JPAEncryptedMailboxMessage) {
-            copy = new JPAEncryptedMailboxMessage((JPAMailbox) mailbox, uid, modSeq, original);
+            copy = new JPAEncryptedMailboxMessage(currentMailbox, uid, modSeq, original);
         } else {
-            copy = new JPAMailboxMessage((JPAMailbox) mailbox, uid, modSeq, original);
+            copy = new JPAMailboxMessage(currentMailbox, uid, modSeq, original);
         }
         return save(mailbox, copy);
     }
@@ -303,19 +314,25 @@ public class JPAMessageMapper extends AbstractMessageMapper implements MessageMa
      *      MailboxMessage)
      */
     protected MessageMetaData save(Mailbox mailbox, MailboxMessage message) throws MailboxException {
-
         try {
-
             // We need to reload a "JPA attached" mailbox, because the provide
             // mailbox is already "JPA detached"
             // If we don't this, we will get an
             // org.apache.openjpa.persistence.ArgumentException.
             JPAId mailboxId = (JPAId) mailbox.getMailboxId();
-            ((AbstractJPAMailboxMessage) message)
-                    .setMailbox(getEntityManager().find(JPAMailbox.class, mailboxId.getRawId()));
+            JPAMailbox currentMailbox = getEntityManager().find(JPAMailbox.class, mailboxId.getRawId());
+            if (message instanceof AbstractJPAMailboxMessage) {
+                ((AbstractJPAMailboxMessage) message).setMailbox(currentMailbox);
+
+                getEntityManager().persist(message);
+                return new SimpleMessageMetaData(message);
+            } else {
+                JPAMailboxMessage persistData = new JPAMailboxMessage(currentMailbox, message.getUid(), message.getModSeq(), message);
+                persistData.setFlags(new Flags());
+                getEntityManager().persist(persistData);
+                return new SimpleMessageMetaData(persistData);
+            }
 
-            getEntityManager().persist(message);
-            return new SimpleMessageMetaData(message);
         } catch (PersistenceException e) {
             throw new MailboxException("Save of message " + message + " failed in mailbox " + mailbox, e);
         } catch (ArgumentException e) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/a377d438/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMetadata.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMetadata.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMetadata.java
new file mode 100644
index 0000000..1907cf0
--- /dev/null
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMetadata.java
@@ -0,0 +1,69 @@
+/****************************************************************
+ * 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.mail;
+
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+
+import com.google.common.base.Optional;
+
+public class MessageMetadata {
+    private final MailboxSession mailboxSession;
+    private final UidProvider uidProvider;
+    private final ModSeqProvider modSeqProvider;
+
+    public MessageMetadata(MailboxSession mailboxSession, UidProvider uidProvider, ModSeqProvider modSeqProvider) {
+        this.mailboxSession = mailboxSession;
+        this.uidProvider = uidProvider;
+        this.modSeqProvider = modSeqProvider;
+    }
+    
+    public long getHighestModSeq(Mailbox mailbox) throws MailboxException {
+        return modSeqProvider.highestModSeq(mailboxSession, mailbox);
+    }
+
+    public Optional<MessageUid> getLastUid(Mailbox mailbox) throws MailboxException {
+        return uidProvider.lastUid(mailboxSession, mailbox);
+    }
+    
+
+    public MessageUid nextUid(Mailbox mailbox) throws MailboxException {
+        return uidProvider.nextUid(mailboxSession, mailbox);
+    }
+
+    public long nextModSeq(Mailbox mailbox) throws MailboxException {
+        if (modSeqProvider != null) {
+            return modSeqProvider.nextModSeq(mailboxSession, mailbox);
+        }
+        return -1;
+    }
+
+    public void enrichMessage(Mailbox mailbox, MailboxMessage message) throws MailboxException { 
+        message.setUid(nextUid(mailbox));
+        
+        if (modSeqProvider != null) {
+            message.setModSeq(nextModSeq(mailbox));
+        }
+    }
+
+}


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


[2/6] james-project git commit: MAILBOX-279: Add more testing with message's attachment

Posted by ro...@apache.org.
MAILBOX-279: Add more testing with message's attachment


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

Branch: refs/heads/master
Commit: d4debb50691bd94d189283ac269b52e968ba7adf
Parents: 20e6f63
Author: Quynh Nguyen <qn...@linagora.com>
Authored: Wed Dec 7 13:54:53 2016 +0700
Committer: Quynh Nguyen <qn...@linagora.com>
Committed: Mon Jan 9 15:11:51 2017 +0700

----------------------------------------------------------------------
 .../mailbox/store/mail/model/MessageAssert.java | 40 ++++++++++-----
 .../model/MessageWithAttachmentMapperTest.java  | 51 ++++++++++++++------
 2 files changed, 62 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d4debb50/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageAssert.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageAssert.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageAssert.java
index b002da4..7267924 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageAssert.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageAssert.java
@@ -25,6 +25,7 @@ import javax.mail.Flags;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.store.mail.MessageMapper;
+import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.assertj.core.api.AbstractAssert;
 
 import com.google.common.base.Objects;
@@ -39,7 +40,33 @@ public class MessageAssert extends AbstractAssert<MessageAssert, MailboxMessage>
         return new MessageAssert(actual);
     }
 
+    public MessageAssert isEqualTo(MailboxMessage expected, MessageMapper.FetchType usedFetchType) throws IOException {
+        isNotNull();
+        if (!Objects.equal(actual.getUid(), expected.getUid())) {
+            failWithMessage("Expected UID to be <%s> but was <%s>", expected.getUid(), actual.getUid());
+        }
+        return isEqualToWithoutUid(expected, usedFetchType);
+    }
+
+    public MessageAssert isEqualToWithoutAttachment(MailboxMessage expected, MessageMapper.FetchType usedFetchType) throws IOException {
+        isNotNull();
+        if (!Objects.equal(actual.getUid(), expected.getUid())) {
+            failWithMessage("Expected UID to be <%s> but was <%s>", expected.getUid(), actual.getUid());
+        }
+        return isEqualToWithoutUidAndAttachment(expected, usedFetchType);
+    }
+
     public MessageAssert isEqualToWithoutUid(MailboxMessage expected, MessageMapper.FetchType usedFetchType) throws IOException {
+        isEqualToWithoutUidAndAttachment(expected, usedFetchType);
+        if (usedFetchType == MessageMapper.FetchType.Full || usedFetchType == MessageMapper.FetchType.Body) {
+            if (!Objects.equal(actual.getAttachments(), expected.getAttachments())) {
+                failWithMessage("Expected attachments to be <%s> but was <%s>", expected.getAttachments(), actual.getAttachments());
+            }
+        }
+        return this;
+    }
+
+    public MessageAssert isEqualToWithoutUidAndAttachment(MailboxMessage expected, FetchType usedFetchType)  throws IOException {
         isNotNull();
         if (!Objects.equal(actual.getMailboxId(), expected.getMailboxId())) {
             failWithMessage("Expected Mailbox ID to be <%s> but was <%s>", expected.getMailboxId().toString(), actual.getMailboxId().toString());
@@ -74,22 +101,9 @@ public class MessageAssert extends AbstractAssert<MessageAssert, MailboxMessage>
                 failWithMessage("Expected Body content to be <%s> but was <%s>", IOUtils.toString(expected.getBodyContent()), IOUtils.toString(actual.getBodyContent()));
             }
         }
-        if (usedFetchType == MessageMapper.FetchType.Full || usedFetchType == MessageMapper.FetchType.Body) {
-            if (!Objects.equal(actual.getAttachments(), expected.getAttachments())) {
-                failWithMessage("Expected attachments to be <%s> but was <%s>", expected.getAttachments(), actual.getAttachments());
-            }
-        }
         return this;
     }
 
-    public MessageAssert isEqualTo(MailboxMessage expected, MessageMapper.FetchType usedFetchType) throws IOException {
-        isNotNull();
-        if (!Objects.equal(actual.getUid(), expected.getUid())) {
-            failWithMessage("Expected UID to be <%s> but was <%s>", expected.getUid(), actual.getUid());
-        }
-        return isEqualToWithoutUid(expected, usedFetchType);
-    }
-
     public MessageAssert hasFlags(Flags flags) {
         if (flags.contains(Flags.Flag.ANSWERED) != actual.isAnswered()) {
             failWithMessage("Expected ANSWERED flag to be <%s> but was <%>", flags.contains(Flags.Flag.ANSWERED), actual.isAnswered());

http://git-wip-us.apache.org/repos/asf/james-project/blob/d4debb50/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
index 2bcecff..5497d14 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.store.mail.model;
 
+import static org.apache.james.mailbox.store.mail.model.MessageAssert.assertThat;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.IOException;
@@ -69,8 +70,8 @@ public class MessageWithAttachmentMapperTest<T extends MapperProvider> {
     private SimpleMailbox attachmentsMailbox;
     
     private SimpleMailboxMessage messageWithoutAttachment;
-    private SimpleMailboxMessage message7With1Attachment;
-    private SimpleMailboxMessage message8With2Attachments;
+    private SimpleMailboxMessage messageWith1Attachment;
+    private SimpleMailboxMessage messageWith2Attachments;
 
     @Rule
     public ExpectedException expected = ExpectedException.none();
@@ -101,13 +102,13 @@ public class MessageWithAttachmentMapperTest<T extends MapperProvider> {
                 .type("content")
                 .build();
         attachmentMapper.storeAttachment(attachment2);
-        message7With1Attachment = createMessage(attachmentsMailbox, mapperProvider.generateMessageId(), "Subject: Test7 \n\nBody7\n.\n", BODY_START, new PropertyBuilder(), 
+        messageWith1Attachment = createMessage(attachmentsMailbox, mapperProvider.generateMessageId(), "Subject: Test7 \n\nBody7\n.\n", BODY_START, new PropertyBuilder(), 
                 ImmutableList.of(MessageAttachment.builder()
                         .attachment(attachment)
                         .cid(Cid.from("cid"))
                         .isInline(true)
                         .build()));
-        message8With2Attachments = createMessage(attachmentsMailbox, mapperProvider.generateMessageId(), "Subject: Test8 \n\nBody8\n.\n", BODY_START, new PropertyBuilder(),
+        messageWith2Attachments = createMessage(attachmentsMailbox, mapperProvider.generateMessageId(), "Subject: Test8 \n\nBody8\n.\n", BODY_START, new PropertyBuilder(),
                 ImmutableList.of(
                         MessageAttachment.builder()
                             .attachment(attachment)
@@ -132,24 +133,24 @@ public class MessageWithAttachmentMapperTest<T extends MapperProvider> {
     public void messagesRetrievedUsingFetchTypeFullShouldHaveAttachmentsLoadedWhenOneAttachment() throws MailboxException, IOException{
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Full;
-        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(message7With1Attachment.getUid()), fetchType, LIMIT);
-        assertThat(retrievedMessageIterator.next().getAttachments()).isEqualTo(message7With1Attachment.getAttachments());
+        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith1Attachment.getUid()), fetchType, LIMIT);
+        assertThat(retrievedMessageIterator.next().getAttachments()).isEqualTo(messageWith1Attachment.getAttachments());
     }
 
     @ContractTest
     public void messagesRetrievedUsingFetchTypeFullShouldHaveAttachmentsLoadedWhenTwoAttachments() throws MailboxException, IOException{
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Full;
-        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(message8With2Attachments.getUid()), fetchType, LIMIT);
-        assertThat(retrievedMessageIterator.next().getAttachments()).isEqualTo(message8With2Attachments.getAttachments());
+        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith2Attachments.getUid()), fetchType, LIMIT);
+        assertThat(retrievedMessageIterator.next().getAttachments()).isEqualTo(messageWith2Attachments.getAttachments());
     }
 
     @ContractTest
     public void messagesRetrievedUsingFetchTypeBodyShouldHaveAttachmentsLoadedWhenOneAttachment() throws MailboxException, IOException{
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Body;
-        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(message7With1Attachment.getUid()), fetchType, LIMIT);
-        assertThat(retrievedMessageIterator.next().getAttachments()).isEqualTo(message7With1Attachment.getAttachments());
+        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith1Attachment.getUid()), fetchType, LIMIT);
+        assertThat(retrievedMessageIterator.next().getAttachments()).isEqualTo(messageWith1Attachment.getAttachments());
     }
 
     @ContractTest
@@ -157,7 +158,7 @@ public class MessageWithAttachmentMapperTest<T extends MapperProvider> {
         Assume.assumeTrue(mapperProvider.supportPartialAttachmentFetch());
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Headers;
-        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(message7With1Attachment.getUid()), fetchType, LIMIT);
+        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith1Attachment.getUid()), fetchType, LIMIT);
         assertThat(retrievedMessageIterator.next().getAttachments()).isEmpty();
     }
 
@@ -166,7 +167,7 @@ public class MessageWithAttachmentMapperTest<T extends MapperProvider> {
         Assume.assumeTrue(mapperProvider.supportPartialAttachmentFetch());
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Metadata;
-        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(message7With1Attachment.getUid()), fetchType, LIMIT);
+        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith1Attachment.getUid()), fetchType, LIMIT);
         assertThat(retrievedMessageIterator.next().getAttachments()).isEmpty();
     }
 
@@ -178,6 +179,24 @@ public class MessageWithAttachmentMapperTest<T extends MapperProvider> {
         assertThat(retrievedMessageIterator.next().getAttachments()).isEmpty();
     }
     
+    @ContractTest
+    public void messagesCanBeRetrievedInMailboxWithRangeTypeOne() throws MailboxException, IOException{
+        saveMessages();
+        MessageMapper.FetchType fetchType = MessageMapper.FetchType.Full;
+        int limit =10;
+        assertThat(messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith1Attachment.getUid()), fetchType, limit).next())
+            .isEqualTo(messageWith1Attachment, fetchType);
+    }
+
+    @ContractTest
+    public void messagesRetrievedUsingFetchTypeBodyShouldHaveBodyDataLoaded() throws MailboxException, IOException{
+        saveMessages();
+        MessageMapper.FetchType fetchType = MessageMapper.FetchType.Body;
+        Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith1Attachment.getUid()), fetchType, LIMIT);
+        assertThat(retrievedMessageIterator.next()).isEqualTo(messageWith1Attachment, fetchType);
+        assertThat(retrievedMessageIterator).isEmpty();
+    }
+
     private SimpleMailbox createMailbox(MailboxPath mailboxPath) {
         SimpleMailbox mailbox = new SimpleMailbox(mailboxPath, UID_VALIDITY);
         MailboxId id = mapperProvider.generateId();
@@ -188,10 +207,10 @@ public class MessageWithAttachmentMapperTest<T extends MapperProvider> {
     private void saveMessages() throws MailboxException {
         messageMapper.add(attachmentsMailbox, messageWithoutAttachment);
         messageWithoutAttachment.setModSeq(messageMapper.getHighestModSeq(attachmentsMailbox));
-        messageMapper.add(attachmentsMailbox, message7With1Attachment);
-        message7With1Attachment.setModSeq(messageMapper.getHighestModSeq(attachmentsMailbox));
-        messageMapper.add(attachmentsMailbox, message8With2Attachments);
-        message8With2Attachments.setModSeq(messageMapper.getHighestModSeq(attachmentsMailbox));
+        messageMapper.add(attachmentsMailbox, messageWith1Attachment);
+        messageWith1Attachment.setModSeq(messageMapper.getHighestModSeq(attachmentsMailbox));
+        messageMapper.add(attachmentsMailbox, messageWith2Attachments);
+        messageWith2Attachments.setModSeq(messageMapper.getHighestModSeq(attachmentsMailbox));
     }
 
     private SimpleMailboxMessage createMessage(Mailbox mailbox, MessageId messageId, String content, int bodyStart, PropertyBuilder propertyBuilder, List<MessageAttachment> attachments) {


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