This is an automated email from the ASF dual-hosted git repository.

rouazana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/master by this push:
     new 03d42b1  JAMES-2735 Update mailet and matcher that uses the headers 
and the per recipients
     new b480dcb  Merge remote-tracking branch 'foilen/JAMES-2735'
03d42b1 is described below

commit 03d42b12c387785baebf5624a2bd40cc56b76006
Author: Simon Levesque <si...@foilen.com>
AuthorDate: Thu Jul 11 06:50:02 2019 -0400

    JAMES-2735 Update mailet and matcher that uses the headers and the per
    recipients
---
 .../james/transport/mailets/RemoveMimeHeader.java  | 24 ++++++-
 .../mailets/RemoveMimeHeaderByPrefix.java          | 21 +++++-
 .../apache/james/transport/matchers/HasHeader.java | 78 ++++++++++++++++------
 .../transport/matchers/HasHeaderWithPrefix.java    | 18 ++++-
 .../mailets/RemoveMimeHeaderByPrefixTest.java      | 30 +++++++++
 .../transport/mailets/RemoveMimeHeaderTest.java    | 66 ++++++++++++++++++
 .../james/transport/matchers/HasHeaderTest.java    | 45 ++++++++++++-
 .../matchers/HasHeaderWithPrefixTest.java          | 65 ++++++++++++++++++
 8 files changed, 321 insertions(+), 26 deletions(-)

diff --git 
a/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeader.java
 
b/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeader.java
index 5f19e80..c728237 100644
--- 
a/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeader.java
+++ 
b/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeader.java
@@ -19,20 +19,23 @@
 
 package org.apache.james.transport.mailets;
 
+import java.util.Iterator;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailetException;
+import org.apache.mailet.PerRecipientHeaders.Header;
 import org.apache.mailet.base.GenericMailet;
 
 import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableList;
 
 /**
- * Remove mime headers
+ * Remove mime headers from the message (global) and per recipient (specific).
  * 
  * Sample configuration:
  * 
@@ -63,9 +66,28 @@ public class RemoveMimeHeader extends GenericMailet {
     @Override
     public void service(Mail mail) throws MessagingException {
         MimeMessage  message = mail.getMessage();
+        
         for (String header : headers) {
             message.removeHeader(header);
         }
+        
+        removeSpecific(mail);
+
         message.saveChanges();
     }
+
+    protected void removeSpecific(Mail mail) {
+        
mail.getPerRecipientSpecificHeaders().getRecipientsWithSpecificHeaders() 
+                .stream()
+                .collect(Collectors.toList()) // Streaming for concurrent 
modifications
+                .forEach(recipient -> {
+                    Iterator<Header> it = 
mail.getPerRecipientSpecificHeaders().getHeadersForRecipient(recipient).iterator();
+                    while (it.hasNext()) {
+                        Header next = it.next();
+                        if (headers.contains(next.getName())) {
+                            it.remove();
+                        }
+                    }
+                });
+    }
 }
diff --git 
a/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefix.java
 
b/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefix.java
index 6a3f464..0118e4d 100644
--- 
a/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefix.java
+++ 
b/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefix.java
@@ -20,7 +20,9 @@
 
 package org.apache.james.transport.mailets;
 
+import java.util.Iterator;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.mail.Header;
 import javax.mail.MessagingException;
@@ -33,7 +35,7 @@ import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 
 /**
- * This mailet removes all of the headers starting with a given prefix.
+ * This mailet removes all of the headers starting with a given prefix in the 
message (global) and per recipient (specific).
  *
  * Sample configuration:
  *
@@ -72,6 +74,23 @@ public class RemoveMimeHeaderByPrefix extends GenericMailet {
         if (!headerNamesToRemove.isEmpty()) {
             mail.getMessage().saveChanges();
         }
+
+        removeSpecific(mail);
+    }
+
+    protected void removeSpecific(Mail mail) {
+        
mail.getPerRecipientSpecificHeaders().getRecipientsWithSpecificHeaders()
+                .stream()
+                .collect(Collectors.toList()) // Streaming for concurrent 
modifications
+                .forEach(recipient -> {
+                    Iterator<org.apache.mailet.PerRecipientHeaders.Header> it 
= 
mail.getPerRecipientSpecificHeaders().getHeadersForRecipient(recipient).iterator();
+                    while (it.hasNext()) {
+                        org.apache.mailet.PerRecipientHeaders.Header next = 
it.next();
+                        if (next.getName().startsWith(prefix)) {
+                            it.remove();
+                        }
+                    }
+                });
     }
 
     private List<String> headerNamesStartingByPrefix(Mail mail) throws 
MessagingException {
diff --git 
a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeader.java
 
b/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeader.java
index e4c8cbb..dba2e2c 100644
--- 
a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeader.java
+++ 
b/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeader.java
@@ -17,17 +17,17 @@
  * under the License.                                           *
  ****************************************************************/
 
