Repository: james-project
Updated Branches:
  refs/heads/master 13f3028b9 -> f53d0eb93


MAILBOX-268 Store in Cassandra attachments ids related to a 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/f53d0eb9
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f53d0eb9
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f53d0eb9

Branch: refs/heads/master
Commit: f53d0eb93045212d778b211384dde48ef1cefc99
Parents: 02aaedb
Author: Raphael Ouazana <raphael.ouaz...@linagora.com>
Authored: Wed May 25 11:42:46 2016 +0200
Committer: Raphael Ouazana <raphael.ouaz...@linagora.com>
Committed: Fri May 27 15:30:30 2016 +0200

----------------------------------------------------------------------
 .../cassandra/mail/CassandraMessageMapper.java  | 24 +++++++-
 .../modules/CassandraMessageModule.java         |  2 +
 .../cassandra/table/CassandraMessageTable.java  |  5 +-
 .../mailbox/hbase/mail/HBaseMailboxMessage.java |  7 +++
 .../jcr/mail/model/JCRMailboxMessage.java       |  7 +++
 .../openjpa/AbstractJPAMailboxMessage.java      |  7 +++
 .../maildir/mail/model/MaildirMessage.java      |  7 +++
 .../mail/InMemoryMessageMapperTest.java         | 11 ++++
 .../mail/model/DelegatingMailboxMessage.java    |  5 ++
 .../james/mailbox/store/mail/model/Message.java |  8 +++
 .../mail/model/impl/SimpleMailboxMessage.java   | 36 +++++++----
 .../store/mail/model/impl/SimpleMessage.java    | 27 ++++++--
 .../mailbox/store/SimpleMailboxMembership.java  |  7 +++
 .../mail/model/AbstractMessageMapperTest.java   | 65 ++++++++++++++++++++
 .../mailbox/store/mail/model/MessageAssert.java |  5 ++
 15 files changed, 201 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f53d0eb9/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index 2e18dec..c2420cd 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -28,6 +28,7 @@ import static 
com.datastax.driver.core.querybuilder.QueryBuilder.lte;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.set;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.update;
+import static 
org.apache.james.mailbox.cassandra.table.CassandraMessageTable.ATTACHMENTS_IDS;
 import static 
org.apache.james.mailbox.cassandra.table.CassandraMessageTable.BODY;
 import static 
org.apache.james.mailbox.cassandra.table.CassandraMessageTable.BODY_CONTENT;
 import static 
org.apache.james.mailbox.cassandra.table.CassandraMessageTable.BODY_OCTECTS;
@@ -89,6 +90,7 @@ import org.apache.james.mailbox.store.SimpleMessageMetaData;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.ModSeqProvider;
 import org.apache.james.mailbox.store.mail.UidProvider;
+import org.apache.james.mailbox.store.mail.model.AttachmentId;
 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;
@@ -105,6 +107,7 @@ import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.datastax.driver.core.querybuilder.Select;
 import com.datastax.driver.core.querybuilder.Select.Where;
 import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
 import com.google.common.io.ByteStreams;
 import com.google.common.primitives.Bytes;
 
@@ -300,7 +303,8 @@ public class CassandraMessageMapper implements 
MessageMapper {
                 buildContent(row, fetchType),
                 getFlags(row),
                 getPropertyBuilder(row),
-                CassandraId.of(row.getUUID(MAILBOX_ID)));
+                CassandraId.of(row.getUUID(MAILBOX_ID)),
+                getAttachmentsIds(row, fetchType));
         message.setUid(row.getLong(IMAP_UID));
         message.setModSeq(row.getLong(MOD_SEQ));
         return message;
@@ -328,6 +332,19 @@ public class CassandraMessageMapper implements 
MessageMapper {
         return property;
     }
 
+    private List<AttachmentId> getAttachmentsIds(Row row, FetchType fetchType) 
{
+        switch (fetchType) {
+        case Full:
+        case Body:
+            return row.getList(ATTACHMENTS_IDS, String.class)
+                    .stream()
+                    .map(AttachmentId::from)
+                    
.collect(org.apache.james.util.streams.Collectors.toImmutableList());
+        default:
+            return ImmutableList.of();
+        }
+    }
+
     private MessageMetaData save(Mailbox mailbox, MailboxMessage message) 
