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 ro...@apache.org on 2017/01/11 09:26:01 UTC

[13/50] [abbrv] james-project git commit: MAILET-115 Extract replaceMailAddresses from AbstractRedirect to MailAddressesUtils

MAILET-115 Extract replaceMailAddresses from AbstractRedirect to MailAddressesUtils


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/d6b0899d
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/d6b0899d
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/d6b0899d

Branch: refs/heads/master
Commit: d6b0899d089340a0a32ecec55bdd20a616601d7a
Parents: 82625a9
Author: Antoine Duprat <ad...@apache.org>
Authored: Thu Nov 3 14:25:01 2016 +0100
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Jan 11 10:03:28 2017 +0700

----------------------------------------------------------------------
 .../mailets/redirect/AbstractRedirect.java      |  94 +-------
 .../transport/util/SpecialAddressesUtils.java   | 144 +++++++++++
 .../mailets/redirect/AbstractRedirectTest.java  | 186 --------------
 .../util/SpecialAddressesUtilsTest.java         | 241 +++++++++++++++++++
 4 files changed, 387 insertions(+), 278 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d6b0899d/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AbstractRedirect.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AbstractRedirect.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AbstractRedirect.java
index 32ae435..59201bd 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AbstractRedirect.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AbstractRedirect.java
@@ -35,12 +35,12 @@ import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeBodyPart;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
-import javax.mail.internet.ParseException;
 
 import org.apache.james.core.MailImpl;
 import org.apache.james.core.MimeMessageUtil;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.transport.mailets.Redirect;
+import org.apache.james.transport.util.SpecialAddressesUtils;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailAddress;
 import org.apache.mailet.base.DateFormats;
@@ -210,7 +210,7 @@ public abstract class AbstractRedirect extends GenericMailet {
             if (containsOnlyUnalteredOrRecipients(recipients)) {
                 return null;
             }
-            return replaceMailAddresses(originalMail, recipients);
+            return SpecialAddressesUtils.from(this).replaceSpecialAddresses(originalMail, recipients);
         }
         return null;
     }
