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]

Reply via email to