-
 package org.apache.james.transport.matchers;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.StringTokenizer;
 
 import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
 
 import org.apache.james.core.MailAddress;
 import org.apache.james.mime4j.codec.DecodeMonitor;
@@ -36,11 +36,18 @@ import org.apache.james.mime4j.util.MimeUtil;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.GenericMatcher;
 
+import com.github.steveash.guavate.Guavate;
+
 /**
- * use: <pre><code>&lt;mailet match="HasHeader={&lt;header&gt;[=value]}+" 
class="..." /&gt;</code></pre>
+ * use:
+ *
+ * <pre>
+ * <code>&lt;mailet match="HasHeader={&lt;header&gt;[=value]}+" class="..." 
/&gt;</code>
+ * </pre>
  * <p/>
- * <p>This matcher checks if the header named is present. If complements the
- * AddHeader mailet.</p>
+ * <p>
+ * This matcher checks if the header is present in the message (global) and 
per recipient (specific). It complements the AddHeader mailet.
+ * </p>
  */
 public class HasHeader extends GenericMatcher {
 
@@ -54,7 +61,7 @@ public class HasHeader extends GenericMatcher {
     private static final String HEADER_VALUE_SEPARATOR = "=";
 
     private interface HeaderCondition {
-        boolean isMatching(MimeMessage mimeMessage) throws MessagingException;
+        Collection<MailAddress> isMatching(Mail mail) throws 
MessagingException;
     }
 
     private static class HeaderNameCondition implements HeaderCondition {
@@ -65,9 +72,22 @@ public class HasHeader extends GenericMatcher {
         }
 
         @Override
-        public boolean isMatching(MimeMessage mimeMessage) throws 
MessagingException {
-            String[] headerArray = mimeMessage.getHeader(headerName);
-            return headerArray != null && headerArray.length > 0;
+        public Collection<MailAddress> isMatching(Mail mail) throws 
MessagingException {
+            String[] headerArray = mail.getMessage().getHeader(headerName);
+            if (headerArray != null && headerArray.length > 0) {
+                return mail.getRecipients();
+            }
+
+            return matchSpecific(mail);
+        }
+
+        protected Collection<MailAddress> matchSpecific(Mail mail) {
+            return 
mail.getPerRecipientSpecificHeaders().getHeadersByRecipient()
+                    .entries()
+                    .stream()
+                    .filter(entry -> 
entry.getValue().getName().equals(headerName))
+                    .map(entry -> entry.getKey())
+                    .collect(Guavate.toImmutableSet());
         }
     }
 
@@ -81,13 +101,23 @@ public class HasHeader extends GenericMatcher {
         }
 
         @Override
-        public boolean isMatching(MimeMessage mimeMessage) throws 
MessagingException {
-            String[] headerArray = mimeMessage.getHeader(headerName);
-            if (headerArray != null && headerArray.length > 0) {
-                return Arrays.stream(headerArray)
-                    .anyMatch(value -> 
headerValue.equals(sanitizeHeaderField(value)));
+        public Collection<MailAddress> isMatching(Mail mail) throws 
MessagingException {
+            String[] headerArray = mail.getMessage().getHeader(headerName);
+            if (headerArray != null && headerArray.length > 0 && //
+                    Arrays.stream(headerArray).anyMatch(value -> 
headerValue.equals(sanitizeHeaderField(value)))) {
+                return mail.getRecipients();
             }
-            return false;
+
+            return matchSpecific(mail);
+        }
+
+        protected Collection<MailAddress> matchSpecific(Mail mail) {
+            return 
mail.getPerRecipientSpecificHeaders().getHeadersByRecipient()
+                    .entries()
+                    .stream()
+                    .filter(entry -> 
entry.getValue().getName().equals(headerName) && 
entry.getValue().getValue().equals(headerValue))
+                    .map(entry -> entry.getKey())
+                    .collect(Guavate.toImmutableSet());
         }
     }
 
@@ -109,7 +139,7 @@ public class HasHeader extends GenericMatcher {
         }
         String headerName = valueSeparatorTokenizer.nextToken().trim();
         if (valueSeparatorTokenizer.hasMoreTokens()) {
-           return new HeaderValueCondition(headerName, 
valueSeparatorTokenizer.nextToken().trim());
+            return new HeaderValueCondition(headerName, 
valueSeparatorTokenizer.nextToken().trim());
         } else {
             return new HeaderNameCondition(headerName);
         }
@@ -117,12 +147,20 @@ public class HasHeader extends GenericMatcher {
 
     @Override
     public Collection<MailAddress> match(Mail mail) throws 
javax.mail.MessagingException {
+        Set<MailAddress> matchingRecipients = new HashSet<>();
+        boolean first = true;
         for (HeaderCondition headerCondition : headerConditions) {
-            if (!headerCondition.isMatching(mail.getMessage())) {
-                return null;
+            if (first) {
+                first = false;
+                // Keep the first list
+                matchingRecipients.addAll(headerCondition.isMatching(mail));
+            } else {
+                // Ensure intersection (all must be true)
+                Collection<MailAddress> currentMatching = 
headerCondition.isMatching(mail);
+                matchingRecipients.removeIf(it -> 
!currentMatching.contains(it));
             }
         }
-        return mail.getRecipients();
+        return matchingRecipients.isEmpty() ? null : matchingRecipients;
     }
-} 
 
+}
diff --git 
a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeaderWithPrefix.java
 
b/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeaderWithPrefix.java
index 78f1d75..525eff0 100644
--- 
a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeaderWithPrefix.java
+++ 
b/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeaderWithPrefix.java
@@ -30,13 +30,14 @@ import 
org.apache.james.transport.mailets.utils.MimeMessageUtils;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.GenericMatcher;
 
+import com.github.steveash.guavate.Guavate;
 import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
 
 /**
  * Matches emails with headers having a given prefix.
  *
- * If a header with the given prefix is found, all recipients will be matched. 
Otherwise, no recipient in returned.
+ * If a header with the given prefix is found in the message (global) all 
recipients will be matched. If a header with the given prefix is found per 
recipient (specific), only these will be matched. 
+ * Otherwise, no recipient in returned.
  *
  * use: <pre><code>&lt;mailet match="HasHeaderWithPrefix=PREFIX" class="..." 
/&gt;</code></pre>
  */
@@ -60,11 +61,22 @@ public class HasHeaderWithPrefix extends GenericMatcher {
     @Override
     public Collection<MailAddress> match(Mail mail) throws MessagingException {
         List<Header> headers = new 
MimeMessageUtils(mail.getMessage()).toHeaderList();
+
         for (Header header: headers) {
             if (header.getName().startsWith(prefix)) {
                 return mail.getRecipients();
             }
         }
-        return ImmutableList.of();
+
+        return matchSpecific(mail);
+    }
+
+    protected Collection<MailAddress> matchSpecific(Mail mail) {
+        return mail.getPerRecipientSpecificHeaders().getHeadersByRecipient()
+                .entries()
+                .stream()
+                .filter(entry -> entry.getValue().getName().startsWith(prefix))
+                .map(entry -> entry.getKey())
+                .collect(Guavate.toImmutableSet());
     }
 }
diff --git 
a/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefixTest.java
 
b/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefixTest.java
index 51143c4..9af35a3 100644
--- 
a/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefixTest.java
+++ 
b/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefixTest.java
@@ -24,9 +24,11 @@ import static 
org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import javax.mail.MessagingException;
 
+import org.apache.james.core.MailAddress;
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.transport.mailets.utils.MimeMessageUtils;
 import org.apache.mailet.Mail;
+import org.apache.mailet.PerRecipientHeaders.Header;
 import org.apache.mailet.base.GenericMailet;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailetConfig;
@@ -39,6 +41,9 @@ class RemoveMimeHeaderByPrefixTest {
     private static final String HEADER_NAME_PREFIX_1 = "X-OPENPAAS-FEATURE-A";
     private static final String HEADER_NAME_PREFIX_2 = "X-OPENPAAS-FEATURE-B";
     private static final String HEADER_NAME_NO_PREFIX = "X-OTHER-BUSINESS";
+    private static final String RECIPIENT1 = "r...@example.com";
+    private static final String RECIPIENT2 = "r...@example.com";
+    private static final String RECIPIENT3 = "r...@example.com";
 
     private GenericMailet mailet;
 
@@ -88,6 +93,31 @@ class RemoveMimeHeaderByPrefixTest {
             .extracting("name")
             .doesNotContain(HEADER_NAME_PREFIX_1, HEADER_NAME_PREFIX_2);
     }
+    
+    @Test
+    void serviceShouldRemoveAllPrefixedHeadersMixed() throws 
MessagingException {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+                .mailetName("Test")
+                .setProperty("prefix", PREFIX)
+                .build();
+        mailet.init(mailetConfig);
+        
+        Mail mail = 
FakeMail.fromMessage(MimeMessageBuilder.mimeMessageBuilder()
+                .addHeader(HEADER_NAME_PREFIX_1, "true"));
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_PREFIX_2).value("1").build(),
 new MailAddress(RECIPIENT1));
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(PREFIX).value("1").build(),
 new MailAddress(RECIPIENT2));
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_NO_PREFIX).value("1").build(),
 new MailAddress(RECIPIENT3));
+        
+        mailet.service(mail);
+        
+        assertThat(new MimeMessageUtils(mail.getMessage()).toHeaderList())
+                .extracting("name")
+                .doesNotContain(PREFIX, HEADER_NAME_PREFIX_1, 
HEADER_NAME_PREFIX_2);
+
+        
assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new 
MailAddress(RECIPIENT1))).isEmpty();
+        
assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new 
MailAddress(RECIPIENT2))).isEmpty();
+        
assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new 
MailAddress(RECIPIENT3))).isNotEmpty();
+    }
 
     @Test
     void serviceShouldNotRemoveNonPrefixedHeaders() throws MessagingException {
diff --git 
a/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderTest.java
 
b/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderTest.java
index 807b2df..baa5b5a 100644
--- 
a/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderTest.java
+++ 
b/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderTest.java
@@ -27,8 +27,10 @@ import static org.mockito.Mockito.when;
 
 import javax.mail.MessagingException;
 
+import org.apache.james.core.MailAddress;
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.mailet.Mail;
+import org.apache.mailet.PerRecipientHeaders.Header;
 import org.apache.mailet.base.GenericMailet;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailetConfig;
@@ -39,6 +41,8 @@ class RemoveMimeHeaderTest {
 
     private static final String HEADER1 = "header1";
     private static final String HEADER2 = "header2";
+    private static final String RECIPIENT1 = "r...@example.com";
+    private static final String RECIPIENT2 = "r...@example.com";
 
     private GenericMailet mailet;
 
@@ -71,6 +75,26 @@ class RemoveMimeHeaderTest {
     }
 
     @Test
+    public void serviceShouldRemoveSpecificHeaderWhenOneMatching() throws 
MessagingException {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+                .mailetName("Test")
+                .setProperty("name", HEADER1)
+                .build();
+        mailet.init(mailetConfig);
+
+        Mail mail = 
FakeMail.fromMessage(MimeMessageBuilder.mimeMessageBuilder().addToRecipient(RECIPIENT1).addToRecipient(RECIPIENT2));
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER1).value("1").build(),
 new MailAddress(RECIPIENT1));
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER2).value("1").build(),
 new MailAddress(RECIPIENT2));
