JAMES-2352 MailAddress object should rely on Domain object

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

Branch: refs/heads/master
Commit: ae85899af4c22c396161963d4cf8100d66440604
Parents: 3d98a4b
Author: benwa <btell...@linagora.com>
Authored: Mon Mar 19 13:46:52 2018 +0700
Committer: benwa <btell...@linagora.com>
Committed: Tue Mar 27 15:13:47 2018 +0700

----------------------------------------------------------------------
 .../main/java/org/apache/james/core/Domain.java | 13 ++++-
 .../java/org/apache/james/core/MailAddress.java | 28 +++++------
 .../org/apache/james/core/MailAddressTest.java  |  3 +-
 .../apache/james/domainlist/api/DomainTest.java | 45 ++++++++++++++++++
 .../james/ai/classic/BayesianAnalysis.java      |  3 +-
 .../transport/mailets/PostmasterAlias.java      |  3 +-
 .../apache/james/transport/matchers/HostIs.java | 10 ++--
 .../james/transport/matchers/HostIsLocal.java   |  3 +-
 .../james/transport/matchers/SenderHostIs.java  | 22 ++++-----
 .../transport/matchers/SenderHostIsLocal.java   |  3 +-
 .../transport/matchers/SenderHostIsTest.java    | 50 +++++++++++++++-----
 .../AbstractAuthRequiredToRelayRcptHook.java    |  7 +--
 ...tSenderAuthIdentifyVerificationRcptHook.java |  2 +-
 .../protocols/smtp/core/MailCmdHandler.java     |  2 +-
 .../core/fastfail/AbstractValidRcptHandler.java |  3 +-
 .../core/fastfail/ValidSenderDomainHandler.java |  2 +-
 .../impl/JamesMailetContext.java                |  4 +-
 .../mailets/AbstractRecipientRewriteTable.java  |  3 +-
 .../transport/mailets/BayesianAnalysis.java     |  3 +-
 .../mailets/JDBCRecipientRewriteTable.java      |  4 +-
 .../mailets/RecipientRewriteTableProcessor.java |  6 +--
 .../james/transport/mailets/RemoteDelivery.java | 16 +++----
 .../transport/mailets/WhiteListManager.java     | 28 +++++------
 .../mailets/XMLRecipientRewriteTable.java       |  2 +-
 .../mailets/managesieve/ManageSieveMailet.java  |  5 +-
 .../mailets/redirect/ProcessRedirectNotify.java |  6 ++-
 .../mailets/redirect/SpecialAddress.java        |  7 +--
 .../mailets/remote/delivery/MailDelivrer.java   | 11 +++--
 .../matchers/AbstractSQLWhitelistMatcher.java   |  6 +--
 .../james/transport/matchers/IsInWhiteList.java | 21 ++++----
 .../matchers/NetworkIsInWhitelist.java          |  2 +-
 .../transport/matchers/SenderInFakeDomain.java  |  5 +-
 .../samples/mailets/InstrumentationMailet.java  |  4 +-
 .../james/fetchmail/MessageProcessor.java       |  3 +-
 .../smtpserver/AuthRequiredToRelayRcptHook.java |  4 +-
 .../james/smtpserver/MailPriorityHandler.java   |  7 +--
 .../smtpserver/fastfail/ValidRcptHandler.java   |  6 +--
 .../james/smtpserver/fastfail/ValidRcptMX.java  |  9 ++--
 .../james/webadmin/routes/GroupsRoutes.java     |  7 +--
 39 files changed, 224 insertions(+), 144 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/core/src/main/java/org/apache/james/core/Domain.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/james/core/Domain.java 
b/core/src/main/java/org/apache/james/core/Domain.java
index c2d081e..22b48a0 100644
--- a/core/src/main/java/org/apache/james/core/Domain.java
+++ b/core/src/main/java/org/apache/james/core/Domain.java
@@ -19,14 +19,23 @@
 
 package org.apache.james.core;
 
+import java.io.Serializable;
 import java.util.Locale;
 import java.util.Objects;
 
 import com.google.common.base.Preconditions;
 
