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