You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ad...@apache.org on 2017/11/15 11:15:59 UTC

[18/19] james-project git commit: JAMES-2214 Improve Emailer and envelope design

JAMES-2214 Improve Emailer and envelope design


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

Branch: refs/heads/master
Commit: 5df4371bc064f7bdc764df65d7aaef538251afc3
Parents: 944643b
Author: benwa <bt...@linagora.com>
Authored: Tue Nov 14 16:49:10 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Nov 15 18:05:46 2017 +0700

----------------------------------------------------------------------
 .../org/apache/james/jmap/model/Emailer.java    | 20 ++++++
 .../org/apache/james/jmap/model/Envelope.java   | 69 ++++++--------------
 .../org/apache/james/jmap/send/MailFactory.java | 10 +--
 3 files changed, 44 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/5df4371b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Emailer.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Emailer.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Emailer.java
index db6a701..5789939 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Emailer.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Emailer.java
@@ -22,6 +22,12 @@ package org.apache.james.jmap.model;
 import java.util.Objects;
 import java.util.Optional;
 
+import javax.mail.internet.AddressException;
+
+import org.apache.james.core.MailAddress;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
@@ -29,10 +35,13 @@ import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
+import com.google.common.base.Throwables;
 
 @JsonDeserialize(builder = Emailer.Builder.class)
 public class Emailer {
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(Emailer.class);
+
     public static Builder builder() {
         return new Builder();
     }
@@ -117,6 +126,17 @@ public class Emailer {
         return email;
     }
 
+    @JsonIgnore
+    public MailAddress toMailAddress() {
+        Preconditions.checkArgument(email.isPresent(), "eMailer mail address should be present when sending a mail using JMAP");
+        try {
+            return new MailAddress(email.get());
+        } catch (AddressException e) {
+            LOGGER.error("Invalid mail address", email);
+            throw Throwables.propagate(e);
+        }
+    }
+
     @Override
     public boolean equals(Object o) {
         if (o instanceof Emailer) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/5df4371b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Envelope.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Envelope.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Envelope.java
index e823aca..c4d80f9 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Envelope.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Envelope.java
@@ -22,78 +22,53 @@ package org.apache.james.jmap.model;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
-import java.util.stream.Collectors;
-
-import javax.mail.internet.AddressException;
+import java.util.stream.Stream;
 
 import org.apache.james.core.MailAddress;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.james.util.StreamUtils;
 
+import com.github.steveash.guavate.Guavate;
 import com.google.common.base.Preconditions;
-import com.google.common.base.Throwables;
 
 public class Envelope {
-    private static final Logger LOGGER = LoggerFactory.getLogger(Envelope.class);
 
     public static Envelope fromMessage(Message jmapMessage) {
         MailAddress sender = jmapMessage.getFrom()
-            .map(Envelope::emailerToMailAddress)
+            .map(Emailer::toMailAddress)
             .orElseThrow(() -> new RuntimeException("Sender is mandatory"));
-        Set<MailAddress> to = emailersToMailAddressSet(jmapMessage.getTo());
-        Set<MailAddress> cc = emailersToMailAddressSet(jmapMessage.getCc());
-        Set<MailAddress> bcc = emailersToMailAddressSet(jmapMessage.getBcc());
 
-        return new Envelope(sender, to, cc, bcc);
+        Stream<MailAddress> to = emailersToMailAddresses(jmapMessage.getTo());
+        Stream<MailAddress> cc = emailersToMailAddresses(jmapMessage.getCc());
+        Stream<MailAddress> bcc = emailersToMailAddresses(jmapMessage.getBcc());
+
+        return new Envelope(sender,
+            StreamUtils.flatten(Stream.of(to, cc, bcc))
+                .collect(Guavate.toImmutableSet()));
     }
 
-    private static Set<MailAddress> emailersToMailAddressSet(List<Emailer> emailers) {
+    private static Stream<MailAddress> emailersToMailAddresses(List<Emailer> emailers) {
         return emailers.stream()
-            .map(Envelope::emailerToMailAddress)
-            .collect(Collectors.toSet());
+            .map(Emailer::toMailAddress);
     }
 
-    private static MailAddress emailerToMailAddress(Emailer emailer) {
-        Preconditions.checkArgument(emailer.getEmail().isPresent(), "eMailer mail address should be present when sending a mail using JMAP");
-        try {
-            return new MailAddress(emailer.getEmail().get());
-        } catch (AddressException e) {
-            LOGGER.error("Invalid mail address", emailer.getEmail());
-            throw Throwables.propagate(e);
-        }
-    }
 
     private final MailAddress from;
-    private final Set<MailAddress> to;
-    private final Set<MailAddress> cc;
-    private final Set<MailAddress> bcc;
+    private final Set<MailAddress> recipients;
 
-    private Envelope(MailAddress from, Set<MailAddress> to, Set<MailAddress> cc, Set<MailAddress> bcc) {
+    private Envelope(MailAddress from, Set<MailAddress> recipients) {
         Preconditions.checkNotNull(from);
-        Preconditions.checkNotNull(to);
-        Preconditions.checkNotNull(cc);
-        Preconditions.checkNotNull(bcc);
+        Preconditions.checkNotNull(recipients);
 
         this.from = from;
-        this.to = to;
-        this.cc = cc;
-        this.bcc = bcc;
+        this.recipients = recipients;
     }
 
     public MailAddress getFrom() {
         return from;
     }
 
-    public Set<MailAddress> getTo() {
-        return to;
-    }
-
-    public Set<MailAddress> getCc() {
-        return cc;
-    }
-
-    public Set<MailAddress> getBcc() {
-        return bcc;
+    public Set<MailAddress> getRecipients() {
+        return recipients;
     }
 
     @Override
@@ -102,15 +77,13 @@ public class Envelope {
             Envelope envelope = (Envelope) o;
 
             return Objects.equals(this.from, envelope.from)
-                && Objects.equals(this.to, envelope.to)
-                && Objects.equals(this.cc, envelope.cc)
-                && Objects.equals(this.bcc, envelope.bcc);
+                && Objects.equals(this.recipients, envelope.recipients);
         }
         return false;
     }
 
     @Override
     public final int hashCode() {
-        return Objects.hash(from, to, cc, bcc);
+        return Objects.hash(from, recipients);
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/5df4371b/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailFactory.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailFactory.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailFactory.java
index 405bab1..3d156d3 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailFactory.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailFactory.java
@@ -21,15 +21,12 @@ package org.apache.james.jmap.send;
 
 import javax.mail.MessagingException;
 
-import org.apache.james.core.MailAddress;
 import org.apache.james.jmap.model.Envelope;
 import org.apache.james.jmap.model.MessageFactory.MetaDataWithContent;
 import org.apache.james.server.core.MailImpl;
 import org.apache.mailet.Mail;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
 
 public class MailFactory {
     
@@ -37,11 +34,10 @@ public class MailFactory {
     }
 
     public Mail build(MetaDataWithContent message, Envelope envelope) throws MessagingException {
-        ImmutableSet<MailAddress> recipients = Sets.union(
-            Sets.union(envelope.getTo(), envelope.getCc()),
-                envelope.getBcc()).immutableCopy();
         return new MailImpl(message.getMessageId().serialize(),
-            envelope.getFrom(), recipients, message.getContent());
+            envelope.getFrom(),
+            envelope.getRecipients(),
+            message.getContent());
     }
 
 }


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