-public class Domain {
+public class Domain implements Serializable {
 
     public static final Domain LOCALHOST = Domain.of("localhost");
+    public static final Domain NULL = new Domain("");
+
+    private static String removeBrackets(String domainName) {
+        if (!(domainName.startsWith("[") && domainName.endsWith("]"))) {
+            return domainName;
+        }
+        return domainName.substring(1, domainName.length() - 1);
+    }
 
     public static Domain of(String domain) {
         Preconditions.checkNotNull(domain);
@@ -39,7 +48,7 @@ public class Domain {
 
     protected Domain(String domainName) {
         this.domainName = domainName;
-        this.normalizedDomainName = domainName.toLowerCase(Locale.US);
+        this.normalizedDomainName = 
removeBrackets(domainName.toLowerCase(Locale.US));
     }
 
     public String name() {

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/core/src/main/java/org/apache/james/core/MailAddress.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/james/core/MailAddress.java 
b/core/src/main/java/org/apache/james/core/MailAddress.java
index c177b26..1a7540e 100644
--- a/core/src/main/java/org/apache/james/core/MailAddress.java
+++ b/core/src/main/java/org/apache/james/core/MailAddress.java
@@ -17,7 +17,6 @@
  * under the License.                                           *
  ****************************************************************/
 
-
 package org.apache.james.core;
 
 import java.util.Locale;
@@ -76,8 +75,8 @@ public class MailAddress implements java.io.Serializable {
     private static final MailAddress NULL_SENDER = new MailAddress() {
 
         @Override
-        public String getDomain() {
-            return "";
+        public Domain getDomain() {
+            return Domain.NULL;
         }
 
         @Override
@@ -103,7 +102,7 @@ public class MailAddress implements java.io.Serializable {
     }
 
     private String localPart = null;
-    private String domain = null;
+    private Domain domain = null;
 
     private MailAddress() {
 
@@ -200,7 +199,7 @@ public class MailAddress implements java.io.Serializable {
         }
 
         localPart = localPartSB.toString();
-        domain = domainSB.toString();
+        domain = Domain.of(domainSB.toString());
     }
 
     private int parseUnquotedLocalPartOrThrowException(StringBuffer 
localPartSB, String address, int pos)
@@ -237,6 +236,10 @@ public class MailAddress implements java.io.Serializable {
         this(new InternetAddress(localPart + "@" + domain));
     }
 
+    public MailAddress(String localPart, Domain domain) throws 
AddressException {
+        this(new InternetAddress(localPart + "@" + domain.name()));
+    }
+
     /**
      * Constructs a MailAddress from an InternetAddress, using only the
      * email address portion (an "addr-spec", not "name-addr", as
@@ -259,7 +262,7 @@ public class MailAddress implements java.io.Serializable {
      */
     @Deprecated
     public String getHost() {
-        return getDomain();
+        return domain.asString();
     }
 
     /**
@@ -270,11 +273,8 @@ public class MailAddress implements java.io.Serializable {
      *         have been stripped returning the raw IP address.
      * @since Mailet API 2.4
      */
-    public String getDomain() {
-        if (!(domain.startsWith("[") && domain.endsWith("]"))) {
-            return domain;
-        }
-        return domain.substring(1, domain.length() - 1);
+    public Domain getDomain() {
+        return domain;
     }
 
     /**
@@ -305,12 +305,12 @@ public class MailAddress implements java.io.Serializable {
     }
 
     public String asString() {
-        return localPart + "@" + domain;
+        return localPart + "@" + domain.asString();
     }
 
     @Override
     public String toString() {
-        return localPart + "@" + domain;
+        return localPart + "@" + domain.asString();
     }
     
     public String asPrettyString() {
@@ -351,7 +351,7 @@ public class MailAddress implements java.io.Serializable {
             return toString().equalsIgnoreCase(theString);
         } else if (obj instanceof MailAddress) {
             MailAddress addr = (MailAddress) obj;
-            return getLocalPart().equalsIgnoreCase(addr.getLocalPart()) && 
getDomain().equalsIgnoreCase(addr.getDomain());
+            return getLocalPart().equalsIgnoreCase(addr.getLocalPart()) && 
getDomain().equals(addr.getDomain());
         }
         return false;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/core/src/test/java/org/apache/james/core/MailAddressTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/james/core/MailAddressTest.java 
b/core/src/test/java/org/apache/james/core/MailAddressTest.java
index cba3fc3..edb1cfa 100644
--- a/core/src/test/java/org/apache/james/core/MailAddressTest.java
+++ b/core/src/test/java/org/apache/james/core/MailAddressTest.java
@@ -22,7 +22,6 @@ package org.apache.james.core;
 import javax.mail.internet.AddressException;
 import javax.mail.internet.InternetAddress;
 
-import org.apache.james.core.MailAddress;
 import org.assertj.core.api.Assertions;
 import org.junit.Assert;
 import org.junit.Test;
@@ -32,7 +31,7 @@ public class MailAddressTest {
     private static final String GOOD_LOCAL_PART = "\"quoted@local part\"";
     private static final String GOOD_QUOTED_LOCAL_PART = "\"quoted@local 
part\"@james.apache.org";
     private static final String GOOD_ADDRESS = "server-dev@james.apache.org";
-    private static final String GOOD_DOMAIN = "james.apache.org";
+    private static final Domain GOOD_DOMAIN = Domain.of("james.apache.org");
 
     private static final String[] GOOD_ADDRESSES = {
             GOOD_ADDRESS,

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/core/src/test/java/org/apache/james/domainlist/api/DomainTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/james/domainlist/api/DomainTest.java 
b/core/src/test/java/org/apache/james/domainlist/api/DomainTest.java
index 4428f96..ef2821c 100644
--- a/core/src/test/java/org/apache/james/domainlist/api/DomainTest.java
+++ b/core/src/test/java/org/apache/james/domainlist/api/DomainTest.java
@@ -40,6 +40,51 @@ public class DomainTest {
     }
 
     @Test
+    public void shouldRemoveBrackets() {
+        assertThat(Domain.of("[domain]")).isEqualTo(Domain.of("domain"));
+    }
+
+    @Test
+    public void openBracketWithTextShouldNotBeRemoved() {
+        assertThat(Domain.of("[domain")).isEqualTo(Domain.of("[Domain"));
+    }
+
+    @Test
+    public void singleOpenBracketShouldNotBeRemoved() {
+        assertThat(Domain.of("[")).isEqualTo(Domain.of("["));
+    }
+
+    @Test
+    public void singleClosingBracketShouldNotBeRemoved() {
+        assertThat(Domain.of("]")).isEqualTo(Domain.of("]"));
+    }
+
+    @Test
+    public void closeBracketWithTextShouldNotBeRemoved() {
+        assertThat(Domain.of("aaa]")).isEqualTo(Domain.of("aaa]"));
+    }
+
+    @Test
+    public void bracketSurroundedWithTextShouldNotBeRemoved() {
+        assertThat(Domain.of("a[aaa]a")).isEqualTo(Domain.of("a[aaa]a"));
+    }
+
+    @Test
+    public void bracketWithTextSuffixShouldNotBeRemoved() {
+        assertThat(Domain.of("[aaa]a")).isEqualTo(Domain.of("[aaa]a"));
+    }
+
+    @Test
+    public void bracketWithTextPrefixShouldNotBeRemoved() {
+        assertThat(Domain.of("a[aaa]")).isEqualTo(Domain.of("a[aaa]"));
+    }
+
+    @Test
+    public void singleBracketShouldNotBeRemoved() {
+        assertThat(Domain.of("[]")).isEqualTo(Domain.of("[]"));
+    }
+
+    @Test
     public void shouldThrowWhenDomainContainAtSymbol() {
         assertThatThrownBy(() -> 
Domain.of("Dom@in")).isInstanceOf(IllegalArgumentException.class);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/mailet/ai/src/main/java/org/apache/james/ai/classic/BayesianAnalysis.java
----------------------------------------------------------------------
diff --git 
a/mailet/ai/src/main/java/org/apache/james/ai/classic/BayesianAnalysis.java 
b/mailet/ai/src/main/java/org/apache/james/ai/classic/BayesianAnalysis.java
index de77a83..c4be663 100644
--- a/mailet/ai/src/main/java/org/apache/james/ai/classic/BayesianAnalysis.java
+++ b/mailet/ai/src/main/java/org/apache/james/ai/classic/BayesianAnalysis.java
@@ -32,7 +32,6 @@ import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 import javax.sql.DataSource;
 
-import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.mailet.Experimental;
 import org.apache.mailet.Mail;
@@ -344,7 +343,7 @@ public class BayesianAnalysis extends GenericMailet {
     }
 
     private boolean isSenderLocal(Mail mail) {
-        return mail.getSender() != null && 
getMailetContext().isLocalServer(Domain.of(mail.getSender().getDomain()));
+        return mail.getSender() != null && 
getMailetContext().isLocalServer(mail.getSender().getDomain());
     }
 
     void loadData(Connection conn) throws java.sql.SQLException {

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java
----------------------------------------------------------------------
diff --git 
a/mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java
 
b/mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java
index 481ec1a..9a539d9 100644
--- 
a/mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java
+++ 
b/mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java
@@ -24,7 +24,6 @@ import java.util.stream.Stream;
 
 import javax.mail.MessagingException;
 
-import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.GenericMailet;
@@ -67,7 +66,7 @@ public class PostmasterAlias extends GenericMailet {
 
     private boolean isPostmasterAlias(MailAddress addr) {
         return addr.getLocalPart().equalsIgnoreCase("postmaster")
-            && getMailetContext().isLocalServer(Domain.of(addr.getDomain()))
+            && getMailetContext().isLocalServer(addr.getDomain())
             && !getMailetContext().isLocalEmail(addr);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HostIs.java
----------------------------------------------------------------------
diff --git 
a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HostIs.java 
b/mailet/standard/src/main/java/org/apache/james/transport/matchers/HostIs.java
index 5225255..ec61434 100644
--- 
a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HostIs.java
+++ 
b/mailet/standard/src/main/java/org/apache/james/transport/matchers/HostIs.java
@@ -17,15 +17,13 @@
  * under the License.                                           *
  ****************************************************************/
 
-
-
 package org.apache.james.transport.matchers;
 
 import java.util.Collection;
-import java.util.Locale;
 import java.util.StringTokenizer;
 import java.util.Vector;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.mailet.base.GenericRecipientMatcher;
 
@@ -34,19 +32,19 @@ import org.apache.mailet.base.GenericRecipientMatcher;
  */
 public class HostIs extends GenericRecipientMatcher {
 
-    private Collection<String> hosts;
+    private Collection<Domain> hosts;
 
     @Override
     public void init() {
         StringTokenizer st = new StringTokenizer(getCondition(), ", ", false);
         hosts = new Vector<>();
         while (st.hasMoreTokens()) {
-            hosts.add(st.nextToken().toLowerCase(Locale.US));
+            hosts.add(Domain.of(st.nextToken()));
         }
     }
 
     @Override
     public boolean matchRecipient(MailAddress recipient) {
-        return hosts.contains(recipient.getDomain().toLowerCase(Locale.US));
+        return hosts.contains(recipient.getDomain());
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HostIsLocal.java
----------------------------------------------------------------------
diff --git 
a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HostIsLocal.java
 
b/mailet/standard/src/main/java/org/apache/james/transport/matchers/HostIsLocal.java
index 46d0c7c..46763a9 100644
--- 
a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HostIsLocal.java
+++ 
b/mailet/standard/src/main/java/org/apache/james/transport/matchers/HostIsLocal.java
@@ -21,7 +21,6 @@
 
 package org.apache.james.transport.matchers;
 
-import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.mailet.base.GenericRecipientMatcher;
 
@@ -33,6 +32,6 @@ public class HostIsLocal extends GenericRecipientMatcher {
 
     @Override
     public boolean matchRecipient(MailAddress recipient) {
-        return 
getMailetContext().isLocalServer(Domain.of(recipient.getDomain()));
+        return getMailetContext().isLocalServer(recipient.getDomain());
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderHostIs.java
----------------------------------------------------------------------
diff --git 
a/mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderHostIs.java
 
b/mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderHostIs.java
index 3fcfb26..6c83b85 100755
--- 
a/mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderHostIs.java
+++ 
b/mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderHostIs.java
@@ -17,23 +17,21 @@
  * under the License.                                           *
  ****************************************************************/
 
-
-
 package org.apache.james.transport.matchers;
 
 import java.util.Collection;
-import java.util.Locale;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.GenericMatcher;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableSet;
 
 /**
  * <p>Checkes the sender's displayed domain name against a supplied list.</p>
@@ -50,7 +48,7 @@ import com.google.common.collect.ImmutableSet;
 public class SenderHostIs extends GenericMatcher {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(SenderHostIs.class);
 
-    private Collection<String> senderHosts;
+    private Collection<Domain> senderHosts;
     
     @Override
     public void init()  {
@@ -60,11 +58,13 @@ public class SenderHostIs extends GenericMatcher {
         senderHosts = parseDomainsList(condition);
     }
 
-    @VisibleForTesting Collection<String> parseDomainsList(String condition) {
-        return ImmutableSet
-                .copyOf(Splitter.onPattern("(, |,| )")
-                        .omitEmptyStrings()
-                        .split(condition));
+    @VisibleForTesting Collection<Domain> parseDomainsList(String condition) {
+        return Splitter.onPattern("(, |,| )")
+            .omitEmptyStrings()
+            .splitToList(condition)
+            .stream()
+            .map(Domain::of)
+            .collect(Guavate.toImmutableList());
     }
 
     /**
@@ -78,7 +78,7 @@ public class SenderHostIs extends GenericMatcher {
     @Override
     public Collection<MailAddress> match(Mail mail) {
         try {
-            if (mail.getSender() != null && 
senderHosts.contains(mail.getSender().getDomain().toLowerCase(Locale.US))) {
+            if (mail.getSender() != null && 
senderHosts.contains(mail.getSender().getDomain())) {
                 return mail.getRecipients();
             }
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderHostIsLocal.java
----------------------------------------------------------------------
diff --git 
a/mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderHostIsLocal.java
 
b/mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderHostIsLocal.java
index 735efae..1500aed 100644
--- 
a/mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderHostIsLocal.java
+++ 
b/mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderHostIsLocal.java
@@ -22,7 +22,6 @@ package org.apache.james.transport.matchers;
 
 import java.util.Collection;
 
-import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.GenericMatcher;
@@ -48,7 +47,7 @@ public class SenderHostIsLocal extends GenericMatcher {
     }
 
     private boolean isLocalServer(Mail mail) {
-        return 
this.getMailetContext().isLocalServer(Domain.of(mail.getSender().getDomain()));
+        return 
this.getMailetContext().isLocalServer(mail.getSender().getDomain());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/mailet/standard/src/test/java/org/apache/james/transport/matchers/SenderHostIsTest.java
----------------------------------------------------------------------
diff --git 
a/mailet/standard/src/test/java/org/apache/james/transport/matchers/SenderHostIsTest.java
 
b/mailet/standard/src/test/java/org/apache/james/transport/matchers/SenderHostIsTest.java
index 0be03f0..a80dcba 100644
--- 
a/mailet/standard/src/test/java/org/apache/james/transport/matchers/SenderHostIsTest.java
+++ 
b/mailet/standard/src/test/java/org/apache/james/transport/matchers/SenderHostIsTest.java
@@ -29,6 +29,7 @@ import java.util.Collection;
 
 import javax.mail.MessagingException;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailetContext;
@@ -141,48 +142,73 @@ public class SenderHostIsTest {
     @Test
     void parseDomainsListShouldParseWhenOnlyOneDomain() {
         //When
-        Collection<String> senderHosts = 
matcher.parseDomainsList("james.apache.org");
+        Collection<Domain> senderHosts = 
matcher.parseDomainsList("james.apache.org");
         //Then
-        assertThat(senderHosts).containsOnly("james.apache.org");
+        assertThat(senderHosts).containsOnly(Domain.of("james.apache.org"));
     }
 
     @Test
     void parseDomainsListShouldParseWhenCommaSpacePattern() {
         //When
-        Collection<String> senderHosts = 
matcher.parseDomainsList("james.apache.org, james2.apache.org, 
james3.apache.org, james4.apache.org, james5.apache.org");
+        Collection<Domain> senderHosts = 
matcher.parseDomainsList("james.apache.org, james2.apache.org, 
james3.apache.org, james4.apache.org, james5.apache.org");
         //Then
-        assertThat(senderHosts).containsOnly("james.apache.org", 
"james2.apache.org", "james3.apache.org", "james4.apache.org", 
"james5.apache.org");
+        assertThat(senderHosts).containsOnly(
+            Domain.of("james.apache.org"),
+            Domain.of("james2.apache.org"),
+            Domain.of("james3.apache.org"),
+            Domain.of("james4.apache.org"),
+            Domain.of("james5.apache.org"));
     }
 
     @Test
     void parseDomainsListShouldParseWhenCommaPattern() {
         //When
-        Collection<String> senderHosts = 
matcher.parseDomainsList("james.apache.org,james2.apache.org,james3.apache.org,james4.apache.org,james5.apache.org");
+        Collection<Domain> senderHosts = 
matcher.parseDomainsList("james.apache.org,james2.apache.org,james3.apache.org,james4.apache.org,james5.apache.org");
         //Then
-        assertThat(senderHosts).containsOnly("james.apache.org", 
"james2.apache.org", "james3.apache.org", "james4.apache.org", 
"james5.apache.org");
+        assertThat(senderHosts).containsOnly(
+            Domain.of("james.apache.org"),
+            Domain.of("james2.apache.org"),
+            Domain.of("james3.apache.org"),
+            Domain.of("james4.apache.org"),
+            Domain.of( "james5.apache.org"));
     }
 
     @Test
     void parseDomainsListShouldParseWhenSpacePattern() {
         //When
-        Collection<String> senderHosts = 
matcher.parseDomainsList("james.apache.org james2.apache.org james3.apache.org 
james4.apache.org james5.apache.org");
+        Collection<Domain> senderHosts = 
matcher.parseDomainsList("james.apache.org james2.apache.org james3.apache.org 
james4.apache.org james5.apache.org");
         //Then
-        assertThat(senderHosts).containsOnly("james.apache.org", 
"james2.apache.org", "james3.apache.org", "james4.apache.org", 
"james5.apache.org");
+        assertThat(senderHosts).containsOnly(
+            Domain.of("james.apache.org"),
+            Domain.of("james2.apache.org"),
+            Domain.of("james3.apache.org"),
+            Domain.of("james4.apache.org"),
+            Domain.of("james5.apache.org"));
     }
 
     @Test
     void parseDomainsListShouldParseWhenMixedPatterns() {
         //When
-        Collection<String> senderHosts = 
matcher.parseDomainsList("james.apache.org james2.apache.org,james3.apache.org, 
james4.apache.org james5.apache.org");
+        Collection<Domain> senderHosts = 
matcher.parseDomainsList("james.apache.org james2.apache.org,james3.apache.org, 
james4.apache.org james5.apache.org");
         //Then
-        assertThat(senderHosts).containsOnly("james.apache.org", 
"james2.apache.org", "james3.apache.org", "james4.apache.org", 
"james5.apache.org");
+        assertThat(senderHosts).containsOnly(
+            Domain.of("james.apache.org"),
+            Domain.of("james2.apache.org"),
+            Domain.of("james3.apache.org"),
+            Domain.of("james4.apache.org"),
+            Domain.of("james5.apache.org"));
     }
 
     @Test
     void parseDomainsListShouldIgnoreEmptyDomains() {
         //When
-        Collection<String> senderHosts = 
matcher.parseDomainsList("james.apache.org   james2.apache.org 
james3.apache.org , james4.apache.org,,,james5.apache.org");
+        Collection<Domain> senderHosts = 
matcher.parseDomainsList("james.apache.org   james2.apache.org 
james3.apache.org , james4.apache.org,,,james5.apache.org");
         //Then
-        assertThat(senderHosts).containsOnly("james.apache.org", 
"james2.apache.org", "james3.apache.org", "james4.apache.org", 
"james5.apache.org");
+        assertThat(senderHosts).containsOnly(
+            Domain.of("james.apache.org"),
+            Domain.of("james2.apache.org"),
+            Domain.of("james3.apache.org"),
+            Domain.of("james4.apache.org"),
+            Domain.of("james5.apache.org"));
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAuthRequiredToRelayRcptHook.java
----------------------------------------------------------------------
diff --git 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAuthRequiredToRelayRcptHook.java
 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAuthRequiredToRelayRcptHook.java
index b0e1165..5c3f880 100644
--- 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAuthRequiredToRelayRcptHook.java
+++ 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAuthRequiredToRelayRcptHook.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.protocols.smtp.core;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.protocols.smtp.SMTPRetCode;
 import org.apache.james.protocols.smtp.SMTPSession;
@@ -49,8 +50,8 @@ public abstract class AbstractAuthRequiredToRelayRcptHook 
implements RcptHook {
     public HookResult doRcpt(SMTPSession session, MailAddress sender,
                              MailAddress rcpt) {
         if (!session.isRelayingAllowed()) {
-            String toDomain = rcpt.getDomain();
-            if (isLocalDomain(toDomain) == false) {
+            Domain toDomain = rcpt.getDomain();
+            if (!isLocalDomain(toDomain)) {
                 if (session.isAuthSupported()) {
                     return AUTH_REQUIRED;
                 } else {
@@ -69,6 +70,6 @@ public abstract class AbstractAuthRequiredToRelayRcptHook 
implements RcptHook {
      * @param domain
      * @return isLocal
      */
-    protected abstract boolean isLocalDomain(String domain);
+    protected abstract boolean isLocalDomain(Domain domain);
     
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractSenderAuthIdentifyVerificationRcptHook.java
----------------------------------------------------------------------
diff --git 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractSenderAuthIdentifyVerificationRcptHook.java
 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractSenderAuthIdentifyVerificationRcptHook.java
index eeeb6b2..4c386c6 100644
--- 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractSenderAuthIdentifyVerificationRcptHook.java
+++ 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractSenderAuthIdentifyVerificationRcptHook.java
@@ -62,7 +62,7 @@ public abstract class 
AbstractSenderAuthIdentifyVerificationRcptHook implements
             // the user was already authenticated
             if ((senderAddress == null)
                 || (!authUser.equalsIgnoreCase(username))
-                || (!isLocalDomain(Domain.of(senderAddress.getDomain())))) {
+                || (!isLocalDomain(senderAddress.getDomain()))) {
                 return INVALID_AUTH;
             }
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java
----------------------------------------------------------------------
diff --git 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java
 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java
index 3afe738..806d730 100644
--- 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java
+++ 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java
@@ -239,7 +239,7 @@ public class MailCmdHandler extends 
AbstractHookableCmdHandler<MailHook> {
                 }
             }
             if ((senderAddress == null) || 
-                    ((senderAddress.getLocalPart().length() == 0) && 
(senderAddress.getDomain().length() == 0))) {
+                    ((senderAddress.getLocalPart().length() == 0) && 
(senderAddress.getDomain().name().length() == 0))) {
                 senderAddress = MailAddress.nullSender();
             }
             // Store the senderAddress in session map

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/AbstractValidRcptHandler.java
----------------------------------------------------------------------
diff --git 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/AbstractValidRcptHandler.java
 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/AbstractValidRcptHandler.java
index 79246e0..ff35f0c 100644
--- 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/AbstractValidRcptHandler.java
+++ 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/AbstractValidRcptHandler.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.protocols.smtp.core.fastfail;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.protocols.smtp.SMTPRetCode;
 import org.apache.james.protocols.smtp.SMTPSession;
@@ -83,5 +84,5 @@ public abstract class AbstractValidRcptHandler implements 
RcptHook {
      * @param domain
      * @return local
      */
-    protected abstract boolean isLocalDomain(SMTPSession session, String 
domain);
+    protected abstract boolean isLocalDomain(SMTPSession session, Domain 
domain);
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/ValidSenderDomainHandler.java
----------------------------------------------------------------------
diff --git 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/ValidSenderDomainHandler.java
 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/ValidSenderDomainHandler.java
index 58d1042..4e3f57e 100644
--- 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/ValidSenderDomainHandler.java
+++ 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/ValidSenderDomainHandler.java
@@ -35,7 +35,7 @@ public abstract class ValidSenderDomainHandler implements 
MailHook {
 
     @Override
     public HookResult doMail(SMTPSession session, MailAddress sender) {
-        if (sender != null  && !hasMXRecord(session,sender.getDomain())) {
+        if (sender != null  && 
!hasMXRecord(session,sender.getDomain().name())) {
             return new 
HookResult(HookReturnCode.DENY,SMTPRetCode.SYNTAX_ERROR_ARGUMENTS,DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.ADDRESS_SYNTAX_SENDER)
 + " sender " + sender + " contains a domain with no valid MX records");
         } else {
             return HookResult.declined();

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
 
b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
index 210a848..5c979e1 100644
--- 
a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
+++ 
b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
@@ -250,7 +250,7 @@ public class JamesMailetContext implements MailetContext, 
Configurable {
     @Override
     public boolean isLocalEmail(MailAddress mailAddress) {
         if (mailAddress != null) {
-            if (!isLocalServer(Domain.of(mailAddress.getDomain()))) {
+            if (!isLocalServer(mailAddress.getDomain())) {
                 return false;
             }
             try {
@@ -465,7 +465,7 @@ public class JamesMailetContext implements MailetContext, 
Configurable {
             }
             try {
                 this.postmaster = new MailAddress(postMasterAddress);
-                if 
(!domains.containsDomain(Domain.of(postmaster.getDomain()))) {
+                if (!domains.containsDomain(postmaster.getDomain())) {
                     LOGGER.warn("The specified postmaster address ( {} ) is 
not a local " +
                         "address.  This is not necessarily a problem, but it 
does mean that emails addressed to " +
                         "the postmaster will be routed to another server.  For 
some configurations this may " +

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTable.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTable.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTable.java
index e048835..44044e3 100755
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTable.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTable.java
@@ -32,7 +32,6 @@ import javax.inject.Inject;
 import javax.mail.MessagingException;
 import javax.mail.internet.ParseException;
 
-import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.domainlist.api.DomainList;
@@ -136,7 +135,7 @@ public abstract class AbstractRecipientRewriteTable extends 
GenericMailet {
 
                             // We need to separate local and remote
                             // recipients. This is explained below.
-                            if 
(getMailetContext().isLocalServer(Domain.of(target.getDomain()))) {
+                            if 
(getMailetContext().isLocalServer(target.getDomain())) {
                                 recipientsToAddLocal.add(target);
                             } else {
                                 recipientsToAddForward.add(target);

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/BayesianAnalysis.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/BayesianAnalysis.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/BayesianAnalysis.java
index 60249a6..7e9c29a 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/BayesianAnalysis.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/BayesianAnalysis.java
@@ -31,7 +31,6 @@ import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 import javax.sql.DataSource;
 
-import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.util.bayesian.JDBCBayesianAnalyzer;
@@ -295,7 +294,7 @@ public class BayesianAnalysis extends GenericMailet {
 
             if (ignoreLocalSender) {
                 // ignore the message if the sender is local
-                if (mail.getSender() != null && 
getMailetContext().isLocalServer(Domain.of(mail.getSender().getDomain()))) {
+                if (mail.getSender() != null && 
getMailetContext().isLocalServer(mail.getSender().getDomain())) {
                     return;
                 }
             }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/JDBCRecipientRewriteTable.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/JDBCRecipientRewriteTable.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/JDBCRecipientRewriteTable.java
index 4da4680..30058ea 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/JDBCRecipientRewriteTable.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/JDBCRecipientRewriteTable.java
@@ -188,8 +188,8 @@ public class JDBCRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
                 ResultSet mappingRS = null;
                 try {
                     mappingStmt.setString(1, recipient.getLocalPart());
-                    mappingStmt.setString(2, recipient.getDomain());
-                    mappingStmt.setString(3, recipient.getDomain());
+                    mappingStmt.setString(2, recipient.getDomain().asString());
+                    mappingStmt.setString(3, recipient.getDomain().asString());
                     mappingRS = mappingStmt.executeQuery();
                     if (mappingRS.next()) {
                         String targetString = mappingRS.getString(1);

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
index d2d3165..293a297 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
@@ -118,7 +118,7 @@ public class RecipientRewriteTableProcessor {
 
     private RrtExecutionResult getRrtExecutionResult(Mail mail, MailAddress 
recipient) {
         try {
-            Mappings mappings = 
virtualTableStore.getMappings(recipient.getLocalPart(), 
Domain.of(recipient.getDomain()));
+            Mappings mappings = 
virtualTableStore.getMappings(recipient.getLocalPart(), recipient.getDomain());
 
             if (mappings != null) {
                 List<MailAddress> newMailAddresses = handleMappings(mappings, 
mail.getSender(), recipient, mail.getMessage());
@@ -155,7 +155,7 @@ public class RecipientRewriteTableProcessor {
 
     private ImmutableList<MailAddress> 
getLocalAddresses(ImmutableList<MailAddress> mailAddresses) {
         return mailAddresses.stream()
-            .filter(mailAddress -> 
mailetContext.isLocalServer(Domain.of(mailAddress.getDomain())))
+            .filter(mailAddress -> 
mailetContext.isLocalServer(mailAddress.getDomain()))
             .collect(Guavate.toImmutableList());
     }
 
@@ -184,7 +184,7 @@ public class RecipientRewriteTableProcessor {
 
     private void forwardToRemoteAddress(MailAddress sender, MailAddress 
recipient, MimeMessage message, ImmutableList<MailAddress> mailAddresses) 
throws MessagingException {
         ImmutableList<MailAddress> remoteAddress = mailAddresses.stream()
-            .filter(mailAddress -> 
!mailetContext.isLocalServer(Domain.of(mailAddress.getDomain())))
+            .filter(mailAddress -> 
!mailetContext.isLocalServer(mailAddress.getDomain()))
             .collect(Guavate.toImmutableList());
 
         if (!remoteAddress.isEmpty()) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
index cdf1b57..17e2ce8 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
@@ -21,7 +21,6 @@ package org.apache.james.transport.mailets;
 
 import java.net.UnknownHostException;
 import java.util.Collection;
-import java.util.Locale;
 import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -30,6 +29,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import javax.inject.Inject;
 import javax.mail.MessagingException;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.domainlist.api.DomainList;
@@ -222,18 +222,18 @@ public class RemoteDelivery extends GenericMailet {
 
     private void serviceNoGateway(Mail mail) {
         String mailName = mail.getName();
-        Map<String, Collection<MailAddress>> targets = 
groupByServer(mail.getRecipients());
-        for (Map.Entry<String, Collection<MailAddress>> entry : 
targets.entrySet()) {
+        Map<Domain, Collection<MailAddress>> targets = 
groupByServer(mail.getRecipients());
+        for (Map.Entry<Domain, Collection<MailAddress>> entry : 
targets.entrySet()) {
             serviceSingleServer(mail, mailName, entry);
         }
     }
 
-    private void serviceSingleServer(Mail mail, String originalName, 
Map.Entry<String, Collection<MailAddress>> entry) {
+    private void serviceSingleServer(Mail mail, String originalName, 
Map.Entry<Domain, Collection<MailAddress>> entry) {
         if (configuration.isDebug()) {
             LOGGER.debug("Sending mail to {} on host {}", entry.getValue(), 
entry.getKey());
         }
         mail.setRecipients(entry.getValue());
-        mail.setName(originalName + NAME_JUNCTION + entry.getKey());
+        mail.setName(originalName + NAME_JUNCTION + entry.getKey().name());
         try {
             queue.enQueue(mail);
         } catch (MailQueueException e) {
@@ -241,11 +241,11 @@ public class RemoteDelivery extends GenericMailet {
         }
     }
 
-    private Map<String, Collection<MailAddress>> 
groupByServer(Collection<MailAddress> recipients) {
+    private Map<Domain, Collection<MailAddress>> 
groupByServer(Collection<MailAddress> recipients) {
         // Must first organize the recipients into distinct servers (name made 
case insensitive)
-        HashMultimap<String, MailAddress> groupByServerMultimap = 
HashMultimap.create();
+        HashMultimap<Domain, MailAddress> groupByServerMultimap = 
HashMultimap.create();
         for (MailAddress recipient : recipients) {
-            
groupByServerMultimap.put(recipient.getDomain().toLowerCase(Locale.US), 
recipient);
+            groupByServerMultimap.put(recipient.getDomain(), recipient);
         }
         return groupByServerMultimap.asMap();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WhiteListManager.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WhiteListManager.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WhiteListManager.java
index 96bc35d..58b0418 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WhiteListManager.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WhiteListManager.java
@@ -293,7 +293,7 @@ public class WhiteListManager extends GenericMailet {
      */
     private void checkAndInsert(MailAddress senderMailAddress, 
Collection<MailAddress> recipients) throws MessagingException {
         String senderUser = 
senderMailAddress.getLocalPart().toLowerCase(Locale.US);
-        String senderHost = 
senderMailAddress.getDomain().toLowerCase(Locale.US);
+        Domain senderHost = senderMailAddress.getDomain();
 
         senderUser = getPrimaryName(senderUser);
 
@@ -308,7 +308,7 @@ public class WhiteListManager extends GenericMailet {
                 ResultSet selectRS = null;
                 try {
                     String recipientUser = 
recipient.getLocalPart().toLowerCase(Locale.US);
-                    Domain recipientHost = Domain.of(recipient.getDomain());
+                    Domain recipientHost = recipient.getDomain();
 
                     if (getMailetContext().isLocalServer(recipientHost)) {
                         // not a remote recipient, so skip
@@ -323,7 +323,7 @@ public class WhiteListManager extends GenericMailet {
                         selectStmt = conn.prepareStatement(selectByPK);
                     }
                     selectStmt.setString(1, senderUser);
-                    selectStmt.setString(2, senderHost);
+                    selectStmt.setString(2, senderHost.asString());
                     selectStmt.setString(3, recipientUser);
                     selectStmt.setString(4, recipientHost.asString());
                     selectRS = selectStmt.executeQuery();
@@ -336,7 +336,7 @@ public class WhiteListManager extends GenericMailet {
                         insertStmt = conn.prepareStatement(insert);
                     }
                     insertStmt.setString(1, senderUser);
-                    insertStmt.setString(2, senderHost);
+                    insertStmt.setString(2, senderHost.asString());
                     insertStmt.setString(3, recipientUser);
                     insertStmt.setString(4, recipientHost.asString());
                     insertStmt.executeUpdate();
@@ -377,7 +377,7 @@ public class WhiteListManager extends GenericMailet {
     private void manageDisplayRequest(Mail mail) throws MessagingException {
         MailAddress senderMailAddress = mail.getSender();
         String senderUser = 
senderMailAddress.getLocalPart().toLowerCase(Locale.US);
-        String senderHost = 
senderMailAddress.getDomain().toLowerCase(Locale.US);
+        Domain senderHost = senderMailAddress.getDomain();
 
         senderUser = getPrimaryName(senderUser);
 
@@ -396,7 +396,7 @@ public class WhiteListManager extends GenericMailet {
             conn = datasource.getConnection();
             selectStmt = conn.prepareStatement(selectBySender);
             selectStmt.setString(1, senderUser);
-            selectStmt.setString(2, senderHost);
+            selectStmt.setString(2, senderHost.asString());
             selectRS = selectStmt.executeQuery();
             while (selectRS.next()) {
                 MailAddress mailAddress = new 
MailAddress(selectRS.getString(1), selectRS.getString(2));
@@ -425,7 +425,7 @@ public class WhiteListManager extends GenericMailet {
     private void manageInsertRequest(Mail mail) throws MessagingException {
         MailAddress senderMailAddress = mail.getSender();
         String senderUser = 
senderMailAddress.getLocalPart().toLowerCase(Locale.US);
-        String senderHost = 
senderMailAddress.getDomain().toLowerCase(Locale.US);
+        Domain senderHost = senderMailAddress.getDomain();
 
         senderUser = getPrimaryName(senderUser);
 
@@ -458,7 +458,7 @@ public class WhiteListManager extends GenericMailet {
                             continue;
                         }
                         String recipientUser = 
recipientMailAddress.getLocalPart().toLowerCase(Locale.US);
-                        Domain recipientHost = 
Domain.of(recipientMailAddress.getDomain());
+                        Domain recipientHost = 
recipientMailAddress.getDomain();
 
                         if (getMailetContext().isLocalServer(recipientHost)) {
                             // not a remote recipient, so skip
@@ -473,7 +473,7 @@ public class WhiteListManager extends GenericMailet {
                             selectStmt = conn.prepareStatement(selectByPK);
                         }
                         selectStmt.setString(1, senderUser);
-                        selectStmt.setString(2, senderHost);
+                        selectStmt.setString(2, senderHost.asString());
                         selectStmt.setString(3, recipientUser);
                         selectStmt.setString(4, recipientHost.asString());
                         selectRS = selectStmt.executeQuery();
@@ -487,7 +487,7 @@ public class WhiteListManager extends GenericMailet {
                             insertStmt = conn.prepareStatement(insert);
                         }
                         insertStmt.setString(1, senderUser);
-                        insertStmt.setString(2, senderHost);
+                        insertStmt.setString(2, senderHost.asString());
                         insertStmt.setString(3, recipientUser);
                         insertStmt.setString(4, recipientHost.asString());
                         insertStmt.executeUpdate();
@@ -546,7 +546,7 @@ public class WhiteListManager extends GenericMailet {
     private void manageRemoveRequest(Mail mail) throws MessagingException {
         MailAddress senderMailAddress = mail.getSender();
         String senderUser = 
senderMailAddress.getLocalPart().toLowerCase(Locale.US);
-        String senderHost = 
senderMailAddress.getDomain().toLowerCase(Locale.US);
+        Domain senderHost = senderMailAddress.getDomain();
 
         senderUser = getPrimaryName(senderUser);
 
@@ -579,7 +579,7 @@ public class WhiteListManager extends GenericMailet {
                             continue;
                         }
                         String recipientUser = 
recipientMailAddress.getLocalPart().toLowerCase(Locale.US);
-                        Domain recipientHost = 
Domain.of(recipientMailAddress.getDomain());
+                        Domain recipientHost = 
recipientMailAddress.getDomain();
 
                         if (getMailetContext().isLocalServer(recipientHost)) {
                             // not a remote recipient, so skip
@@ -594,7 +594,7 @@ public class WhiteListManager extends GenericMailet {
                             selectStmt = conn.prepareStatement(selectByPK);
                         }
                         selectStmt.setString(1, senderUser);
-                        selectStmt.setString(2, senderHost);
+                        selectStmt.setString(2, senderHost.asString());
                         selectStmt.setString(3, recipientUser);
                         selectStmt.setString(4, recipientHost.asString());
                         selectRS = selectStmt.executeQuery();
@@ -608,7 +608,7 @@ public class WhiteListManager extends GenericMailet {
                             deleteStmt = conn.prepareStatement(deleteByPK);
                         }
                         deleteStmt.setString(1, senderUser);
-                        deleteStmt.setString(2, senderHost);
+                        deleteStmt.setString(2, senderHost.asString());
                         deleteStmt.setString(3, recipientUser);
                         deleteStmt.setString(4, recipientHost.asString());
                         deleteStmt.executeUpdate();

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/XMLRecipientRewriteTable.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/XMLRecipientRewriteTable.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/XMLRecipientRewriteTable.java
index 84aeb0c..9fea7da 100755
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/XMLRecipientRewriteTable.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/XMLRecipientRewriteTable.java
@@ -104,7 +104,7 @@ public class XMLRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
 
         for (MailAddress source : recipients) {
             String user = source.getLocalPart().toLowerCase(Locale.US);
-            Domain domain = Domain.of(source.getDomain());
+            Domain domain = source.getDomain();
 
             String targetString = 
RecipientRewriteTableUtil.getTargetString(user, domain, mappings);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
index e705a48..cd9bd4e 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
@@ -127,7 +127,7 @@ public class ManageSieveMailet extends GenericMailet 
implements MessageToCoreToM
             LOGGER.error("Sender is null");
             return;
         }
-        if 
(!getMailetContext().isLocalServer(Domain.of(mail.getSender().getDomain()))) {
+        if (!getMailetContext().isLocalServer(mail.getSender().getDomain())) {
             LOGGER.error("Sender not local");
             return;
         }
@@ -139,7 +139,8 @@ public class ManageSieveMailet extends GenericMailet 
implements MessageToCoreToM
         } else {
             session.setState(Session.State.UNAUTHENTICATED);
         }
-        session.setUser(mail.getSender().getLocalPart() + '@' + 
(mail.getSender().getDomain() == null ? "localhost" : 
mail.getSender().getDomain()));
+        Domain domain = mail.getSender().getDomain() == null ? 
Domain.LOCALHOST : mail.getSender().getDomain();
+        session.setUser(mail.getSender().getLocalPart() + '@' + domain.name());
         getMailetContext().sendMail(mail.getRecipients().iterator().next(), 
Lists.newArrayList(mail.getSender()),transcoder.execute(session, 
mail.getMessage()));
         mail.setState(Mail.GHOST);
         

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
index 0a585aa..8099966 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
@@ -178,6 +178,10 @@ public class ProcessRedirectNotify {
     private boolean senderDomainIsValid(Mail mail) throws MessagingException {
         return !mailet.getInitParameters().getFakeDomainCheck()
                 || mail.getSender() == null
-                || 
!mailet.getMailetContext().getMailServers(mail.getSender().getDomain()).isEmpty();
+                || !mailet.getMailetContext()
+            .getMailServers(mail.getSender()
+                .getDomain()
+                .name())
+            .isEmpty();
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/SpecialAddress.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/SpecialAddress.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/SpecialAddress.java
index 4fb0d9f..aae6405 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/SpecialAddress.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/SpecialAddress.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.transport.mailets.redirect;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 
 import com.google.common.base.Throwables;
@@ -37,7 +38,7 @@ public class SpecialAddress {
 
     public static class AddressMarker {
 
-        public static final String ADDRESS_MARKER = "address.marker";
+        public static final Domain ADDRESS_MARKER = 
Domain.of("address.marker");
         public static final MailAddress SENDER = 
mailAddressUncheckedException(SpecialAddressKind.SENDER, ADDRESS_MARKER);
         public static final MailAddress REVERSE_PATH = 
mailAddressUncheckedException(SpecialAddressKind.REVERSE_PATH, ADDRESS_MARKER);
         public static final MailAddress FROM = 
mailAddressUncheckedException(SpecialAddressKind.FROM, ADDRESS_MARKER);
@@ -48,7 +49,7 @@ public class SpecialAddress {
         public static final MailAddress UNALTERED = 
mailAddressUncheckedException(SpecialAddressKind.UNALTERED, ADDRESS_MARKER);
         public static final MailAddress NULL = 
mailAddressUncheckedException(SpecialAddressKind.NULL, ADDRESS_MARKER);
 
-        private static MailAddress 
mailAddressUncheckedException(SpecialAddressKind kind, String domain) {
+        private static MailAddress 
mailAddressUncheckedException(SpecialAddressKind kind, Domain domain) {
             try {
                 return new MailAddress(kind.getValue(), domain);
             } catch (Exception e) {
@@ -58,6 +59,6 @@ public class SpecialAddress {
     }
 
     public static boolean isSpecialAddress(MailAddress mailAddress) {
-        return 
mailAddress.getDomain().equalsIgnoreCase(AddressMarker.ADDRESS_MARKER);
+        return mailAddress.getDomain().equals(AddressMarker.ADDRESS_MARKER);
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrer.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrer.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrer.java
index 9fbb4ba..2999338 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrer.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrer.java
@@ -28,6 +28,7 @@ import javax.mail.MessagingException;
 import javax.mail.SendFailedException;
 import javax.mail.internet.InternetAddress;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.dnsservice.api.TemporaryResolutionException;
@@ -96,11 +97,11 @@ public class MailDelivrer {
             LOGGER.debug("Attempting to deliver {}", mail.getName());
         }
 
-        String host = retrieveTargetHostname(mail);
+        Domain host = retrieveTargetHostname(mail);
         try {
             // Figure out which servers to try to send to. This collection
             // will hold all the possible target servers
-            Iterator<HostAddress> targetServers = 
dnsHelper.retrieveHostAddressIterator(host);
+            Iterator<HostAddress> targetServers = 
dnsHelper.retrieveHostAddressIterator(host.asString());
             if (!targetServers.hasNext()) {
                 return handleNoTargetServer(mail, host);
             }
@@ -111,7 +112,7 @@ public class MailDelivrer {
         }
     }
 
-    private String retrieveTargetHostname(Mail mail) {
+    private Domain retrieveTargetHostname(Mail mail) {
         Preconditions.checkArgument(!mail.getRecipients().isEmpty(), "Mail 
should have recipients to attempt delivery");
         MailAddress rcpt = Iterables.getFirst(mail.getRecipients(), null);
         return rcpt.getDomain();
@@ -234,8 +235,8 @@ public class MailDelivrer {
         }
     }
 
-    private ExecutionResult handleNoTargetServer(Mail mail, String host) {
-        LOGGER.info("No mail server found for: {}", host);
+    private ExecutionResult handleNoTargetServer(Mail mail, Domain host) {
+        LOGGER.info("No mail server found for: {}", host.name());
         MessagingException messagingException = new MessagingException("There 
are no DNS entries for the hostname " + host + ".  I cannot determine where to 
send this message.");
         int retry = DeliveryRetriesHelper.retrieveRetries(mail);
         if (retry >= configuration.getDnsProblemRetry()) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractSQLWhitelistMatcher.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractSQLWhitelistMatcher.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractSQLWhitelistMatcher.java
index 36df391..c35812d 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractSQLWhitelistMatcher.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractSQLWhitelistMatcher.java
@@ -145,10 +145,8 @@ public abstract class AbstractSQLWhitelistMatcher extends 
GenericMatcher {
         }
 
         String senderUser = senderMailAddress.getLocalPart();
-        String senderHost = senderMailAddress.getDomain();
 
         senderUser = senderUser.toLowerCase(Locale.US);
-        senderHost = senderHost.toLowerCase(Locale.US);
 
         Collection<MailAddress> recipients = mail.getRecipients();
 
@@ -156,9 +154,9 @@ public abstract class AbstractSQLWhitelistMatcher extends 
GenericMatcher {
 
         for (MailAddress recipientMailAddress : recipients) {
             String recipientUser = 
recipientMailAddress.getLocalPart().toLowerCase(Locale.US);
-            String recipientHost = recipientMailAddress.getDomain();
+            Domain recipientHost = recipientMailAddress.getDomain();
 
-            if (!getMailetContext().isLocalServer(Domain.of(recipientHost))) {
+            if (!getMailetContext().isLocalServer(recipientHost)) {
                 // not a local recipient, so skip
                 continue;
             }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsInWhiteList.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsInWhiteList.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsInWhiteList.java
index 5022879..ba2f413 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsInWhiteList.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsInWhiteList.java
@@ -27,6 +27,7 @@ import java.util.Locale;
 
 import javax.mail.MessagingException;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.mailet.Experimental;
 import org.apache.mailet.Mail;
@@ -80,14 +81,14 @@ public class IsInWhiteList extends 
AbstractSQLWhitelistMatcher {
     protected boolean matchedWhitelist(MailAddress recipientMailAddress, Mail 
mail) throws MessagingException {
         MailAddress senderMailAddress = mail.getSender();
         String senderUser = 
senderMailAddress.getLocalPart().toLowerCase(Locale.US);
-        String senderHost = 
senderMailAddress.getDomain().toLowerCase(Locale.US);
+        Domain senderHost = senderMailAddress.getDomain();
 
         Connection conn = null;
         PreparedStatement selectStmt = null;
         ResultSet selectRS = null;
         try {
             String recipientUser = 
recipientMailAddress.getLocalPart().toLowerCase(Locale.US);
-            String recipientHost = 
recipientMailAddress.getDomain().toLowerCase(Locale.US);
+            Domain recipientHost = recipientMailAddress.getDomain();
 
             if (conn == null) {
                 conn = datasource.getConnection();
@@ -98,9 +99,9 @@ public class IsInWhiteList extends 
AbstractSQLWhitelistMatcher {
                     selectStmt = conn.prepareStatement(selectByPK);
                 }
                 selectStmt.setString(1, recipientUser);
-                selectStmt.setString(2, recipientHost);
+                selectStmt.setString(2, recipientHost.asString());
                 selectStmt.setString(3, senderUser);
-                selectStmt.setString(4, senderHost);
+                selectStmt.setString(4, senderHost.asString());
                 selectRS = selectStmt.executeQuery();
                 if (selectRS.next()) {
                     // This address was already in the list
@@ -116,9 +117,9 @@ public class IsInWhiteList extends 
AbstractSQLWhitelistMatcher {
                 selectStmt = conn.prepareStatement(selectByPK);
     
                 selectStmt.setString(1, recipientUser);
-                selectStmt.setString(2, recipientHost);
+                selectStmt.setString(2, recipientHost.asString());
                 selectStmt.setString(3, "*");
-                selectStmt.setString(4, senderHost);
+                selectStmt.setString(4, senderHost.asString());
                 selectRS = selectStmt.executeQuery();
                 if (selectRS.next()) {
                     // This address was already in the list
@@ -134,9 +135,9 @@ public class IsInWhiteList extends 
AbstractSQLWhitelistMatcher {
                 selectStmt = conn.prepareStatement(selectByPK);
     
                 selectStmt.setString(1, "*");
-                selectStmt.setString(2, recipientHost);
+                selectStmt.setString(2, recipientHost.asString());
                 selectStmt.setString(3, senderUser);
-                selectStmt.setString(4, senderHost);
+                selectStmt.setString(4, senderHost.asString());
                 selectRS = selectStmt.executeQuery();
                 if (selectRS.next()) {
                     // This address was already in the list
@@ -152,9 +153,9 @@ public class IsInWhiteList extends 
AbstractSQLWhitelistMatcher {
                 selectStmt = conn.prepareStatement(selectByPK);
     
                 selectStmt.setString(1, "*");
-                selectStmt.setString(2, recipientHost);
+                selectStmt.setString(2, recipientHost.asString());
                 selectStmt.setString(3, "*");
-                selectStmt.setString(4, senderHost);
+                selectStmt.setString(4, senderHost.asString());
                 selectRS = selectStmt.executeQuery();
                 if (selectRS.next()) {
                     // This address was already in the list

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/NetworkIsInWhitelist.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/NetworkIsInWhitelist.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/NetworkIsInWhitelist.java
index 8b0f20c..7be16f1 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/NetworkIsInWhitelist.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/NetworkIsInWhitelist.java
@@ -85,7 +85,7 @@ public class NetworkIsInWhitelist extends 
AbstractSQLWhitelistMatcher {
         ResultSet selectRS = null;
         try {
             String recipientUser = 
recipientMailAddress.getLocalPart().toLowerCase(Locale.US);
-            String recipientHost = 
recipientMailAddress.getDomain().toLowerCase(Locale.US);
+            String recipientHost = recipientMailAddress.getDomain().asString();
 
             if (conn == null) {
                 conn = datasource.getConnection();

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/SenderInFakeDomain.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/SenderInFakeDomain.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/SenderInFakeDomain.java
index 2ad4291..87b17e7 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/SenderInFakeDomain.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/SenderInFakeDomain.java
@@ -21,6 +21,7 @@ package org.apache.james.transport.matchers;
 
 import java.util.Collection;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.mailet.Experimental;
 import org.apache.mailet.Mail;
@@ -40,10 +41,10 @@ public class SenderInFakeDomain extends 
AbstractNetworkMatcher {
         if (mail.getSender() == null) {
             return null;
         }
-        String domain = mail.getSender().getDomain();
+        Domain domain = mail.getSender().getDomain();
         // DNS Lookup for this domain
         @SuppressWarnings("deprecation")
-        Collection<String> servers = getMailetContext().getMailServers(domain);
+        Collection<String> servers = 
getMailetContext().getMailServers(domain.name());
         if (servers.size() == 0) {
             // No records...could not deliver to this domain, so matches
             // criteria.

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/InstrumentationMailet.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/InstrumentationMailet.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/InstrumentationMailet.java
index 2b798ac..eee8fd2 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/InstrumentationMailet.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/InstrumentationMailet.java
@@ -88,11 +88,11 @@ public class InstrumentationMailet implements Mailet {
             LOGGER.info("Remote Address: " + mail.getRemoteAddr());
             LOGGER.info("Remote Host: " + mail.getRemoteHost());
             LOGGER.info("State: " + mail.getState());
-            LOGGER.info("Sender host: " + mail.getSender().getDomain());
+            LOGGER.info("Sender host: " + mail.getSender().getDomain().name());
             LOGGER.info("Sender user: " + mail.getSender().getLocalPart());
             Collection<MailAddress> recipients = mail.getRecipients();
             for (MailAddress address : recipients) {
-                LOGGER.info("Recipient: " + address.getLocalPart() + "@" + 
address.getDomain());
+                LOGGER.info("Recipient: " + address.getLocalPart() + "@" + 
address.getDomain().name());
             }
 
             LOGGER.info("Subject: " + message.getSubject());

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java
 
b/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java
index c1e84ce..313b9d6 100644
--- 
a/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java
+++ 
b/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java
@@ -32,7 +32,6 @@ import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.ParseException;
 
-import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.server.core.MailImpl;
@@ -850,7 +849,7 @@ public class MessageProcessor extends ProcessorAbstract {
      */
     protected boolean isLocalServer(MailAddress recipient) {
         try {
-            return 
getConfiguration().getDomainList().containsDomain(Domain.of(recipient.getDomain()));
+            return 
getConfiguration().getDomainList().containsDomain(recipient.getDomain());
         } catch (DomainListException e) {
             LOGGER.error("Unable to access DomainList", e);
             return false;

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/AuthRequiredToRelayRcptHook.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/AuthRequiredToRelayRcptHook.java
 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/AuthRequiredToRelayRcptHook.java
index 69fb9d6..f577632 100644
--- 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/AuthRequiredToRelayRcptHook.java
+++ 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/AuthRequiredToRelayRcptHook.java
@@ -47,9 +47,9 @@ public class AuthRequiredToRelayRcptHook extends 
AbstractAuthRequiredToRelayRcpt
     }
 
     @Override
-    protected boolean isLocalDomain(String domain) {
+    protected boolean isLocalDomain(Domain domain) {
         try {
-            return domains.containsDomain(Domain.of(domain));
+            return domains.containsDomain(domain);
         } catch (DomainListException e) {
             return false;
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/MailPriorityHandler.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/MailPriorityHandler.java
 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/MailPriorityHandler.java
index 61b986b..ce8f348 100644
--- 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/MailPriorityHandler.java
+++ 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/MailPriorityHandler.java
@@ -27,6 +27,7 @@ import java.util.Map;
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.protocols.api.handler.ProtocolHandler;
 import org.apache.james.protocols.smtp.SMTPSession;
@@ -43,7 +44,7 @@ import org.apache.mailet.Mail;
  */
 public class MailPriorityHandler implements JamesMessageHook, ProtocolHandler {
 
-    private final Map<String, Integer> prioMap = new HashMap<>();
+    private final Map<Domain, Integer> prioMap = new HashMap<>();
 
     @Override
     public HookResult onMessage(SMTPSession session, Mail mail) {
@@ -52,7 +53,7 @@ public class MailPriorityHandler implements JamesMessageHook, 
ProtocolHandler {
         Integer p = null;
 
         while (rcpts.hasNext()) {
-            String domain = rcpts.next().getDomain();
+            Domain domain = rcpts.next().getDomain();
             Integer prio;
             if (domain != null) {
                 prio = prioMap.get(domain);
@@ -80,7 +81,7 @@ public class MailPriorityHandler implements JamesMessageHook, 
ProtocolHandler {
     public void init(Configuration config) throws ConfigurationException {
         List<HierarchicalConfiguration> entries = 
((HierarchicalConfiguration)config).configurationsAt("priorityEntries.priorityEntry");
         for (HierarchicalConfiguration prioConf : entries) {
-            String domain = prioConf.getString("domain");
+            Domain domain = Domain.of(prioConf.getString("domain"));
             int prio = prioConf.getInt("priority", 
MailPrioritySupport.NORMAL_PRIORITY);
             if (prio > MailPrioritySupport.HIGH_PRIORITY || prio < 
MailPrioritySupport.LOW_PRIORITY) {
                 throw new ConfigurationException("configured priority must be 
>= " + MailPrioritySupport.LOW_PRIORITY + " and <= " + 
MailPrioritySupport.HIGH_PRIORITY);

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptHandler.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptHandler.java
 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptHandler.java
index 3a1cdf8..d79ac4c 100644
--- 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptHandler.java
+++ 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptHandler.java
@@ -112,7 +112,7 @@ public class ValidRcptHandler extends 
AbstractValidRcptHandler implements Protoc
                     LOGGER.debug("Unknown user {} check if it's an alias", 
username);
 
                     try {
-                        Mappings targetString = 
vut.getMappings(recipient.getLocalPart(), Domain.of(recipient.getDomain()));
+                        Mappings targetString = 
vut.getMappings(recipient.getLocalPart(), recipient.getDomain());
 
                         if (targetString != null && !targetString.isEmpty()) {
                             return true;
@@ -135,9 +135,9 @@ public class ValidRcptHandler extends 
AbstractValidRcptHandler implements Protoc
     }
 
     @Override
-    protected boolean isLocalDomain(SMTPSession session, String domain) {
+    protected boolean isLocalDomain(SMTPSession session, Domain domain) {
         try {
-            return domains.containsDomain(Domain.of(domain));
+            return domains.containsDomain(domain);
         } catch (DomainListException e) {
             LOGGER.error("Unable to get domains", e);
             return false;

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptMX.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptMX.java
 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptMX.java
index 04a2600..4cdfb89 100644
--- 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptMX.java
+++ 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptMX.java
@@ -27,6 +27,7 @@ import javax.inject.Inject;
 
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationException;
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.dnsservice.api.TemporaryResolutionException;
@@ -53,8 +54,6 @@ public class ValidRcptMX implements RcptHook, ProtocolHandler 
{
 
     private DNSService dnsService = null;
 
-    private static final String LOCALHOST = "localhost";
-
     private NetMatcher bNetwork = null;
 
     /**
@@ -90,14 +89,14 @@ public class ValidRcptMX implements RcptHook, 
ProtocolHandler {
     @Override
     public HookResult doRcpt(SMTPSession session, MailAddress sender, 
MailAddress rcpt) {
 
-        String domain = rcpt.getDomain();
+        Domain domain = rcpt.getDomain();
 
         // Email should be deliver local
-        if (!domain.equals(LOCALHOST)) {
+        if (!domain.equals(Domain.LOCALHOST)) {
 
             Iterator<String> mx;
             try {
-                mx = dnsService.findMXRecords(domain).iterator();
+                mx = dnsService.findMXRecords(domain.name()).iterator();
             } catch (TemporaryResolutionException e1) {
                 return new HookResult(HookReturnCode.DENYSOFT);
             }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae85899a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
 
b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
index 0817f16..7699a63 100644
--- 
a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
+++ 
b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
@@ -62,6 +62,7 @@ import org.slf4j.LoggerFactory;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSortedSet;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -154,7 +155,7 @@ public class GroupsRoutes implements Routes {
     })
     public HaltException addToGroup(Request request, Response response) throws 
JsonExtractException, AddressException, RecipientRewriteTableException, 
UsersRepositoryException, DomainListException {
         MailAddress groupAddress = 
parseMailAddress(request.params(GROUP_ADDRESS));
-        Domain domain = Domain.of(groupAddress.getDomain());
+        Domain domain = groupAddress.getDomain();
         ensureRegisteredDomain(domain);
         ensureNotShadowingAnotherAddress(groupAddress);
         MailAddress userAddress = 
parseMailAddress(request.params(USER_ADDRESS));
@@ -202,7 +203,7 @@ public class GroupsRoutes implements Routes {
         MailAddress userAddress = 
parseMailAddress(request.params(USER_ADDRESS));
         recipientRewriteTable.removeAddressMapping(
             groupAddress.getLocalPart(),
-            Domain.of(groupAddress.getDomain()),
+            groupAddress.getDomain(),
             userAddress.asString());
         return halt(HttpStatus.OK_200);
     }
@@ -222,7 +223,7 @@ public class GroupsRoutes implements Routes {
     })
     public ImmutableSortedSet<String> listGroupMembers(Request request, 
Response response) throws RecipientRewriteTable.ErrorMappingException, 
RecipientRewriteTableException {
         MailAddress groupAddress = 
parseMailAddress(request.params(GROUP_ADDRESS));
-        Mappings mappings = 
recipientRewriteTable.getMappings(groupAddress.getLocalPart(), 
Domain.of(groupAddress.getDomain()));
+        Mappings mappings = 
recipientRewriteTable.getMappings(groupAddress.getLocalPart(), 
groupAddress.getDomain());
 
         ensureNonEmptyMappings(mappings);
 


---------------------------------------------------------------------
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