JAMES-2557 Solve generic mail sending with a duplicate method

We need a generic way to duplicate an email. This allows then to mutate the 
duplicated and sends arbitrary emails from the generic mailet context.

This is compulsory to allow UseRecipientHeaders to work when no sender is 
specified, which is not handled with other APIs.


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

Branch: refs/heads/master
Commit: 4caac5f104f59a80b2a884e3f7effa46ee7190a0
Parents: dbb6074
Author: Benoit Tellier <[email protected]>
Authored: Fri Oct 19 11:13:25 2018 +0700
Committer: Benoit Tellier <[email protected]>
Committed: Tue Oct 30 09:39:30 2018 +0700

----------------------------------------------------------------------
 .../src/main/java/org/apache/mailet/Mail.java   |  6 +++
 .../transport/mailets/UseHeaderRecipients.java  |  2 +-
 .../org/apache/mailet/base/test/FakeMail.java   | 53 ++++++++++++++++++--
 .../org/apache/james/server/core/MailImpl.java  |  5 ++
 4 files changed, 60 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/4caac5f1/mailet/api/src/main/java/org/apache/mailet/Mail.java
----------------------------------------------------------------------
diff --git a/mailet/api/src/main/java/org/apache/mailet/Mail.java 
b/mailet/api/src/main/java/org/apache/mailet/Mail.java
index 4b98f30..c1bccd0 100644
--- a/mailet/api/src/main/java/org/apache/mailet/Mail.java
+++ b/mailet/api/src/main/java/org/apache/mailet/Mail.java
@@ -157,6 +157,12 @@ public interface Mail extends Serializable, Cloneable {
     default boolean hasSender() {
         return !getMaybeSender().isNullSender();
     }
+
+    /**
+     * @since Mailet API v3.2.0
+     * @return A copy of this email. Implementation can affect a variation of 
the initial mail name property.
+     */
+    Mail duplicate() throws MessagingException;
     
     /**
      * Returns the current state of the message, such as GHOST, ERROR or 
DEFAULT.

http://git-wip-us.apache.org/repos/asf/james-project/blob/4caac5f1/mailet/standard/src/main/java/org/apache/james/transport/mailets/UseHeaderRecipients.java
----------------------------------------------------------------------
diff --git 
a/mailet/standard/src/main/java/org/apache/james/transport/mailets/UseHeaderRecipients.java
 
b/mailet/standard/src/main/java/org/apache/james/transport/mailets/UseHeaderRecipients.java
index 85c6887..82a469d 100644
--- 
a/mailet/standard/src/main/java/org/apache/james/transport/mailets/UseHeaderRecipients.java
+++ 
b/mailet/standard/src/main/java/org/apache/james/transport/mailets/UseHeaderRecipients.java
@@ -106,7 +106,7 @@ public class UseHeaderRecipients extends GenericMailet {
         }
 
         // Return email to the "root" process.
-        getMailetContext().sendMail(mail.getSender(), mail.getRecipients(), 
mail.getMessage());
+        getMailetContext().sendMail(mail.duplicate());
         mail.setState(Mail.GHOST);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/4caac5f1/mailet/test/src/main/java/org/apache/mailet/base/test/FakeMail.java
----------------------------------------------------------------------
diff --git 
a/mailet/test/src/main/java/org/apache/mailet/base/test/FakeMail.java 
b/mailet/test/src/main/java/org/apache/mailet/base/test/FakeMail.java
index 43281a8..02cb868 100644
--- a/mailet/test/src/main/java/org/apache/mailet/base/test/FakeMail.java
+++ b/mailet/test/src/main/java/org/apache/mailet/base/test/FakeMail.java
@@ -37,6 +37,7 @@ import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeMessage;
 
 import org.apache.james.core.MailAddress;
+import org.apache.james.core.MaybeSender;
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.util.MimeMessageUtil;
 import org.apache.mailet.Mail;
@@ -171,13 +172,23 @@ public class FakeMail implements Mail, Serializable {
 
         public Builder name(String name) {
             Preconditions.checkNotNull(name, "'name' can not be null");
-            this.name = Optional.of(name);
+            name(Optional.of(name));
+            return this;
+        }
+
+        public Builder name(Optional<String> name) {
+            this.name = name;
             return this;
         }
 
         public Builder sender(MailAddress sender) {
             Preconditions.checkNotNull(sender, "'sender' can not be null");
-            this.sender = Optional.of(sender);
+            sender(MaybeSender.of(sender));
+            return this;
+        }
+
+        public Builder sender(MaybeSender sender) {
+            this.sender = sender.asOptional();
             return this;
         }
 
@@ -187,19 +198,34 @@ public class FakeMail implements Mail, Serializable {
 
         public Builder state(String state) {
             Preconditions.checkNotNull(state, "'state' can not be null");
-            this.state = Optional.of(state);
+            state(Optional.of(state));
+            return this;
+        }
+
+        public Builder state(Optional<String> state) {
+            this.state = state;
             return this;
         }
 
         public Builder errorMessage(String errorMessage) {
             Preconditions.checkNotNull(errorMessage, "'errorMessage' can not 
be null");
-            this.errorMessage = Optional.of(errorMessage);
+            errorMessage(Optional.of(errorMessage));
+            return this;
+        }
+
+        public Builder errorMessage(Optional<String> errorMessage) {
+            this.errorMessage = errorMessage;
             return this;
         }
 
         public Builder lastUpdated(Date lastUpdated) {
             Preconditions.checkNotNull(lastUpdated, "'lastUpdated' can not be 
null");
-            this.lastUpdated = Optional.of(lastUpdated);
+            lastUpdated(Optional.of(lastUpdated));
+            return this;
+        }
+
+        public Builder lastUpdated(Optional<Date> lastUpdated) {
+            this.lastUpdated = lastUpdated;
             return this;
         }
 
@@ -284,6 +310,23 @@ public class FakeMail implements Mail, Serializable {
     }
 
     @Override
+    public Mail duplicate() throws MessagingException {
+        return builder()
+            .mimeMessage(msg)
+            .recipients(ImmutableList.copyOf(recipients))
+            .name(Optional.ofNullable(name))
+            .sender(MaybeSender.of(sender))
+            .state(Optional.ofNullable(state))
+            .errorMessage(Optional.ofNullable(errorMessage))
+            .lastUpdated(Optional.ofNullable(lastUpdated))
+            .attributes(attributes)
+            .size(size)
+            .remoteAddr(remoteAddr)
+            .remoteHost(remoteHost)
+            .build();
+    }
+
+    @Override
     public String getName() {
         return name;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/4caac5f1/server/container/core/src/main/java/org/apache/james/server/core/MailImpl.java
----------------------------------------------------------------------
diff --git 
a/server/container/core/src/main/java/org/apache/james/server/core/MailImpl.java
 
b/server/container/core/src/main/java/org/apache/james/server/core/MailImpl.java
index ae9c853..cd0fc57 100644
--- 
a/server/container/core/src/main/java/org/apache/james/server/core/MailImpl.java
+++ 
b/server/container/core/src/main/java/org/apache/james/server/core/MailImpl.java
@@ -797,4 +797,9 @@ public class MailImpl implements Disposable, Mail {
     public void addAllSpecificHeaderForRecipient(PerRecipientHeaders 
perRecipientHeaders) {
         perRecipientSpecificHeaders.addAll(perRecipientHeaders);
     }
+
+    @Override
+    public Mail duplicate() throws MessagingException {
+        return MailImpl.duplicate(this);
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to