+
+        mailet.service(mail);
+
+        assertThat(mail.getMessage().getHeader(HEADER1)).isNull();
+        assertThat(mail.getMessage().getHeader(HEADER2)).isNull();
+        
assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new 
MailAddress(RECIPIENT1))).isEmpty();
+        
assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new 
MailAddress(RECIPIENT2))).isNotEmpty();
+    }
+
+    @Test
     void serviceShouldRemoveHeadersWhenTwoMatching() throws MessagingException 
{
         FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
                 .mailetName("Test")
@@ -87,6 +111,48 @@ class RemoveMimeHeaderTest {
         assertThat(mail.getMessage().getHeader(HEADER1)).isNull();
         assertThat(mail.getMessage().getHeader(HEADER2)).isNull();
     }
+    
+    @Test
+    public void serviceShouldRemoveSpecificHeadersWhenTwoMatching() throws 
MessagingException {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+                .mailetName("Test")
+                .setProperty("name", HEADER1 + "," + HEADER2)
+                .build();
+        mailet.init(mailetConfig);
+
+        Mail mail = 
FakeMail.fromMessage(MimeMessageBuilder.mimeMessageBuilder().addToRecipient(RECIPIENT1).addToRecipient(RECIPIENT2));
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER1).value("1").build(),
 new MailAddress(RECIPIENT1));
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER2).value("1").build(),
 new MailAddress(RECIPIENT2));
