You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2017/02/15 00:01:19 UTC

[01/13] james-project git commit: JAMES-1934 StoreMessageManager should position a property for non inline attachment detection

Repository: james-project
Updated Branches:
  refs/heads/master 3c2e5eddb -> a275f62d7


JAMES-1934 StoreMessageManager should position a property for non inline attachment detection


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

Branch: refs/heads/master
Commit: de54a6eaf73a90ce3cb9fa92ab22c731cceb7441
Parents: 3c2e5ed
Author: Benoit Tellier <bt...@linagora.com>
Authored: Wed Feb 8 10:41:29 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Feb 15 06:59:39 2017 +0700

----------------------------------------------------------------------
 .../james/mailbox/store/StoreMessageManager.java       | 13 +++++++++++++
 .../mailbox/store/mail/model/impl/PropertyBuilder.java | 10 ++++++++--
 2 files changed, 21 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/de54a6ea/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index a7febbe..60c7d19 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -94,6 +94,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
 
 /**
@@ -398,6 +400,8 @@ public class StoreMessageManager implements org.apache.james.mailbox.MessageMana
             final int size = (int) file.length();
 
             final List<MessageAttachment> attachments = extractAttachments(contentIn);
+            propertyBuilder.setHasAttachment(hasNonInlinedAttachment(attachments));
+
             final MailboxMessage message = createMessage(internalDate, size, bodyStartOctet, contentIn, flags, propertyBuilder, attachments);
 
             new QuotaChecker(quotaManager, quotaRootResolver, mailbox).tryAddition(1, size);
@@ -439,6 +443,15 @@ public class StoreMessageManager implements org.apache.james.mailbox.MessageMana
 
     }
 
+    private boolean hasNonInlinedAttachment(List<MessageAttachment> attachments) {
+        return FluentIterable.from(attachments).anyMatch(new Predicate<MessageAttachment>() {
+            @Override
+            public boolean apply(MessageAttachment input) {
+                return !input.isInline();
+            }
+        });
+    }
+
     private List<MessageAttachment> extractAttachments(SharedFileInputStream contentIn) {
         try {
             return messageParser.retrieveAttachments(contentIn);

http://git-wip-us.apache.org/repos/asf/james-project/blob/de54a6ea/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java
index deac8ed..c42aa0c 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java
@@ -53,8 +53,10 @@ import org.apache.james.mailbox.store.mail.model.Property;
  * Builds properties
  */
 public class PropertyBuilder {
-    
+
     private static final int INITIAL_CAPACITY = 32;
+    public static final String JAMES_INTERNALS = "JAMES_INTERNALS";
+    public static final String HAS_ATTACHMENT = "HAS_ATTACHMENT";
 
     private Long textualLineCount;
     private final List<SimpleProperty> properties;
@@ -218,7 +220,11 @@ public class PropertyBuilder {
     public void setMediaType(String value) {
         setProperty(MIME_MIME_TYPE_SPACE, MIME_MEDIA_TYPE_NAME, value);
     }
-    
+
+    public void setHasAttachment(boolean value) {
+        setProperty(JAMES_INTERNALS, HAS_ATTACHMENT, Boolean.toString(value));
+    }
+
     /**
      * Gets the MIME content subtype.
      * 


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


[09/13] james-project git commit: JAMES-1934 suppress eclipse warning

Posted by bt...@apache.org.
JAMES-1934 suppress eclipse warning


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

Branch: refs/heads/master
Commit: a275f62d7ef83952579c18b24897bcdbea2de952
Parents: cdfe3f7
Author: Luc DUZAN <ld...@linagora.com>
Authored: Mon Feb 13 18:23:26 2017 +0100
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Feb 15 06:59:46 2017 +0700

----------------------------------------------------------------------
 .../java/org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/a275f62d/mailbox/tool/src/test/java/org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java
----------------------------------------------------------------------
diff --git a/mailbox/tool/src/test/java/org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java b/mailbox/tool/src/test/java/org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java
index b83e6c1..ca83271 100644
--- a/mailbox/tool/src/test/java/org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java
+++ b/mailbox/tool/src/test/java/org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java
@@ -23,7 +23,6 @@ import org.junit.Test;
 /**
  * TODO this test class needs to be reviewed.
  */
-@SuppressWarnings("unused")
 public class JpaMigratorTest {
     
     @Test()


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


[02/13] james-project git commit: JAMES-1934 Merge IndexableMessageWithId into IndexableMessage and make it immutable

Posted by bt...@apache.org.
JAMES-1934 Merge IndexableMessageWithId into IndexableMessage and make it immutable


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

Branch: refs/heads/master
Commit: 83e9e0c46de33800ef88fd9c5a8492acec000541
Parents: 98e7ccb
Author: Luc DUZAN <ld...@linagora.com>
Authored: Thu Feb 9 11:22:19 2017 +0100
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Feb 15 06:59:45 2017 +0700

----------------------------------------------------------------------
 .../elasticsearch/json/IndexableMessage.java    | 551 +++++++++++--------
 .../json/IndexableMessageWithMessageId.java     |  72 ---
 .../json/MessageToElasticSearchJson.java        |  32 +-
 .../json/IndexableMessageTest.java              | 166 +++++-
 .../json/MessageToElasticSearchJsonTest.java    |   4 +-
 5 files changed, 495 insertions(+), 330 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/83e9e0c4/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
index 6150b19..c6e3ce7 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
@@ -48,186 +48,288 @@ import com.google.common.collect.Multimap;
 
 public class IndexableMessage {
 
-    public static final SimpleProperty HAS_ATTACHMENT_PROPERTY = new SimpleProperty(PropertyBuilder.JAMES_INTERNALS, PropertyBuilder.HAS_ATTACHMENT, "true");
+    public static class Builder {
+        private static ZonedDateTime getSanitizedInternalDate(MailboxMessage message, ZoneId zoneId) {
+            if (message.getInternalDate() == null) {
+                return ZonedDateTime.now();
+            }
+            return ZonedDateTime.ofInstant(
+                    Instant.ofEpochMilli(message.getInternalDate().getTime()),
+                    zoneId);
+        }
+        private IndexAttachments indexAttachments;
+        private MailboxMessage message;
+        private TextExtractor textExtractor;
+        private List<User> users;
 
-    public static IndexableMessage from(MailboxMessage message, List<User> users, TextExtractor textExtractor,
-                                        ZoneId zoneId, IndexAttachments indexAttachments) {
+        private ZoneId zoneId;
 
-        Preconditions.checkNotNull(message.getMailboxId());
-        Preconditions.checkArgument(!users.isEmpty());
-        IndexableMessage indexableMessage = new IndexableMessage();
-        try {
-            MimePart parsingResult = new MimePartParser(message, textExtractor).parse();
-            indexableMessage.users = users.stream().map(User::getUserName).collect(Guavate.toImmutableList());
-            indexableMessage.bodyText = parsingResult.locateFirstTextBody();
-            indexableMessage.bodyHtml = parsingResult.locateFirstHtmlBody();
-            indexableMessage.hasAttachment = message.getProperties()
-                .stream()
-                .anyMatch(property -> property.equals(HAS_ATTACHMENT_PROPERTY));
-            indexableMessage.setFlattenedAttachments(parsingResult, indexAttachments);
-            indexableMessage.copyHeaderFields(parsingResult.getHeaderCollection(), getSanitizedInternalDate(message, zoneId));
-            indexableMessage.generateText();
-        } catch (IOException | MimeException e) {
-            throw Throwables.propagate(e);
+        private Builder() {
         }
-        indexableMessage.copyMessageFields(message, zoneId);
-        return indexableMessage;
-    }
 
-    private void setFlattenedAttachments(MimePart parsingResult, IndexAttachments indexAttachments) {
-        List<MimePart> mimeparts = parsingResult.getAttachmentsStream()
+        public IndexableMessage build() {
+            Preconditions.checkNotNull(message.getMailboxId());
+            Preconditions.checkNotNull(message.getMessageId());
+            Preconditions.checkNotNull(users);
+            Preconditions.checkNotNull(textExtractor);
+            Preconditions.checkNotNull(indexAttachments);
+            Preconditions.checkNotNull(zoneId);
+            Preconditions.checkState(!users.isEmpty());
+
+            try {
+                return instanciateIndexedMessage();
+            } catch (IOException | MimeException e) {
+                throw Throwables.propagate(e);
+            }
+        }
+
+        public Builder extractor(TextExtractor textExtractor) {
+            this.textExtractor = textExtractor;
+            return this;
+        }
+
+        public Builder indexAttachments(IndexAttachments indexAttachments) {
+            this.indexAttachments = indexAttachments;
+            return this;
+        }
+
+        public Builder message(MailboxMessage message) {
+            this.message = message;
+            return this;
+        }
+
+        public Builder users(List<User> users) {
+            this.users = users;
+            return this;
+        }
+
+        public Builder zoneId(ZoneId zoneId) {
+            this.zoneId = zoneId;
+            return this;
+        }
+
+        private boolean computeHasAttachment(MailboxMessage message) {
+            return message.getProperties()
+                    .stream()
+                    .anyMatch(property -> property.equals(HAS_ATTACHMENT_PROPERTY));
+        }
+
+        private IndexableMessage instanciateIndexedMessage() throws IOException, MimeException {
+            String messageId = message.getMessageId().serialize();
+            MimePart parsingResult = new MimePartParser(message, textExtractor).parse();
+
+            List<String> stringifiedUsers = users.stream()
+                    .map(User::getUserName)
                     .collect(Guavate.toImmutableList());
 
-        if (IndexAttachments.YES.equals(indexAttachments)) {
-            this.attachments = mimeparts;
-        } else {
-            this.attachments = ImmutableList.of();
+            Optional<String> bodyText = parsingResult.locateFirstTextBody();
+            Optional<String> bodyHtml = parsingResult.locateFirstHtmlBody();
+
+            boolean hasAttachment = computeHasAttachment(message);
+            List<MimePart> attachments = setFlattenedAttachments(parsingResult, indexAttachments);
+
+            HeaderCollection headerCollection = parsingResult.getHeaderCollection();
+            ZonedDateTime internalDate = getSanitizedInternalDate(message, zoneId);
+
+            Multimap<String, String> headers = headerCollection.getHeaders();
+            Subjects subjects = Subjects.from(headerCollection.getSubjectSet());
+            EMailers from = EMailers.from(headerCollection.getFromAddressSet());
+            EMailers to = EMailers.from(headerCollection.getToAddressSet());
+            EMailers replyTo = EMailers.from(headerCollection.getReplyToAddressSet());
+            EMailers cc = EMailers.from(headerCollection.getCcAddressSet());
+            EMailers bcc = EMailers.from(headerCollection.getBccAddressSet());
+            String sentDate = DateResolutionFormater.DATE_TIME_FOMATTER.format(headerCollection.getSentDate().orElse(internalDate));
+
+            String text = Stream.of(from.serialize(),
+                        to.serialize(),
+                        cc.serialize(),
+                        bcc.serialize(),
+                        subjects.serialize(),
+                        bodyText.orElse(null),
+                        bodyHtml.orElse(null))
+                    .filter(str -> !Strings.isNullOrEmpty(str))
+                    .collect(Collectors.joining(" "));
+
+            long uid = message.getUid().asLong();
+            String mailboxId = message.getMailboxId().serialize();
+            long modSeq = message.getModSeq();
+            long size = message.getFullContentOctets();
+            String date = DateResolutionFormater.DATE_TIME_FOMATTER.format(getSanitizedInternalDate(message, zoneId));
+            String mediaType = message.getMediaType();
+            String subType = message.getSubType();
+            boolean isAnswered = message.isAnswered();
+            boolean isDeleted = message.isDeleted();
+            boolean isDraft = message.isDraft();
+            boolean isFlagged = message.isFlagged();
+            boolean isRecent = message.isRecent();
+            boolean isUnRead = !message.isSeen();
+            String[] userFlags = message.createFlags().getUserFlags();
+            List<Property> properties = message.getProperties();
+
+            return new IndexableMessage(
+                    attachments,
+                    bcc,
+                    bodyHtml,
+                    bodyText,
+                    cc,
+                    date,
+                    from,
+                    hasAttachment,
+                    headers,
+                    isAnswered,
+                    isDeleted,
+                    isDraft,
+                    isFlagged,
+                    isRecent,
+                    isUnRead,
+                    mailboxId,
+                    mediaType,
+                    messageId,
+                    modSeq,
+                    properties,
+                    replyTo,
+                    sentDate,
+                    size,
+                    subjects,
+                    subType,
+                    text,
+                    to,
+                    uid,
+                    userFlags,
+                    stringifiedUsers);
         }
-    }
 
-    private void copyHeaderFields(HeaderCollection headerCollection, ZonedDateTime internalDate) {
-        this.headers = headerCollection.getHeaders();
-        this.subjects = Subjects.from(headerCollection.getSubjectSet());
-        this.from = EMailers.from(headerCollection.getFromAddressSet());
-        this.to = EMailers.from(headerCollection.getToAddressSet());
-        this.replyTo = EMailers.from(headerCollection.getReplyToAddressSet());
-        this.cc = EMailers.from(headerCollection.getCcAddressSet());
-        this.bcc = EMailers.from(headerCollection.getBccAddressSet());
-        this.sentDate = DateResolutionFormater.DATE_TIME_FOMATTER.format(headerCollection.getSentDate().orElse(internalDate));
-    }
-
-    private void copyMessageFields(MailboxMessage message, ZoneId zoneId) {
-        this.uid = message.getUid().asLong();
-        this.mailboxId = message.getMailboxId().serialize();
-        this.modSeq = message.getModSeq();
-        this.size = message.getFullContentOctets();
-        this.date = DateResolutionFormater.DATE_TIME_FOMATTER.format(getSanitizedInternalDate(message, zoneId));
-        this.mediaType = message.getMediaType();
-        this.subType = message.getSubType();
-        this.isAnswered = message.isAnswered();
-        this.isDeleted = message.isDeleted();
-        this.isDraft = message.isDraft();
-        this.isFlagged = message.isFlagged();
-        this.isRecent = message.isRecent();
-        this.isUnRead = ! message.isSeen();
-        this.userFlags = message.createFlags().getUserFlags();
-        this.properties = message.getProperties();
-    }
-
-    private static ZonedDateTime getSanitizedInternalDate(MailboxMessage message, ZoneId zoneId) {
-        if (message.getInternalDate() == null) {
-            return ZonedDateTime.now();
+        private List<MimePart> setFlattenedAttachments(MimePart parsingResult, IndexAttachments indexAttachments) {
+            if (IndexAttachments.YES.equals(indexAttachments)) {
+                return parsingResult.getAttachmentsStream()
+                    .collect(Guavate.toImmutableList());
+            } else {
+                return ImmutableList.of();
+            }
         }
-        return ZonedDateTime.ofInstant(
-            Instant.ofEpochMilli(message.getInternalDate().getTime()),
-            zoneId);
-    }
-
-    private void generateText() {
-        this.text = Stream.of(from.serialize(),
-                to.serialize(),
-                cc.serialize(),
-                bcc.serialize(),
-                subjects.serialize(),
-                bodyText.orElse(null),
-                bodyHtml.orElse(null))
-            .filter(str -> !Strings.isNullOrEmpty(str))
-            .collect(Collectors.joining(" "));
-    }
-
-    private long uid;
-    private String mailboxId;
-    private List<String> users;
-    private long modSeq;
-    private long size;
-    private String date;
-    private String mediaType;
-    private String subType;
-    private boolean hasAttachment;
-    private boolean isUnRead;
-    private boolean isRecent;
-    private boolean isFlagged;
-    private boolean isDeleted;
-    private boolean isDraft;
-    private boolean isAnswered;
-    private String[] userFlags;
-    private Multimap<String, String> headers;
-    private EMailers from;
-    private EMailers to;
-    private EMailers cc;
-    private EMailers bcc;
-    private EMailers replyTo;
-    private Subjects subjects;
-    private String sentDate;
-    private List<Property> properties;
-    private List<MimePart> attachments;
-    private Optional<String> bodyText;
-    private Optional<String> bodyHtml;
-    private String text;
-
-
-    public IndexableMessage(long uid, String mailboxId, List<String> users, long modSeq, long size, String date, String mediaType,
-                            String subType, boolean isUnRead, boolean isRecent, boolean isFlagged, boolean isDeleted, boolean isDraft,
-                            boolean isAnswered, String[] userFlags, Multimap<String, String> headers, EMailers from, EMailers to,
-                            EMailers cc, EMailers bcc, EMailers replyTo, Subjects subjects, String sentDate, List<Property> properties,
-                            List<MimePart> attachments, boolean hasAttachment, Optional<String> bodyText, Optional<String> bodyHtml, String text) {
-        this.uid = uid;
-        this.mailboxId = mailboxId;
-        this.users = users;
-        this.modSeq = modSeq;
-        this.size = size;
+    }
+
+    public static final SimpleProperty HAS_ATTACHMENT_PROPERTY = new SimpleProperty(PropertyBuilder.JAMES_INTERNALS, PropertyBuilder.HAS_ATTACHMENT, "true");
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    private final List<MimePart> attachments;
+    private final EMailers bcc;
+    private final Optional<String> bodyHtml;
+    private final Optional<String> bodyText;
+    private final EMailers cc;
+    private final String date;
+    private final EMailers from;
+    private final boolean hasAttachment;
+    private final Multimap<String, String> headers;
+    private final boolean isAnswered;
+    private final boolean isDeleted;
+    private final boolean isDraft;
+    private final boolean isFlagged;
+    private final boolean isRecent;
+    private final boolean isUnRead;
+    private final String mailboxId;
+    private final String mediaType;
+    private final String messageId;
+    private final long modSeq;
+    private final List<Property> properties;
+    private final EMailers replyTo;
+    private final String sentDate;
+    private final long size;
+    private final Subjects subjects;
+    private final String subType;
+    private final String text;
+    private final EMailers to;
+    private final long uid;
+    private final String[] userFlags;
+    private final List<String> users;
+
+    private IndexableMessage(
+            List<MimePart> attachments,
+            EMailers bcc,
+            Optional<String> bodyHtml,
+            Optional<String> bodyText,
+            EMailers cc,
+            String date,
+            EMailers from,
+            boolean hasAttachment,
+            Multimap<String, String> headers,
+            boolean isAnswered,
+            boolean isDeleted,
+            boolean isDraft,
+            boolean isFlagged,
+            boolean isRecent,
+            boolean isUnRead,
+            String mailboxId,
+            String mediaType,
+            String messageId,
+            long modSeq,
+            List<Property> properties,
+            EMailers replyTo,
+            String sentDate,
+            long size,
+            Subjects subjects,
+            String subType,
+            String text,
+            EMailers to,
+            long uid,
+            String[] userFlags,
+            List<String> users) {
+        this.attachments = attachments;
+        this.bcc = bcc;
+        this.bodyHtml = bodyHtml;
+        this.bodyText = bodyText;
+        this.cc = cc;
         this.date = date;
-        this.mediaType = mediaType;
-        this.subType = subType;
-        this.isUnRead = isUnRead;
-        this.isRecent = isRecent;
-        this.isFlagged = isFlagged;
+        this.from = from;
+        this.hasAttachment = hasAttachment;
+        this.headers = headers;
+        this.isAnswered = isAnswered;
         this.isDeleted = isDeleted;
         this.isDraft = isDraft;
-        this.isAnswered = isAnswered;
-        this.userFlags = userFlags;
-        this.headers = headers;
-        this.from = from;
-        this.to = to;
-        this.cc = cc;
-        this.bcc = bcc;
+        this.isFlagged = isFlagged;
+        this.isRecent = isRecent;
+        this.isUnRead = isUnRead;
+        this.mailboxId = mailboxId;
+        this.mediaType = mediaType;
+        this.messageId = messageId;
+        this.modSeq = modSeq;
+        this.properties = properties;
         this.replyTo = replyTo;
-        this.subjects = subjects;
         this.sentDate = sentDate;
-        this.properties = properties;
-        this.attachments = attachments;
-        this.hasAttachment = hasAttachment;
-        this.bodyText = bodyText;
-        this.bodyHtml = bodyHtml;
+        this.size = size;
+        this.subjects = subjects;
+        this.subType = subType;
         this.text = text;
+        this.to = to;
+        this.uid = uid;
+        this.userFlags = userFlags;
+        this.users = users;
     }
 
-    public IndexableMessage() {
-    }
-
-    @JsonProperty(JsonMessageConstants.UID)
-    public Long getUid() {
-        return uid;
+    @JsonProperty(JsonMessageConstants.ATTACHMENTS)
+    public List<MimePart> getAttachments() {
+        return attachments;
     }
-
-    @JsonProperty(JsonMessageConstants.MAILBOX_ID)
-    public String getMailboxId() {
-        return mailboxId;
+    @JsonProperty(JsonMessageConstants.BCC)
+    public EMailers getBcc() {
+        return bcc;
     }
-
-    @JsonProperty(JsonMessageConstants.USERS)
-    public List<String> getUsers() {
-        return users;
+    @JsonProperty(JsonMessageConstants.HTML_BODY)
+    public Optional<String> getBodyHtml() {
+        return bodyHtml;
     }
 
-    @JsonProperty(JsonMessageConstants.MODSEQ)
-    public long getModSeq() {
-        return modSeq;
+    @JsonProperty(JsonMessageConstants.TEXT_BODY)
+    public Optional<String> getBodyText() {
+        return bodyText;
     }
 
-    @JsonProperty(JsonMessageConstants.SIZE)
-    public long getSize() {
-        return size;
+    @JsonProperty(JsonMessageConstants.CC)
+    public EMailers getCc() {
+        return cc;
     }
 
     @JsonProperty(JsonMessageConstants.DATE)
@@ -235,54 +337,59 @@ public class IndexableMessage {
         return date;
     }
 
-    @JsonProperty(JsonMessageConstants.MEDIA_TYPE)
-    public String getMediaType() {
-        return mediaType;
+    @JsonProperty(JsonMessageConstants.FROM)
+    public EMailers getFrom() {
+        return from;
     }
 
-    @JsonProperty(JsonMessageConstants.SUBTYPE)
-    public String getSubType() {
-        return subType;
+    @JsonProperty(JsonMessageConstants.HAS_ATTACHMENT)
+    public boolean getHasAttachment() {
+        return hasAttachment;
     }
 
-    @JsonProperty(JsonMessageConstants.IS_UNREAD)
-    public boolean isUnRead() {
-        return isUnRead;
+    @JsonProperty(JsonMessageConstants.HEADERS)
+    public Multimap<String, String> getHeaders() {
+        return headers;
     }
 
-    @JsonProperty(JsonMessageConstants.IS_RECENT)
-    public boolean isRecent() {
-        return isRecent;
+    @JsonProperty(JsonMessageConstants.MAILBOX_ID)
+    public String getMailboxId() {
+        return mailboxId;
     }
 
-    @JsonProperty(JsonMessageConstants.IS_FLAGGED)
-    public boolean isFlagged() {
-        return isFlagged;
+    @JsonProperty(JsonMessageConstants.MEDIA_TYPE)
+    public String getMediaType() {
+        return mediaType;
     }
 
-    @JsonProperty(JsonMessageConstants.IS_DELETED)
-    public boolean isDeleted() {
-        return isDeleted;
+    @JsonProperty(JsonMessageConstants.MESSAGE_ID)
+    public String getMessageId() {
+        return messageId;
     }
 
-    @JsonProperty(JsonMessageConstants.IS_DRAFT)
-    public boolean isDraft() {
-        return isDraft;
+    @JsonProperty(JsonMessageConstants.MODSEQ)
+    public long getModSeq() {
+        return modSeq;
     }
 
-    @JsonProperty(JsonMessageConstants.IS_ANSWERED)
-    public boolean isAnswered() {
-        return isAnswered;
+    @JsonProperty(JsonMessageConstants.PROPERTIES)
+    public List<Property> getProperties() {
+        return properties;
     }
 
-    @JsonProperty(JsonMessageConstants.USER_FLAGS)
-    public String[] getUserFlags() {
-        return userFlags;
+    @JsonProperty(JsonMessageConstants.REPLY_TO)
+    public EMailers getReplyTo() {
+        return replyTo;
     }
 
-    @JsonProperty(JsonMessageConstants.HEADERS)
-    public Multimap<String, String> getHeaders() {
-        return headers;
+    @JsonProperty(JsonMessageConstants.SENT_DATE)
+    public String getSentDate() {
+        return sentDate;
+    }
+
+    @JsonProperty(JsonMessageConstants.SIZE)
+    public long getSize() {
+        return size;
     }
 
     @JsonProperty(JsonMessageConstants.SUBJECT)
@@ -290,9 +397,14 @@ public class IndexableMessage {
         return subjects;
     }
 
-    @JsonProperty(JsonMessageConstants.FROM)
-    public EMailers getFrom() {
-        return from;
+    @JsonProperty(JsonMessageConstants.SUBTYPE)
+    public String getSubType() {
+        return subType;
+    }
+
+    @JsonProperty(JsonMessageConstants.TEXT)
+    public String getText() {
+        return text;
     }
 
     @JsonProperty(JsonMessageConstants.TO)
@@ -300,53 +412,48 @@ public class IndexableMessage {
         return to;
     }
 
-    @JsonProperty(JsonMessageConstants.CC)
-    public EMailers getCc() {
-        return cc;
-    }
-
-    @JsonProperty(JsonMessageConstants.BCC)
-    public EMailers getBcc() {
-        return bcc;
+    @JsonProperty(JsonMessageConstants.UID)
+    public Long getUid() {
+        return uid;
     }
 
-    @JsonProperty(JsonMessageConstants.REPLY_TO)
-    public EMailers getReplyTo() {
-        return replyTo;
+    @JsonProperty(JsonMessageConstants.USER_FLAGS)
+    public String[] getUserFlags() {
+        return userFlags;
     }
 
-    @JsonProperty(JsonMessageConstants.SENT_DATE)
-    public String getSentDate() {
-        return sentDate;
+    @JsonProperty(JsonMessageConstants.USERS)
+    public List<String> getUsers() {
+        return users;
     }
 
-    @JsonProperty(JsonMessageConstants.PROPERTIES)
-    public List<Property> getProperties() {
-        return properties;
+    @JsonProperty(JsonMessageConstants.IS_ANSWERED)
+    public boolean isAnswered() {
+        return isAnswered;
     }
 
-    @JsonProperty(JsonMessageConstants.ATTACHMENTS)
-    public List<MimePart> getAttachments() {
-        return attachments;
+    @JsonProperty(JsonMessageConstants.IS_DELETED)
+    public boolean isDeleted() {
+        return isDeleted;
     }
 
-    @JsonProperty(JsonMessageConstants.TEXT_BODY)
-    public Optional<String> getBodyText() {
-        return bodyText;
+    @JsonProperty(JsonMessageConstants.IS_DRAFT)
+    public boolean isDraft() {
+        return isDraft;
     }
 
-    @JsonProperty(JsonMessageConstants.HTML_BODY)
-    public Optional<String> getBodyHtml() {
-        return bodyHtml;
+    @JsonProperty(JsonMessageConstants.IS_FLAGGED)
+    public boolean isFlagged() {
+        return isFlagged;
     }
 
-    @JsonProperty(JsonMessageConstants.HAS_ATTACHMENT)
-    public boolean getHasAttachment() {
-        return hasAttachment;
+    @JsonProperty(JsonMessageConstants.IS_RECENT)
+    public boolean isRecent() {
+        return isRecent;
     }
 
-    @JsonProperty(JsonMessageConstants.TEXT)
-    public String getText() {
-        return text;
+    @JsonProperty(JsonMessageConstants.IS_UNREAD)
+    public boolean isUnRead() {
+        return isUnRead;
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/83e9e0c4/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageWithMessageId.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageWithMessageId.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageWithMessageId.java
deleted file mode 100644
index 2578580..0000000
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageWithMessageId.java
+++ /dev/null
@@ -1,72 +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.elasticsearch.json;
-
-import java.time.ZoneId;
-import java.util.List;
-import java.util.Optional;
-
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.elasticsearch.IndexAttachments;
-import org.apache.james.mailbox.extractor.TextExtractor;
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-import org.apache.james.mailbox.store.mail.model.Property;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.collect.Multimap;
-
-public class IndexableMessageWithMessageId extends IndexableMessage {
-
-    public static IndexableMessage from(MailboxMessage message, List<MailboxSession.User> users, TextExtractor textExtractor,
-                                        ZoneId zoneId, IndexAttachments indexAttachments) {
-        IndexableMessage indexableMessage = IndexableMessage.from(message, users, textExtractor, zoneId, indexAttachments);
-        return new IndexableMessageWithMessageId(indexableMessage.getUid(), indexableMessage.getMailboxId(), indexableMessage.getUsers(),
-            indexableMessage.getModSeq(), indexableMessage.getSize(), indexableMessage.getDate(), indexableMessage.getMediaType(),
-            indexableMessage.getSubType(), indexableMessage.isUnRead(), indexableMessage.isRecent(), indexableMessage.isFlagged(),
-            indexableMessage.isDeleted(), indexableMessage.isDraft(), indexableMessage.isAnswered(), indexableMessage.getUserFlags(),
-            indexableMessage.getHeaders(), indexableMessage.getFrom(), indexableMessage.getTo(), indexableMessage.getCc(), indexableMessage.getBcc(),
-            indexableMessage.getReplyTo(), indexableMessage.getSubjects(), indexableMessage.getSentDate(), indexableMessage.getProperties(),
-            indexableMessage.getAttachments(), indexableMessage.getHasAttachment(), indexableMessage.getBodyText(), indexableMessage.getBodyHtml(), indexableMessage.getText(),
-            message.getMessageId().serialize());
-    }
-
-    private String messageId;
-
-    public IndexableMessageWithMessageId(long uid, String mailboxId, List<String> users, long modSeq, long size, String date,
-                                         String mediaType, String subType, boolean isUnRead, boolean isRecent, boolean isFlagged,
-                                         boolean isDeleted, boolean isDraft, boolean isAnswered, String[] userFlags, Multimap<String, String> headers,
-                                         EMailers from, EMailers to, EMailers cc, EMailers bcc, EMailers replyTo, Subjects subjects,
-                                         String sentDate, List<Property> properties, List<MimePart> attachments, boolean hasAttachments, Optional<String> bodyText,
-                                         Optional<String> bodyHtml, String text, String messageId) {
-        super(uid, mailboxId, users, modSeq, size, date, mediaType, subType, isUnRead, isRecent, isFlagged, isDeleted,
-            isDraft, isAnswered, userFlags, headers, from, to, cc, bcc, replyTo, subjects, sentDate, properties, attachments, hasAttachments,
-            bodyText, bodyHtml, text);
-        this.messageId = messageId;
-    }
-
-    public IndexableMessageWithMessageId(String messageId) {
-        this.messageId = messageId;
-    }
-
-    @JsonProperty(JsonMessageConstants.MESSAGE_ID)
-    public String getMessageId() {
-        return messageId;
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/83e9e0c4/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
index 6b699b9..d4c896e 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
@@ -73,9 +73,21 @@ public class MessageToElasticSearchJson {
         Preconditions.checkNotNull(message);
         switch (indexMessageId) {
             case Required:
-                return mapper.writeValueAsString(IndexableMessageWithMessageId.from(message, users, textExtractor, zoneId, indexAttachments));
+                return mapper.writeValueAsString(IndexableMessage.builder()
+                        .message(message)
+                        .users(users)
+                        .extractor(textExtractor)
+                        .zoneId(zoneId)
+                        .indexAttachments(indexAttachments)
+                        .build());
             case Optional:
-                return mapper.writeValueAsString(IndexableMessage.from(message, users, textExtractor, zoneId, indexAttachments));
+                return mapper.writeValueAsString(IndexableMessage.builder()
+                        .message(message)
+                        .users(users)
+                        .extractor(textExtractor)
+                        .zoneId(zoneId)
+                        .indexAttachments(indexAttachments)
+                        .build());
             default:
                 throw new NotImplementedException();
         }
@@ -85,9 +97,21 @@ public class MessageToElasticSearchJson {
         Preconditions.checkNotNull(message);
         switch (indexMessageId) {
             case Required:
-                return mapper.writeValueAsString(IndexableMessageWithMessageId.from(message, users, textExtractor, zoneId, IndexAttachments.NO));
+                return mapper.writeValueAsString(IndexableMessage.builder()
+                        .message(message)
+                        .users(users)
+                        .extractor(textExtractor)
+                        .zoneId(zoneId)
+                        .indexAttachments(IndexAttachments.NO)
+                        .build());
             case Optional:
-                return mapper.writeValueAsString(IndexableMessage.from(message, users, textExtractor, zoneId, IndexAttachments.NO));
+                return mapper.writeValueAsString(IndexableMessage.builder()
+                        .message(message)
+                        .users(users)
+                        .extractor(textExtractor)
+                        .zoneId(zoneId)
+                        .indexAttachments(IndexAttachments.NO)
+                        .build());
             default:
                 throw new NotImplementedException();
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/83e9e0c4/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java
index a66f326..56aedb3 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java
@@ -35,6 +35,7 @@ import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.elasticsearch.IndexAttachments;
 import org.apache.james.mailbox.extractor.ParsedContent;
 import org.apache.james.mailbox.extractor.TextExtractor;
+import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
@@ -57,6 +58,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
             .thenReturn(new ByteArrayInputStream("".getBytes()));
         when(mailboxMessage.createFlags())
@@ -64,8 +67,13 @@ public class IndexableMessageTest {
         when(mailboxMessage.getUid())
             .thenReturn(MESSAGE_UID);
 
-        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
-                new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.NO);
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new DefaultTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.NO)
+                .build();
 
         assertThat(indexableMessage.getText()).isEmpty();
     }
@@ -76,6 +84,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
             .thenReturn(new ByteArrayInputStream("From: First user <us...@james.org>\nFrom: Second user <us...@james.org>".getBytes()));
         when(mailboxMessage.createFlags())
@@ -83,8 +93,13 @@ public class IndexableMessageTest {
         when(mailboxMessage.getUid())
             .thenReturn(MESSAGE_UID);
 
-        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
-                new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.NO);
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new DefaultTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.NO)
+                .build();
 
         assertThat(indexableMessage.getText()).isEqualTo("Second user user2@james.org First user user@james.org");
     }
@@ -95,6 +110,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
             .thenReturn(new ByteArrayInputStream("To: First to <us...@james.org>\nTo: Second to <us...@james.org>".getBytes()));
         when(mailboxMessage.createFlags())
@@ -102,8 +119,13 @@ public class IndexableMessageTest {
         when(mailboxMessage.getUid())
             .thenReturn(MESSAGE_UID);
 
-        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
-                new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.NO);
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new DefaultTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.NO)
+                .build();
 
         assertThat(indexableMessage.getText()).isEqualTo("First to user@james.org Second to user2@james.org");
     }
@@ -114,6 +136,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
             .thenReturn(new ByteArrayInputStream("Cc: First cc <us...@james.org>\nCc: Second cc <us...@james.org>".getBytes()));
         when(mailboxMessage.createFlags())
@@ -121,8 +145,13 @@ public class IndexableMessageTest {
         when(mailboxMessage.getUid())
             .thenReturn(MESSAGE_UID);
 
-        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
-                new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.NO);
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new DefaultTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.NO)
+                .build();
 
         assertThat(indexableMessage.getText()).isEqualTo("First cc user@james.org Second cc user2@james.org");
     }
@@ -133,6 +162,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getUid())
             .thenReturn(MESSAGE_UID);
         when(mailboxMessage.getFullContent())
@@ -140,8 +171,13 @@ public class IndexableMessageTest {
         when(mailboxMessage.createFlags())
             .thenReturn(new Flags());
 
-        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
-                new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.NO);
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new DefaultTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.NO)
+                .build();
 
         assertThat(indexableMessage.getText()).isEqualTo("Second bcc user2@james.org First bcc user@james.org");
     }
@@ -152,6 +188,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
             .thenReturn(new ByteArrayInputStream("Subject: subject1\nSubject: subject2".getBytes()));
         when(mailboxMessage.createFlags())
@@ -159,8 +197,13 @@ public class IndexableMessageTest {
         when(mailboxMessage.getUid())
             .thenReturn(MESSAGE_UID);
 
-        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
-                new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.NO);
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new DefaultTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.NO)
+                .build();
 
         assertThat(indexableMessage.getText()).isEqualTo("subject1 subject2");
     }
@@ -171,6 +214,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
             .thenReturn(new ByteArrayInputStream("\nMy body".getBytes()));
         when(mailboxMessage.createFlags())
@@ -178,8 +223,13 @@ public class IndexableMessageTest {
         when(mailboxMessage.getUid())
             .thenReturn(MESSAGE_UID);
 
-        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
-                new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.NO);
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new DefaultTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.NO)
+                .build();
 
         assertThat(indexableMessage.getText()).isEqualTo("My body");
     }
@@ -190,6 +240,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
             .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/mailWithHeaders.eml"))));
         when(mailboxMessage.createFlags())
@@ -197,8 +249,13 @@ public class IndexableMessageTest {
         when(mailboxMessage.getUid())
             .thenReturn(MESSAGE_UID);
 
-        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
-                new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.NO);
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new DefaultTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.NO)
+                .build();
 
         assertThat(indexableMessage.getText()).isEqualTo("Ad Min admin@opush.test " +
                 "a@test a@test B b@test " + 
@@ -218,6 +275,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
             .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/mailWithHeaders.eml"))));
         when(mailboxMessage.createFlags())
@@ -227,8 +286,13 @@ public class IndexableMessageTest {
         when(mailboxMessage.getProperties()).thenReturn(ImmutableList.of(IndexableMessage.HAS_ATTACHMENT_PROPERTY));
 
         // When
-        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
-                new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.YES);
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new DefaultTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.YES)
+                .build();
 
         // Then
         assertThat(indexableMessage.getHasAttachment()).isTrue();
@@ -241,6 +305,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
             .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/mailWithHeaders.eml"))));
         when(mailboxMessage.createFlags())
@@ -251,8 +317,13 @@ public class IndexableMessageTest {
             .thenReturn(ImmutableList.of(new SimpleProperty(PropertyBuilder.JAMES_INTERNALS, PropertyBuilder.HAS_ATTACHMENT, "false")));
 
         // When
-        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
-            new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.YES);
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new DefaultTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.NO)
+                .build();
 
         // Then
         assertThat(indexableMessage.getHasAttachment()).isFalse();
@@ -265,6 +336,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
             .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/mailWithHeaders.eml"))));
         when(mailboxMessage.createFlags())
@@ -275,8 +348,13 @@ public class IndexableMessageTest {
             .thenReturn(ImmutableList.of());
 
         // When
-        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
-            new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.YES);
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new DefaultTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.NO)
+                .build();
 
         // Then
         assertThat(indexableMessage.getHasAttachment()).isFalse();
@@ -289,6 +367,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
             .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/mailWithHeaders.eml"))));
         when(mailboxMessage.createFlags())
@@ -297,8 +377,13 @@ public class IndexableMessageTest {
             .thenReturn(MESSAGE_UID);
 
         // When
-        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
-                new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.NO);
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new DefaultTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.NO)
+                .build();
 
         // Then
         assertThat(indexableMessage.getAttachments()).isEmpty();
@@ -311,6 +396,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
             .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/emailWith3Attachments.eml"))));
         when(mailboxMessage.createFlags())
@@ -319,8 +406,13 @@ public class IndexableMessageTest {
             .thenReturn(MESSAGE_UID);
 
         // When
-        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
-                new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.YES);
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new DefaultTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.YES)
+                .build();
 
         // Then
         assertThat(indexableMessage.getAttachments()).isNotEmpty();
@@ -333,6 +425,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
             .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/emailWith3Attachments.eml"))));
         when(mailboxMessage.createFlags())
@@ -347,8 +441,13 @@ public class IndexableMessageTest {
             .thenReturn(new ParsedContent("third attachment content", ImmutableMap.of()));
 
         // When
-        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
-                textExtractor, ZoneId.of("Europe/Paris"), IndexAttachments.YES);
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(textExtractor)
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.YES)
+                .build();
 
         // Then
         assertThat(indexableMessage.getText()).contains("first attachment content");
@@ -362,6 +461,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
             .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/bodyMakeTikaToFail.eml"))));
         when(mailboxMessage.createFlags())
@@ -370,8 +471,13 @@ public class IndexableMessageTest {
             .thenReturn(MESSAGE_UID);
 
         // When
-        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
-                new TikaTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.YES);
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new TikaTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.YES)
+                .build();
 
         // Then
         assertThat(indexableMessage.getText()).contains("subject should be parsed");

http://git-wip-us.apache.org/repos/asf/james-project/blob/83e9e0c4/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
index 7efb14a..f508766 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
@@ -95,7 +95,7 @@ public class MessageToElasticSearchJsonTest {
         ImmutableList<User> users = ImmutableList.of();
 
         assertThatThrownBy(() -> messageToElasticSearchJson.convertToJson(spamMail, users))
-            .isInstanceOf(IllegalArgumentException.class);
+            .isInstanceOf(IllegalStateException.class);
     }
 
     @Test
@@ -372,7 +372,7 @@ public class MessageToElasticSearchJsonTest {
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
                 new DefaultTextExtractor(),
                 ZoneId.of("Europe/Paris"),
-                IndexAttachments.YES,
+                IndexAttachments.NO,
                 MessageSearchIndex.IndexMessageId.Required);
         String convertToJsonWithoutAttachment = messageToElasticSearchJson.convertToJsonWithoutAttachment(message, ImmutableList.of(new MockMailboxSession("username").getUser()));
 


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


[06/13] james-project git commit: JAMES-1934 Adding test demonstrating HasAttachment criterion do not return inlined images

Posted by bt...@apache.org.
JAMES-1934 Adding test demonstrating HasAttachment criterion do not return inlined images


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

Branch: refs/heads/master
Commit: 7d7665ab0b14b226f3c2a308345765ce25fa74b8
Parents: 810c764
Author: Benoit Tellier <bt...@linagora.com>
Authored: Wed Feb 8 17:36:02 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Feb 15 06:59:45 2017 +0700

----------------------------------------------------------------------
 .../store/search/AbstractMessageSearchIndexTest.java  | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/7d7665ab/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
index f64f88d..4e1d4fc 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
@@ -68,6 +68,7 @@ public abstract class AbstractMessageSearchIndexTest {
     private ComposedMessageId m8;
     private ComposedMessageId m9;
     private ComposedMessageId mailWithAttachment;
+    private ComposedMessageId mailWithInlinedAttachment;
     private ComposedMessageId mOther;
 
     @Before
@@ -155,8 +156,6 @@ public abstract class AbstractMessageSearchIndexTest {
             session,
             true,
             new Flags(Flags.Flag.SEEN));
-        // sentDate: Tue, 2 Jun 2015 12:00:55 +0200
-        // Internal date : 2014/09/02 00:00:00.000
         m9 = inboxMessageManager.appendMessage(
             ClassLoader.getSystemResourceAsStream("eml/frnog.eml"),
             new Date(1409608800000L),
@@ -171,6 +170,13 @@ public abstract class AbstractMessageSearchIndexTest {
             true,
             new Flags("Hello you"));
 
+        mailWithInlinedAttachment = myFolderMessageManager.appendMessage(
+            ClassLoader.getSystemResourceAsStream("eml/oneInlinedAttachment.eml"),
+            new Date(1409608900000L),
+            session,
+            true,
+            new Flags("Hello you"));
+
         await();
     }
 
@@ -245,7 +251,7 @@ public abstract class AbstractMessageSearchIndexTest {
         SearchQuery searchQuery = new SearchQuery();
         searchQuery.andCriteria(SearchQuery.hasNoAttachment());
         assertThat(messageSearchIndex.search(session, mailbox2, searchQuery))
-            .containsOnly(mOther.getUid());
+            .containsOnly(mOther.getUid(), mailWithInlinedAttachment.getUid());
     }
 
     @Test
@@ -935,6 +941,6 @@ public abstract class AbstractMessageSearchIndexTest {
         List<MessageId> actual = messageSearchIndex.search(session, MultimailboxesSearchQuery.from(searchQuery).build(), LIMIT);
 
         assertThat(actual).containsOnly(m1.getMessageId(), m2.getMessageId(), m3.getMessageId(), m4.getMessageId(), m5.getMessageId(),
-            m6.getMessageId(), m7.getMessageId(), m8.getMessageId(), m9.getMessageId(), mOther.getMessageId(), mailWithAttachment.getMessageId());
+            m6.getMessageId(), m7.getMessageId(), m8.getMessageId(), m9.getMessageId(), mOther.getMessageId(), mailWithAttachment.getMessageId(), mailWithInlinedAttachment.getMessageId());
     }
 }


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


[04/13] james-project git commit: JAMES-1934 add hasAttachment criterion

Posted by bt...@apache.org.
JAMES-1934 add hasAttachment criterion


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

Branch: refs/heads/master
Commit: 3705c186061dd77a7387cd2ccef45dcaba2bd66d
Parents: de54a6e
Author: Luc DUZAN <ld...@linagora.com>
Authored: Thu Feb 9 12:54:34 2017 +0100
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Feb 15 06:59:45 2017 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/model/SearchQuery.java | 53 ++++++++++++++++++++
 .../store/mail/model/impl/PropertyBuilder.java  | 13 +++++
 .../mailbox/store/search/MessageSearches.java   | 13 +++++
 .../search/AbstractMessageSearchIndexTest.java  | 27 +++++++++-
 4 files changed, 105 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/3705c186/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
index 914a7b6..a5eeca6 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
@@ -32,6 +32,7 @@ import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.model.SearchQuery.Sort;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
@@ -594,6 +595,14 @@ public class SearchQuery implements Serializable {
         return result;
     }
 
+    public static Criterion hasAttachment() {
+        return new AttachmentCriterion(BooleanOperator.set());
+    }
+
+    public static Criterion hasNoAttachment() {
+        return new AttachmentCriterion(BooleanOperator.unset());
+    }
+
     /**
      * Creates a filter on the given flag selecting messages where the given
      * flag is selected.
@@ -1308,6 +1317,50 @@ public class SearchQuery implements Serializable {
         }
     }
 
+    /***
+     * Filter on attachment presence
+     */
+    public static class AttachmentCriterion extends Criterion {
+        private final BooleanOperator operator;
+
+        private AttachmentCriterion(BooleanOperator operator) {
+            this.operator = operator;
+        }
+
+        /**
+         * Gets the test to be preformed.
+         *
+         * @return the <code>BooleanOperator</code>, not null
+         */
+        public BooleanOperator getOperator() {
+            return operator;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hashCode(operator);
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof AttachmentCriterion) {
+                AttachmentCriterion that = (AttachmentCriterion) obj;
+
+                return Objects.equal(this.operator, that.operator);
+            }
+
+            return false;
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this)
+                .add("operator", operator)
+                .toString();
+        }
+    }
+
+
     /**
      * Filters on a standard flag.
      */

http://git-wip-us.apache.org/repos/asf/james-project/blob/3705c186/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java
index c42aa0c..152f874 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java
@@ -49,6 +49,8 @@ import java.util.TreeMap;
 
 import org.apache.james.mailbox.store.mail.model.Property;
 
+import com.google.common.base.Predicate;
+
 /**
  * Builds properties
  */
@@ -58,6 +60,17 @@ public class PropertyBuilder {
     public static final String JAMES_INTERNALS = "JAMES_INTERNALS";
     public static final String HAS_ATTACHMENT = "HAS_ATTACHMENT";
 
+    public static Predicate<Property> isHasAttachmentProperty() {
+        return new Predicate<Property>() {
+            @Override
+            public boolean apply(Property input) {
+                return input.getNamespace().equals(PropertyBuilder.JAMES_INTERNALS)
+                    && input.getLocalName().equals(PropertyBuilder.HAS_ATTACHMENT)
+                    && input.getValue().equals("true");
+            }
+        };
+    }
+
     private Long textualLineCount;
     private final List<SimpleProperty> properties;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/3705c186/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
index 6fe58b5..6a440b2 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
@@ -47,6 +47,8 @@ import org.apache.james.mailbox.model.SearchQuery.DateResolution;
 import org.apache.james.mailbox.model.SearchQuery.UidRange;
 import org.apache.james.mailbox.store.ResultUtils;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.apache.james.mailbox.store.mail.model.Property;
+import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.search.comparator.CombinedComparator;
 import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.MimeIOException;
@@ -69,6 +71,7 @@ import org.apache.james.mime4j.utils.search.MessageMatcher;
 
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
@@ -94,6 +97,7 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
     public MessageSearches() {
     }
 
+    @Override
     public Iterator<SimpleMessageSearchIndex.SearchResult> iterator() {
         ImmutableList.Builder<MailboxMessage> builder = ImmutableList.builder();
         while (messages.hasNext()) {
@@ -187,6 +191,8 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
             result = true;
         } else if (criterion instanceof SearchQuery.ConjunctionCriterion) {
             result = matches((SearchQuery.ConjunctionCriterion) criterion, message, recentMessageUids);
+        } else if (criterion instanceof SearchQuery.AttachmentCriterion) {
+            result = matches((SearchQuery.AttachmentCriterion) criterion, message);
         } else if (criterion instanceof SearchQuery.ModSeqCriterion) {
             result = matches((SearchQuery.ModSeqCriterion) criterion, message);
         } else {
@@ -523,6 +529,13 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
         return cal.getTime();
     }
 
+
+    private boolean matches(SearchQuery.AttachmentCriterion criterion, MailboxMessage message) throws UnsupportedSearchException {
+        boolean mailHasAttachments = FluentIterable.from(message.getProperties())
+            .anyMatch(PropertyBuilder.isHasAttachmentProperty());
+        return mailHasAttachments == criterion.getOperator().isSet();
+    }
+
     private boolean matches(SearchQuery.SizeCriterion criterion, MailboxMessage message) throws UnsupportedSearchException {
         SearchQuery.NumericOperator operator = criterion.getOperator();
         long size = message.getFullContentOctets();

http://git-wip-us.apache.org/repos/asf/james-project/blob/3705c186/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
index b3cd404..f64f88d 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
@@ -67,6 +67,7 @@ public abstract class AbstractMessageSearchIndexTest {
     private ComposedMessageId m7;
     private ComposedMessageId m8;
     private ComposedMessageId m9;
+    private ComposedMessageId mailWithAttachment;
     private ComposedMessageId mOther;
 
     @Before
@@ -162,6 +163,14 @@ public abstract class AbstractMessageSearchIndexTest {
             session,
             true,
             new Flags("Hello you"));
+
+        mailWithAttachment = myFolderMessageManager.appendMessage(
+            ClassLoader.getSystemResourceAsStream("eml/oneAttachmentAndSomeTextInlined.eml"),
+            new Date(1409608900000L),
+            session,
+            true,
+            new Flags("Hello you"));
+
         await();
     }
 
@@ -224,6 +233,22 @@ public abstract class AbstractMessageSearchIndexTest {
     }
 
     @Test
+    public void hasAttachmentShouldOnlyReturnMessageThatHasAttachmentWhichAreNotInline() throws MailboxException {
+        SearchQuery searchQuery = new SearchQuery();
+        searchQuery.andCriteria(SearchQuery.hasAttachment());
+        assertThat(messageSearchIndex.search(session, mailbox2, searchQuery))
+            .containsOnly(mailWithAttachment.getUid());
+    }
+
+    @Test
+    public void hasNoAttachmenShouldOnlyReturnMessageThatHasNoAttachmentWhichAreNotInline() throws MailboxException {
+        SearchQuery searchQuery = new SearchQuery();
+        searchQuery.andCriteria(SearchQuery.hasNoAttachment());
+        assertThat(messageSearchIndex.search(session, mailbox2, searchQuery))
+            .containsOnly(mOther.getUid());
+    }
+
+    @Test
     public void flagIsSetShouldReturnUidOfMessageMarkedAsDeletedWhenUsedWithFlagDeleted() throws MailboxException {
         SearchQuery searchQuery = new SearchQuery();
         searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.DELETED));
@@ -910,6 +935,6 @@ public abstract class AbstractMessageSearchIndexTest {
         List<MessageId> actual = messageSearchIndex.search(session, MultimailboxesSearchQuery.from(searchQuery).build(), LIMIT);
 
         assertThat(actual).containsOnly(m1.getMessageId(), m2.getMessageId(), m3.getMessageId(), m4.getMessageId(), m5.getMessageId(),
-            m6.getMessageId(), m7.getMessageId(), m8.getMessageId(), m9.getMessageId(), mOther.getMessageId());
+            m6.getMessageId(), m7.getMessageId(), m8.getMessageId(), m9.getMessageId(), mOther.getMessageId(), mailWithAttachment.getMessageId());
     }
 }


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


[12/13] james-project git commit: JAMES-1934 indexation handle invalid messageId instead of looking for backend indexation support

Posted by bt...@apache.org.
JAMES-1934 indexation handle invalid messageId instead of looking for backend indexation support


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

Branch: refs/heads/master
Commit: cdfe3f71371c1cddc2be47d04d56380591823dd5
Parents: 983de8d
Author: Luc DUZAN <ld...@linagora.com>
Authored: Fri Feb 10 14:09:28 2017 +0100
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Feb 15 06:59:46 2017 +0700

----------------------------------------------------------------------
 .../elasticsearch/json/IndexableMessage.java    |  4 +-
 .../json/MessageToElasticSearchJson.java        | 72 ++++-----------
 .../ElasticSearchIntegrationTest.java           |  5 +-
 .../json/IndexableMessageTest.java              | 93 +++++++++++++++++++
 .../json/MessageToElasticSearchJsonTest.java    | 52 +++++------
 .../lucene/search/LuceneMessageSearchIndex.java | 28 +++---
 .../LuceneMailboxMessageSearchIndexTest.java    |  3 +-
 .../store/search/MessageSearchIndex.java        |  5 --
 .../james/mailbox/store/search/SearchUtil.java  | 14 +++
 .../mailbox/store/search/SearchUtilTest.java    | 94 +++++++++++++++++++-
 .../host/ElasticSearchHostSystem.java           |  3 +-
 11 files changed, 255 insertions(+), 118 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/cdfe3f71/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
index c6e3ce7..e5ad24e 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.Property;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleProperty;
+import org.apache.james.mailbox.store.search.SearchUtil;
 import org.apache.james.mime4j.MimeException;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -69,7 +70,6 @@ public class IndexableMessage {
 
         public IndexableMessage build() {
             Preconditions.checkNotNull(message.getMailboxId());
-            Preconditions.checkNotNull(message.getMessageId());
             Preconditions.checkNotNull(users);
             Preconditions.checkNotNull(textExtractor);
             Preconditions.checkNotNull(indexAttachments);
@@ -115,7 +115,7 @@ public class IndexableMessage {
         }
 
         private IndexableMessage instanciateIndexedMessage() throws IOException, MimeException {
-            String messageId = message.getMessageId().serialize();
+            String messageId = SearchUtil.getSerializedMessageIdIfSupportedByUnderlyingStorageOrNull(message);
             MimePart parsingResult = new MimePartParser(message, textExtractor).parse();
 
             List<String> stringifiedUsers = users.stream()

http://git-wip-us.apache.org/repos/asf/james-project/blob/cdfe3f71/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
index d4c896e..aacd790 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
@@ -25,13 +25,11 @@ import java.util.List;
 import javax.inject.Inject;
 import javax.mail.Flags;
 
-import org.apache.commons.lang.NotImplementedException;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession.User;
 import org.apache.james.mailbox.elasticsearch.IndexAttachments;
 import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-import org.apache.james.mailbox.store.search.MessageSearchIndex;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -45,81 +43,45 @@ public class MessageToElasticSearchJson {
     private final TextExtractor textExtractor;
     private final ZoneId zoneId;
     private final IndexAttachments indexAttachments;
-    private final MessageSearchIndex.IndexMessageId indexMessageId;
 
-    public MessageToElasticSearchJson(TextExtractor textExtractor, ZoneId zoneId, IndexAttachments indexAttachments, MessageSearchIndex.IndexMessageId indexMessageId) {
+    public MessageToElasticSearchJson(TextExtractor textExtractor, ZoneId zoneId, IndexAttachments indexAttachments) {
         this.textExtractor = textExtractor;
         this.zoneId = zoneId;
         this.indexAttachments = indexAttachments;
         this.mapper = new ObjectMapper();
         this.mapper.registerModule(new GuavaModule());
         this.mapper.registerModule(new Jdk8Module());
-        this.indexMessageId = indexMessageId;
     }
 
     @Inject
     public MessageToElasticSearchJson(TextExtractor textExtractor, IndexAttachments indexAttachments, MailboxManager mailboxManager) {
-        this(textExtractor, ZoneId.systemDefault(), indexAttachments, indexMessageId(mailboxManager));
-    }
-
-    private static MessageSearchIndex.IndexMessageId indexMessageId(MailboxManager mailboxManager) {
-        if (mailboxManager.getSupportedMessageCapabilities().contains(MailboxManager.MessageCapabilities.UniqueID)) {
-            return MessageSearchIndex.IndexMessageId.Required;
-        }
-        return MessageSearchIndex.IndexMessageId.Optional;
+        this(textExtractor, ZoneId.systemDefault(), indexAttachments);
     }
 
     public String convertToJson(MailboxMessage message, List<User> users) throws JsonProcessingException {
         Preconditions.checkNotNull(message);
-        switch (indexMessageId) {
-            case Required:
-                return mapper.writeValueAsString(IndexableMessage.builder()
-                        .message(message)
-                        .users(users)
-                        .extractor(textExtractor)
-                        .zoneId(zoneId)
-                        .indexAttachments(indexAttachments)
-                        .build());
-            case Optional:
-                return mapper.writeValueAsString(IndexableMessage.builder()
-                        .message(message)
-                        .users(users)
-                        .extractor(textExtractor)
-                        .zoneId(zoneId)
-                        .indexAttachments(indexAttachments)
-                        .build());
-            default:
-                throw new NotImplementedException();
-        }
+
+        return mapper.writeValueAsString(IndexableMessage.builder()
+                .message(message)
+                .users(users)
+                .extractor(textExtractor)
+                .zoneId(zoneId)
+                .indexAttachments(indexAttachments)
+                .build());
     }
 
     public String convertToJsonWithoutAttachment(MailboxMessage message, List<User> users) throws JsonProcessingException {
-        Preconditions.checkNotNull(message);
-        switch (indexMessageId) {
-            case Required:
-                return mapper.writeValueAsString(IndexableMessage.builder()
-                        .message(message)
-                        .users(users)
-                        .extractor(textExtractor)
-                        .zoneId(zoneId)
-                        .indexAttachments(IndexAttachments.NO)
-                        .build());
-            case Optional:
-                return mapper.writeValueAsString(IndexableMessage.builder()
-                        .message(message)
-                        .users(users)
-                        .extractor(textExtractor)
-                        .zoneId(zoneId)
-                        .indexAttachments(IndexAttachments.NO)
-                        .build());
-            default:
-                throw new NotImplementedException();
-        }
+        return mapper.writeValueAsString(IndexableMessage.builder()
+                .message(message)
+                .users(users)
+                .extractor(textExtractor)
+                .zoneId(zoneId)
+                .indexAttachments(IndexAttachments.NO)
+                .build());
     }
 
     public String getUpdatedJsonMessagePart(Flags flags, long modSeq) throws JsonProcessingException {
         Preconditions.checkNotNull(flags);
         return mapper.writeValueAsString(new MessageUpdateJson(flags, modSeq));
     }
-
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/cdfe3f71/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
index c406419..7ae3d09 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
@@ -46,7 +46,6 @@ import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
 import org.apache.james.mailbox.store.search.AbstractMessageSearchIndexTest;
-import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.elasticsearch.client.Client;
 import org.junit.Rule;
 import org.junit.rules.RuleChain;
@@ -90,7 +89,7 @@ public class ElasticSearchIntegrationTest extends AbstractMessageSearchIndexTest
                 MailboxElasticsearchConstants.MAILBOX_INDEX,
                 MailboxElasticsearchConstants.MESSAGE_TYPE),
             new ElasticSearchSearcher(client, new QueryConverter(new CriterionConverter()), SEARCH_SIZE, new InMemoryId.Factory(), messageIdFactory),
-            new MessageToElasticSearchJson(new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.YES, MessageSearchIndex.IndexMessageId.Required));
+            new MessageToElasticSearchJson(new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.YES));
         storeMailboxManager = new InMemoryMailboxManager(
             mapperFactory,
             new FakeAuthenticator(),
@@ -103,4 +102,4 @@ public class ElasticSearchIntegrationTest extends AbstractMessageSearchIndexTest
         storeMailboxManager.setMessageSearchIndex(messageSearchIndex);
         storeMailboxManager.init();
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/cdfe3f71/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java
index 56aedb3..726eb69 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java
@@ -37,6 +37,7 @@ import org.apache.james.mailbox.extractor.ParsedContent;
 import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.mock.MockMailboxSession;
+import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -482,5 +483,97 @@ public class IndexableMessageTest {
         // Then
         assertThat(indexableMessage.getText()).contains("subject should be parsed");
     }
+    
+    @Test
+    public void  shouldHandleCorrectlyMessageIdHavingSerializeMethodThatThrowAnException() throws Exception {
+       MessageId invalidMessageIdThatThrowException = mock(MessageId.class);
+       when(invalidMessageIdThatThrowException.serialize())
+           .thenThrow(new UnsupportedOperationException());
+       
+        // When
+        MailboxMessage mailboxMessage = mock(MailboxMessage.class);
+        TestId mailboxId = TestId.of(1);
+        when(mailboxMessage.getMailboxId())
+            .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(invalidMessageIdThatThrowException);
+        when(mailboxMessage.getFullContent())
+            .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/bodyMakeTikaToFail.eml"))));
+        when(mailboxMessage.createFlags())
+            .thenReturn(new Flags());
+        when(mailboxMessage.getUid())
+            .thenReturn(MESSAGE_UID);
 
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new TikaTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.YES)
+                .build();
+
+        // Then
+        assertThat(indexableMessage.getMessageId()).isNull();
+    }
+
+    @Test
+    public void shouldHandleCorrectlyMessageIdHavingSerializeMethodThatReturnNull() throws Exception {
+       MessageId invalidMessageIdThatReturnNull = mock(MessageId.class);
+       when(invalidMessageIdThatReturnNull.serialize())
+           .thenReturn(null);
+       
+        // When
+        MailboxMessage mailboxMessage = mock(MailboxMessage.class);
+        TestId mailboxId = TestId.of(1);
+        when(mailboxMessage.getMailboxId())
+            .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(invalidMessageIdThatReturnNull);
+        when(mailboxMessage.getFullContent())
+            .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/bodyMakeTikaToFail.eml"))));
+        when(mailboxMessage.createFlags())
+            .thenReturn(new Flags());
+        when(mailboxMessage.getUid())
+            .thenReturn(MESSAGE_UID);
+
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new TikaTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.YES)
+                .build();
+
+        // Then
+        assertThat(indexableMessage.getMessageId()).isNull();
+    }
+
+    @Test
+    public void shouldHandleCorrectlyNullMessageId() throws Exception {
+       
+        // When
+        MailboxMessage mailboxMessage = mock(MailboxMessage.class);
+        TestId mailboxId = TestId.of(1);
+        when(mailboxMessage.getMailboxId())
+            .thenReturn(mailboxId);
+        when(mailboxMessage.getMessageId())
+            .thenReturn(null);
+        when(mailboxMessage.getFullContent())
+            .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/bodyMakeTikaToFail.eml"))));
+        when(mailboxMessage.createFlags())
+            .thenReturn(new Flags());
+        when(mailboxMessage.getUid())
+            .thenReturn(MESSAGE_UID);
+
+        IndexableMessage indexableMessage = IndexableMessage.builder()
+                .message(mailboxMessage)
+                .users(ImmutableList.of(new MockMailboxSession("username").getUser()))
+                .extractor(new TikaTextExtractor())
+                .zoneId(ZoneId.of("Europe/Paris"))
+                .indexAttachments(IndexAttachments.YES)
+                .build();
+
+        // Then
+        assertThat(indexableMessage.getMessageId()).isNull();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/cdfe3f71/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
index f508766..ba27b58 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
@@ -45,7 +45,6 @@ import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 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.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.apache.james.mailbox.tika.extractor.TikaTextExtractor;
 import org.junit.Before;
 import org.junit.Test;
@@ -82,8 +81,7 @@ public class MessageToElasticSearchJsonTest {
     public void convertToJsonShouldThrowWhenNoUser() throws Exception {
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
                 new DefaultTextExtractor(),
-                ZoneId.of("Europe/Paris"), IndexAttachments.YES,
-                MessageSearchIndex.IndexMessageId.Required);
+                ZoneId.of("Europe/Paris"), IndexAttachments.YES);
         MailboxMessage spamMail = new SimpleMailboxMessage(MESSAGE_ID,
                 date,
                 SIZE,
@@ -102,8 +100,7 @@ public class MessageToElasticSearchJsonTest {
     public void spamEmailShouldBeWellConvertedToJson() throws IOException {
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
             new DefaultTextExtractor(),
-            ZoneId.of("Europe/Paris"), IndexAttachments.YES,
-            MessageSearchIndex.IndexMessageId.Required);
+            ZoneId.of("Europe/Paris"), IndexAttachments.YES);
         MailboxMessage spamMail = new SimpleMailboxMessage(MESSAGE_ID,
                 date,
                 SIZE,
@@ -123,8 +120,7 @@ public class MessageToElasticSearchJsonTest {
     public void htmlEmailShouldBeWellConvertedToJson() throws IOException {
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
             new DefaultTextExtractor(),
-            ZoneId.of("Europe/Paris"), IndexAttachments.YES,
-            MessageSearchIndex.IndexMessageId.Required);
+            ZoneId.of("Europe/Paris"), IndexAttachments.YES);
         MailboxMessage htmlMail = new SimpleMailboxMessage(MESSAGE_ID,
                 date,
                 SIZE,
@@ -144,8 +140,7 @@ public class MessageToElasticSearchJsonTest {
     public void pgpSignedEmailShouldBeWellConvertedToJson() throws IOException {
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
             new DefaultTextExtractor(),
-            ZoneId.of("Europe/Paris"), IndexAttachments.YES,
-            MessageSearchIndex.IndexMessageId.Required);
+            ZoneId.of("Europe/Paris"), IndexAttachments.YES);
         MailboxMessage pgpSignedMail = new SimpleMailboxMessage(MESSAGE_ID,
                 date,
                 SIZE,
@@ -165,8 +160,7 @@ public class MessageToElasticSearchJsonTest {
     public void simpleEmailShouldBeWellConvertedToJson() throws IOException {
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
             new DefaultTextExtractor(),
-            ZoneId.of("Europe/Paris"), IndexAttachments.YES,
-            MessageSearchIndex.IndexMessageId.Required);
+            ZoneId.of("Europe/Paris"), IndexAttachments.YES);
         MailboxMessage mail = new SimpleMailboxMessage(MESSAGE_ID,
                 date,
                 SIZE,
@@ -187,8 +181,7 @@ public class MessageToElasticSearchJsonTest {
     public void recursiveEmailShouldBeWellConvertedToJson() throws IOException {
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
             new DefaultTextExtractor(),
-            ZoneId.of("Europe/Paris"), IndexAttachments.YES,
-            MessageSearchIndex.IndexMessageId.Required);
+            ZoneId.of("Europe/Paris"), IndexAttachments.YES);
         MailboxMessage recursiveMail = new SimpleMailboxMessage(MESSAGE_ID, 
                 date,
                 SIZE,
@@ -208,8 +201,7 @@ public class MessageToElasticSearchJsonTest {
     public void emailWithNoInternalDateShouldUseNowDate() throws IOException {
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
             new DefaultTextExtractor(),
-            ZoneId.of("Europe/Paris"), IndexAttachments.YES,
-            MessageSearchIndex.IndexMessageId.Required);
+            ZoneId.of("Europe/Paris"), IndexAttachments.YES);
         MailboxMessage mailWithNoInternalDate = new SimpleMailboxMessage(MESSAGE_ID,
                 null,
                 SIZE,
@@ -243,8 +235,8 @@ public class MessageToElasticSearchJsonTest {
         // When
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
             new DefaultTextExtractor(),
-            ZoneId.of("Europe/Paris"), IndexAttachments.YES,
-            MessageSearchIndex.IndexMessageId.Required);
+            ZoneId.of("Europe/Paris"),
+            IndexAttachments.YES);
         String convertToJson = messageToElasticSearchJson.convertToJson(mailWithNoInternalDate, ImmutableList.of(new MockMailboxSession("username").getUser()));
 
         // Then
@@ -271,8 +263,8 @@ public class MessageToElasticSearchJsonTest {
         // When
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
             new DefaultTextExtractor(),
-            ZoneId.of("Europe/Paris"), IndexAttachments.NO,
-            MessageSearchIndex.IndexMessageId.Required);
+            ZoneId.of("Europe/Paris"),
+            IndexAttachments.NO);
         String convertToJson = messageToElasticSearchJson.convertToJson(mailWithNoInternalDate, ImmutableList.of(new MockMailboxSession("username").getUser()));
 
         // Then
@@ -286,8 +278,7 @@ public class MessageToElasticSearchJsonTest {
     public void emailWithNoMailboxIdShouldThrow() throws IOException {
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
             new DefaultTextExtractor(),
-            ZoneId.of("Europe/Paris"), IndexAttachments.YES,
-            MessageSearchIndex.IndexMessageId.Required);
+            ZoneId.of("Europe/Paris"), IndexAttachments.YES);
         MailboxMessage mailWithNoMailboxId;
         try {
             mailWithNoMailboxId = new SimpleMailboxMessage(MESSAGE_ID, date,
@@ -309,8 +300,8 @@ public class MessageToElasticSearchJsonTest {
     public void getUpdatedJsonMessagePartShouldBehaveWellOnEmptyFlags() throws Exception {
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
             new DefaultTextExtractor(),
-            ZoneId.of("Europe/Paris"), IndexAttachments.YES,
-            MessageSearchIndex.IndexMessageId.Required);
+            ZoneId.of("Europe/Paris"),
+            IndexAttachments.YES);
         assertThatJson(messageToElasticSearchJson.getUpdatedJsonMessagePart(new Flags(), MOD_SEQ))
             .isEqualTo("{\"modSeq\":42,\"isAnswered\":false,\"isDeleted\":false,\"isDraft\":false,\"isFlagged\":false,\"isRecent\":false,\"userFlags\":[],\"isUnread\":true}");
     }
@@ -319,8 +310,8 @@ public class MessageToElasticSearchJsonTest {
     public void getUpdatedJsonMessagePartShouldBehaveWellOnNonEmptyFlags() throws Exception {
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
             new DefaultTextExtractor(),
-            ZoneId.of("Europe/Paris"), IndexAttachments.YES,
-            MessageSearchIndex.IndexMessageId.Required);
+            ZoneId.of("Europe/Paris"),
+            IndexAttachments.YES);
         assertThatJson(messageToElasticSearchJson.getUpdatedJsonMessagePart(new FlagsBuilder().add(Flags.Flag.DELETED, Flags.Flag.FLAGGED).add("user").build(), MOD_SEQ))
             .isEqualTo("{\"modSeq\":42,\"isAnswered\":false,\"isDeleted\":true,\"isDraft\":false,\"isFlagged\":true,\"isRecent\":false,\"userFlags\":[\"user\"],\"isUnread\":true}");
     }
@@ -329,8 +320,8 @@ public class MessageToElasticSearchJsonTest {
     public void getUpdatedJsonMessagePartShouldThrowIfFlagsIsNull() throws Exception {
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
             new DefaultTextExtractor(),
-            ZoneId.of("Europe/Paris"), IndexAttachments.YES,
-            MessageSearchIndex.IndexMessageId.Required);
+            ZoneId.of("Europe/Paris"),
+            IndexAttachments.YES);
         messageToElasticSearchJson.getUpdatedJsonMessagePart(null, MOD_SEQ);
     }
 
@@ -338,8 +329,8 @@ public class MessageToElasticSearchJsonTest {
     public void spamEmailShouldBeWellConvertedToJsonWithApacheTika() throws IOException {
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
             new TikaTextExtractor(),
-            ZoneId.of("Europe/Paris"), IndexAttachments.YES,
-            MessageSearchIndex.IndexMessageId.Required);
+            ZoneId.of("Europe/Paris"),
+            IndexAttachments.YES);
         MailboxMessage spamMail = new SimpleMailboxMessage(MESSAGE_ID, date,
             SIZE,
             BODY_START_OCTET,
@@ -372,8 +363,7 @@ public class MessageToElasticSearchJsonTest {
         MessageToElasticSearchJson messageToElasticSearchJson = new MessageToElasticSearchJson(
                 new DefaultTextExtractor(),
                 ZoneId.of("Europe/Paris"),
-                IndexAttachments.NO,
-                MessageSearchIndex.IndexMessageId.Required);
+                IndexAttachments.NO);
         String convertToJsonWithoutAttachment = messageToElasticSearchJson.convertToJsonWithoutAttachment(message, ImmutableList.of(new MockMailboxSession("username").getUser()));
 
         // Then

http://git-wip-us.apache.org/repos/asf/james-project/blob/cdfe3f71/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
index eb7ec7c..b46f9ad 100644
--- a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
+++ b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
@@ -70,7 +70,6 @@ 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.search.ListeningMessageSearchIndex;
-import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.apache.james.mailbox.store.search.SearchUtil;
 import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.dom.Header;
@@ -358,7 +357,6 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
     private final MailboxId.Factory mailboxIdFactory;
     private final MessageId.Factory messageIdFactory;
     private final IndexWriter writer;
-    private final IndexMessageId shouldIndexMessageId;
     
     private int maxQueryResults = DEFAULT_MAX_QUERY_RESULTS;
 
@@ -366,31 +364,29 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
 
     @Inject
     public LuceneMessageSearchIndex(MessageMapperFactory factory, MailboxId.Factory mailboxIdFactory, Directory directory, MessageId.Factory messageIdFactory, MailboxManager mailboxManager) throws CorruptIndexException, LockObtainFailedException, IOException {
-        this(factory, mailboxIdFactory, directory, false, true, messageIdFactory, indexMessageId(mailboxManager));
+        this(factory, mailboxIdFactory, directory, false, true, messageIdFactory);
     }
 
-    private static MessageSearchIndex.IndexMessageId indexMessageId(MailboxManager mailboxManager) {
-        if (mailboxManager.getSupportedMessageCapabilities().contains(MailboxManager.MessageCapabilities.UniqueID)) {
-            return MessageSearchIndex.IndexMessageId.Required;
-        }
-        return MessageSearchIndex.IndexMessageId.Optional;
-    }
-    
-    public LuceneMessageSearchIndex(MessageMapperFactory factory, MailboxId.Factory mailboxIdFactory, Directory directory, boolean dropIndexOnStart, boolean lenient, MessageId.Factory messageIdFactory, IndexMessageId shouldIndexMessageId) throws CorruptIndexException, LockObtainFailedException, IOException {
+    public LuceneMessageSearchIndex(
+            MessageMapperFactory factory,
+            MailboxId.Factory mailboxIdFactory,
+            Directory directory,
+            boolean dropIndexOnStart,
+            boolean lenient,
+            MessageId.Factory messageIdFactory)
+                    throws CorruptIndexException, LockObtainFailedException, IOException {
         super(factory);
         this.mailboxIdFactory = mailboxIdFactory;
         this.messageIdFactory = messageIdFactory;
         this.writer = new IndexWriter(directory,  createConfig(createAnalyzer(lenient), dropIndexOnStart));
-        this.shouldIndexMessageId = shouldIndexMessageId;
     }
     
     
-    public LuceneMessageSearchIndex(MessageMapperFactory factory, MailboxId.Factory mailboxIdFactory, MessageId.Factory messageIdFactory, IndexWriter writer, IndexMessageId shouldIndexMessageId) {
+    public LuceneMessageSearchIndex(MessageMapperFactory factory, MailboxId.Factory mailboxIdFactory, MessageId.Factory messageIdFactory, IndexWriter writer) {
         super(factory);
         this.mailboxIdFactory = mailboxIdFactory;
         this.messageIdFactory = messageIdFactory;
         this.writer = writer;
-        this.shouldIndexMessageId = shouldIndexMessageId;
     }
 
     @Override
@@ -561,9 +557,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
         doc.add(new Field(MAILBOX_ID_FIELD, membership.getMailboxId().serialize().toUpperCase(Locale.ENGLISH), Store.YES, Index.NOT_ANALYZED));
         doc.add(new NumericField(UID_FIELD,Store.YES, true).setLongValue(membership.getUid().asLong()));
         doc.add(new Field(HAS_ATTACHMENT_FIELD, Boolean.toString(hasAttachment(membership)), Store.YES, Index.NOT_ANALYZED));
-        if (shouldIndexMessageId == IndexMessageId.Required) {
-            doc.add(new Field(MESSAGE_ID_FIELD, membership.getMessageId().serialize(), Store.YES, Index.NOT_ANALYZED));
-        }
+        doc.add(new Field(MESSAGE_ID_FIELD, SearchUtil.getSerializedMessageIdIfSupportedByUnderlyingStorageOrNull(membership), Store.YES, Index.NOT_ANALYZED));
 
         // create an unqiue key for the document which can be used later on updates to find the document
         doc.add(new Field(ID_FIELD, membership.getMailboxId().serialize().toUpperCase(Locale.ENGLISH) +"-" + Long.toString(membership.getUid().asLong()), Store.YES, Index.NOT_ANALYZED));

http://git-wip-us.apache.org/repos/asf/james-project/blob/cdfe3f71/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
index e93cdb6..d8c39e2 100644
--- a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
+++ b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
@@ -50,7 +50,6 @@ import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.mailbox.store.MessageBuilder;
 import org.apache.james.mailbox.store.SimpleMailboxMembership;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
-import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.apache.lucene.store.RAMDirectory;
 import org.junit.Before;
 import org.junit.Test;
@@ -100,7 +99,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         id3 = factory.generate();
         id4 = factory.generate();
         id5 = factory.generate();
-        index = new LuceneMessageSearchIndex(null, new TestId.Factory(), new RAMDirectory(), true, useLenient(), factory, MessageSearchIndex.IndexMessageId.Required);
+        index = new LuceneMessageSearchIndex(null, new TestId.Factory(), new RAMDirectory(), true, useLenient(), factory);
         index.setEnableSuffixMatch(true);
         Map<String, String> headersSubject = new HashMap<String, String>();
         headersSubject.put("Subject", "test (fwd)");

http://git-wip-us.apache.org/repos/asf/james-project/blob/cdfe3f71/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java
index 162598a..08adfd3 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java
@@ -43,11 +43,6 @@ import com.google.common.base.Optional;
  */
 public interface MessageSearchIndex {
 
-    enum IndexMessageId {
-        Required,
-        Optional
-    }
-
     /**
      * Return all uids of the previous indexed {@link Mailbox}'s which match the {@link SearchQuery}
      */

http://git-wip-us.apache.org/repos/asf/james-project/blob/cdfe3f71/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java
index 4a9a721..2c899fa 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java
@@ -21,6 +21,8 @@ package org.apache.james.mailbox.store.search;
 import java.nio.charset.Charset;
 import java.util.Locale;
 
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mime4j.codec.DecodeMonitor;
 import org.apache.james.mime4j.codec.DecoderUtil;
 import org.apache.james.mime4j.dom.address.Address;
@@ -171,6 +173,18 @@ public class SearchUtil {
         }
         return "";
     }
+
+
+    public static String getSerializedMessageIdIfSupportedByUnderlyingStorageOrNull(MailboxMessage mailboxMessage) {
+        try {
+            MessageId messageId = mailboxMessage.getMessageId();
+            if (messageId != null) {
+                return messageId.serialize();
+            }
+        } catch(UnsupportedOperationException e) {}
+
+        return null;
+    }
     
     
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/cdfe3f71/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/SearchUtilTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/SearchUtilTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/SearchUtilTest.java
index 67b9066..542ef9c 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/SearchUtilTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/SearchUtilTest.java
@@ -18,8 +18,13 @@
  ****************************************************************/
 package org.apache.james.mailbox.store.search;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.junit.Test;
 
 public class SearchUtilTest {
@@ -65,4 +70,91 @@ public class SearchUtilTest {
     public void testComplexExtraction() {
         assertEquals("Test", SearchUtil.getBaseSubject("Re: re:re: fwd:[fwd: \t  Test]  (fwd)  (fwd)(fwd) "));
     }
+    
+    @Test
+    public void getMessageIdIfSupportedByUnderlyingStorageOrNullForNullMessageIdShouldReturnNull() {
+        //given
+        MailboxMessage message = mock(MailboxMessage.class);
+        when(message.getMessageId())
+            .thenReturn(null);
+        
+        //when
+        String serialiazedMessageId = SearchUtil.getSerializedMessageIdIfSupportedByUnderlyingStorageOrNull(message);
+        
+        //expect
+        assertNull(serialiazedMessageId);
+    }
+
+    @Test
+    public void getSerializedMessageIdIfSupportedByUnderlyingStorageOrNullForMessageIdThatSerializeReturnNullShouldReturnNull() {
+        //given
+        MessageId invalidMessageIdThatReturnNull = mock(MessageId.class);
+        when(invalidMessageIdThatReturnNull.serialize())
+            .thenReturn(null);
+
+        MailboxMessage message = mock(MailboxMessage.class);
+        when(message.getMessageId())
+            .thenReturn(invalidMessageIdThatReturnNull);
+
+        //when
+        String serialiazedMessageId = SearchUtil.getSerializedMessageIdIfSupportedByUnderlyingStorageOrNull(message);
+
+        //expect
+        assertNull(serialiazedMessageId);
+    }
+
+    @Test
+    public void getSerializedMessageIdIfSupportedByUnderlyingStorageOrNullForMessageIdThatSerializeReturnUnsupportedOperationExceptionShouldReturnNull() {
+        //given
+        MessageId invalidMessageIdThatThrowException = mock(MessageId.class);
+        when(invalidMessageIdThatThrowException.serialize())
+            .thenThrow(new UnsupportedOperationException());
+
+        MailboxMessage message = mock(MailboxMessage.class);
+        when(message.getMessageId())
+            .thenReturn(invalidMessageIdThatThrowException);
+
+        //when
+        String serialiazedMessageId = SearchUtil.getSerializedMessageIdIfSupportedByUnderlyingStorageOrNull(message);
+
+        //expect
+        assertNull(serialiazedMessageId);
+    }
+
+    @Test
+    public void getSerializedMessageIdIfSupportedByUnderlyingStorageOrNullForValidMessageIdShouldReturnSerializedId() {
+        //given
+        String messageIdString = "http://www.labraxeenne.com/#/";
+        MessageId messageId = mock(MessageId.class);
+        when(messageId.serialize())
+            .thenReturn(messageIdString);
+
+        MailboxMessage message = mock(MailboxMessage.class);
+        when(message.getMessageId())
+            .thenReturn(messageId);
+
+        //when
+        String serialiazedMessageId = SearchUtil.getSerializedMessageIdIfSupportedByUnderlyingStorageOrNull(message);
+
+        //expect
+        assertEquals(serialiazedMessageId, messageIdString);
+    }
+
+    @Test
+    public void getSerializedMessageIdIfSupportedByUnderlyingStorageOrNullForMessageIdThatReturnUssuportedOperationException() {
+        //given
+        MessageId messageId = mock(MessageId.class);
+        when(messageId.serialize())
+            .thenThrow(new UnsupportedOperationException());
+
+        MailboxMessage message = mock(MailboxMessage.class);
+        when(message.getMessageId())
+            .thenReturn(messageId);
+
+        //when
+        String serialiazedMessageId = SearchUtil.getSerializedMessageIdIfSupportedByUnderlyingStorageOrNull(message);
+
+        //expect
+        assertEquals(serialiazedMessageId, null);
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/cdfe3f71/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
index a745032..72e93b0 100644
--- a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
@@ -59,7 +59,6 @@ import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
 import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.NoQuotaManager;
-import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.apache.james.mpt.api.ImapFeatures;
 import org.apache.james.mpt.api.ImapFeatures.Feature;
 import org.apache.james.mpt.host.JamesImapHostSystem;
@@ -111,7 +110,7 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem {
             factory,
             new ElasticSearchIndexer(client, new DeleteByQueryPerformer(client, Executors.newSingleThreadExecutor(), MailboxElasticsearchConstants.MAILBOX_INDEX, MailboxElasticsearchConstants.MESSAGE_TYPE), MailboxElasticsearchConstants.MAILBOX_INDEX, MailboxElasticsearchConstants.MESSAGE_TYPE),
             new ElasticSearchSearcher(client, new QueryConverter(new CriterionConverter()), new InMemoryId.Factory(), messageIdFactory),
-            new MessageToElasticSearchJson(new DefaultTextExtractor(), ZoneId.systemDefault(), IndexAttachments.YES, MessageSearchIndex.IndexMessageId.Required));
+            new MessageToElasticSearchJson(new DefaultTextExtractor(), ZoneId.systemDefault(), IndexAttachments.YES));
 
         MailboxACLResolver aclResolver = new UnionMailboxACLResolver();
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();


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


[11/13] james-project git commit: JAMES-1934 suppress useless import

Posted by bt...@apache.org.
JAMES-1934 suppress useless import


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

Branch: refs/heads/master
Commit: 9fb956bf9d53289cdc48861a4ad95ba90219ccbe
Parents: 83e9e0c
Author: Luc DUZAN <ld...@linagora.com>
Authored: Mon Feb 13 11:44:57 2017 +0100
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Feb 15 06:59:46 2017 +0700

----------------------------------------------------------------------
 .../src/main/java/org/apache/james/mailbox/model/SearchQuery.java  | 2 --
 .../org/apache/james/mailbox/store/search/MessageSearches.java     | 2 --
 .../org/apache/james/mailbox/store/SimpleMailboxMembership.java    | 2 --
 .../org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java     | 2 --
 4 files changed, 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/9fb956bf/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
index fbf8002..80764a5 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
@@ -32,8 +32,6 @@ import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
 import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.model.SearchQuery.Sort;
-
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/9fb956bf/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
index 6a440b2..c478a40 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
@@ -47,7 +47,6 @@ import org.apache.james.mailbox.model.SearchQuery.DateResolution;
 import org.apache.james.mailbox.model.SearchQuery.UidRange;
 import org.apache.james.mailbox.store.ResultUtils;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-import org.apache.james.mailbox.store.mail.model.Property;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.search.comparator.CombinedComparator;
 import org.apache.james.mime4j.MimeException;
@@ -71,7 +70,6 @@ import org.apache.james.mime4j.utils.search.MessageMatcher;
 
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;

http://git-wip-us.apache.org/repos/asf/james-project/blob/9fb956bf/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 c69e7aa..c99aaf0 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
@@ -25,7 +25,6 @@ import java.io.InputStream;
 import java.io.OutputStreamWriter;
 import java.io.SequenceInputStream;
 import java.io.Writer;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -44,7 +43,6 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.Property;
 
 import com.google.common.base.Objects;
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 
 public class SimpleMailboxMembership implements MailboxMessage {

http://git-wip-us.apache.org/repos/asf/james-project/blob/9fb956bf/mailbox/tool/src/test/java/org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java
----------------------------------------------------------------------
diff --git a/mailbox/tool/src/test/java/org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java b/mailbox/tool/src/test/java/org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java
index f95a705..b83e6c1 100644
--- a/mailbox/tool/src/test/java/org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java
+++ b/mailbox/tool/src/test/java/org/apache/james/mailbox/jpa/migrator/JpaMigratorTest.java
@@ -18,8 +18,6 @@
  ****************************************************************/
 package org.apache.james.mailbox.jpa.migrator;
 
-import org.apache.james.mailbox.jpa.migrator.JpaMigrator;
-import org.apache.james.mailbox.jpa.migrator.exception.JpaMigrateException;
 import org.junit.Test;
 
 /**


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


[13/13] james-project git commit: JAMES-1929 JMAP wiring for GetMessageList::hasAttachment filter

Posted by bt...@apache.org.
JAMES-1929 JMAP wiring for GetMessageList::hasAttachment filter


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

Branch: refs/heads/master
Commit: 46feedcea1b9f609279dc12c33921c5036c9bcb6
Parents: 9fb956b
Author: Benoit Tellier <bt...@linagora.com>
Authored: Wed Feb 8 16:44:07 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Feb 15 06:59:46 2017 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/model/SearchQuery.java | 12 +++++--
 .../james/jmap/utils/FilterToSearchQuery.java   | 24 ++++++--------
 .../jmap/utils/FilterToSearchQueryTest.java     | 33 ++++++++++++++------
 3 files changed, 44 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/46feedce/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
index 80764a5..0c2203b 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
@@ -593,12 +593,20 @@ public class SearchQuery implements Serializable {
         return result;
     }
 
+    public static Criterion hasAttachment(boolean value) {
+        if (value) {
+            return new AttachmentCriterion(BooleanOperator.set());
+        } else {
+            return new AttachmentCriterion(BooleanOperator.unset());
+        }
+    }
+
     public static Criterion hasAttachment() {
-        return new AttachmentCriterion(BooleanOperator.set());
+        return hasAttachment(true);
     }
 
     public static Criterion hasNoAttachment() {
-        return new AttachmentCriterion(BooleanOperator.unset());
+        return hasAttachment(false);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/46feedce/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
index db7b485..d30c692 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
@@ -23,7 +23,6 @@ import java.util.Date;
 
 import javax.mail.Flags.Flag;
 
-import org.apache.commons.lang.NotImplementedException;
 import org.apache.james.jmap.model.Filter;
 import org.apache.james.jmap.model.FilterCondition;
 import org.apache.james.jmap.model.FilterOperator;
@@ -32,7 +31,6 @@ import org.apache.james.mailbox.model.SearchQuery.AddressType;
 import org.apache.james.mailbox.model.SearchQuery.Criterion;
 import org.apache.james.mailbox.model.SearchQuery.DateResolution;
 
-import com.github.fge.lambdas.Throwing;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
 
@@ -52,17 +50,15 @@ public class FilterToSearchQuery {
 
     private SearchQuery convertCondition(FilterCondition filter) {
         SearchQuery searchQuery = new SearchQuery();
-        filter.getText().ifPresent(text -> {
-            searchQuery.andCriteria(
-                    SearchQuery.or(ImmutableList.of(
-                            SearchQuery.address(AddressType.From, text),
-                            SearchQuery.address(AddressType.To, text),
-                            SearchQuery.address(AddressType.Cc, text),
-                            SearchQuery.address(AddressType.Bcc, text),
-                            SearchQuery.headerContains("Subject", text),
-                            SearchQuery.bodyContains(text)))
-                    );
-        });
+        filter.getText().ifPresent(text -> searchQuery.andCriteria(
+                SearchQuery.or(ImmutableList.of(
+                        SearchQuery.address(AddressType.From, text),
+                        SearchQuery.address(AddressType.To, text),
+                        SearchQuery.address(AddressType.Cc, text),
+                        SearchQuery.address(AddressType.Bcc, text),
+                        SearchQuery.headerContains("Subject", text),
+                        SearchQuery.bodyContains(text)))
+                ));
         filter.getFrom().ifPresent(from -> searchQuery.andCriteria(SearchQuery.address(AddressType.From, from)));
         filter.getTo().ifPresent(to -> searchQuery.andCriteria(SearchQuery.address(AddressType.To, to)));
         filter.getCc().ifPresent(cc -> searchQuery.andCriteria(SearchQuery.address(AddressType.Cc, cc)));
@@ -71,7 +67,6 @@ public class FilterToSearchQuery {
         filter.getBody().ifPresent(body ->  searchQuery.andCriteria(SearchQuery.bodyContains(body)));
         filter.getAfter().ifPresent(after -> searchQuery.andCriteria(SearchQuery.internalDateAfter(Date.from(after.toInstant()), DateResolution.Second)));
         filter.getBefore().ifPresent(before -> searchQuery.andCriteria(SearchQuery.internalDateBefore(Date.from(before.toInstant()), DateResolution.Second)));
-        filter.getHasAttachment().ifPresent(Throwing.consumer(hasAttachment -> { throw new NotImplementedException(); } ));
         filter.getHeader().ifPresent(header -> searchQuery.andCriteria(SearchQuery.headerContains(header.getName(), header.getValue().orElse(null))));
         filter.getIsAnswered().ifPresent(isAnswered -> searchQuery.andCriteria(SearchQuery.flagIsSet(Flag.ANSWERED)));
         filter.getIsDraft().ifPresent(isDraft -> searchQuery.andCriteria(SearchQuery.flagIsSet(Flag.DRAFT)));
@@ -79,6 +74,7 @@ public class FilterToSearchQuery {
         filter.getIsUnread().ifPresent(isUnread -> searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flag.SEEN)));
         filter.getMaxSize().ifPresent(maxSize -> searchQuery.andCriteria(SearchQuery.sizeLessThan(maxSize)));
         filter.getMinSize().ifPresent(minSize -> searchQuery.andCriteria(SearchQuery.sizeGreaterThan(minSize)));
+        filter.getHasAttachment().ifPresent(hasAttachment -> searchQuery.andCriteria(SearchQuery.hasAttachment(hasAttachment)));
         return searchQuery;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/46feedce/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
index 41cfb39..6b3f6bf 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
@@ -27,7 +27,6 @@ import java.util.Date;
 
 import javax.mail.Flags.Flag;
 
-import org.apache.commons.lang.NotImplementedException;
 import org.apache.james.jmap.model.Filter;
 import org.apache.james.jmap.model.FilterCondition;
 import org.apache.james.jmap.model.FilterOperator;
@@ -97,6 +96,30 @@ public class FilterToSearchQueryTest {
     }
 
     @Test
+    public void filterConditionShouldMapWhenHasAttachment() {
+        SearchQuery expectedSearchQuery = new SearchQuery();
+        expectedSearchQuery.andCriteria(SearchQuery.hasAttachment());
+
+        SearchQuery searchQuery = new FilterToSearchQuery().convert(FilterCondition.builder()
+            .hasAttachment(true)
+            .build());
+
+        assertThat(searchQuery).isEqualTo(expectedSearchQuery);
+    }
+
+    @Test
+    public void filterConditionShouldMapWhenHasNoAttachment() {
+        SearchQuery expectedSearchQuery = new SearchQuery();
+        expectedSearchQuery.andCriteria(SearchQuery.hasNoAttachment());
+
+        SearchQuery searchQuery = new FilterToSearchQuery().convert(FilterCondition.builder()
+            .hasAttachment(false)
+            .build());
+
+        assertThat(searchQuery).isEqualTo(expectedSearchQuery);
+    }
+
+    @Test
     public void filterConditionShouldMapWhenBcc() {
         String bcc = "blindcopy@james.org";
         SearchQuery expectedSearchQuery = new SearchQuery();
@@ -181,14 +204,6 @@ public class FilterToSearchQueryTest {
     }
 
     @Test
-    public void filterConditionShouldThrowWhenHasAttachment() {
-        assertThatThrownBy(() -> new FilterToSearchQuery().convert(FilterCondition.builder()
-                .hasAttachment(true)
-                .build()))
-            .isInstanceOf(NotImplementedException.class);
-    }
-
-    @Test
     public void filterConditionShouldMapWhenIsAnswered() {
         SearchQuery expectedSearchQuery = new SearchQuery();
         expectedSearchQuery.andCriteria(SearchQuery.flagIsSet(Flag.ANSWERED));


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


[08/13] james-project git commit: JAMES-1934 implements hasAttachment search for lucene

Posted by bt...@apache.org.
JAMES-1934 implements hasAttachment search for lucene


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

Branch: refs/heads/master
Commit: 810c764dedb1a19a2d15c32c981545f390fcf807
Parents: c1357bc
Author: Luc DUZAN <ld...@linagora.com>
Authored: Thu Feb 9 12:57:49 2017 +0100
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Feb 15 06:59:45 2017 +0700

----------------------------------------------------------------------
 .../lucene/search/LuceneMessageSearchIndex.java | 29 ++++++++++++++++----
 1 file changed, 23 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/810c764d/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
index 9b3c0c1..eb7ec7c 100644
--- a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
+++ b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
@@ -52,6 +52,7 @@ import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mailbox.model.SearchQuery.AllCriterion;
+import org.apache.james.mailbox.model.SearchQuery.AttachmentCriterion;
 import org.apache.james.mailbox.model.SearchQuery.ContainsOperator;
 import org.apache.james.mailbox.model.SearchQuery.Criterion;
 import org.apache.james.mailbox.model.SearchQuery.CustomFlagCriterion;
@@ -67,6 +68,7 @@ import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
 import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.apache.james.mailbox.store.search.SearchUtil;
@@ -162,6 +164,11 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
     public final static String UID_FIELD = "uid";
     
     /**
+     * {@link Field} boolean field that say if the message as an attachment or not
+     */
+    public final static String HAS_ATTACHMENT_FIELD = "hasAttachment";
+
+    /**
      * {@link Field} which will contain the {@link Flags} of the {@link MailboxMessage}
      */
     public final static String FLAGS_FIELD = "flags";
@@ -553,7 +560,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
         // TODO: Better handling
         doc.add(new Field(MAILBOX_ID_FIELD, membership.getMailboxId().serialize().toUpperCase(Locale.ENGLISH), Store.YES, Index.NOT_ANALYZED));
         doc.add(new NumericField(UID_FIELD,Store.YES, true).setLongValue(membership.getUid().asLong()));
-
+        doc.add(new Field(HAS_ATTACHMENT_FIELD, Boolean.toString(hasAttachment(membership)), Store.YES, Index.NOT_ANALYZED));
         if (shouldIndexMessageId == IndexMessageId.Required) {
             doc.add(new Field(MESSAGE_ID_FIELD, membership.getMessageId().serialize(), Store.YES, Index.NOT_ANALYZED));
         }
@@ -575,6 +582,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
         SimpleContentHandler handler = new SimpleContentHandler() {
             
 
+            @Override
             public void headers(Header header) {
                 
                 Date sentDate = null;
@@ -756,6 +764,11 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
         return doc;
     }
 
+    private static boolean hasAttachment(MailboxMessage membership) {
+       return FluentIterable.from(membership.getProperties())
+            .anyMatch(PropertyBuilder.isHasAttachmentProperty());
+    }
+
     private String toSentDateField(DateResolution res) {
         String field;
         switch (res) {
@@ -972,6 +985,10 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
         }
     }
     
+    private Query createAttachmentQuery(boolean isSet, Query inMailboxes) throws MailboxException, UnsupportedSearchException {
+        return new TermQuery(new Term(HAS_ATTACHMENT_FIELD, Boolean.toString(isSet)));
+    }
+
     /**
      * Return a {@link Query} which is build based on the given {@link SearchQuery.FlagCriterion}. This is kind of a hack
      * as it will do a search for the flags in this method and 
@@ -1261,6 +1278,9 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
         } else if (criterion instanceof SearchQuery.FlagCriterion) {
             FlagCriterion crit = (FlagCriterion) criterion;
             return createFlagQuery(toString(crit.getFlag()), crit.getOperator().isSet(), inMailboxes, recentUids);
+        } else if (criterion instanceof SearchQuery.AttachmentCriterion) {
+            AttachmentCriterion crit = (AttachmentCriterion) criterion;
+            return createAttachmentQuery(crit.getOperator().isSet(), inMailboxes);
         } else if (criterion instanceof SearchQuery.CustomFlagCriterion) {
             CustomFlagCriterion crit = (CustomFlagCriterion) criterion;
             return createFlagQuery(crit.getFlag(), crit.getOperator().isSet(), inMailboxes, recentUids);
@@ -1284,6 +1304,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
     /**
      * @see org.apache.james.mailbox.store.search.ListeningMessageSearchIndex#add(org.apache.james.mailbox.MailboxSession, org.apache.james.mailbox.store.mail.model.Mailbox, MailboxMessage)
      */
+    @Override
     public void add(MailboxSession session, Mailbox mailbox, MailboxMessage membership) throws MailboxException {
         Document doc = createMessageDocument(session, membership);
         Document flagsDoc = createFlagsDocument(membership);
@@ -1424,8 +1445,4 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
             throw new MailboxException("Unable to delete message from index", e);
         }
     }
-
-    
-
-
-}
+}
\ No newline at end of file


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


[07/13] james-project git commit: JAMES-1934 implemens hasAttachment search for ES

Posted by bt...@apache.org.
JAMES-1934 implemens hasAttachment search for ES


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

Branch: refs/heads/master
Commit: c1357bca59a99a5e422068782fef24f5195b86e8
Parents: 59cfd84
Author: Luc DUZAN <ld...@linagora.com>
Authored: Thu Feb 9 12:56:53 2017 +0100
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Feb 15 06:59:45 2017 +0700

----------------------------------------------------------------------
 .../elasticsearch/MailboxMappingFactory.java    |  4 +
 .../elasticsearch/json/IndexableMessage.java    | 24 ++++--
 .../json/IndexableMessageWithMessageId.java     |  6 +-
 .../elasticsearch/query/CriterionConverter.java |  6 ++
 .../json/IndexableMessageTest.java              | 80 +++++++++++++++++++-
 .../src/test/resources/eml/Toto.eml             | 41 ----------
 .../store/src/test/resources/eml/htmlMail.json  |  2 +-
 .../src/test/resources/eml/nonTextual.json      |  2 +-
 .../store/src/test/resources/eml/spamMail.json  |  2 +-
 9 files changed, 111 insertions(+), 56 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/c1357bca/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/MailboxMappingFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/MailboxMappingFactory.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/MailboxMappingFactory.java
index aaa0009..7c54b40 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/MailboxMappingFactory.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/MailboxMappingFactory.java
@@ -212,6 +212,10 @@ public class MailboxMappingFactory {
                                 .endObject()
                             .endObject()
 
+                            .startObject(JsonMessageConstants.HAS_ATTACHMENT)
+                                .field(NodeMappingFactory.TYPE, NodeMappingFactory.BOOLEAN)
+                            .endObject()
+
                             .startObject(JsonMessageConstants.TEXT)
                                 .field(NodeMappingFactory.TYPE, NodeMappingFactory.STRING)
                                 .field(NodeMappingFactory.ANALYZER, NodeMappingFactory.SNOWBALL)

http://git-wip-us.apache.org/repos/asf/james-project/blob/c1357bca/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
index 770f558..6150b19 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
@@ -34,6 +34,8 @@ import org.apache.james.mailbox.elasticsearch.query.DateResolutionFormater;
 import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.Property;
+import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleProperty;
 import org.apache.james.mime4j.MimeException;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -46,6 +48,8 @@ import com.google.common.collect.Multimap;
 
 public class IndexableMessage {
 
+    public static final SimpleProperty HAS_ATTACHMENT_PROPERTY = new SimpleProperty(PropertyBuilder.JAMES_INTERNALS, PropertyBuilder.HAS_ATTACHMENT, "true");
+
     public static IndexableMessage from(MailboxMessage message, List<User> users, TextExtractor textExtractor,
                                         ZoneId zoneId, IndexAttachments indexAttachments) {
 
@@ -57,6 +61,9 @@ public class IndexableMessage {
             indexableMessage.users = users.stream().map(User::getUserName).collect(Guavate.toImmutableList());
             indexableMessage.bodyText = parsingResult.locateFirstTextBody();
             indexableMessage.bodyHtml = parsingResult.locateFirstHtmlBody();
+            indexableMessage.hasAttachment = message.getProperties()
+                .stream()
+                .anyMatch(property -> property.equals(HAS_ATTACHMENT_PROPERTY));
             indexableMessage.setFlattenedAttachments(parsingResult, indexAttachments);
             indexableMessage.copyHeaderFields(parsingResult.getHeaderCollection(), getSanitizedInternalDate(message, zoneId));
             indexableMessage.generateText();
@@ -68,11 +75,13 @@ public class IndexableMessage {
     }
 
     private void setFlattenedAttachments(MimePart parsingResult, IndexAttachments indexAttachments) {
-        if (indexAttachments.equals(IndexAttachments.YES)) {
-            attachments = parsingResult.getAttachmentsStream()
-                    .collect(Collectors.toList());
+        List<MimePart> mimeparts = parsingResult.getAttachmentsStream()
+                    .collect(Guavate.toImmutableList());
+
+        if (IndexAttachments.YES.equals(indexAttachments)) {
+            this.attachments = mimeparts;
         } else {
-            attachments = ImmutableList.of();
+            this.attachments = ImmutableList.of();
         }
     }
 
@@ -134,6 +143,7 @@ public class IndexableMessage {
     private String date;
     private String mediaType;
     private String subType;
+    private boolean hasAttachment;
     private boolean isUnRead;
     private boolean isRecent;
     private boolean isFlagged;
@@ -155,11 +165,12 @@ public class IndexableMessage {
     private Optional<String> bodyHtml;
     private String text;
 
+
     public IndexableMessage(long uid, String mailboxId, List<String> users, long modSeq, long size, String date, String mediaType,
                             String subType, boolean isUnRead, boolean isRecent, boolean isFlagged, boolean isDeleted, boolean isDraft,
                             boolean isAnswered, String[] userFlags, Multimap<String, String> headers, EMailers from, EMailers to,
                             EMailers cc, EMailers bcc, EMailers replyTo, Subjects subjects, String sentDate, List<Property> properties,
-                            List<MimePart> attachments, Optional<String> bodyText, Optional<String> bodyHtml, String text) {
+                            List<MimePart> attachments, boolean hasAttachment, Optional<String> bodyText, Optional<String> bodyHtml, String text) {
         this.uid = uid;
         this.mailboxId = mailboxId;
         this.users = users;
@@ -185,6 +196,7 @@ public class IndexableMessage {
         this.sentDate = sentDate;
         this.properties = properties;
         this.attachments = attachments;
+        this.hasAttachment = hasAttachment;
         this.bodyText = bodyText;
         this.bodyHtml = bodyHtml;
         this.text = text;
@@ -330,7 +342,7 @@ public class IndexableMessage {
 
     @JsonProperty(JsonMessageConstants.HAS_ATTACHMENT)
     public boolean getHasAttachment() {
-        return attachments.size() > 0;
+        return hasAttachment;
     }
 
     @JsonProperty(JsonMessageConstants.TEXT)

http://git-wip-us.apache.org/repos/asf/james-project/blob/c1357bca/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageWithMessageId.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageWithMessageId.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageWithMessageId.java
index 8f376dc..2578580 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageWithMessageId.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageWithMessageId.java
@@ -43,7 +43,7 @@ public class IndexableMessageWithMessageId extends IndexableMessage {
             indexableMessage.isDeleted(), indexableMessage.isDraft(), indexableMessage.isAnswered(), indexableMessage.getUserFlags(),
             indexableMessage.getHeaders(), indexableMessage.getFrom(), indexableMessage.getTo(), indexableMessage.getCc(), indexableMessage.getBcc(),
             indexableMessage.getReplyTo(), indexableMessage.getSubjects(), indexableMessage.getSentDate(), indexableMessage.getProperties(),
-            indexableMessage.getAttachments(), indexableMessage.getBodyText(), indexableMessage.getBodyHtml(), indexableMessage.getText(),
+            indexableMessage.getAttachments(), indexableMessage.getHasAttachment(), indexableMessage.getBodyText(), indexableMessage.getBodyHtml(), indexableMessage.getText(),
             message.getMessageId().serialize());
     }
 
@@ -53,10 +53,10 @@ public class IndexableMessageWithMessageId extends IndexableMessage {
                                          String mediaType, String subType, boolean isUnRead, boolean isRecent, boolean isFlagged,
                                          boolean isDeleted, boolean isDraft, boolean isAnswered, String[] userFlags, Multimap<String, String> headers,
                                          EMailers from, EMailers to, EMailers cc, EMailers bcc, EMailers replyTo, Subjects subjects,
-                                         String sentDate, List<Property> properties, List<MimePart> attachments, Optional<String> bodyText,
+                                         String sentDate, List<Property> properties, List<MimePart> attachments, boolean hasAttachments, Optional<String> bodyText,
                                          Optional<String> bodyHtml, String text, String messageId) {
         super(uid, mailboxId, users, modSeq, size, date, mediaType, subType, isUnRead, isRecent, isFlagged, isDeleted,
-            isDraft, isAnswered, userFlags, headers, from, to, cc, bcc, replyTo, subjects, sentDate, properties, attachments,
+            isDraft, isAnswered, userFlags, headers, from, to, cc, bcc, replyTo, subjects, sentDate, properties, attachments, hasAttachments,
             bodyText, bodyHtml, text);
         this.messageId = messageId;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c1357bca/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
index 3904a92..dcc4ff6 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
@@ -78,6 +78,8 @@ public class CriterionConverter {
 
         registerCriterionConverter(SearchQuery.InternalDateCriterion.class,
             criterion -> dateRangeFilter(JsonMessageConstants.DATE, criterion.getOperator()));
+
+        registerCriterionConverter(SearchQuery.AttachmentCriterion.class, this::convertAttachmentCriterion);
     }
     
     @SuppressWarnings("unchecked")
@@ -115,6 +117,10 @@ public class CriterionConverter {
         return criterionConverterMap.get(criterion.getClass()).apply(criterion);
     }
 
+    private QueryBuilder convertAttachmentCriterion(SearchQuery.AttachmentCriterion criterion) {
+        return termQuery(JsonMessageConstants.HAS_ATTACHMENT, criterion.getOperator().isSet());
+    }
+
     private QueryBuilder convertCustomFlagCriterion(SearchQuery.CustomFlagCriterion criterion) {
         QueryBuilder termQueryBuilder = termQuery(JsonMessageConstants.USER_FLAGS, criterion.getFlag());
         if (criterion.getOperator().isSet()) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/c1357bca/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java
index cf98e6e..a66f326 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java
@@ -20,11 +20,12 @@
 package org.apache.james.mailbox.elasticsearch.json;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.any;
+import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.time.ZoneId;
 
 import javax.mail.Flags;
@@ -38,6 +39,8 @@ import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 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.SimpleProperty;
 import org.apache.james.mailbox.tika.extractor.TikaTextExtractor;
 import org.junit.Test;
 
@@ -209,6 +212,77 @@ public class IndexableMessageTest {
     }
 
     @Test
+    public void hasAttachmentsShouldReturnTrueWhenPropertyIsPresentAndTrue() throws IOException {
+        //Given
+        MailboxMessage  mailboxMessage = mock(MailboxMessage.class);
+        TestId mailboxId = TestId.of(1);
+        when(mailboxMessage.getMailboxId())
+            .thenReturn(mailboxId);
+        when(mailboxMessage.getFullContent())
+            .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/mailWithHeaders.eml"))));
+        when(mailboxMessage.createFlags())
+            .thenReturn(new Flags());
+        when(mailboxMessage.getUid())
+            .thenReturn(MESSAGE_UID);
+        when(mailboxMessage.getProperties()).thenReturn(ImmutableList.of(IndexableMessage.HAS_ATTACHMENT_PROPERTY));
+
+        // When
+        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
+                new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.YES);
+
+        // Then
+        assertThat(indexableMessage.getHasAttachment()).isTrue();
+    }
+
+    @Test
+    public void hasAttachmentsShouldReturnFalseWhenPropertyIsPresentButFalse() throws IOException {
+        //Given
+        MailboxMessage  mailboxMessage = mock(MailboxMessage.class);
+        TestId mailboxId = TestId.of(1);
+        when(mailboxMessage.getMailboxId())
+            .thenReturn(mailboxId);
+        when(mailboxMessage.getFullContent())
+            .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/mailWithHeaders.eml"))));
+        when(mailboxMessage.createFlags())
+            .thenReturn(new Flags());
+        when(mailboxMessage.getUid())
+            .thenReturn(MESSAGE_UID);
+        when(mailboxMessage.getProperties())
+            .thenReturn(ImmutableList.of(new SimpleProperty(PropertyBuilder.JAMES_INTERNALS, PropertyBuilder.HAS_ATTACHMENT, "false")));
+
+        // When
+        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
+            new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.YES);
+
+        // Then
+        assertThat(indexableMessage.getHasAttachment()).isFalse();
+    }
+
+    @Test
+    public void hasAttachmentsShouldReturnFalseWhenPropertyIsAbsent() throws IOException {
+        //Given
+        MailboxMessage  mailboxMessage = mock(MailboxMessage.class);
+        TestId mailboxId = TestId.of(1);
+        when(mailboxMessage.getMailboxId())
+            .thenReturn(mailboxId);
+        when(mailboxMessage.getFullContent())
+            .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/mailWithHeaders.eml"))));
+        when(mailboxMessage.createFlags())
+            .thenReturn(new Flags());
+        when(mailboxMessage.getUid())
+            .thenReturn(MESSAGE_UID);
+        when(mailboxMessage.getProperties())
+            .thenReturn(ImmutableList.of());
+
+        // When
+        IndexableMessage indexableMessage = IndexableMessage.from(mailboxMessage, ImmutableList.of(new MockMailboxSession("username").getUser()),
+            new DefaultTextExtractor(), ZoneId.of("Europe/Paris"), IndexAttachments.YES);
+
+        // Then
+        assertThat(indexableMessage.getHasAttachment()).isFalse();
+    }
+
+    @Test
     public void attachmentsShouldNotBeenIndexedWhenAsked() throws Exception {
         //Given
         MailboxMessage mailboxMessage = mock(MailboxMessage.class);
@@ -216,7 +290,7 @@ public class IndexableMessageTest {
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
         when(mailboxMessage.getFullContent())
-            .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/Toto.eml"))));
+            .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/mailWithHeaders.eml"))));
         when(mailboxMessage.createFlags())
             .thenReturn(new Flags());
         when(mailboxMessage.getUid())
@@ -238,7 +312,7 @@ public class IndexableMessageTest {
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
         when(mailboxMessage.getFullContent())
-            .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/Toto.eml"))));
+            .thenReturn(new ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("eml/emailWith3Attachments.eml"))));
         when(mailboxMessage.createFlags())
             .thenReturn(new Flags());
         when(mailboxMessage.getUid())

http://git-wip-us.apache.org/repos/asf/james-project/blob/c1357bca/mailbox/elasticsearch/src/test/resources/eml/Toto.eml
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/resources/eml/Toto.eml b/mailbox/elasticsearch/src/test/resources/eml/Toto.eml
deleted file mode 100644
index ab2de03..0000000
--- a/mailbox/elasticsearch/src/test/resources/eml/Toto.eml
+++ /dev/null
@@ -1,41 +0,0 @@
-Return-Path: <lr...@linagora.com>
-Received: from alderaan.linagora.com (smtp.linagora.dc1 [172.16.18.53])
-	 by imap (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA;
-	 Tue, 29 Nov 2016 13:57:56 +0100
-X-Sieve: CMU Sieve 2.2
-Received: from [10.69.0.146] (mne69-10-88-173-78-196.fbx.proxad.net [88.173.78.196])
-	(using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits))
-	(No client certificate requested)
-	by alderaan.linagora.com (Postfix) with ESMTPSA id CB0233783
-	for <lr...@linagora.com>; Tue, 29 Nov 2016 13:57:56 +0100 (CET)
-To: Laura ROYET <lr...@linagora.com>
-From: Laura Royet <lr...@linagora.com>
-Subject: Toto
-Message-ID: <25...@linagora.com>
-Date: Tue, 29 Nov 2016 13:57:56 +0100
-User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101
- Thunderbird/45.5.0
-MIME-Version: 1.0
-Content-Type: multipart/mixed;
- boundary="------------3F646081DC313215FD6847F4"
-
-This is a multi-part message in MIME format.
---------------3F646081DC313215FD6847F4
-Content-Type: text/plain; charset=utf-8; format=flowed
-Content-Transfer-Encoding: 7bit
-
-
-
--- 
-Laura Royet
-
-
---------------3F646081DC313215FD6847F4
-Content-Type: text/plain; charset=UTF-8;
- name="Toto.txt"
-Content-Transfer-Encoding: base64
-Content-Disposition: attachment;
- filename="Toto.txt"
-
-VG90bwpDb3B5cmlnaHQgwqkgMjAxNiBMSU5BR09SQSAKQ0MgQlktU0EsIEdOVSBGREwK
---------------3F646081DC313215FD6847F4--

http://git-wip-us.apache.org/repos/asf/james-project/blob/c1357bca/mailbox/store/src/test/resources/eml/htmlMail.json
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/resources/eml/htmlMail.json b/mailbox/store/src/test/resources/eml/htmlMail.json
index 1655f5e..a8998ef 100644
--- a/mailbox/store/src/test/resources/eml/htmlMail.json
+++ b/mailbox/store/src/test/resources/eml/htmlMail.json
@@ -159,7 +159,7 @@
   "isAnswered":false,
   "isFlagged":false,
   "isRecent":false,
-  "hasAttachment":true,
+  "hasAttachment":false,
   "isUnread":false,
   "users": [
     "username"

http://git-wip-us.apache.org/repos/asf/james-project/blob/c1357bca/mailbox/store/src/test/resources/eml/nonTextual.json
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/resources/eml/nonTextual.json b/mailbox/store/src/test/resources/eml/nonTextual.json
index 9d1aa9c..e44e2d8 100644
--- a/mailbox/store/src/test/resources/eml/nonTextual.json
+++ b/mailbox/store/src/test/resources/eml/nonTextual.json
@@ -154,7 +154,7 @@
   "isDraft":false,
   "isFlagged":false,
   "isRecent":false,
-  "hasAttachment":true,
+  "hasAttachment":false,
   "isUnread":true,
   "users": [
     "username"

http://git-wip-us.apache.org/repos/asf/james-project/blob/c1357bca/mailbox/store/src/test/resources/eml/spamMail.json
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/resources/eml/spamMail.json b/mailbox/store/src/test/resources/eml/spamMail.json
index b71a5ce..388aa2d 100644
--- a/mailbox/store/src/test/resources/eml/spamMail.json
+++ b/mailbox/store/src/test/resources/eml/spamMail.json
@@ -198,7 +198,7 @@
   "isDraft": false,
   "isFlagged": false,
   "isRecent": false,
-  "hasAttachment": true,
+  "hasAttachment": false,
   "isUnread": true,
   "users": [
     "username"


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


[03/13] james-project git commit: JAMES-1934 add missing override

Posted by bt...@apache.org.
JAMES-1934 add missing override


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

Branch: refs/heads/master
Commit: 98e7ccb113e645020ec0420907b2235c6145bc86
Parents: 7d7665a
Author: Luc DUZAN <ld...@linagora.com>
Authored: Wed Feb 8 16:27:10 2017 +0100
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Feb 15 06:59:45 2017 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/model/SearchQuery.java  | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/98e7ccb1/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
index a5eeca6..fbf8002 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
@@ -821,6 +821,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("lowValue", lowValue)
@@ -886,6 +887,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("lowValue", lowValue)
@@ -957,6 +959,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("criteria", criteria)
@@ -994,6 +997,7 @@ public class SearchQuery implements Serializable {
             return 1729;
         }
 
+        @Override
         public String toString() {
             return "AllCriterion";
         }
@@ -1061,6 +1065,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("operator", operator)
@@ -1118,6 +1123,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("operator", operator)
@@ -1164,6 +1170,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("operator", operator)
@@ -1209,6 +1216,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("operator", operator)
@@ -1251,6 +1259,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("operator", operator)
@@ -1309,6 +1318,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("operator", operator)
@@ -1414,6 +1424,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("operator", operator)
@@ -1458,6 +1469,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("operator", operator)
@@ -1512,6 +1524,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("address", address)
@@ -1557,6 +1570,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("value", value)
@@ -1644,6 +1658,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("set", set)
@@ -1707,6 +1722,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("value", value)
@@ -1779,6 +1795,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("date", date)
@@ -1832,6 +1849,7 @@ public class SearchQuery implements Serializable {
             return true;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("range", Arrays.toString(range))
@@ -1878,6 +1896,7 @@ public class SearchQuery implements Serializable {
             return false;
         }
 
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("ranges", Arrays.toString(ranges))


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


[05/13] james-project git commit: JAMES-1934 add tests to PropertyBuilder

Posted by bt...@apache.org.
JAMES-1934 add tests to PropertyBuilder


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

Branch: refs/heads/master
Commit: 59cfd844b98cfeeced35234dbcd8c32abff1635e
Parents: 3705c18
Author: Benoit Tellier <bt...@linagora.com>
Authored: Wed Feb 8 11:48:12 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Feb 15 06:59:45 2017 +0700

----------------------------------------------------------------------
 .../mailbox/store/SimpleMailboxMembership.java  |  8 +++-
 .../mail/model/impl/PropertyBuilderTest.java    | 49 ++++++++++++++++++++
 2 files changed, 56 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/59cfd844/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 fd67f05..c69e7aa 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
@@ -44,6 +44,8 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.Property;
 
 import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
 
 public class SimpleMailboxMembership implements MailboxMessage {
     
@@ -233,7 +235,11 @@ public class SimpleMailboxMembership implements MailboxMessage {
     }
 
     public List<Property> getProperties() {
-        return new ArrayList<Property>(properties);
+        if (properties != null) {
+            return ImmutableList.<Property>copyOf(properties);
+        } else {
+            return ImmutableList.of();
+        }
     }
 
     public Long getTextualLineCount() {

http://git-wip-us.apache.org/repos/asf/james-project/blob/59cfd844/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilderTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilderTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilderTest.java
new file mode 100644
index 0000000..79b1548
--- /dev/null
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilderTest.java
@@ -0,0 +1,49 @@
+/****************************************************************
+ * 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.impl;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+
+public class PropertyBuilderTest {
+
+    @Test
+    public void emptyPropertyBuilderShouldCreateEmptyProperties() {
+        assertThat(new PropertyBuilder().toProperties()).isEmpty();
+    }
+
+    @Test
+    public void setHasAttachmentShouldAddFalseWhenCalledWithFalse() {
+        PropertyBuilder propertyBuilder = new PropertyBuilder();
+        propertyBuilder.setHasAttachment(false);
+        assertThat(propertyBuilder.toProperties())
+            .containsOnly(new SimpleProperty(PropertyBuilder.JAMES_INTERNALS, PropertyBuilder.HAS_ATTACHMENT, "false"));
+    }
+
+    @Test
+    public void setHasAttachmentShouldAddTrueWhenCalledWithTrue() {
+        PropertyBuilder propertyBuilder = new PropertyBuilder();
+        propertyBuilder.setHasAttachment(true);
+        assertThat(propertyBuilder.toProperties())
+            .containsOnly(new SimpleProperty(PropertyBuilder.JAMES_INTERNALS, PropertyBuilder.HAS_ATTACHMENT, "true"));
+    }
+
+}


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


[10/13] james-project git commit: JAMES-1929 Adding integration tests for hasAttachment filter support

Posted by bt...@apache.org.
JAMES-1929 Adding integration tests for hasAttachment filter support


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

Branch: refs/heads/master
Commit: 983de8dd1e0714dbf5256d7be7bea21aa7123221
Parents: 46feedc
Author: Benoit Tellier <bt...@linagora.com>
Authored: Wed Feb 8 17:04:36 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Feb 15 06:59:46 2017 +0700

----------------------------------------------------------------------
 .../integration/GetMessageListMethodTest.java   | 46 ++++++++++++++++++++
 1 file changed, 46 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/983de8dd/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
index be275d9..034575c 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
@@ -127,6 +127,52 @@ public abstract class GetMessageListMethodTest {
     }
 
     @Test
+    public void getMessageListShouldSupportHasAttachmentSetToTrue() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+
+        jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        ComposedMessageId message2 = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"), new Date(), false, new Flags());
+        jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/oneInlinedImage.eml"), new Date(), false, new Flags());
+        await();
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {\"filter\":{\"hasAttachment\":\"true\"}}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", contains(message2.getMessageId().serialize()));
+    }
+
+    @Test
+    public void getMessageListShouldSupportHasAttachmentSetToFalse() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+
+        ComposedMessageId message1 = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"), new Date(), false, new Flags());
+        ComposedMessageId message3 = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/oneInlinedImage.eml"), new Date(), false, new Flags());
+        await();
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {\"filter\":{\"hasAttachment\":\"false\"}}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", contains(message1.getMessageId().serialize(), message3.getMessageId().serialize()));
+    }
+
+    @Test
     public void getMessageListShouldNotFailWhenHeaderIsValid() throws Exception {
         given()
             .header("Authorization", accessToken.serialize())


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