MAILET-149 JSON created from ICAL should better use From when available and backup to sender envelope
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/9ff71bd2 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/9ff71bd2 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/9ff71bd2 Branch: refs/heads/master Commit: 9ff71bd26ccb4e54788ed70a61ff1aa13b06f5f5 Parents: 84ecf06 Author: Benoit Tellier <[email protected]> Authored: Tue Jan 24 09:29:54 2017 +0700 Committer: Benoit Tellier <[email protected]> Committed: Tue Jan 24 16:49:07 2017 +0700 ---------------------------------------------------------------------- .../transport/mailets/ICALToJsonAttribute.java | 34 +++++- .../james/transport/mailets/model/ICAL.java | 4 +- .../mailets/ICALToJsonAttributeTest.java | 109 +++++++++++++++++++ .../james/transport/mailets/model/ICALTest.java | 14 +-- .../mailets/ICSAttachmentWorkflowTest.java | 5 +- 5 files changed, 148 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/9ff71bd2/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICALToJsonAttribute.java ---------------------------------------------------------------------- diff --git a/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICALToJsonAttribute.java b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICALToJsonAttribute.java index b62ab33..84ebabb 100644 --- a/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICALToJsonAttribute.java +++ b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICALToJsonAttribute.java @@ -20,11 +20,16 @@ package org.apache.james.transport.mailets; import java.io.Serializable; +import java.util.Arrays; import java.util.Map; +import java.util.Optional; import java.util.UUID; import java.util.stream.Stream; +import javax.mail.Address; import javax.mail.MessagingException; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; import org.apache.commons.lang3.tuple.Pair; import org.apache.james.transport.mailets.model.ICAL; @@ -35,6 +40,7 @@ import org.apache.mailet.base.GenericMailet; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.github.fge.lambdas.Throwing; import com.github.steveash.guavate.Guavate; import com.google.common.base.Charsets; import com.google.common.base.Strings; @@ -132,8 +138,9 @@ public class ICALToJsonAttribute extends GenericMailet { if (mail.getAttribute(rawSourceAttributeName) == null) { return; } - if (mail.getSender() == null) { - log("Skipping " + mail.getName() + " because no sender"); + Optional<String> sender = retrieveSender(mail); + if (!sender.isPresent()) { + log("Skipping " + mail.getName() + " because no sender and no from"); return; } try { @@ -141,7 +148,7 @@ public class ICALToJsonAttribute extends GenericMailet { Map<String, byte[]> rawCalendars = getRawCalendarMap(mail); Map<String, byte[]> jsonsInByteForm = calendars.entrySet() .stream() - .flatMap(calendar -> toJson(calendar, rawCalendars, mail)) + .flatMap(calendar -> toJson(calendar, rawCalendars, mail, sender.get())) .collect(Guavate.toImmutableMap(Pair::getKey, Pair::getValue)); mail.setAttribute(destinationAttributeName, (Serializable) jsonsInByteForm); } catch (ClassCastException e) { @@ -159,10 +166,10 @@ public class ICALToJsonAttribute extends GenericMailet { return (Map<String, byte[]>) mail.getAttribute(rawSourceAttributeName); } - private Stream<Pair<String, byte[]>> toJson(Map.Entry<String, Calendar> entry, Map<String, byte[]> rawCalendars, Mail mail) { + private Stream<Pair<String, byte[]>> toJson(Map.Entry<String, Calendar> entry, Map<String, byte[]> rawCalendars, Mail mail, String sender) { return mail.getRecipients() .stream() - .flatMap(recipient -> toICAL(entry, rawCalendars, recipient, mail.getSender())) + .flatMap(recipient -> toICAL(entry, rawCalendars, recipient, sender)) .flatMap(ical -> toJson(ical, mail.getName())) .map(json -> Pair.of(UUID.randomUUID().toString(), json.getBytes(Charsets.UTF_8))); } @@ -179,7 +186,7 @@ public class ICALToJsonAttribute extends GenericMailet { } } - private Stream<ICAL> toICAL(Map.Entry<String, Calendar> entry, Map<String, byte[]> rawCalendars, MailAddress recipient, MailAddress sender) { + private Stream<ICAL> toICAL(Map.Entry<String, Calendar> entry, Map<String, byte[]> rawCalendars, MailAddress recipient, String sender) { Calendar calendar = entry.getValue(); byte[] rawICal = rawCalendars.get(entry.getKey()); if (rawICal == null) { @@ -197,4 +204,19 @@ public class ICALToJsonAttribute extends GenericMailet { return Stream.of(); } } + + private Optional<String> retrieveSender(Mail mail) throws MessagingException { + Optional<String> from = Optional.ofNullable(mail.getMessage()) + .map(Throwing.function(MimeMessage::getFrom).orReturn(new Address[]{})) + .map(Arrays::stream) + .orElse(Stream.of()) + .map(address -> (InternetAddress) address) + .map(InternetAddress::getAddress) + .findFirst(); + if (from.isPresent()) { + return from; + } + return Optional.ofNullable(mail.getSender()) + .map(MailAddress::asString); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/9ff71bd2/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/model/ICAL.java ---------------------------------------------------------------------- diff --git a/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/model/ICAL.java b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/model/ICAL.java index 80f1555..14db606 100644 --- a/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/model/ICAL.java +++ b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/model/ICAL.java @@ -61,8 +61,8 @@ public class ICAL { return Optional.ofNullable(property).map(Property::getValue); } - public Builder sender(MailAddress sender) { - this.sender = sender.asString(); + public Builder sender(String sender) { + this.sender = sender; return this; } http://git-wip-us.apache.org/repos/asf/james-project/blob/9ff71bd2/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToJsonAttributeTest.java ---------------------------------------------------------------------- diff --git a/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToJsonAttributeTest.java b/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToJsonAttributeTest.java index 574878b..76147ee 100644 --- a/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToJsonAttributeTest.java +++ b/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToJsonAttributeTest.java @@ -35,6 +35,7 @@ import org.apache.mailet.MailAddress; import org.apache.mailet.base.MailAddressFixture; import org.apache.mailet.base.test.FakeMail; import org.apache.mailet.base.test.FakeMailetConfig; +import org.apache.mailet.base.test.MimeMessageBuilder; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -428,6 +429,114 @@ public class ICALToJsonAttributeTest { "}"); } + @SuppressWarnings("unchecked") + @Test + public void serviceShouldUseFromWhenSpecified() throws Exception { + testee.init(FakeMailetConfig.builder().build()); + + byte[] ics = ByteStreams.toByteArray(ClassLoader.getSystemResourceAsStream("ics/meeting.ics")); + Calendar calendar = new CalendarBuilder().build(new ByteArrayInputStream(ics)); + ImmutableMap<String, Calendar> icals = ImmutableMap.of("key", calendar); + ImmutableMap<String, byte[]> rawIcals = ImmutableMap.of("key", ics); + MailAddress recipient = MailAddressFixture.ANY_AT_JAMES2; + String from = MailAddressFixture.OTHER_AT_JAMES.asString(); + Mail mail = FakeMail.builder() + .sender(SENDER) + .recipient(recipient) + .mimeMessage(MimeMessageBuilder.mimeMessageBuilder() + .setFrom(from) + .build()) + .attribute(ICALToJsonAttribute.DEFAULT_SOURCE_ATTRIBUTE_NAME, icals) + .attribute(ICALToJsonAttribute.DEFAULT_RAW_SOURCE_ATTRIBUTE_NAME, rawIcals) + .build(); + testee.service(mail); + + Map<String, byte[]> jsons = (Map<String, byte[]>) mail.getAttribute(ICALToJsonAttribute.DEFAULT_DESTINATION_ATTRIBUTE_NAME); + assertThat(jsons).hasSize(1); + assertThatJson(new String(jsons.values().iterator().next(), Charsets.UTF_8)) + .isEqualTo("{" + + "\"ical\": \"" + toJsonValue(ics) +"\"," + + "\"sender\": \"" + from + "\"," + + "\"recipient\": \"" + recipient.asString() + "\"," + + "\"uid\": \"f1514f44bf39311568d640727cff54e819573448d09d2e5677987ff29caa01a9e047feb2aab16e43439a608f28671ab7c10e754ce92be513f8e04ae9ff15e65a9819cf285a6962bc\"," + + "\"sequence\": \"0\"," + + "\"dtstamp\": \"20170106T115036Z\"," + + "\"method\": \"REQUEST\"," + + "\"recurrence-id\": null" + + "}"); + } + + @SuppressWarnings("unchecked") + @Test + public void serviceShouldSupportMimeMessagesWithoutFromFields() throws Exception { + testee.init(FakeMailetConfig.builder().build()); + + byte[] ics = ByteStreams.toByteArray(ClassLoader.getSystemResourceAsStream("ics/meeting.ics")); + Calendar calendar = new CalendarBuilder().build(new ByteArrayInputStream(ics)); + ImmutableMap<String, Calendar> icals = ImmutableMap.of("key", calendar); + ImmutableMap<String, byte[]> rawIcals = ImmutableMap.of("key", ics); + MailAddress recipient = MailAddressFixture.ANY_AT_JAMES2; + Mail mail = FakeMail.builder() + .sender(SENDER) + .recipient(recipient) + .mimeMessage(MimeMessageBuilder.mimeMessageBuilder() + .build()) + .attribute(ICALToJsonAttribute.DEFAULT_SOURCE_ATTRIBUTE_NAME, icals) + .attribute(ICALToJsonAttribute.DEFAULT_RAW_SOURCE_ATTRIBUTE_NAME, rawIcals) + .build(); + testee.service(mail); + + Map<String, byte[]> jsons = (Map<String, byte[]>) mail.getAttribute(ICALToJsonAttribute.DEFAULT_DESTINATION_ATTRIBUTE_NAME); + assertThat(jsons).hasSize(1); + assertThatJson(new String(jsons.values().iterator().next(), Charsets.UTF_8)) + .isEqualTo("{" + + "\"ical\": \"" + toJsonValue(ics) +"\"," + + "\"sender\": \"" + SENDER.asString() + "\"," + + "\"recipient\": \"" + recipient.asString() + "\"," + + "\"uid\": \"f1514f44bf39311568d640727cff54e819573448d09d2e5677987ff29caa01a9e047feb2aab16e43439a608f28671ab7c10e754ce92be513f8e04ae9ff15e65a9819cf285a6962bc\"," + + "\"sequence\": \"0\"," + + "\"dtstamp\": \"20170106T115036Z\"," + + "\"method\": \"REQUEST\"," + + "\"recurrence-id\": null" + + "}"); + } + + @SuppressWarnings("unchecked") + @Test + public void serviceShouldUseFromWhenSpecifiedAndNoSender() throws Exception { + testee.init(FakeMailetConfig.builder().build()); + + byte[] ics = ByteStreams.toByteArray(ClassLoader.getSystemResourceAsStream("ics/meeting.ics")); + Calendar calendar = new CalendarBuilder().build(new ByteArrayInputStream(ics)); + ImmutableMap<String, Calendar> icals = ImmutableMap.of("key", calendar); + ImmutableMap<String, byte[]> rawIcals = ImmutableMap.of("key", ics); + MailAddress recipient = MailAddressFixture.ANY_AT_JAMES2; + String from = MailAddressFixture.OTHER_AT_JAMES.asString(); + Mail mail = FakeMail.builder() + .recipient(recipient) + .mimeMessage(MimeMessageBuilder.mimeMessageBuilder() + .setFrom(from) + .build()) + .attribute(ICALToJsonAttribute.DEFAULT_SOURCE_ATTRIBUTE_NAME, icals) + .attribute(ICALToJsonAttribute.DEFAULT_RAW_SOURCE_ATTRIBUTE_NAME, rawIcals) + .build(); + testee.service(mail); + + Map<String, byte[]> jsons = (Map<String, byte[]>) mail.getAttribute(ICALToJsonAttribute.DEFAULT_DESTINATION_ATTRIBUTE_NAME); + assertThat(jsons).hasSize(1); + assertThatJson(new String(jsons.values().iterator().next(), Charsets.UTF_8)) + .isEqualTo("{" + + "\"ical\": \"" + toJsonValue(ics) +"\"," + + "\"sender\": \"" + from + "\"," + + "\"recipient\": \"" + recipient.asString() + "\"," + + "\"uid\": \"f1514f44bf39311568d640727cff54e819573448d09d2e5677987ff29caa01a9e047feb2aab16e43439a608f28671ab7c10e754ce92be513f8e04ae9ff15e65a9819cf285a6962bc\"," + + "\"sequence\": \"0\"," + + "\"dtstamp\": \"20170106T115036Z\"," + + "\"method\": \"REQUEST\"," + + "\"recurrence-id\": null" + + "}"); + } + private List<String> toSortedValueList(Map<String, byte[]> jsons) { return jsons.values() .stream() http://git-wip-us.apache.org/repos/asf/james-project/blob/9ff71bd2/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/model/ICALTest.java ---------------------------------------------------------------------- diff --git a/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/model/ICALTest.java b/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/model/ICALTest.java index b4ce81e..99db64b 100644 --- a/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/model/ICALTest.java +++ b/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/model/ICALTest.java @@ -46,7 +46,7 @@ public class ICALTest { ICAL.builder() .recipient(MailAddressFixture.ANY_AT_JAMES) - .sender(MailAddressFixture.OTHER_AT_JAMES) + .sender(MailAddressFixture.OTHER_AT_JAMES.asString()) .build(); } @@ -71,7 +71,7 @@ public class ICALTest { Calendar calendar = new CalendarBuilder().build(new ByteArrayInputStream(ics)); ICAL.builder() - .sender(MailAddressFixture.OTHER_AT_JAMES) + .sender(MailAddressFixture.OTHER_AT_JAMES.asString()) .from(calendar, ics) .build(); } @@ -86,7 +86,7 @@ public class ICALTest { MailAddress sender = MailAddressFixture.OTHER_AT_JAMES; ICAL ical = ICAL.builder() .recipient(recipient) - .sender(sender) + .sender(sender.asString()) .from(calendar, ics) .build(); @@ -118,7 +118,7 @@ public class ICALTest { MailAddress sender = MailAddressFixture.OTHER_AT_JAMES; ICAL.builder() .recipient(recipient) - .sender(sender) + .sender(sender.asString()) .from(calendar, ics) .build(); } @@ -134,7 +134,7 @@ public class ICALTest { MailAddress sender = MailAddressFixture.OTHER_AT_JAMES; ICAL.builder() .recipient(recipient) - .sender(sender) + .sender(sender.asString()) .from(calendar, ics) .build(); } @@ -150,7 +150,7 @@ public class ICALTest { MailAddress sender = MailAddressFixture.OTHER_AT_JAMES; ICAL.builder() .recipient(recipient) - .sender(sender) + .sender(sender.asString()) .from(calendar, ics) .build(); } @@ -164,7 +164,7 @@ public class ICALTest { MailAddress sender = MailAddressFixture.OTHER_AT_JAMES; ICAL ical = ICAL.builder() .recipient(recipient) - .sender(sender) + .sender(sender.asString()) .from(calendar, ics) .build(); http://git-wip-us.apache.org/repos/asf/james-project/blob/9ff71bd2/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java index 2cd1b5c..1ed4020 100644 --- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java @@ -33,7 +33,6 @@ import org.apache.james.mailets.configuration.MailetContainer; import org.apache.james.mailets.configuration.ProcessorConfiguration; import org.apache.james.mailets.utils.IMAPMessageReader; import org.apache.james.mailets.utils.SMTPMessageSender; -import org.apache.james.queue.activemq.MimeMessageBlobMessageSource; import org.apache.james.transport.mailets.amqp.AmqpRule; import org.apache.james.util.streams.SwarmGenericContainer; import org.apache.mailet.Mail; @@ -551,7 +550,7 @@ public class ICSAttachmentWorkflowTest { .setSubject("test") .build(); - yahooInvitationMessage = new MimeMessage(null, ClassLoader.getSystemResourceAsStream("yahooInvitation.eml")); + yahooInvitationMessage = MimeMessageBuilder.mimeMessageFromStream(ClassLoader.getSystemResourceAsStream("eml/yahooInvitation.eml")); messageWithThreeICSAttached = MimeMessageBuilder.mimeMessageBuilder() .setMultipartWithBodyParts( @@ -749,7 +748,7 @@ public class ICSAttachmentWorkflowTest { Optional<String> content = amqpRule.readContent(); assertThat(content).isPresent(); DocumentContext jsonPath = toJsonPath(content.get()); - assertThat(jsonPath.<String> read("sender")).isEqualTo(FROM); + assertThat(jsonPath.<String> read("sender")).isEqualTo("[email protected]"); assertThat(jsonPath.<String> read("recipient")).isEqualTo(RECIPIENT); assertThat(jsonPath.<String> read("uid")).isEqualTo("5014513f-1026-4b58-82cf-80d4fc060bbe"); assertThat(jsonPath.<String> read("sequence")).isEqualTo("0"); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