+
+        mailet.service(mail);
+
+        assertThat(mail.getMessage().getHeader(HEADER1)).isNull();
+        assertThat(mail.getMessage().getHeader(HEADER2)).isNull();
+        
assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new 
MailAddress(RECIPIENT1))).isEmpty();
+        
assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new 
MailAddress(RECIPIENT2))).isEmpty();
+    }
+    
+    @Test
+    public void serviceShouldRemoveSpecificAndGlobalHeadersWhenMixed() throws 
MessagingException {
+        FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+                .mailetName("Test")
+                .setProperty("name", HEADER1)
+                .build();
+        mailet.init(mailetConfig);
+        
+        Mail mail = 
FakeMail.fromMessage(MimeMessageBuilder.mimeMessageBuilder().addToRecipient(RECIPIENT1).addToRecipient(RECIPIENT2)
+                .addHeader(HEADER1, "true")
+                .addHeader(HEADER2, "true"));
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER1).value("1").build(),
 new MailAddress(RECIPIENT1));
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER2).value("1").build(),
 new MailAddress(RECIPIENT2));
+
+        mailet.service(mail);
+
+        assertThat(mail.getMessage().getHeader(HEADER1)).isNull();
+        assertThat(mail.getMessage().getHeader(HEADER2)).isNotNull();
+        
assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new 
MailAddress(RECIPIENT1))).isEmpty();
+        
assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new 
MailAddress(RECIPIENT2))).isNotEmpty();
+    }
 
     @Test
     void serviceShouldNotRemoveHeaderWhenNoneMatching() throws 
