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 ad...@apache.org on 2018/08/30 13:15:48 UTC
[06/26] james-project git commit: JAMES-2529 Encapsulate MailMatcher
code in relevant sub-classes
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 <bt...@linagora.com>
Authored: Thu Aug 30 09:36:25 2018 +0700
Committer: Antoine Duprat <ad...@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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org