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 <[email protected]>
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><mailet match="HasHeader={<header>[=value]}+"
class="..." /></code></pre>
+ * use:
+ *
+ * <pre>
+ * <code><mailet match="HasHeader={<header>[=value]}+" class="..."
/></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><mailet match="HasHeaderWithPrefix=PREFIX" class="..."
/></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 = "[email protected]";
+ private static final String RECIPIENT2 = "[email protected]";
+ private static final String RECIPIENT3 = "[email protected]";
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 = "[email protected]";
+ private static final String RECIPIENT2 = "[email protected]";
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("[email protected]"));
+
+ assertThat(matcher.match(mail)).containsAll(Arrays.asList(new
MailAddress("[email protected]")));
+ }
+
+ @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("[email protected]"));
+
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_2).value(HEADER_VALUE_2).build(),
new MailAddress("[email protected]"));
+
+ assertThat(matcher.match(mail)).containsAll(Arrays.asList(new
MailAddress("[email protected]")));
+ }
+
+ @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("[email protected]"), new
MailAddress("[email protected]"), new
MailAddress("[email protected]")) //
+ .build();
+
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_1).value("wrong
value").build(), new MailAddress("[email protected]"));
+
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_1).value(HEADER_VALUE_1).build(),
new MailAddress("[email protected]"));
+
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_2).value("any
value").build(), new MailAddress("[email protected]"));
+
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_1).value("wrong
value").build(), new MailAddress("[email protected]"));
+
mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_2).value("any
value").build(), new MailAddress("[email protected]"));
+
+ assertThat(matcher.match(mail)).containsAll(Arrays.asList(new
MailAddress("[email protected]")));
+ }
+
}
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: [email protected]
For additional commands, e-mail: [email protected]