MessagingException {
diff --git 
a/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java
 
b/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java
index 785c266..0dd3ff5 100644
--- 
a/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java
+++ 
b/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java
@@ -17,18 +17,21 @@
  * under the License.                                           *
  ****************************************************************/
 
-
 package org.apache.james.transport.matchers;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.util.Arrays;
+
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
+import org.apache.james.core.MailAddress;
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.util.MimeMessageUtil;
 import org.apache.mailet.Mail;
 import org.apache.mailet.Matcher;
+import org.apache.mailet.PerRecipientHeaders.Header;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMatcherConfig;
 import org.apache.mailet.base.test.MailUtil;
@@ -208,4 +211,44 @@ public class HasHeaderTest {
 
         
assertThat(matcher.match(mail)).containsAll(mockedMail.getRecipients());
     }
+
+    @Test
+    public void 
matchShouldReturnAddressesWhenAllConditionsMatchGlobalAndSpecific() throws 
MessagingException {
+        
matcher.init(FakeMatcherConfig.builder().matcherName("HasHeader").condition(HEADER_NAME_1
 + "+" + HEADER_NAME_2).build());
+
+        Mail mail = 
MailUtil.createMockMail2Recipients(MimeMessageBuilder.mimeMessageBuilder().addHeader(HEADER_NAME_1,
 HEADER_VALUE_1).build());
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_2).value(HEADER_VALUE_2).build(),
 new MailAddress("t...@james.apache.org"));
