JAMES-2529 Encapsulate MailMatcher code in relevant sub-classes This makes reading way easier as in an IDE one can fold complete sub-classes
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/9a2e06d1 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/9a2e06d1 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/9a2e06d1 Branch: refs/heads/master Commit: 9a2e06d1ace6a54a084ab880ff50416a4dbe2eeb Parents: 247a851 Author: Benoit Tellier <btell...@linagora.com> Authored: Thu Aug 30 09:36:25 2018 +0700 Committer: Antoine Duprat <adup...@linagora.com> Committed: Thu Aug 30 15:07:01 2018 +0200 ---------------------------------------------------------------------- .../james/jmap/mailet/filter/MailMatcher.java | 118 +++++++++---------- 1 file changed, 58 insertions(+), 60 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/9a2e06d1/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/filter/MailMatcher.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/filter/MailMatcher.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/filter/MailMatcher.java index d9efaf7..d762120 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/filter/MailMatcher.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/filter/MailMatcher.java @@ -48,36 +48,38 @@ import com.google.common.collect.ImmutableMap; public interface MailMatcher { interface HeaderExtractor extends ThrowingFunction<Mail, Stream<String>> { + HeaderExtractor SUBJECT_EXTRACTOR = mail -> + OptionalUtils.ofNullableToStream(mail.getMessage().getSubject()); + HeaderExtractor RECIPIENT_EXTRACTOR = mail -> addressExtractor( + mail.getMessage().getRecipients(Message.RecipientType.TO), + mail.getMessage().getRecipients(Message.RecipientType.CC)); + HeaderExtractor FROM_EXTRACTOR = mail -> addressExtractor(mail.getMessage().getFrom()); + HeaderExtractor CC_EXTRACTOR = recipientExtractor(Message.RecipientType.CC); + HeaderExtractor TO_EXTRACTOR = recipientExtractor(Message.RecipientType.TO); + + Map<Field, HeaderExtractor> HEADER_EXTRACTOR_REGISTRY = ImmutableMap.<Field, HeaderExtractor>builder() + .put(Field.SUBJECT, SUBJECT_EXTRACTOR) + .put(Field.RECIPIENT, RECIPIENT_EXTRACTOR) + .put(Field.FROM, FROM_EXTRACTOR) + .put(Field.CC, CC_EXTRACTOR) + .put(Field.TO, TO_EXTRACTOR) + .build(); - } - - class HeaderMatcher implements MailMatcher { - - private static final Logger LOGGER = LoggerFactory.getLogger(HeaderMatcher.class); - - private final ContentMatcher contentMatcher; - private final String ruleValue; - private final HeaderExtractor headerExtractor; - - private HeaderMatcher(ContentMatcher contentMatcher, String ruleValue, - HeaderExtractor headerExtractor) { - Preconditions.checkNotNull(contentMatcher); - Preconditions.checkNotNull(headerExtractor); + static HeaderExtractor recipientExtractor(Message.RecipientType type) { + return mail -> addressExtractor(mail.getMessage().getRecipients(type)); + } - this.contentMatcher = contentMatcher; - this.ruleValue = ruleValue; - this.headerExtractor = headerExtractor; + static Stream<String> addressExtractor(Address[]... addresses) { + return Optional.ofNullable(addresses) + .map(Arrays::stream) + .orElse(Stream.empty()) + .filter(Objects::nonNull) + .flatMap(AddressHelper::asStringStream); } - @Override - public boolean match(Mail mail) { - try { - final Stream<String> headerLines = headerExtractor.apply(mail); - return contentMatcher.match(headerLines, ruleValue); - } catch (Exception e) { - LOGGER.error("error while extracting mail header", e); - return false; - } + static Optional<HeaderExtractor> asHeaderExtractor(Field field) { + return Optional + .ofNullable(HeaderExtractor.HEADER_EXTRACTOR_REGISTRY.get(field)); } } @@ -176,27 +178,40 @@ public interface MailMatcher { boolean match(Stream<String> contents, String valueToMatch); } - HeaderExtractor SUBJECT_EXTRACTOR = mail -> - OptionalUtils.ofNullableToStream(mail.getMessage().getSubject()); - HeaderExtractor RECIPIENT_EXTRACTOR = mail -> addressExtractor( - mail.getMessage().getRecipients(Message.RecipientType.TO), - mail.getMessage().getRecipients(Message.RecipientType.CC)); - HeaderExtractor FROM_EXTRACTOR = mail -> addressExtractor(mail.getMessage().getFrom()); - HeaderExtractor CC_EXTRACTOR = recipientExtractor(Message.RecipientType.CC); - HeaderExtractor TO_EXTRACTOR = recipientExtractor(Message.RecipientType.TO); - - Map<Field, HeaderExtractor> HEADER_EXTRACTOR_REGISTRY = ImmutableMap.<Field, HeaderExtractor>builder() - .put(Field.SUBJECT, SUBJECT_EXTRACTOR) - .put(Field.RECIPIENT, RECIPIENT_EXTRACTOR) - .put(Field.FROM, FROM_EXTRACTOR) - .put(Field.CC, CC_EXTRACTOR) - .put(Field.TO, TO_EXTRACTOR) - .build(); + class HeaderMatcher implements MailMatcher { + + private static final Logger LOGGER = LoggerFactory.getLogger(HeaderMatcher.class); + + private final ContentMatcher contentMatcher; + private final String ruleValue; + private final HeaderExtractor headerExtractor; + + private HeaderMatcher(ContentMatcher contentMatcher, String ruleValue, + HeaderExtractor headerExtractor) { + Preconditions.checkNotNull(contentMatcher); + Preconditions.checkNotNull(headerExtractor); + + this.contentMatcher = contentMatcher; + this.ruleValue = ruleValue; + this.headerExtractor = headerExtractor; + } + + @Override + public boolean match(Mail mail) { + try { + final Stream<String> headerLines = headerExtractor.apply(mail); + return contentMatcher.match(headerLines, ruleValue); + } catch (Exception e) { + LOGGER.error("error while extracting mail header", e); + return false; + } + } + } static MailMatcher from(Rule rule) { Condition ruleCondition = rule.getCondition(); Optional<ContentMatcher> maybeContentMatcher = ContentMatcher.asContentMatcher(ruleCondition.getField(), ruleCondition.getComparator()); - Optional<HeaderExtractor> maybeHeaderExtractor = getHeaderExtractor(ruleCondition.getField()); + Optional<HeaderExtractor> maybeHeaderExtractor = HeaderExtractor.asHeaderExtractor(ruleCondition.getField()); return new HeaderMatcher( maybeContentMatcher.orElseThrow(() -> new RuntimeException("No content matcher associated with field " + ruleCondition.getField())), @@ -204,22 +219,5 @@ public interface MailMatcher { maybeHeaderExtractor.orElseThrow(() -> new RuntimeException("No content matcher associated with comparator " + ruleCondition.getComparator()))); } - static HeaderExtractor recipientExtractor(Message.RecipientType type) { - return mail -> addressExtractor(mail.getMessage().getRecipients(type)); - } - - static Stream<String> addressExtractor(Address[]... addresses) { - return Optional.ofNullable(addresses) - .map(Arrays::stream) - .orElse(Stream.empty()) - .filter(Objects::nonNull) - .flatMap(AddressHelper::asStringStream); - } - - static Optional<HeaderExtractor> getHeaderExtractor(Field field) { - return Optional - .ofNullable(HEADER_EXTRACTOR_REGISTRY.get(field)); - } - boolean match(Mail mail); } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org