JAMES-2132 Add error field

RFC defines them in https://tools.ietf.org/html/rfc8098#section-3.2.7 as:

   The Error field is used to supply additional information in the form
   of text messages when the "error" disposition modifier appears.  The
   syntax is as follows:

   error-field = "Error" ":" *([FWS] text)


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

Branch: refs/heads/master
Commit: c576fd1c516641b6954857706075380a6177bc7d
Parents: 5ee43e6
Author: benwa <btell...@linagora.com>
Authored: Mon Aug 28 17:57:21 2017 +0700
Committer: benwa <btell...@linagora.com>
Committed: Thu Aug 31 18:00:20 2017 +0700

----------------------------------------------------------------------
 .../java/org/apache/james/mdn/MDNReport.java    | 25 +++++++-
 .../java/org/apache/james/mdn/fields/Error.java | 39 ++++++++++++
 .../java/org/apache/james/mdn/fields/Text.java  | 47 ++++++++++++++
 .../org/apache/james/mdn/MDNFactoryTest.java    | 65 ++++++++++++++++++++
 4 files changed, 173 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/c576fd1c/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 1423074..127f0f4 100644
--- a/mdn/src/main/java/org/apache/james/mdn/MDNReport.java
+++ b/mdn/src/main/java/org/apache/james/mdn/MDNReport.java
@@ -22,6 +22,7 @@ package org.apache.james.mdn;
 import java.util.Optional;
 
 import org.apache.james.mdn.fields.Disposition;
+import org.apache.james.mdn.fields.Error;
 import org.apache.james.mdn.fields.FinalRecipient;
 import org.apache.james.mdn.fields.Gateway;
 import org.apache.james.mdn.fields.OriginalMessageId;
@@ -39,6 +40,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();
 
         public Builder reportingUserAgentField(ReportingUserAgent 
reportingUserAgentField) {
             this.reportingUserAgentField = 
Optional.of(reportingUserAgentField);
@@ -65,6 +67,12 @@ public class MDNReport {
             return this;
         }
 
+
+        public Builder errorField(Error errorField) {
+            this.errorField = Optional.of(errorField);
+            return this;
+        }
+
         public Builder finalRecipientField(FinalRecipient finalRecipientField) 
{
             this.finalRecipientField = Optional.of(finalRecipientField);
             return this;
@@ -88,7 +96,7 @@ public class MDNReport {
                 gatewayField, originalRecipientField,
                 finalRecipientField.get(),
                 originalMessageIdField,
-                dispositionField.get());
+                dispositionField.get(), errorField);
         }
 
     }