+
+        assertThat(matcher.match(mail)).containsAll(Arrays.asList(new 
MailAddress("t...@james.apache.org")));
+    }
+
+    @Test
+    public void matchShouldReturnAddressesWhenAllConditionsMatchSpecific() 
throws MessagingException {
+        
matcher.init(FakeMatcherConfig.builder().matcherName("HasHeader").condition(HEADER_NAME_1
 + "+" + HEADER_NAME_2).build());
+
+        Mail mail = 
MailUtil.createMockMail2Recipients(MimeMessageBuilder.mimeMessageBuilder().build());
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_1).value(HEADER_VALUE_1).build(),
 new MailAddress("t...@james.apache.org"));
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_2).value(HEADER_VALUE_2).build(),
 new MailAddress("t...@james.apache.org"));
+
+        assertThat(matcher.match(mail)).containsAll(Arrays.asList(new 
MailAddress("t...@james.apache.org")));
+    }
+
+    @Test
+    public void 
matchShouldReturnAddressesWhenAllValueConditionsMatchGlobalAndSpecific() throws 
MessagingException {
+        
matcher.init(FakeMatcherConfig.builder().matcherName("HasHeader").condition(HEADER_NAME_1
 + "=" + HEADER_VALUE_1 + "+" + HEADER_NAME_2).build());
+
+        Mail mail = FakeMail.builder() //
+                .name(MailUtil.newId()) //
+                .mimeMessage(MimeMessageBuilder.mimeMessageBuilder().build()) 
//
+                .recipients(new MailAddress("t...@james.apache.org"), new 
MailAddress("te...@james.apache.org"), new 
MailAddress("te...@james.apache.org")) //
+                .build();
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_1).value("wrong
 value").build(), new MailAddress("t...@james.apache.org"));
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_1).value(HEADER_VALUE_1).build(),
 new MailAddress("te...@james.apache.org"));
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_2).value("any
 value").build(), new MailAddress("te...@james.apache.org"));
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_1).value("wrong
 value").build(), new MailAddress("te...@james.apache.org"));
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_2).value("any
 value").build(), new MailAddress("te...@james.apache.org"));
+
+        assertThat(matcher.match(mail)).containsAll(Arrays.asList(new 
MailAddress("te...@james.apache.org")));
+    }
+
 }
diff --git 
a/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderWithPrefixTest.java
 