throws MailboxException {
         try {
             CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
@@ -356,7 +373,10 @@ public class CassandraMessageMapper implements 
MessageMapper {
                         .setString(Properties.NAME, x.getLocalName())
                         .setString(Properties.VALUE, x.getValue()))
                     .collect(Collectors.toList()))
-                .value(TEXTUAL_LINE_COUNT, message.getTextualLineCount()));
+                .value(TEXTUAL_LINE_COUNT, message.getTextualLineCount())
+                .value(ATTACHMENTS_IDS, message.getAttachmentsIds().stream()
+                    .map(AttachmentId::getId)
+                    .collect(Collectors.toList())));
 
             return new SimpleMessageMetaData(message);
         } catch (IOException e) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/f53d0eb9/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
index d401782..3565213 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
@@ -34,6 +34,7 @@ import static com.datastax.driver.core.DataType.bigint;
 import static com.datastax.driver.core.DataType.blob;
 import static com.datastax.driver.core.DataType.cboolean;
 import static com.datastax.driver.core.DataType.cint;
+import static com.datastax.driver.core.DataType.frozenList;
 import static com.datastax.driver.core.DataType.set;
 import static com.datastax.driver.core.DataType.text;
 import static com.datastax.driver.core.DataType.timestamp;
@@ -68,6 +69,7 @@ public class CassandraMessageModule implements 
CassandraModule {
                     .addColumn(CassandraMessageTable.Flag.SEEN, cboolean())
                     .addColumn(CassandraMessageTable.Flag.USER, cboolean())
                     .addColumn(CassandraMessageTable.Flag.USER_FLAGS, 
set(text()))
+                    .addColumn(CassandraMessageTable.ATTACHMENTS_IDS, 
frozenList(text()))
                     .addUDTListColumn(CassandraMessageTable.PROPERTIES, 
SchemaBuilder.frozen(CassandraMessageTable.PROPERTIES))));
         index = Arrays.asList(
             new CassandraIndex(

http://git-wip-us.apache.org/repos/asf/james-project/blob/f53d0eb9/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageTable.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageTable.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageTable.java
index 446ca50..e2e19af 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageTable.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageTable.java
@@ -37,11 +37,12 @@ public interface CassandraMessageTable {
     String BODY_CONTENT = "bodyContent";
     String HEADER_CONTENT = "headerContent";
     String PROPERTIES = "properties";
+    String ATTACHMENTS_IDS = "attachmentsIds";
 
-    String[] FIELDS = { MAILBOX_ID, IMAP_UID, INTERNAL_DATE, MOD_SEQ, 
BODY_START_OCTET, FULL_CONTENT_OCTETS, BODY_OCTECTS, Flag.ANSWERED, 
Flag.DELETED, Flag.DRAFT, Flag.FLAGGED, Flag.RECENT, Flag.SEEN, Flag.USER, 
Flag.USER_FLAGS, BODY_CONTENT, HEADER_CONTENT, TEXTUAL_LINE_COUNT, PROPERTIES };
+    String[] FIELDS = { MAILBOX_ID, IMAP_UID, INTERNAL_DATE, MOD_SEQ, 
BODY_START_OCTET, FULL_CONTENT_OCTETS, BODY_OCTECTS, Flag.ANSWERED, 
Flag.DELETED, Flag.DRAFT, Flag.FLAGGED, Flag.RECENT, Flag.SEEN, Flag.USER, 
Flag.USER_FLAGS, BODY_CONTENT, HEADER_CONTENT, TEXTUAL_LINE_COUNT, PROPERTIES, 
ATTACHMENTS_IDS };
     String[] METADATA = { MAILBOX_ID, IMAP_UID, INTERNAL_DATE, MOD_SEQ, 
BODY_START_OCTET, FULL_CONTENT_OCTETS, BODY_OCTECTS, Flag.ANSWERED, 
Flag.DELETED, Flag.DRAFT, Flag.FLAGGED, Flag.RECENT, Flag.SEEN, Flag.USER, 
Flag.USER_FLAGS, TEXTUAL_LINE_COUNT, PROPERTIES };
     String[] HEADERS = { MAILBOX_ID, IMAP_UID, INTERNAL_DATE, MOD_SEQ, 
BODY_START_OCTET, FULL_CONTENT_OCTETS, BODY_OCTECTS, Flag.ANSWERED, 
Flag.DELETED, Flag.DRAFT, Flag.FLAGGED, Flag.RECENT, Flag.SEEN, Flag.USER, 
Flag.USER_FLAGS, HEADER_CONTENT, TEXTUAL_LINE_COUNT, PROPERTIES };
-    String[] BODY = { MAILBOX_ID, IMAP_UID, INTERNAL_DATE, MOD_SEQ, 
BODY_START_OCTET, FULL_CONTENT_OCTETS, BODY_OCTECTS, Flag.ANSWERED, 
Flag.DELETED, Flag.DRAFT, Flag.FLAGGED, Flag.RECENT, Flag.SEEN, Flag.USER, 
Flag.USER_FLAGS, BODY_CONTENT, TEXTUAL_LINE_COUNT, PROPERTIES };
+    String[] BODY = { MAILBOX_ID, IMAP_UID, INTERNAL_DATE, MOD_SEQ, 
BODY_START_OCTET, FULL_CONTENT_OCTETS, BODY_OCTECTS, Flag.ANSWERED, 
Flag.DELETED, Flag.DRAFT, Flag.FLAGGED, Flag.RECENT, Flag.SEEN, Flag.USER, 
Flag.USER_FLAGS, BODY_CONTENT, TEXTUAL_LINE_COUNT, PROPERTIES, ATTACHMENTS_IDS 
};
 
     interface Flag {
         String ANSWERED = "flagAnswered";

http://git-wip-us.apache.org/repos/asf/james-project/blob/f53d0eb9/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMessage.java
----------------------------------------------------------------------
diff --git 
a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMessage.java
 
b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMessage.java
index e56df67..ae8c54b 100644
--- 
a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMessage.java
+++ 
b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMessage.java
@@ -33,10 +33,12 @@ import java.util.List;
 
 import javax.mail.Flags;
 
+import org.apache.commons.lang.NotImplementedException;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.hbase.HBaseId;
 import org.apache.james.mailbox.hbase.io.ChunkInputStream;
+import org.apache.james.mailbox.store.mail.model.AttachmentId;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.FlagsBuilder;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -351,4 +353,9 @@ public class HBaseMailboxMessage implements MailboxMessage {
     public int compareTo(MailboxMessage other) {
         return MESSAGE_UID_COMPARATOR.compare(this, other);
     }
+
+    @Override
+    public List<AttachmentId> getAttachmentsIds() {
+        throw new NotImplementedException("Attachments Ids not implemented");
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f53d0eb9/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailboxMessage.java
----------------------------------------------------------------------
diff --git 
a/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailboxMessage.java
 
b/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailboxMessage.java
index 8bbf28d..62d17dd 100644
--- 
a/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailboxMessage.java
+++ 
b/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailboxMessage.java
@@ -35,12 +35,14 @@ import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.input.BoundedInputStream;
+import org.apache.commons.lang.NotImplementedException;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.commons.JcrUtils;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jcr.JCRId;
 import org.apache.james.mailbox.jcr.JCRImapConstants;
 import org.apache.james.mailbox.jcr.Persistent;
+import org.apache.james.mailbox.store.mail.model.AttachmentId;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.FlagsBuilder;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -676,4 +678,9 @@ public class JCRMailboxMessage implements MailboxMessage, 
JCRImapConstants, Pers
     public int compareTo(MailboxMessage other) {
         return MESSAGE_UID_COMPARATOR.compare(this, other);
     }
+
+    @Override
+    public List<AttachmentId> getAttachmentsIds() {
+        throw new NotImplementedException("Attachments Ids not implemented");
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f53d0eb9/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 02c0425..3488127 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
@@ -40,11 +40,13 @@ import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.OrderBy;
 
+import org.apache.commons.lang.NotImplementedException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.JPAId;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.JPAProperty;
 import org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;
+import org.apache.james.mailbox.store.mail.model.AttachmentId;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.DelegatingMailboxMessage;
 import org.apache.james.mailbox.store.mail.model.FlagsBuilder;
@@ -574,4 +576,9 @@ public abstract class AbstractJPAMailboxMessage implements 
MailboxMessage {
     }
     
 
+    @Override
+    public List<AttachmentId> getAttachmentsIds() {
+        throw new NotImplementedException("Attachments Ids not implemented");
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f53d0eb9/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java
----------------------------------------------------------------------
diff --git 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java
 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java
index 427a7bb..be2ecaa 100644
--- 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java
+++ 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java
@@ -19,7 +19,9 @@
 package org.apache.james.mailbox.maildir.mail.model;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.NotImplementedException;
 import org.apache.james.mailbox.maildir.MaildirMessageName;
+import org.apache.james.mailbox.store.mail.model.AttachmentId;
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.mail.model.MessageId;
 import org.apache.james.mailbox.store.mail.model.Property;
@@ -274,4 +276,9 @@ public class MaildirMessage implements Message {
         return new LimitingFileInputStream(messageName.getFile(), limit);
     }
 
+    @Override
+    public List<AttachmentId> getAttachmentsIds() {
+        throw new NotImplementedException("Attachments Ids not implemented");
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f53d0eb9/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapperTest.java
 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapperTest.java
index 8ab4df2..ad61d5e 100644
--- 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapperTest.java
+++ 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapperTest.java
@@ -20,10 +20,21 @@
 package org.apache.james.mailbox.inmemory.mail;
 
 import org.apache.james.mailbox.store.mail.model.AbstractMessageMapperTest;
+import org.junit.Ignore;
 
 public class InMemoryMessageMapperTest extends AbstractMessageMapperTest {
 
     public InMemoryMessageMapperTest() {
         super(new InMemoryMapperProvider());
     }
+
+    @Ignore("Partial fetch not supported by InMemory backend")
+    @Override
+    public void 
messagesRetrievedUsingFetchTypeHeadersShouldHaveAttachmentsIdsEmptyWhenOneAttachment()
 {
+    }
+
+    @Ignore("Partial fetch not supported by InMemory backend")
+    @Override
+    public void 
messagesRetrievedUsingFetchTypeMetadataShouldHaveAttachmentsIdsEmptyWhenOneAttachment()
 {
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f53d0eb9/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java
index 0ede32d..c8bc67e 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java
@@ -115,4 +115,9 @@ public abstract class DelegatingMailboxMessage implements 
MailboxMessage {
     public Message getMessage() {
         return message;
     }
+
+    @Override
+    public List<AttachmentId> getAttachmentsIds() {
+        return message.getAttachmentsIds();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f53d0eb9/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Message.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Message.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Message.java
index 1b14d71..4d3999b 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Message.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Message.java
@@ -103,4 +103,12 @@ public interface Message {
      * @return unmodifiable list of meta-data, not null
      */
     List<Property> getProperties();
+    
+    /**
+     * Return the list of ids of parsed attachments
+     * 
+     * @return a read only list of attachments ids
+     */
+    List<AttachmentId> getAttachmentsIds();
+
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f53d0eb9/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
index 1455c79..0122cb1 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.store.mail.model.impl;
 
 import java.io.IOException;
 import java.util.Date;
+import java.util.List;
 
 import javax.mail.Flags;
 import javax.mail.internet.SharedInputStream;
@@ -28,11 +29,13 @@ import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.store.mail.model.AttachmentId;
 import org.apache.james.mailbox.store.mail.model.DelegatingMailboxMessage;
 import org.apache.james.mailbox.store.mail.model.MailboxId;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
 import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
 import com.google.common.primitives.Ints;
 
 public class SimpleMailboxMessage extends DelegatingMailboxMessage {
@@ -45,7 +48,7 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
         int bodyStartOctet = Ints.checkedCast(original.getFullContentOctets() 
- original.getBodyOctets());
         PropertyBuilder pBuilder = new 
PropertyBuilder(original.getProperties());
         pBuilder.setTextualLineCount(original.getTextualLineCount());
-        return new SimpleMailboxMessage(internalDate, size, bodyStartOctet, 
content, flags, pBuilder, mailboxId);
+        return new SimpleMailboxMessage(internalDate, size, bodyStartOctet, 
content, flags, pBuilder, mailboxId, original.getAttachmentsIds());
     }
 
     private static SharedByteArrayInputStream copyFullContent(MailboxMessage 
original) throws MailboxException {
@@ -68,19 +71,28 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
     private long modSeq;
 
     public SimpleMailboxMessage(Date internalDate, long size, int 
bodyStartOctet,
+            SharedInputStream content, Flags flags,
+            PropertyBuilder propertyBuilder, MailboxId mailboxId, 
List<AttachmentId> attachmentsIds) {
+        super(new SimpleMessage(
+                content, size, internalDate, propertyBuilder.getSubType(),
+                propertyBuilder.getMediaType(),
+                bodyStartOctet,
+                propertyBuilder.getTextualLineCount(),
+                propertyBuilder.toProperties(),
+                attachmentsIds
+                ));
+
+            setFlags(flags);
+            this.mailboxId = mailboxId;
+            this.userFlags = flags.getUserFlags();
+    }
+
+    public SimpleMailboxMessage(Date internalDate, long size, int 
bodyStartOctet,
                                 SharedInputStream content, Flags flags,
                                 PropertyBuilder propertyBuilder, MailboxId 
mailboxId) {
-        super(new SimpleMessage(
-            content, size, internalDate, propertyBuilder.getSubType(),
-            propertyBuilder.getMediaType(),
-            bodyStartOctet,
-            propertyBuilder.getTextualLineCount(),
-            propertyBuilder.toProperties()
-            ));
-
-        setFlags(flags);
-        this.mailboxId = mailboxId;
-        this.userFlags = flags.getUserFlags();
+        this(internalDate, size, bodyStartOctet,
+                content, flags,
+                propertyBuilder, mailboxId, ImmutableList.<AttachmentId>of());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/f53d0eb9/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMessage.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMessage.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMessage.java
index 32349b3..d77571e 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMessage.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMessage.java
@@ -18,16 +18,20 @@
  ****************************************************************/
 package org.apache.james.mailbox.store.mail.model.impl;
 
-import org.apache.james.mailbox.store.mail.model.Message;
-import org.apache.james.mailbox.store.mail.model.MessageId;
-import org.apache.james.mailbox.store.mail.model.Property;
-
-import javax.mail.internet.SharedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Date;
 import java.util.List;
 
+import javax.mail.internet.SharedInputStream;
+
+import org.apache.james.mailbox.store.mail.model.AttachmentId;
+import org.apache.james.mailbox.store.mail.model.Message;
+import org.apache.james.mailbox.store.mail.model.MessageId;
+import org.apache.james.mailbox.store.mail.model.Property;
+
+import com.google.common.collect.ImmutableList;
+
 public class SimpleMessage implements Message {
 
     private final String subType;
@@ -38,8 +42,9 @@ public class SimpleMessage implements Message {
     private final long size;
     private final Long textualLineCount;
     private final List<Property> properties;
+    private final List<AttachmentId> attachmentsIds;
 
-    public SimpleMessage(SharedInputStream content, long size, Date 
internalDate, String subType, String mediaType, int bodyStartOctet, Long 
textualLineCount, List<Property> properties) {
+    public SimpleMessage(SharedInputStream content, long size, Date 
internalDate, String subType, String mediaType, int bodyStartOctet, Long 
textualLineCount, List<Property> properties, List<AttachmentId> attachmentsIds) 
{
         this.subType = subType;
         this.mediaType = mediaType;
         this.content = content;
@@ -48,6 +53,11 @@ public class SimpleMessage implements Message {
         this.size = size;
         this.textualLineCount = textualLineCount;
         this.properties = properties;
+        this.attachmentsIds = attachmentsIds;
+    }
+
+    public SimpleMessage(SharedInputStream content, long size, Date 
internalDate, String subType, String mediaType, int bodyStartOctet, Long 
textualLineCount, List<Property> properties) {
+        this(content, size, internalDate, subType, mediaType, bodyStartOctet, 
textualLineCount, properties, ImmutableList.<AttachmentId>of());
     }
 
     @Override
@@ -108,4 +118,9 @@ public class SimpleMessage implements Message {
     public List<Property> getProperties() {
         return properties;
     }
+
+    @Override
+    public List<AttachmentId> getAttachmentsIds() {
+        return attachmentsIds;
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f53d0eb9/mailbox/store/src/test/java/org/apache/james/mailbox/store/SimpleMailboxMembership.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SimpleMailboxMembership.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SimpleMailboxMembership.java
index a1afb98..4d1eb4f 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SimpleMailboxMembership.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SimpleMailboxMembership.java
@@ -35,6 +35,8 @@ import java.util.Map.Entry;
 
 import javax.mail.Flags;
 
+import org.apache.commons.lang.NotImplementedException;
+import org.apache.james.mailbox.store.mail.model.AttachmentId;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.Property;
@@ -270,5 +272,10 @@ public class SimpleMailboxMembership implements 
MailboxMessage {
     public DefaultMessageId getMessageId() {
         return new DefaultMessageId(getMailboxId(), getUid());
     }
+
+    @Override
+    public List<AttachmentId> getAttachmentsIds() {
+        throw new NotImplementedException("Attachments Ids not implemented");
+    }
     
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f53d0eb9/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java
index 41d04d0..7641a52 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java
@@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.io.IOException;
 import java.util.Date;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
 import javax.mail.Flags;
@@ -46,6 +47,8 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
+import com.google.common.collect.ImmutableList;
+
 public abstract class AbstractMessageMapperTest {
 
     private final static char DELIMITER = ':';
@@ -59,6 +62,7 @@ public abstract class AbstractMessageMapperTest {
 
     private SimpleMailbox benwaInboxMailbox;
     private SimpleMailbox benwaWorkMailbox;
+    private SimpleMailbox attachmentsMailbox;
     
     private SimpleMailboxMessage message1;
     private SimpleMailboxMessage message2;
@@ -66,6 +70,8 @@ public abstract class AbstractMessageMapperTest {
     private SimpleMailboxMessage message4;
     private SimpleMailboxMessage message5;
     private SimpleMailboxMessage message6;
+    private SimpleMailboxMessage message7With1Attachment;
+    private SimpleMailboxMessage message8With2Attachments;
 
     public AbstractMessageMapperTest(MapperProvider mapperProvider) {
         this.mapperProvider = mapperProvider;
@@ -77,12 +83,15 @@ public abstract class AbstractMessageMapperTest {
         messageMapper = mapperProvider.createMessageMapper();
         benwaInboxMailbox = createMailbox(new MailboxPath("#private", "benwa", 
"INBOX"));
         benwaWorkMailbox = createMailbox( new MailboxPath("#private", "benwa", 
"INBOX"+DELIMITER+"work"));
+        attachmentsMailbox = createMailbox( new MailboxPath("#private", 
"benwa", "Attachments"));
         message1 = createMessage(benwaInboxMailbox, "Subject: Test1 
\n\nBody1\n.\n", BODY_START, new PropertyBuilder());
         message2 = createMessage(benwaInboxMailbox, "Subject: Test2 
\n\nBody2\n.\n", BODY_START, new PropertyBuilder());
         message3 = createMessage(benwaInboxMailbox, "Subject: Test3 
\n\nBody3\n.\n", BODY_START, new PropertyBuilder());
         message4 = createMessage(benwaInboxMailbox, "Subject: Test4 
\n\nBody4\n.\n", BODY_START, new PropertyBuilder());
         message5 = createMessage(benwaInboxMailbox, "Subject: Test5 
\n\nBody5\n.\n", BODY_START, new PropertyBuilder());
         message6 = createMessage(benwaWorkMailbox, "Subject: Test6 
\n\nBody6\n.\n", BODY_START, new PropertyBuilder());
+        message7With1Attachment = createMessage(attachmentsMailbox, "Subject: 
Test7 \n\nBody7\n.\n", BODY_START, new PropertyBuilder(), 
ImmutableList.of(AttachmentId.from("123")));
+        message8With2Attachments = createMessage(attachmentsMailbox, "Subject: 
Test8 \n\nBody8\n.\n", BODY_START, new PropertyBuilder(), 
ImmutableList.of(AttachmentId.from("123"), AttachmentId.from("456")));
     }
 
     @After
@@ -249,6 +258,54 @@ public abstract class AbstractMessageMapperTest {
     }
 
     @Test
+    public void 
messagesRetrievedUsingFetchTypeFullShouldHaveAttachmentsIdsEmptyWhenNoAttachment()
 throws MailboxException, IOException{
+        saveMessages();
+        MessageMapper.FetchType fetchType = MessageMapper.FetchType.Full;
+        Iterator<MailboxMessage> retrievedMessageIterator = 
messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(message1.getUid()), fetchType, LIMIT);
+        
assertThat(retrievedMessageIterator.next().getAttachmentsIds()).isEmpty();
+    }
+
+    @Test
+    public void 
messagesRetrievedUsingFetchTypeFullShouldHaveAttachmentsIdsLoadedWhenOneAttachment()
 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().getAttachmentsIds()).isEqualTo(message7With1Attachment.getAttachmentsIds());
+    }
+
+    @Test
+    public void 
messagesRetrievedUsingFetchTypeFullShouldHaveAttachmentsIdsLoadedWhenTwoAttachments()
 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().getAttachmentsIds()).isEqualTo(message8With2Attachments.getAttachmentsIds());
+    }
+
+    @Test
+    public void 
messagesRetrievedUsingFetchTypeBodyShouldHaveAttachmentsIdsLoadedWhenOneAttachment()
 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().getAttachmentsIds()).isEqualTo(message7With1Attachment.getAttachmentsIds());
+    }
+
+    @Test
+    public void 
messagesRetrievedUsingFetchTypeHeadersShouldHaveAttachmentsIdsEmptyWhenOneAttachment()
 throws MailboxException, IOException{
+        saveMessages();
+        MessageMapper.FetchType fetchType = MessageMapper.FetchType.Headers;
+        Iterator<MailboxMessage> retrievedMessageIterator = 
messageMapper.findInMailbox(attachmentsMailbox, 
MessageRange.one(message7With1Attachment.getUid()), fetchType, LIMIT);
+        
assertThat(retrievedMessageIterator.next().getAttachmentsIds()).isEmpty();
+    }
+
+    @Test
+    public void 
messagesRetrievedUsingFetchTypeMetadataShouldHaveAttachmentsIdsEmptyWhenOneAttachment()
 throws MailboxException, IOException{
+        saveMessages();
+        MessageMapper.FetchType fetchType = MessageMapper.FetchType.Metadata;
+        Iterator<MailboxMessage> retrievedMessageIterator = 
messageMapper.findInMailbox(attachmentsMailbox, 
MessageRange.one(message7With1Attachment.getUid()), fetchType, LIMIT);
+        
assertThat(retrievedMessageIterator.next().getAttachmentsIds()).isEmpty();
+    }
+
+    @Test
     public void retrievingMessagesWithALimitShouldLimitTheNumberOfMessages() 
throws MailboxException {
         int limit = 2;
         saveMessages();
@@ -663,12 +720,20 @@ public abstract class AbstractMessageMapperTest {
         message5.setModSeq(messageMapper.getHighestModSeq(benwaInboxMailbox));
         messageMapper.add(benwaWorkMailbox, message6);
         message6.setModSeq(messageMapper.getHighestModSeq(benwaWorkMailbox));
+        messageMapper.add(attachmentsMailbox, message7With1Attachment);
+        
message7With1Attachment.setModSeq(messageMapper.getHighestModSeq(attachmentsMailbox));
+        messageMapper.add(attachmentsMailbox, message8With2Attachments);
+        
message8With2Attachments.setModSeq(messageMapper.getHighestModSeq(attachmentsMailbox));
     }
 
     private MailboxMessage retrieveMessageFromStorage(MailboxMessage message) 
throws MailboxException {
         return messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.one(message.getUid()), MessageMapper.FetchType.Metadata, 
LIMIT).next();
     }
     
+    private SimpleMailboxMessage createMessage(Mailbox mailbox, String 
content, int bodyStart, PropertyBuilder propertyBuilder, List<AttachmentId> 
attachmentsIds) {
+        return new SimpleMailboxMessage(new Date(), content.length(), 
bodyStart, new SharedByteArrayInputStream(content.getBytes()), new Flags(), 
propertyBuilder, mailbox.getMailboxId(), attachmentsIds);
+    }
+    
     private SimpleMailboxMessage createMessage(Mailbox mailbox, String 
content, int bodyStart, PropertyBuilder propertyBuilder) {
         return new SimpleMailboxMessage(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/f53d0eb9/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 a73904e..ab7a8bb 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
@@ -74,6 +74,11 @@ 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.getAttachmentsIds(), 
expected.getAttachmentsIds())) {
+                failWithMessage("Expected attachments ids to be <%s> but was 
<%s>", expected.getAttachmentsIds(), actual.getAttachmentsIds());
+            }
+        }
         return this;
     }
 


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

Reply via email to