@@ -105,15 +113,17 @@ public class MDNReport {
     private final FinalRecipient finalRecipientField;
     private final Optional<OriginalMessageId> originalMessageIdField;
     private final Disposition dispositionField;
+    private final Optional<Error> errorField;
 
     private MDNReport(Optional<ReportingUserAgent> reportingUserAgentField, 
Optional<Gateway> gatewayField, Optional<OriginalRecipient> 
originalRecipientField,
-                      FinalRecipient finalRecipientField, 
Optional<OriginalMessageId> originalMessageIdField, Disposition 
dispositionField) {
+                      FinalRecipient finalRecipientField, 
Optional<OriginalMessageId> originalMessageIdField, Disposition 
dispositionField, Optional<Error> errorField) {
         this.reportingUserAgentField = reportingUserAgentField;
         this.gatewayField = gatewayField;
         this.originalRecipientField = originalRecipientField;
         this.finalRecipientField = finalRecipientField;
         this.originalMessageIdField = originalMessageIdField;
         this.dispositionField = dispositionField;
+        this.errorField = errorField;
     }
 
     public Optional<ReportingUserAgent> getReportingUserAgentField() {
@@ -136,13 +146,22 @@ public class MDNReport {
         return dispositionField;
     }
 
+    public Optional<Gateway> getGatewayField() {
+        return gatewayField;
+    }
+
+    public Optional<Error> getErrorField() {
+        return errorField;
+    }
+
     public String formattedValue() {
         return reportingUserAgentField.map(value -> value.formattedValue() + 
LINE_END).orElse("")
             + gatewayField.map(value -> value.formattedValue() + 
LINE_END).orElse("")
             + originalRecipientField.map(value -> value.formattedValue() + 
LINE_END).orElse("")
             + finalRecipientField.formattedValue() + LINE_END
             + originalMessageIdField.map(value -> value.formattedValue() + 
LINE_END).orElse("")
-            + dispositionField.formattedValue() + LINE_END;
+            + dispositionField.formattedValue() + LINE_END
+            + errorField.map(value -> value.formattedValue() + 
LINE_END).orElse("");
 
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c576fd1c/mdn/src/main/java/org/apache/james/mdn/fields/Error.java
----------------------------------------------------------------------
diff --git a/mdn/src/main/java/org/apache/james/mdn/fields/Error.java 
b/mdn/src/main/java/org/apache/james/mdn/fields/Error.java
new file mode 100644
index 0000000..8a68299
--- /dev/null
+++ b/mdn/src/main/java/org/apache/james/mdn/fields/Error.java
@@ -0,0 +1,39 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mdn.fields;
+
+public class Error implements Field {
+    public static final String FIELD_NAME = "Error";
+
+    private final Text text;
+
+    public Error(Text text) {
+        this.text = text;
+    }
+
+    public Text getText() {
+        return text;
+    }
+
+    @Override
+    public String formattedValue() {
+        return FIELD_NAME + ": " + text.formatted();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/c576fd1c/mdn/src/main/java/org/apache/james/mdn/fields/Text.java
----------------------------------------------------------------------
diff --git a/mdn/src/main/java/org/apache/james/mdn/fields/Text.java 
b/mdn/src/main/java/org/apache/james/mdn/fields/Text.java
new file mode 100644
index 0000000..7473e08
--- /dev/null
+++ b/mdn/src/main/java/org/apache/james/mdn/fields/Text.java
@@ -0,0 +1,47 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mdn.fields;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+
+public class Text {
+
+    public static Text fromRawText(String rawText) {
+        return new Text(replaceLineBreaksByContinuation(rawText));
+    }
+
+    private static String replaceLineBreaksByContinuation(String rawText) {
+        return Joiner.on("\r\n ")
+            .join(Splitter.on("\n")
+                .trimResults()
+                .splitToList(rawText));
+    }
+
+    private final String content;
+
+    public Text(String content) {
+        this.content = content;
+    }
+
+    public String formatted() {
+        return content;
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/c576fd1c/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 ac51b08..01b71b7 100644
--- a/mdn/src/test/java/org/apache/james/mdn/MDNFactoryTest.java
+++ b/mdn/src/test/java/org/apache/james/mdn/MDNFactoryTest.java
@@ -25,11 +25,13 @@ import java.util.Optional;
 
 import org.apache.james.mdn.action.mode.DispositionActionMode;
 import org.apache.james.mdn.fields.Disposition;
+import org.apache.james.mdn.fields.Error;
 import org.apache.james.mdn.fields.FinalRecipient;
 import org.apache.james.mdn.fields.Gateway;
 import org.apache.james.mdn.fields.OriginalMessageId;
 import org.apache.james.mdn.fields.OriginalRecipient;
 import org.apache.james.mdn.fields.ReportingUserAgent;
+import org.apache.james.mdn.fields.Text;
 import org.apache.james.mdn.modifier.DispositionModifier;
 import org.apache.james.mdn.sending.mode.DispositionSendingMode;
 import org.apache.james.mdn.type.DispositionType;
@@ -565,4 +567,67 @@ public class MDNFactoryTest {
             .dispositionField(disposition)
             .build();
     }
+
+    @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("final_recipient"))
+            .originalRecipientField(new OriginalRecipient("originalRecipient"))
+            .originalMessageIdField(new 
OriginalMessageId("original_message_id"))
+            .dispositionField(disposition)
+            .errorField(new Error(Text.fromRawText("An error message")))
+            .build()
+            .formattedValue();
+
+        assertThat(report)
+            .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" +
+                "Original-Recipient: rfc822; originalRecipient\r\n" +
+                "Final-Recepient: 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");
+    }
+
+    @Test
+    public void generateMDNReportShouldFormatErrorFieldsOnSeveralLines() {
+        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("final_recipient"))
+            .originalRecipientField(new OriginalRecipient("originalRecipient"))
+            .originalMessageIdField(new 
OriginalMessageId("original_message_id"))
+            .dispositionField(disposition)
+            .errorField(new Error(Text.fromRawText("An error message\non 
several lines")))
+            .build()
+            .formattedValue();
+
+        assertThat(report)
+            .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" +
+                "Original-Recipient: rfc822; originalRecipient\r\n" +
+                "Final-Recepient: 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" +
+                " on several lines\r\n");
+    }
 }


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