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