Skip to content

Commit

Permalink
JAMES-1929 JMAP wiring for GetMessageList::hasAttachment filter
Browse files Browse the repository at this point in the history
  • Loading branch information
chibenwa committed Feb 14, 2017
1 parent 9fb956b commit 46feedc
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 25 deletions.
Expand Up @@ -593,12 +593,20 @@ public static Criterion flagSet(Flag flag, boolean isSet) {
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);
}

/**
Expand Down
Expand Up @@ -23,7 +23,6 @@

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;
Expand All @@ -32,7 +31,6 @@
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;

Expand All @@ -52,17 +50,15 @@ public SearchQuery convert(Filter filter) {

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)));
Expand All @@ -71,14 +67,14 @@ private SearchQuery convertCondition(FilterCondition filter) {
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)));
filter.getIsFlagged().ifPresent(isFlagged -> searchQuery.andCriteria(SearchQuery.flagIsSet(Flag.FLAGGED)));
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;
}

Expand Down
Expand Up @@ -27,7 +27,6 @@

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;
Expand Down Expand Up @@ -96,6 +95,30 @@ public void filterConditionShouldMapWhenCc() {
assertThat(searchQuery).isEqualTo(expectedSearchQuery);
}

@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";
Expand Down Expand Up @@ -180,14 +203,6 @@ public void filterConditionShouldMapWhenBefore() {
assertThat(searchQuery).isEqualTo(expectedSearchQuery);
}

@Test
public void filterConditionShouldThrowWhenHasAttachment() {
assertThatThrownBy(() -> new FilterToSearchQuery().convert(FilterCondition.builder()
.hasAttachment(true)
.build()))
.isInstanceOf(NotImplementedException.class);
}

@Test
public void filterConditionShouldMapWhenIsAnswered() {
SearchQuery expectedSearchQuery = new SearchQuery();
Expand Down

0 comments on commit 46feedc

Please sign in to comment.