You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2017/01/24 09:49:46 UTC
[4/4] james-project git commit: MAILET-149 JSON created from ICAL
should better use From when available and backup to sender envelope
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 <bt...@linagora.com>
Authored: Tue Jan 24 09:29:54 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
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("obmlinagora@yahoo.fr");
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org