JAMES-2132 MultipleError fields can be added to a MDN report

https://tools.ietf.org/html/rfc8098#section-3.1

Describes the MDN structure as:

   disposition-notification-content = [ reporting-ua-field CRLF ]
             [ mdn-gateway-field CRLF ]
             [ original-recipient-field CRLF ]
             final-recipient-field CRLF
             [ original-message-id-field CRLF ]
             disposition-field CRLF
             *( error-field CRLF )
             *( extension-field CRLF )


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

Branch: refs/heads/master
Commit: 6643ef28e70044bf61bc89ffcd39bff0c0e67d46
Parents: 633d2eb
Author: benwa <btell...@linagora.com>
Authored: Mon Aug 28 21:30:08 2017 +0700
Committer: benwa <btell...@linagora.com>
Committed: Fri Sep 1 08:14:40 2017 +0700

----------------------------------------------------------------------
 .../java/org/apache/james/mdn/MDNReport.java    | 36 ++++++++++++------
 .../org/apache/james/mdn/MDNFactoryTest.java    | 40 ++++++++++++++++++--
 2 files changed, 62 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/6643ef28/mdn/src/main/java/org/apache/james/mdn/MDNReport.java
----------------------------------------------------------------------
diff --git a/mdn/src/main/java/org/apache/james/mdn/MDNReport.java 
b/mdn/src/main/java/org/apache/james/mdn/MDNReport.java
index 1d3beee..72eade2 100644
--- a/mdn/src/main/java/org/apache/james/mdn/MDNReport.java
+++ b/mdn/src/main/java/org/apache/james/mdn/MDNReport.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mdn;
 
