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