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:22 UTC

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

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