+import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
@@ -46,7 +47,7 @@ public class MDNReport {
         private Optional<FinalRecipient> finalRecipientField = 
Optional.empty();
         private Optional<OriginalMessageId> originalMessageIdField = 
Optional.empty();
         private Optional<Disposition> dispositionField = Optional.empty();
-        private Optional<Error> errorField = Optional.empty();
+        private ImmutableList.Builder<Error> errorField = 
ImmutableList.builder();
         private ImmutableList.Builder<ExtensionField> extensionFields = 
ImmutableList.builder();
 
         public Builder reportingUserAgentField(ReportingUserAgent 
reportingUserAgentField) {
@@ -74,9 +75,13 @@ public class MDNReport {
             return this;
         }
 
+        public Builder addErrorField(Error errorField) {
+            this.errorField.add(errorField);
+            return this;
+        }
 
-        public Builder errorField(Error errorField) {
-            this.errorField = Optional.of(errorField);
+        public Builder addErrorFields(Error... errorField) {
+            this.errorField.add(errorField);
             return this;
         }
 
@@ -114,7 +119,7 @@ public class MDNReport {
                 finalRecipientField.get(),
                 originalMessageIdField,
                 dispositionField.get(),
-                errorField,
+                errorField.build(),
                 extensionFields.build());
         }
 
@@ -130,19 +135,19 @@ public class MDNReport {
     private final FinalRecipient finalRecipientField;
     private final Optional<OriginalMessageId> originalMessageIdField;
     private final Disposition dispositionField;
-    private final Optional<Error> errorField;
+    private final ImmutableList<Error> errorFields;
     private final ImmutableList<ExtensionField> extensionFields;
 
     private MDNReport(Optional<ReportingUserAgent> reportingUserAgentField, 
Optional<Gateway> gatewayField, Optional<OriginalRecipient> 
originalRecipientField,
-                      FinalRecipient finalRecipientField, 
Optional<OriginalMessageId> originalMessageIdField, Disposition 
dispositionField, Optional<Error> errorField,
-                      ImmutableList<ExtensionField> extensionFields) {
+                      FinalRecipient finalRecipientField, 
Optional<OriginalMessageId> originalMessageIdField, Disposition 
dispositionField,
+                      ImmutableList<Error> errorFields, 
ImmutableList<ExtensionField> extensionFields) {
         this.reportingUserAgentField = reportingUserAgentField;
         this.gatewayField = gatewayField;
         this.originalRecipientField = originalRecipientField;
         this.finalRecipientField = finalRecipientField;
         this.originalMessageIdField = originalMessageIdField;
         this.dispositionField = dispositionField;
-        this.errorField = errorField;
+        this.errorFields = errorFields;
         this.extensionFields = extensionFields;
     }
 
@@ -170,8 +175,8 @@ public class MDNReport {
         return gatewayField;
     }
 
-    public Optional<Error> getErrorField() {
-        return errorField;
+    public List<Error> getErrorFields() {
+        return errorFields;
     }
 
     public String formattedValue() {
@@ -181,10 +186,19 @@ public class MDNReport {
             + finalRecipientField.formattedValue() + LINE_END
             + originalMessageIdField.map(value -> value.formattedValue() + 
LINE_END).orElse("")
             + dispositionField.formattedValue() + LINE_END
-            + errorField.map(value -> value.formattedValue() + 
LINE_END).orElse("")
+            + formatErrors()
             + formattedExtensionValue();
     }
 
+    private String formatErrors() {
+        if (errorFields.isEmpty()) {
+            return "";
+        }
+        return errorFields.stream()
+            .map(Error::formattedValue)
+            .collect(Collectors.joining(LINE_END)) + LINE_END;
+    }
+
     private String formattedExtensionValue() {
         if (extensionFields.isEmpty()) {
             return "";

http://git-wip-us.apache.org/repos/asf/james-project/blob/6643ef28/mdn/src/test/java/org/apache/james/mdn/MDNFactoryTest.java
----------------------------------------------------------------------
diff --git a/mdn/src/test/java/org/apache/james/mdn/MDNFactoryTest.java 
b/mdn/src/test/java/org/apache/james/mdn/MDNFactoryTest.java
index 7d7ac83..c9235a8 100644
--- a/mdn/src/test/java/org/apache/james/mdn/MDNFactoryTest.java
+++ b/mdn/src/test/java/org/apache/james/mdn/MDNFactoryTest.java
@@ -607,7 +607,7 @@ public class MDNFactoryTest {
     }
 
     @Test
-    public void generateMDNReportShouldFormatErrorFields() {
+    public void generateMDNReportShouldFormatErrorField() {
         Disposition disposition = Disposition.builder()
             .actionMode(DispositionActionMode.Automatic)
             .sendingMode(DispositionSendingMode.Automatic)
@@ -624,7 +624,7 @@ public class MDNFactoryTest {
             .originalRecipientField(new 
OriginalRecipient(Text.fromRawText("originalRecipient")))
             .originalMessageIdField(new 
OriginalMessageId("original_message_id"))
             .dispositionField(disposition)
-            .errorField(new Error(Text.fromRawText("An error message")))
+            .addErrorField(new Error(Text.fromRawText("An error message")))
             .build()
             .formattedValue();
 
@@ -638,6 +638,40 @@ public class MDNFactoryTest {
     }
 
     @Test
+    public void generateMDNReportShouldFormatErrorFields() {
+        Disposition disposition = Disposition.builder()
+            .actionMode(DispositionActionMode.Automatic)
+            .sendingMode(DispositionSendingMode.Automatic)
+            .type(DispositionType.Processed)
+            .addModifier(DispositionModifier.Error)
+            .addModifier(DispositionModifier.Failed)
+            .build();
+
+        String report = MDNReport.builder()
+            .reportingUserAgentField(new ReportingUserAgent(
+                "UA_name",
+                Optional.of("UA_product")))
+            .finalRecipientField(new 
FinalRecipient(Text.fromRawText("final_recipient")))
+            .originalRecipientField(new 
OriginalRecipient(Text.fromRawText("originalRecipient")))
+            .originalMessageIdField(new 
OriginalMessageId("original_message_id"))
+            .dispositionField(disposition)
+            .addErrorFields(
+                new Error(Text.fromRawText("An error message")),
+                new Error(Text.fromRawText("A second error message")))
+            .build()
+            .formattedValue();
+
+        assertThat(report)
+            .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" +
+                "Original-Recipient: rfc822; originalRecipient\r\n" +
+                "Final-Recipient: rfc822; final_recipient\r\n" +
+                "Original-Message-ID: original_message_id\r\n" +
+                "Disposition: 
automatic-action/MDN-sent-automatically;processed/error,failed\r\n" +
+                "Error: An error message\r\n" +
+                "Error: A second error message\r\n");
+    }
+
+    @Test
     public void generateMDNReportShouldFormatErrorFieldsOnSeveralLines() {
         Disposition disposition = Disposition.builder()
             .actionMode(DispositionActionMode.Automatic)
@@ -655,7 +689,7 @@ public class MDNFactoryTest {
             .originalRecipientField(new 
OriginalRecipient(Text.fromRawText("originalRecipient")))
             .originalMessageIdField(new 
OriginalMessageId("original_message_id"))
             .dispositionField(disposition)
-            .errorField(new Error(Text.fromRawText("An error message\non 
several lines")))
+            .addErrorField(new Error(Text.fromRawText("An error message\non 
several lines")))
             .build()
             .formattedValue();
 


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