@@ -844,96 +844,6 @@ public abstract class AbstractRedirect extends GenericMailet {
 
     /**
      * Returns a new Collection built over <i>list</i> replacing special
-     * addresses with real <code>MailAddress</code>-es.<br>
-     * Manages <code>SpecialAddress.SENDER</code>,
-     * <code>SpecialAddress.REVERSE_PATH</code>,
-     * <code>SpecialAddress.FROM</code>, <code>SpecialAddress.REPLY_TO</code>,
-     * <code>SpecialAddress.RECIPIENTS</code>, <code>SpecialAddress.TO</code>,
-     * <code>SpecialAddress.NULL</code> and
-     * <code>SpecialAddress.UNALTERED</code>.<br>
-     * <code>SpecialAddress.FROM</code> is made equivalent to
-     * <code>SpecialAddress.SENDER</code>; <code>SpecialAddress.TO</code> is
-     * made equivalent to <code>SpecialAddress.RECIPIENTS</code>.<br>
-     * <code>SpecialAddress.REPLY_TO</code> uses the ReplyTo header if
-     * available, otherwise the From header if available, otherwise the Sender
-     * header if available, otherwise the return-path.<br>
-     * <code>SpecialAddress.NULL</code> and
-     * <code>SpecialAddress.UNALTERED</code> are ignored.<br>
-     * Any other address is not replaced.
-     */
-    protected Collection<MailAddress> replaceMailAddresses(Mail mail, Collection<MailAddress> list) {
-        ImmutableSet.Builder<MailAddress> builder = ImmutableSet.builder();
-        for (MailAddress mailAddress : list) {
-            if (!SpecialAddress.isSpecialAddress(mailAddress)) {
-                builder.add(mailAddress);
-                continue;
-            }
-
-            SpecialAddressKind specialAddressKind = SpecialAddressKind.forValue(mailAddress.getLocalPart());
-            if (specialAddressKind == null) {
-                builder.add(mailAddress);
-                continue;
-            }
-            switch (specialAddressKind) {
-            case SENDER:
-            case FROM:
-                MailAddress sender = mail.getSender();
-                if (sender != null) {
-                    builder.add(sender);
-                }
-                break;
-            case REPLY_TO:
-                addReplyToFromMail(builder, mail);
-                break;
-            case REVERSE_PATH:
-                MailAddress reversePath = mail.getSender();
-                if (reversePath != null) {
-                    builder.add(reversePath);
-                }
-                break;
-            case RECIPIENTS:
-            case TO:
-                builder.addAll(mail.getRecipients());
-                break;
-            case UNALTERED:
-            case NULL:
-                break;
-            case DELETE:
-                builder.add(mailAddress);
-                break;
-            }
-        }
-        return builder.build();
-    }
-
-    private void addReplyToFromMail(ImmutableSet.Builder<MailAddress> set, Mail mail) {
-        try {
-            InternetAddress[] replyToArray = (InternetAddress[]) mail.getMessage().getReplyTo();
-            if (replyToArray == null || replyToArray.length == 0) {
-                MailAddress sender = mail.getSender();
-                if (sender != null) {
-                    set.add(sender);
-                }
-            } else {
-                addReplyTo(set, replyToArray);
-            }
-        } catch (MessagingException ae) {
-            log("Unable to parse the \"REPLY_TO\" header in the original message; ignoring.");
-        }
-    }
-
-    private void addReplyTo(ImmutableSet.Builder<MailAddress> set, InternetAddress[] replyToArray) {
-        for (InternetAddress replyTo : replyToArray) {
-            try {
-                set.add(new MailAddress(replyTo));
-            } catch (ParseException pe) {
-                log("Unable to parse a \"REPLY_TO\" header address in the original message: " + replyTo + "; ignoring.");
-            }
-        }
-    }
-
-    /**
-     * Returns a new Collection built over <i>list</i> replacing special
      * addresses with real <code>InternetAddress</code>-es.<br>
      * Manages <code>SpecialAddress.SENDER</code>,
      * <code>SpecialAddress.REVERSE_PATH</code>,

http://git-wip-us.apache.org/repos/asf/james-project/blob/d6b0899d/server/mailet/mailets/src/main/java/org/apache/james/transport/util/SpecialAddressesUtils.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/util/SpecialAddressesUtils.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/util/SpecialAddressesUtils.java
new file mode 100644
index 0000000..02318b3
--- /dev/null
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/util/SpecialAddressesUtils.java
@@ -0,0 +1,144 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.transport.util;
+
+import java.util.Collection;
+import java.util.Set;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.ParseException;
+
+import org.apache.james.transport.mailets.redirect.SpecialAddress;
+import org.apache.james.transport.mailets.redirect.SpecialAddressKind;
+import org.apache.mailet.Mail;
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.base.GenericMailet;
+
+import com.google.common.collect.ImmutableSet;
+
+public class SpecialAddressesUtils {
+
+    public static SpecialAddressesUtils from(GenericMailet genericMailet) {
+        return new SpecialAddressesUtils(genericMailet);
+    }
+
+    private final GenericMailet genericMailet;
+
+    public SpecialAddressesUtils(GenericMailet genericMailet) {
+        this.genericMailet = genericMailet;
+    }
+
+    /**
+     * Returns a new Collection built over <i>mailAddresses</i> replacing special
+     * addresses with real <code>MailAddress</code>-es.<br>
+     * Manages <code>SpecialAddress.SENDER</code>,
+     * <code>SpecialAddress.REVERSE_PATH</code>,
+     * <code>SpecialAddress.FROM</code>, <code>SpecialAddress.REPLY_TO</code>,
+     * <code>SpecialAddress.RECIPIENTS</code>, <code>SpecialAddress.TO</code>,
+     * <code>SpecialAddress.NULL</code> and
+     * <code>SpecialAddress.UNALTERED</code>.<br>
+     * <code>SpecialAddress.FROM</code> is made equivalent to
+     * <code>SpecialAddress.SENDER</code>; <code>SpecialAddress.TO</code> is
+     * made equivalent to <code>SpecialAddress.RECIPIENTS</code>.<br>
+     * <code>SpecialAddress.REPLY_TO</code> uses the ReplyTo header if
+     * available, otherwise the From header if available, otherwise the Sender
+     * header if available, otherwise the return-path.<br>
+     * <code>SpecialAddress.NULL</code> and
+     * <code>SpecialAddress.UNALTERED</code> are ignored.<br>
+     * Any other address is not replaced.
+     */
+    public Collection<MailAddress> replaceSpecialAddresses(Mail mailWithReplacementAddresses, Collection<MailAddress> mailAddresses) {
+        ImmutableSet.Builder<MailAddress> builder = ImmutableSet.builder();
+        for (MailAddress mailAddress : mailAddresses) {
+            if (!SpecialAddress.isSpecialAddress(mailAddress)) {
+                builder.add(mailAddress);
+                continue;
+            }
+
+            SpecialAddressKind specialAddressKind = SpecialAddressKind.forValue(mailAddress.getLocalPart());
+            if (specialAddressKind == null) {
+                builder.add(mailAddress);
+                continue;
+            }
+            switch (specialAddressKind) {
+            case SENDER:
+            case FROM:
+                MailAddress sender = mailWithReplacementAddresses.getSender();
+                if (sender != null) {
+                    builder.add(sender);
+                }
+                break;
+            case REPLY_TO:
+                builder.addAll(getReplyTosFromMail(mailWithReplacementAddresses));
+                break;
+            case REVERSE_PATH:
+                MailAddress reversePath = mailWithReplacementAddresses.getSender();
+                if (reversePath != null) {
+                    builder.add(reversePath);
+                }
+                break;
+            case RECIPIENTS:
+            case TO:
+                builder.addAll(mailWithReplacementAddresses.getRecipients());
+                break;
+            case UNALTERED:
+            case NULL:
+                break;
+            case DELETE:
+                builder.add(mailAddress);
+                break;
+            }
+        }
+        return builder.build();
+    }
+
+    private Set<MailAddress> getReplyTosFromMail(Mail mail) {
+        try {
+            InternetAddress[] replyToArray = (InternetAddress[]) mail.getMessage().getReplyTo();
+            if (replyToArray == null || replyToArray.length == 0) {
+                return getSender(mail);
+            }
+            return getReplyTos(replyToArray);
+        } catch (MessagingException ae) {
+            genericMailet.log("Unable to parse the \"REPLY_TO\" header in the original message; ignoring.");
+            return ImmutableSet.of();
+        }
+    }
+
+    private Set<MailAddress> getSender(Mail mail) {
+        MailAddress sender = mail.getSender();
+        if (sender != null) {
+            return ImmutableSet.of(sender);
+        }
+        return ImmutableSet.of();
+    }
+
+    private Set<MailAddress> getReplyTos(InternetAddress[] replyToArray) {
+        ImmutableSet.Builder<MailAddress> builder = ImmutableSet.builder();
+        for (InternetAddress replyTo : replyToArray) {
+            try {
+                builder.add(new MailAddress(replyTo));
+            } catch (ParseException pe) {
+                genericMailet.log("Unable to parse a \"REPLY_TO\" header address in the original message: " + replyTo + "; ignoring.");
+            }
+        }
+        return builder.build();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/d6b0899d/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/AbstractRedirectTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/AbstractRedirectTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/AbstractRedirectTest.java
index d7885fd..c7069e4 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/AbstractRedirectTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/AbstractRedirectTest.java
@@ -86,192 +86,6 @@ public class AbstractRedirectTest {
     }
 
     @Test
-    public void replaceMailAddressesShouldReturnEmptyWhenEmptyList() throws Exception {
-        FakeMail mail = FakeMail.builder()
-                .build();
-
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, ImmutableList.<MailAddress> of());
-
-        assertThat(addresses).isEmpty();
-    }
-
-    @Test
-    public void replaceMailAddressesShouldReturnSameContentWhenAddressesDoesntMatchAddressMarkerDomain() throws Exception {
-        FakeMail mail = FakeMail.builder()
-                .build();
-
-        MailAddress mailAddress = new MailAddress("user", "addres.marker");
-        MailAddress mailAddress2 = new MailAddress("user2", "address.mar");
-        ImmutableList<MailAddress> list = ImmutableList.of(mailAddress, mailAddress2);
-
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, list);
-
-        assertThat(addresses).containsOnly(mailAddress, mailAddress2);
-    }
-
-    @Test
-    public void replaceMailAddressesShouldReturnSenderWhenAddressesMatchSender() throws Exception {
-        MailAddress sender = MailAddressFixture.ANY_AT_JAMES;
-        FakeMail mail = FakeMail.builder()
-                .sender(sender)
-                .build();
-
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, ImmutableList.of(SpecialAddress.SENDER));
-
-        assertThat(addresses).containsOnly(sender);
-    }
-
-    @Test
-    public void replaceMailAddressesShouldReturnSenderWhenAddressesMatchFrom() throws Exception {
-        MailAddress sender = MailAddressFixture.ANY_AT_JAMES;
-        FakeMail mail = FakeMail.builder()
-                .sender(sender)
-                .build();
-
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, ImmutableList.of(SpecialAddress.FROM));
-
-        assertThat(addresses).containsOnly(sender);
-    }
-
-    @Test
-    public void replaceMailAddressesShouldReturnEmptyWhenAddressesMatchSenderAndSenderIsNull() throws Exception {
-        FakeMail mail = FakeMail.builder()
-                .build();
-
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, ImmutableList.of(SpecialAddress.SENDER));
-
-        assertThat(addresses).isEmpty();
-    }
-
-    @Test
-    public void replaceMailAddressesShouldReturnEmptyWhenAddressesMatchReplyToAndReplyToIsNull() throws Exception {
-        MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
-        FakeMail mail = FakeMail.from(message);
-
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, ImmutableList.of(SpecialAddress.REPLY_TO));
-
-        assertThat(addresses).isEmpty();
-    }
-
-    @Test
-    public void replaceMailAddressesShouldReturnReplyToWhenAddressesMatchReplyTo() throws Exception {
-        MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
-        message.setReplyTo(InternetAddress.parse(MailAddressFixture.ANY_AT_JAMES.toString() + ", " + MailAddressFixture.OTHER_AT_JAMES.toString()));
-        FakeMail mail = FakeMail.from(message);
-
-        MailAddress expectedReplyTo = MailAddressFixture.ANY_AT_JAMES;
-        MailAddress expectedReplyTo2 = MailAddressFixture.OTHER_AT_JAMES;
-
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, ImmutableList.of(SpecialAddress.REPLY_TO));
-
-        assertThat(addresses).containsOnly(expectedReplyTo, expectedReplyTo2);
-    }
-
-    @Test
-    public void replaceMailAddressesShouldReturnSenderWhenAddressesMatchReplyToAndNoReplyTo() throws Exception {
-        MailAddress sender = MailAddressFixture.ANY_AT_JAMES;
-        FakeMail mail = FakeMail.builder()
-                .sender(sender)
-                .mimeMessage(new MimeMessage(Session.getDefaultInstance(new Properties())))
-                .build();
-
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, ImmutableList.of(SpecialAddress.REPLY_TO));
-
-        assertThat(addresses).containsOnly(sender);
-    }
-
-    @Test
-    public void replaceMailAddressesShouldReturnSenderWhenAddressesMatchReversePath() throws Exception {
-        MailAddress sender = MailAddressFixture.ANY_AT_JAMES;
-        FakeMail mail = FakeMail.builder()
-                .sender(sender)
-                .build();
-
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, ImmutableList.of(SpecialAddress.REVERSE_PATH));
-
-        assertThat(addresses).containsOnly(sender);
-    }
-
-    @Test
-    public void replaceMailAddressesShouldReturnEmptyWhenAddressesMatchReversePathAndNoSender() throws Exception {
-        FakeMail mail = FakeMail.builder()
-                .build();
-
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, ImmutableList.of(SpecialAddress.REVERSE_PATH));
-
-        assertThat(addresses).isEmpty();
-    }
-
-    @Test
-    public void replaceMailAddressesShouldReturnRecipientsWhenAddressesMatchRecipients() throws Exception {
-        MailAddress recipient = MailAddressFixture.ANY_AT_JAMES;
-        MailAddress recipient2 = MailAddressFixture.OTHER_AT_JAMES;
-        FakeMail mail = FakeMail.builder()
-                .recipients(recipient, recipient2)
-                .build();
-
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, ImmutableList.of(SpecialAddress.RECIPIENTS));
-
-        assertThat(addresses).containsOnly(recipient, recipient2);
-    }
-
-    @Test
-    public void replaceMailAddressesShouldReturnRecipientsWhenAddressesMatchTo() throws Exception {
-        MailAddress recipient = MailAddressFixture.ANY_AT_JAMES;
-        MailAddress recipient2 = MailAddressFixture.OTHER_AT_JAMES;
-        FakeMail mail = FakeMail.builder()
-                .recipients(recipient, recipient2)
-                .build();
-
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, ImmutableList.of(SpecialAddress.TO));
-
-        assertThat(addresses).containsOnly(recipient, recipient2);
-    }
-
-    @Test
-    public void replaceMailAddressesShouldReturnEmptyWhenAddressesMatchUnaltered() throws Exception {
-        FakeMail mail = FakeMail.builder()
-                .build();
-
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, ImmutableList.of(SpecialAddress.UNALTERED));
-
-        assertThat(addresses).isEmpty();
-    }
-
-    @Test
-    public void replaceMailAddressesShouldReturnEmptyWhenAddressesMatchNull() throws Exception {
-        FakeMail mail = FakeMail.builder()
-                .build();
-
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, ImmutableList.of(SpecialAddress.NULL));
-
-        assertThat(addresses).isEmpty();
-    }
-
-    @Test
-    public void replaceMailAddressesShouldReturnSameAddressWhenAddressesDoesntMatch() throws Exception {
-        FakeMail mail = FakeMail.builder()
-                .build();
-
-        MailAddress address = new MailAddress("user", "address.marker");
-        MailAddress address2 = new MailAddress("user2", "address.marker");
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, ImmutableList.of(address, address2));
-
-        assertThat(addresses).containsOnly(address, address2);
-    }
-
-    @Test
-    public void replaceMailAddressesShouldReturnSameListWhenAddressesMatchDelete() throws Exception {
-        FakeMail mail = FakeMail.builder()
-                .build();
-
-        Collection<MailAddress> addresses = testee.replaceMailAddresses(mail, ImmutableList.of(SpecialAddress.DELETE));
-
-        MailAddress expected = new MailAddress("delete", "address.marker");
-        assertThat(addresses).containsOnly(expected);
-    }
-
-    @Test
     public void replaceInternetAddressesShouldReturnEmptyWhenEmptyList() throws Exception {
         FakeMail mail = FakeMail.builder()
                 .build();

http://git-wip-us.apache.org/repos/asf/james-project/blob/d6b0899d/server/mailet/mailets/src/test/java/org/apache/james/transport/util/SpecialAddressesUtilsTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/util/SpecialAddressesUtilsTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/util/SpecialAddressesUtilsTest.java
new file mode 100644
index 0000000..b55dd46
--- /dev/null
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/util/SpecialAddressesUtilsTest.java
@@ -0,0 +1,241 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.transport.util;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Collection;
+import java.util.Properties;
+
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+
+import org.apache.james.transport.mailets.redirect.SpecialAddress;
+import org.apache.mailet.Mail;
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.base.GenericMailet;
+import org.apache.mailet.base.MailAddressFixture;
+import org.apache.mailet.base.test.FakeMail;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableList;
+
+public class SpecialAddressesUtilsTest {
+
+    private SpecialAddressesUtils testee;
+
+    @Before
+    public void setup() {
+        testee = SpecialAddressesUtils.from(new GenericMailet() {
+            
+            @Override
+            public void service(Mail mail) throws MessagingException {
+            }
+        });
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnEmptyWhenEmptyList() throws Exception {
+        FakeMail mail = FakeMail.builder()
+                .build();
+
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, ImmutableList.<MailAddress> of());
+
+        assertThat(addresses).isEmpty();
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnSameContentWhenAddressesDoesntMatchAddressMarkerDomain() throws Exception {
+        FakeMail mail = FakeMail.builder()
+                .build();
+
+        MailAddress mailAddress = new MailAddress("user", "addres.marker");
+        MailAddress mailAddress2 = new MailAddress("user2", "address.mar");
+        ImmutableList<MailAddress> list = ImmutableList.of(mailAddress, mailAddress2);
+
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, list);
+
+        assertThat(addresses).containsOnly(mailAddress, mailAddress2);
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnSenderWhenAddressesMatchSender() throws Exception {
+        MailAddress sender = MailAddressFixture.ANY_AT_JAMES;
+        FakeMail mail = FakeMail.builder()
+                .sender(sender)
+                .build();
+
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, ImmutableList.of(SpecialAddress.SENDER));
+
+        assertThat(addresses).containsOnly(sender);
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnSenderWhenAddressesMatchFrom() throws Exception {
+        MailAddress sender = MailAddressFixture.ANY_AT_JAMES;
+        FakeMail mail = FakeMail.builder()
+                .sender(sender)
+                .build();
+
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, ImmutableList.of(SpecialAddress.FROM));
+
+        assertThat(addresses).containsOnly(sender);
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnEmptyWhenAddressesMatchSenderAndSenderIsNull() throws Exception {
+        FakeMail mail = FakeMail.builder()
+                .build();
+
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, ImmutableList.of(SpecialAddress.SENDER));
+
+        assertThat(addresses).isEmpty();
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnEmptyWhenAddressesMatchReplyToAndReplyToIsNull() throws Exception {
+        MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
+        FakeMail mail = FakeMail.from(message);
+
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, ImmutableList.of(SpecialAddress.REPLY_TO));
+
+        assertThat(addresses).isEmpty();
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnReplyToWhenAddressesMatchReplyTo() throws Exception {
+        MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
+        message.setReplyTo(InternetAddress.parse(MailAddressFixture.ANY_AT_JAMES.toString() + ", " + MailAddressFixture.OTHER_AT_JAMES.toString()));
+        FakeMail mail = FakeMail.from(message);
+
+        MailAddress expectedReplyTo = MailAddressFixture.ANY_AT_JAMES;
+        MailAddress expectedReplyTo2 = MailAddressFixture.OTHER_AT_JAMES;
+
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, ImmutableList.of(SpecialAddress.REPLY_TO));
+
+        assertThat(addresses).containsOnly(expectedReplyTo, expectedReplyTo2);
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnSenderWhenAddressesMatchReplyToAndNoReplyTo() throws Exception {
+        MailAddress sender = MailAddressFixture.ANY_AT_JAMES;
+        FakeMail mail = FakeMail.builder()
+                .sender(sender)
+                .mimeMessage(new MimeMessage(Session.getDefaultInstance(new Properties())))
+                .build();
+
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, ImmutableList.of(SpecialAddress.REPLY_TO));
+
+        assertThat(addresses).containsOnly(sender);
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnSenderWhenAddressesMatchReversePath() throws Exception {
+        MailAddress sender = MailAddressFixture.ANY_AT_JAMES;
+        FakeMail mail = FakeMail.builder()
+                .sender(sender)
+                .build();
+
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, ImmutableList.of(SpecialAddress.REVERSE_PATH));
+
+        assertThat(addresses).containsOnly(sender);
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnEmptyWhenAddressesMatchReversePathAndNoSender() throws Exception {
+        FakeMail mail = FakeMail.builder()
+                .build();
+
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, ImmutableList.of(SpecialAddress.REVERSE_PATH));
+
+        assertThat(addresses).isEmpty();
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnRecipientsWhenAddressesMatchRecipients() throws Exception {
+        MailAddress recipient = MailAddressFixture.ANY_AT_JAMES;
+        MailAddress recipient2 = MailAddressFixture.OTHER_AT_JAMES;
+        FakeMail mail = FakeMail.builder()
+                .recipients(recipient, recipient2)
+                .build();
+
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, ImmutableList.of(SpecialAddress.RECIPIENTS));
+
+        assertThat(addresses).containsOnly(recipient, recipient2);
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnRecipientsWhenAddressesMatchTo() throws Exception {
+        MailAddress recipient = MailAddressFixture.ANY_AT_JAMES;
+        MailAddress recipient2 = MailAddressFixture.OTHER_AT_JAMES;
+        FakeMail mail = FakeMail.builder()
+                .recipients(recipient, recipient2)
+                .build();
+
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, ImmutableList.of(SpecialAddress.TO));
+
+        assertThat(addresses).containsOnly(recipient, recipient2);
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnEmptyWhenAddressesMatchUnaltered() throws Exception {
+        FakeMail mail = FakeMail.builder()
+                .build();
+
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, ImmutableList.of(SpecialAddress.UNALTERED));
+
+        assertThat(addresses).isEmpty();
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnEmptyWhenAddressesMatchNull() throws Exception {
+        FakeMail mail = FakeMail.builder()
+                .build();
+
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, ImmutableList.of(SpecialAddress.NULL));
+
+        assertThat(addresses).isEmpty();
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnSameAddressWhenAddressesDoesntMatch() throws Exception {
+        FakeMail mail = FakeMail.builder()
+                .build();
+
+        MailAddress address = new MailAddress("user", "address.marker");
+        MailAddress address2 = new MailAddress("user2", "address.marker");
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, ImmutableList.of(address, address2));
+
+        assertThat(addresses).containsOnly(address, address2);
+    }
+
+    @Test
+    public void replaceMailAddressesShouldReturnSameListWhenAddressesMatchDelete() throws Exception {
+        FakeMail mail = FakeMail.builder()
+                .build();
+
+        Collection<MailAddress> addresses = testee.replaceSpecialAddresses(mail, ImmutableList.of(SpecialAddress.DELETE));
+
+        MailAddress expected = new MailAddress("delete", "address.marker");
+        assertThat(addresses).containsOnly(expected);
+    }
+}


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