b/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderWithPrefixTest.java
index acc4846..ea93dae 100644
--- 
a/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderWithPrefixTest.java
+++ 
b/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderWithPrefixTest.java
@@ -23,11 +23,14 @@ package org.apache.james.transport.matchers;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
+import java.util.Arrays;
+
 import javax.mail.MessagingException;
 
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.mailet.Mail;
 import org.apache.mailet.Matcher;
+import org.apache.mailet.PerRecipientHeaders.Header;
 import org.apache.mailet.base.MailAddressFixture;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMatcherConfig;
@@ -66,6 +69,26 @@ class HasHeaderWithPrefixTest {
     }
 
     @Test
+    void matchShouldReturnAddressesWhenPrefixedHeaderNameInSpecific() throws 
MessagingException {
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+            .matcherName("HasHeader")
+            .condition(PREFIX)
+            .build();
+
+        matcher.init(matcherConfig);
+
+        Mail mail = FakeMail.builder()
+            .name("mail")
+            .mimeMessage(MimeMessageBuilder.mimeMessageBuilder())
+            .recipients(MailAddressFixture.ANY_AT_JAMES, 
MailAddressFixture.OTHER_AT_JAMES2)
+            .build();
+        
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_PREFIX_1).value("true").build(),
 MailAddressFixture.ANY_AT_JAMES);
+
+        
assertThat(matcher.match(mail)).containsAll(Arrays.asList(MailAddressFixture.ANY_AT_JAMES));
+    }
+
+    @Test
     void matchShouldReturnAddressesWhenExactlyPrefix() throws 
MessagingException {
         FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
             .matcherName("HasHeader")
@@ -85,6 +108,26 @@ class HasHeaderWithPrefixTest {
     }
 
     @Test
+    void matchShouldReturnAddressesWhenExactlyPrefixInSpecific() throws 
MessagingException {
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+                .matcherName("HasHeader")
+                .condition(PREFIX)
+                .build();
+        
+        matcher.init(matcherConfig);
+        
+        Mail mail = FakeMail.builder()
+                .name("mail")
+                .mimeMessage(MimeMessageBuilder.mimeMessageBuilder())
+                .recipients(MailAddressFixture.ANY_AT_JAMES, 
MailAddressFixture.OTHER_AT_JAMES2)
+                .build();
+        
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(PREFIX).value("true").build(),
 MailAddressFixture.ANY_AT_JAMES);
+        
+        
assertThat(matcher.match(mail)).containsAll(Arrays.asList(MailAddressFixture.ANY_AT_JAMES));
+    }
+
+    @Test
     void matchShouldReturnEmptyWhenNoPrefixedHeader() throws 
MessagingException {
         FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
             .matcherName("HasHeader")
@@ -124,6 +167,28 @@ class HasHeaderWithPrefixTest {
     }
 
     @Test
+    void matchShouldReturnAddressesWhenAtLeastOneHeaderPrefixedInSpecific() 
throws MessagingException {
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+                .matcherName("HasHeader")
+                .condition(PREFIX)
+                .build();
+        
+        matcher.init(matcherConfig);
+        
+        Mail mail = FakeMail.builder()
+                .name("mail")
+                .mimeMessage(MimeMessageBuilder.mimeMessageBuilder())
+                .recipients(MailAddressFixture.ANY_AT_JAMES, 
MailAddressFixture.OTHER_AT_JAMES2)
+                .build();
+        
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_PREFIX_1).value("true").build(),
 MailAddressFixture.ANY_AT_JAMES);
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_NO_PREFIX).value("true").build(),
 MailAddressFixture.ANY_AT_JAMES);
+        
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_NO_PREFIX).value("true").build(),
 MailAddressFixture.OTHER_AT_JAMES2);
+        
+        
assertThat(matcher.match(mail)).containsAll(Arrays.asList(MailAddressFixture.ANY_AT_JAMES));
+    }
+
+    @Test
     void initShouldRejectEmptyPrefix() {
         assertThatThrownBy(() ->
             matcher.init(FakeMatcherConfig.builder()


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to