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 rc...@apache.org on 2020/02/03 07:28:03 UTC

[james-project] branch master updated (e52ffc5 -> ea264f3)

This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git.


    from e52ffc5  fix inlined datasource name in grafana dashboards
     new 6966e2f  fix grafana dashboard quote query to avoid problems with hyphens
     new 0ed54bf  fix grafana imap dashboard not reporting IMAP CREATE metrics
     new d3b38d5  [Refactoring] Migrate SpamAssassinConfigurationTest to JUnit 5
     new c3e93f3  [Refactoring] Migrate SpamAssassinListenerTest to JUnit 5
     new 2759aa2  [Refactoring] Migrate ElasticSearchQuotaMailboxListenerTest to JUnit 5
     new 76e0eb1  [Refactoring] Small access modifiers cleanup in test classes in mailbox-quota-search-elasticsearch module
     new f2e375a  [Refactoring] Migrate InMemoryCurrentQuotaManagerTest to JUnit 5
     new ab69bf8  [Refactoring] Migrate InMemoryMailboxIdDeserializerTest to JUnit 5
     new 8f6ea31  [Refactoring] Migrate InMemoryMessageIdTest to JUnit 5
     new e57152c  [Refactoring] Small access modifiers cleanup in test classes in mailbox-memory module
     new 63dda69  JAMES-3016 Create ConvertTo7Bit unit test
     new c861ab3  JAMES-3016 Extract 7Bit converter to a common class
     new c445784  JAMES-3016 Converter7Bit tail recursive optimization
     new ea264f3  JAMES-3030 make Reactor toInputStream 50 times faster

The 14 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../Cassandra_driver-1504068385404-dashboard.json  |  12 +-
 .../IMAP_board-1488774825351-dashboard.json        |  40 ++--
 .../IMAP_count_board-1488774815587-dashboard.json  |  38 ++--
 ...AMES_DNS_dashboard-1491268903944-dashboard.json |  20 +-
 .../JMAP_board-1488774804236-dashboard.json        |  42 ++---
 .../JMAP_count_board-1488774795514-dashboard.json  |  24 +--
 .../James_JVM-1504068360629-dashboard.json         |  26 +--
 .../MAILET-1490071694187-dashboard.json            |  38 ++--
 .../MATCHER-1490071813409-dashboard.json           |  10 +-
 .../MailQueue-1490071879988-dashboard.json         |   2 +-
 .../MailboxListeners rate-1552903378376.json       |  12 +-
 .../MailboxListeners-1528958667486-dashboard.json  |  12 +-
 .../Miscalleneous-1490072265151-dashboard.json     |  28 +--
 .../PreDeletionHooks-1553684324244-dashboard.json  |   2 +-
 .../SMTP_board-1488774774172-dashboard.json        |  12 +-
 .../SMTP_count_board-1488774761350-dashboard.json  |  12 +-
 .../SpamAssassin-1522226824255-dashboard.json      |  12 +-
 .../Tika-1522226794419-dashboard.json              |  20 +-
 .../inmemory/InMemoryCombinationManagerTest.java   |   2 +-
 .../InMemoryMailboxIdDeserializerTest.java         |  28 +--
 .../mailbox/inmemory/InMemoryMessageIdTest.java    |   8 +-
 .../inmemory/MemoryMailboxManagerStressTest.java   |   2 +-
 .../mailbox/inmemory/MemoryMailboxManagerTest.java |   2 +-
 .../mail/InMemoryMailboxManagerAttachmentTest.java |   4 +-
 .../inmemory/mail/MemoryAnnotationMapperTest.java  |   2 +-
 .../inmemory/mail/MemoryMailboxMapperAclTest.java  |   2 +-
 .../inmemory/mail/MemoryMailboxMapperTest.java     |   2 +-
 .../InMemoryQuotaMailboxMessageManagerTest.java    |   4 +-
 .../quota/InMemoryCurrentQuotaManagerTest.java     |  79 ++++----
 .../elasticsearch/QuotaQueryConverterTest.java     |   2 +-
 .../ElasticSearchQuotaMailboxListenerTest.java     |  39 ++--
 .../elasticsearch/json/QuotaRatioAsJsonTest.java   |   4 +-
 .../json/QuotaRatioToElasticSearchJsonTest.java    |   2 +-
 .../SpamAssassinConfigurationTest.java             |  10 +-
 .../spamassassin/SpamAssassinListenerTest.java     |  70 +++----
 .../org/apache/mailet/base}/Converter7Bit.java     |  29 +--
 .../org/apache/mailet/base/Converter7BitTest.java  | 203 +++++++++++++++++++++
 .../eml/multipart-7bit-attachment-content.txt      |  98 ++++++++++
 .../base/src/test/resources/eml/multipart-7bit.eml | 142 ++++++++++++++
 .../eml/multipart-8bit-attachment-content.txt      |  92 ++++++++++
 .../base/src/test/resources/eml/multipart-8bit.eml | 128 +++++++++++++
 .../base/src/test/resources/eml/text-only-7bit.eml |  27 +++
 .../base/src/test/resources/eml/text-only-8bit.eml |  29 +++
 .../java/org/apache/james/util/ReactorUtils.java   |  77 ++++----
 .../org/apache/james/util/ReactorUtilsTest.java    |  67 +++++--
 .../apache/james/jdkim/mailets/ConvertTo7Bit.java  |  45 ++---
 .../remote/delivery/MailDelivrerToHost.java        |   1 +
 47 files changed, 1152 insertions(+), 410 deletions(-)
 rename {server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery => mailet/base/src/main/java/org/apache/mailet/base}/Converter7Bit.java (77%)
 create mode 100644 mailet/base/src/test/java/org/apache/mailet/base/Converter7BitTest.java
 create mode 100644 mailet/base/src/test/resources/eml/multipart-7bit-attachment-content.txt
 create mode 100644 mailet/base/src/test/resources/eml/multipart-7bit.eml
 create mode 100644 mailet/base/src/test/resources/eml/multipart-8bit-attachment-content.txt
 create mode 100644 mailet/base/src/test/resources/eml/multipart-8bit.eml
 create mode 100644 mailet/base/src/test/resources/eml/text-only-7bit.eml
 create mode 100644 mailet/base/src/test/resources/eml/text-only-8bit.eml


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 01/14: fix grafana dashboard quote query to avoid problems with hyphens

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 6966e2fbd4fcfb0be0efce49204e8114fd35c0ac
Author: Rémi KOWALSKI <rk...@linagora.com>
AuthorDate: Wed Jan 29 11:56:08 2020 +0100

    fix grafana dashboard quote query to avoid problems with hyphens
---
 .../Cassandra_driver-1504068385404-dashboard.json  | 12 +++----
 .../IMAP_board-1488774825351-dashboard.json        | 38 ++++++++++----------
 .../IMAP_count_board-1488774815587-dashboard.json  | 38 ++++++++++----------
 ...AMES_DNS_dashboard-1491268903944-dashboard.json | 20 +++++------
 .../JMAP_board-1488774804236-dashboard.json        | 42 +++++++++++-----------
 .../JMAP_count_board-1488774795514-dashboard.json  | 24 ++++++-------
 .../James_JVM-1504068360629-dashboard.json         | 26 +++++++-------
 .../MAILET-1490071694187-dashboard.json            | 38 ++++++++++----------
 .../MATCHER-1490071813409-dashboard.json           | 10 +++---
 .../MailQueue-1490071879988-dashboard.json         |  2 +-
 .../MailboxListeners rate-1552903378376.json       | 12 +++----
 .../MailboxListeners-1528958667486-dashboard.json  | 12 +++----
 .../Miscalleneous-1490072265151-dashboard.json     | 28 +++++++--------
 .../PreDeletionHooks-1553684324244-dashboard.json  |  2 +-
 .../SMTP_board-1488774774172-dashboard.json        | 12 +++----
 .../SMTP_count_board-1488774761350-dashboard.json  | 12 +++----
 .../SpamAssassin-1522226824255-dashboard.json      | 12 +++----
 .../Tika-1522226794419-dashboard.json              | 20 +++++------
 18 files changed, 180 insertions(+), 180 deletions(-)

diff --git a/grafana-reporting/Cassandra_driver-1504068385404-dashboard.json b/grafana-reporting/Cassandra_driver-1504068385404-dashboard.json
index 8db433c..bdb7ec4 100644
--- a/grafana-reporting/Cassandra_driver-1504068385404-dashboard.json
+++ b/grafana-reporting/Cassandra_driver-1504068385404-dashboard.json
@@ -110,7 +110,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:requests",
+              "query": "name:\"requests\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -223,7 +223,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:requests",
+              "query": "name:\"requests\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -341,7 +341,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:executor-queue-depth",
+              "query": "name:\"executor-queue-depth\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -447,7 +447,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:task-scheduler-task-count",
+              "query": "name:\"task-scheduler-task-count\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -553,7 +553,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:blocking-executor-queue-depth",
+              "query": "name:\"blocking-executor-queue-depth\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -659,7 +659,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:open-connections",
+              "query": "name:\"open-connections\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
diff --git a/grafana-reporting/IMAP_board-1488774825351-dashboard.json b/grafana-reporting/IMAP_board-1488774825351-dashboard.json
index 901271d..e532731 100644
--- a/grafana-reporting/IMAP_board-1488774825351-dashboard.json
+++ b/grafana-reporting/IMAP_board-1488774825351-dashboard.json
@@ -97,7 +97,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:imapConnections",
+              "query": "name:\"imapConnections\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -210,7 +210,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-LOGIN",
+              "query": "name:\"IMAP-LOGIN\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -323,7 +323,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-CAPABILITY",
+              "query": "name:\"IMAP-CAPABILITY\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -436,7 +436,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-AUTHENTICATE",
+              "query": "name:\"IMAP-AUTHENTICATE\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -561,7 +561,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-SELECT",
+              "query": "name:\"IMAP-SELECT\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -674,7 +674,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-GETQUOTAROOT",
+              "query": "name:\"IMAP-GETQUOTAROOT\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -787,7 +787,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-FETCH",
+              "query": "name:\"IMAP-FETCH\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -900,7 +900,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-APPEND",
+              "query": "name:\"IMAP-APPEND\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1025,7 +1025,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-IDLE",
+              "query": "name:\"IMAP-IDLE\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1138,7 +1138,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-NOOP",
+              "query": "name:\"IMAP-NOOP\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1251,7 +1251,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-STORE",
+              "query": "name:\"IMAP-STORE\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1364,7 +1364,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-LSUB",
+              "query": "name:\"IMAP-LSUB\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1489,7 +1489,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-NAMESPACE",
+              "query": "name:\"IMAP-NAMESPACE\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1602,7 +1602,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-CLOSE",
+              "query": "name:\"IMAP-CLOSE\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1715,7 +1715,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-LOGOUT",
+              "query": "name:\"IMAP-LOGOUT\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1828,7 +1828,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-LIST",
+              "query": "name:\"IMAP-LIST\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1953,7 +1953,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP_CREATE",
+              "query": "name:\"IMAP_CREATE\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -2066,7 +2066,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-COPY",
+              "query": "name:\"IMAP-COPY\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -2179,7 +2179,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:IMAP-MOVE",
+              "query": "name:\"IMAP-MOVE\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
diff --git a/grafana-reporting/IMAP_count_board-1488774815587-dashboard.json b/grafana-reporting/IMAP_count_board-1488774815587-dashboard.json
index 70d5183..6e4d94f 100644
--- a/grafana-reporting/IMAP_count_board-1488774815587-dashboard.json
+++ b/grafana-reporting/IMAP_count_board-1488774815587-dashboard.json
@@ -97,7 +97,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:imapConnections",
+              "query": "name:\"imapConnections\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -202,7 +202,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-LOGIN",
+              "query": "name:\"IMAP-LOGIN\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -307,7 +307,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-CAPABILITY",
+              "query": "name:\"IMAP-CAPABILITY\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -412,7 +412,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-AUTHENTICATE",
+              "query": "name:\"IMAP-AUTHENTICATE\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -529,7 +529,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-SELECT",
+              "query": "name:\"IMAP-SELECT\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -634,7 +634,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-GETQUOTAROOT",
+              "query": "name:\"IMAP-GETQUOTAROOT\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -739,7 +739,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-FETCH",
+              "query": "name:\"IMAP-FETCH\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -844,7 +844,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-APPEND",
+              "query": "name:\"IMAP-APPEND\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -961,7 +961,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-IDLE",
+              "query": "name:\"IMAP-IDLE\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1066,7 +1066,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-NOOP",
+              "query": "name:\"IMAP-NOOP\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1171,7 +1171,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-STORE",
+              "query": "name:\"IMAP-STORE\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1276,7 +1276,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-LSUB",
+              "query": "name:\"IMAP-LSUB\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1393,7 +1393,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-NAMESPACE",
+              "query": "name:\"IMAP-NAMESPACE\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1498,7 +1498,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-CLOSE",
+              "query": "name:\"IMAP-CLOSE\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1603,7 +1603,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-LOGOUT",
+              "query": "name:\"IMAP-LOGOUT\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1708,7 +1708,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-LIST",
+              "query": "name:\"IMAP-LIST\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1825,7 +1825,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-CREATE",
+              "query": "name:\"IMAP-CREATE\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1930,7 +1930,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-COPY",
+              "query": "name:\"IMAP-COPY\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -2035,7 +2035,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:IMAP-MOVE",
+              "query": "name:\"IMAP-MOVE\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
diff --git a/grafana-reporting/JAMES_DNS_dashboard-1491268903944-dashboard.json b/grafana-reporting/JAMES_DNS_dashboard-1491268903944-dashboard.json
index e7ecaab..34526c3 100644
--- a/grafana-reporting/JAMES_DNS_dashboard-1491268903944-dashboard.json
+++ b/grafana-reporting/JAMES_DNS_dashboard-1491268903944-dashboard.json
@@ -117,7 +117,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:findMXRecords",
+              "query": "name:\"findMXRecords\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -230,7 +230,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:getByName",
+              "query": "name:\"getByName\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -343,7 +343,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:getAllByName",
+              "query": "name:\"getAllByName\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -468,7 +468,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:getHostName",
+              "query": "name:\"getHostName\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -581,7 +581,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:findTXTRecords",
+              "query": "name:\"findTXTRecords\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -706,7 +706,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:getHostName",
+              "query": "name:\"getHostName\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -819,7 +819,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:findMXRecords",
+              "query": "name:\"findMXRecords\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -932,7 +932,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:findTXTRecords",
+              "query": "name:\"findTXTRecords\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1049,7 +1049,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:getByName",
+              "query": "name:\"getByName\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1154,7 +1154,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:getAllByName",
+              "query": "name:\"getAllByName\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
diff --git a/grafana-reporting/JMAP_board-1488774804236-dashboard.json b/grafana-reporting/JMAP_board-1488774804236-dashboard.json
index 85acae4..b90a657 100644
--- a/grafana-reporting/JMAP_board-1488774804236-dashboard.json
+++ b/grafana-reporting/JMAP_board-1488774804236-dashboard.json
@@ -117,7 +117,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-request",
+              "query": "name:\"JMAP-request\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -230,7 +230,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-getMailboxes",
+              "query": "name:\"JMAP-getMailboxes\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -343,7 +343,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-getMessageList",
+              "query": "name:\"JMAP-getMessageList\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -456,7 +456,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-getMessages",
+              "query": "name:\"JMAP-getMessages\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -581,7 +581,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-SetMessageDestructionProcessor",
+              "query": "name:\"JMAP-SetMessageDestructionProcessor\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -694,7 +694,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-SetMessagesUpdateProcessor",
+              "query": "name:\"JMAP-SetMessagesUpdateProcessor\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -807,7 +807,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-SetMessageCreationProcessor",
+              "query": "name:\"JMAP-SetMessageCreationProcessor\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -920,7 +920,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-setMessages",
+              "query": "name:\"JMAP-setMessages\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1045,7 +1045,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-SetMailboxesDestructionProcessor",
+              "query": "name:\"JMAP-SetMailboxesDestructionProcessor\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1158,7 +1158,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-SetMailboxesCreationProcessor",
+              "query": "name:\"JMAP-SetMailboxesCreationProcessor\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1271,7 +1271,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-mailboxUpdateProcessor",
+              "query": "name:\"JMAP-mailboxUpdateProcessor\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1384,7 +1384,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-setMailboxes",
+              "query": "name:\"JMAP-setMailboxes\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1509,7 +1509,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-getVacationResponse",
+              "query": "name:\"JMAP-getVacationResponse\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1622,7 +1622,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-setVacationResponse",
+              "query": "name:\"JMAP-setVacationResponse\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1735,7 +1735,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-mailboxes-provisioning",
+              "query": "name:\"JMAP-mailboxes-provisioning\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1848,7 +1848,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-user-provisioning",
+              "query": "name:\"JMAP-user-provisioning\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1973,7 +1973,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-upload-post",
+              "query": "name:\"JMAP-upload-post\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -2086,7 +2086,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-download-post",
+              "query": "name:\"JMAP-download-post\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -2199,7 +2199,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-download-get",
+              "query": "name:\"JMAP-download-get\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -2312,7 +2312,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-authentication-post",
+              "query": "name:\"JMAP-authentication-post\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -2437,7 +2437,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:JMAP-authentication-filter",
+              "query": "name:\"JMAP-authentication-filter\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
diff --git a/grafana-reporting/JMAP_count_board-1488774795514-dashboard.json b/grafana-reporting/JMAP_count_board-1488774795514-dashboard.json
index 3ac108f..4c118f1 100644
--- a/grafana-reporting/JMAP_count_board-1488774795514-dashboard.json
+++ b/grafana-reporting/JMAP_count_board-1488774795514-dashboard.json
@@ -114,7 +114,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:JMAP-request",
+              "query": "name:\"JMAP-request\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -224,7 +224,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:JMAP-getMailboxes",
+              "query": "name:\"JMAP-getMailboxes\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -334,7 +334,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:JMAP-getMessageList",
+              "query": "name:\"JMAP-getMessageList\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -444,7 +444,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:JMAP-getMessages",
+              "query": "name:\"JMAP-getMessages\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -566,7 +566,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:JMAP-setMessages",
+              "query": "name:\"JMAP-setMessages\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -676,7 +676,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:JMAP-setMailboxes",
+              "query": "name:\"JMAP-setMailboxes\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -786,7 +786,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:JMAP-getVacationResponse",
+              "query": "name:\"JMAP-getVacationResponse\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -896,7 +896,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:JMAP-setVacationResponse",
+              "query": "name:\"JMAP-setVacationResponse\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1018,7 +1018,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:JMAP-upload-post",
+              "query": "name:\"JMAP-upload-post\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1128,7 +1128,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:JMAP-download-post",
+              "query": "name:\"JMAP-download-post\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1238,7 +1238,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:JMAP-download-get",
+              "query": "name:\"JMAP-download-get\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1348,7 +1348,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:JMAP-authentication-post",
+              "query": "name:\"JMAP-authentication-post\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
diff --git a/grafana-reporting/James_JVM-1504068360629-dashboard.json b/grafana-reporting/James_JVM-1504068360629-dashboard.json
index 08a6b01..75979f4 100644
--- a/grafana-reporting/James_JVM-1504068360629-dashboard.json
+++ b/grafana-reporting/James_JVM-1504068360629-dashboard.json
@@ -110,7 +110,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:jvm.file.descriptor",
+              "query": "name:\"jvm.file.descriptor\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -216,7 +216,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:jvm.threads.count",
+              "query": "name:\"jvm.threads.count\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -322,7 +322,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:jvm.threads.deadlock.count",
+              "query": "name:\"jvm.threads.deadlock.count\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -432,7 +432,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:jvm.memory.total.max",
+              "query": "name:\"jvm.memory.total.max\"",
               "refId": "A",
               "timeField": "@timestamp"
             },
@@ -459,7 +459,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:jvm.memory.total.used",
+              "query": "name:\"jvm.memory.total.used\"",
               "refId": "B",
               "timeField": "@timestamp"
             }
@@ -557,7 +557,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:jvm.memory.heap.max",
+              "query": "name:\"jvm.memory.heap.max\"",
               "refId": "A",
               "timeField": "@timestamp"
             },
@@ -585,7 +585,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:jvm.memory.heap.used",
+              "query": "name:\"jvm.memory.heap.used\"",
               "refId": "B",
               "timeField": "@timestamp"
             }
@@ -683,7 +683,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:jvm.memory.non-heap.max",
+              "query": "name:\"jvm.memory.non-heap.max\"",
               "refId": "A",
               "timeField": "@timestamp"
             },
@@ -711,7 +711,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:jvm.memory.non-heap.used",
+              "query": "name:\"jvm.memory.non-heap.used\"",
               "refId": "B",
               "timeField": "@timestamp"
             }
@@ -809,7 +809,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:jvm.class.loading.loaded",
+              "query": "name:\"jvm.class.loading.loaded\"",
               "refId": "A",
               "timeField": "@timestamp"
             },
@@ -837,7 +837,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:jvm.class.loading.unloaded",
+              "query": "name:\"jvm.class.loading.unloaded\"",
               "refId": "B",
               "timeField": "@timestamp"
             }
@@ -955,7 +955,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:jvm.gc.count",
+              "query": "name:\"jvm.gc.count\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1061,7 +1061,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:jvm.gc.time",
+              "query": "name:\"jvm.gc.time\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
diff --git a/grafana-reporting/MAILET-1490071694187-dashboard.json b/grafana-reporting/MAILET-1490071694187-dashboard.json
index 9926197..0be1142 100644
--- a/grafana-reporting/MAILET-1490071694187-dashboard.json
+++ b/grafana-reporting/MAILET-1490071694187-dashboard.json
@@ -117,7 +117,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:LocalDelivery",
+              "query": "name:\"LocalDelivery\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -230,7 +230,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:spoolProcessing",
+              "query": "name:\"spoolProcessing\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -343,7 +343,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:RemoteDelivery",
+              "query": "name:\"RemoteDelivery\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -456,7 +456,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:ToProcessor",
+              "query": "name:\"ToProcessor\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -581,7 +581,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:PostmasterAlias",
+              "query": "name:\"PostmasterAlias\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -694,7 +694,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:Bounce",
+              "query": "name:\"Bounce\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -807,7 +807,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:ToRepository",
+              "query": "name:\"ToRepository\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -920,7 +920,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:MetricsMailet",
+              "query": "name:\"MetricsMailet\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1045,7 +1045,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:SetMimeHeader",
+              "query": "name:\"SetMimeHeader\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1158,7 +1158,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:RemoveMimeHeader",
+              "query": "name:\"RemoveMimeHeader\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1271,7 +1271,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:RecipientRewriteTable",
+              "query": "name:\"RecipientRewriteTable\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1384,7 +1384,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:StripAttachment",
+              "query": "name:\"StripAttachment\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1509,7 +1509,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:MimeDecodingMailet",
+              "query": "name:\"MimeDecodingMailet\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1622,7 +1622,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:ICalendarParser",
+              "query": "name:\"ICalendarParser\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1735,7 +1735,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:ICALToHeader",
+              "query": "name:\"ICALToHeader\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1848,7 +1848,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:ICALToJsonAttribute",
+              "query": "name:\"ICALToJsonAttribute\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1973,7 +1973,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:AmqpForwardAttribute",
+              "query": "name:\"AmqpForwardAttribute\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -2086,7 +2086,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:VacationMailet",
+              "query": "name:\"VacationMailet\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -2199,7 +2199,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:RemoteDeliveryTrial",
+              "query": "name:\"RemoteDeliveryTrial\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
diff --git a/grafana-reporting/MATCHER-1490071813409-dashboard.json b/grafana-reporting/MATCHER-1490071813409-dashboard.json
index a966cbb..b948e4e 100644
--- a/grafana-reporting/MATCHER-1490071813409-dashboard.json
+++ b/grafana-reporting/MATCHER-1490071813409-dashboard.json
@@ -117,7 +117,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:All",
+              "query": "name:\"All\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -230,7 +230,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:spoolProcessing",
+              "query": "name:\"spoolProcessing\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -343,7 +343,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:SMTPAuthSuccessful",
+              "query": "name:\"SMTPAuthSuccessful\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -468,7 +468,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:RecipientIsLocal",
+              "query": "name:\"RecipientIsLocal\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -581,7 +581,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:HasMailAttribute",
+              "query": "name:\"HasMailAttribute\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
diff --git a/grafana-reporting/MailQueue-1490071879988-dashboard.json b/grafana-reporting/MailQueue-1490071879988-dashboard.json
index af03b4d..56b9f1c 100644
--- a/grafana-reporting/MailQueue-1490071879988-dashboard.json
+++ b/grafana-reporting/MailQueue-1490071879988-dashboard.json
@@ -997,7 +997,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:spoolProcessing",
+              "query": "name:\"spoolProcessing\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
diff --git a/grafana-reporting/MailboxListeners rate-1552903378376.json b/grafana-reporting/MailboxListeners rate-1552903378376.json
index 84be681..ece9c76 100644
--- a/grafana-reporting/MailboxListeners rate-1552903378376.json	
+++ b/grafana-reporting/MailboxListeners rate-1552903378376.json	
@@ -109,7 +109,7 @@
               "type": "avg"
             }
           ],
-          "query": "name:mailbox-listener-ElasticSearchListeningMessageSearchIndex",
+          "query": "name:\"mailbox-listener-ElasticSearchListeningMessageSearchIndex\"",
           "refId": "A",
           "timeField": "@timestamp"
         }
@@ -236,7 +236,7 @@
               "type": "avg"
             }
           ],
-          "query": "name:mailbox-listener-ElasticSearchQuotaMailboxListener",
+          "query": "name:\"mailbox-listener-ElasticSearchQuotaMailboxListener\"",
           "refId": "A",
           "timeField": "@timestamp"
         }
@@ -363,7 +363,7 @@
               "type": "avg"
             }
           ],
-          "query": "name:mailbox-listener-SpamAssassinListener",
+          "query": "name:\"mailbox-listener-SpamAssassinListener\"",
           "refId": "A",
           "timeField": "@timestamp"
         }
@@ -490,7 +490,7 @@
               "type": "avg"
             }
           ],
-          "query": "name:mailbox-listener-ListeningCurrentQuotaUpdater",
+          "query": "name:\"mailbox-listener-ListeningCurrentQuotaUpdater\"",
           "refId": "A",
           "timeField": "@timestamp"
         }
@@ -617,7 +617,7 @@
               "type": "avg"
             }
           ],
-          "query": "name:mailbox-listener-MailboxAnnotationListener",
+          "query": "name:\"mailbox-listener-MailboxAnnotationListener\"",
           "refId": "A",
           "timeField": "@timestamp"
         }
@@ -744,7 +744,7 @@
               "type": "avg"
             }
           ],
-          "query": "name: mailbox-listener-QuotaThresholdCrossingListener",
+          "query": "name:\" mailbox-listener-QuotaThresholdCrossingListener\"",
           "refId": "A",
           "timeField": "@timestamp"
         }
diff --git a/grafana-reporting/MailboxListeners-1528958667486-dashboard.json b/grafana-reporting/MailboxListeners-1528958667486-dashboard.json
index 86cd8c7..017059d 100644
--- a/grafana-reporting/MailboxListeners-1528958667486-dashboard.json
+++ b/grafana-reporting/MailboxListeners-1528958667486-dashboard.json
@@ -117,7 +117,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:mailbox-listener-ElasticSearchListeningMessageSearchIndex",
+              "query": "name:\"mailbox-listener-ElasticSearchListeningMessageSearchIndex\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -230,7 +230,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:mailbox-listener-ElasticSearchQuotaMailboxListener",
+              "query": "name:\"mailbox-listener-ElasticSearchQuotaMailboxListener\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -343,7 +343,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:mailbox-listener-SpamAssassinListener",
+              "query": "name:\"mailbox-listener-SpamAssassinListener\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -468,7 +468,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:mailbox-listener-ListeningCurrentQuotaUpdater",
+              "query": "name:\"mailbox-listener-ListeningCurrentQuotaUpdater\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -581,7 +581,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:mailbox-listener-MailboxAnnotationListener",
+              "query": "name:\"mailbox-listener-MailboxAnnotationListener\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -694,7 +694,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name: mailbox-listener-QuotaThresholdCrossingListener",
+              "query": "name:\" mailbox-listener-QuotaThresholdCrossingListener\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
diff --git a/grafana-reporting/Miscalleneous-1490072265151-dashboard.json b/grafana-reporting/Miscalleneous-1490072265151-dashboard.json
index e5fcce8..8c9e33d 100644
--- a/grafana-reporting/Miscalleneous-1490072265151-dashboard.json
+++ b/grafana-reporting/Miscalleneous-1490072265151-dashboard.json
@@ -98,7 +98,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:imapConnections",
+              "query": "name:\"imapConnections\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -191,7 +191,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:smtpConnections",
+              "query": "name:\"smtpConnections\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -284,7 +284,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:lmtpConnections",
+              "query": "name:\"lmtpConnections\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -389,7 +389,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:imapCommands",
+              "query": "name:\"imapCommands\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -482,7 +482,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:smtpCommands",
+              "query": "name:\"smtpCommands\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -575,7 +575,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:lmtpCommands",
+              "query": "name:\"lmtpCommands\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -668,7 +668,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:JMAP-request",
+              "query": "name:\"JMAP-request\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -773,7 +773,7 @@
                   "type": "cardinality"
                 }
               ],
-              "query": "name:outgoingMails",
+              "query": "name:\"outgoingMails\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -959,7 +959,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:localDeliveredMails",
+              "query": "name:\"localDeliveredMails\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1157,7 +1157,7 @@
                   "type": "cardinality"
                 }
               ],
-              "query": "name:mailet-relay-denied",
+              "query": "name:\"mailet-relay-denied\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1250,7 +1250,7 @@
                   "type": "cardinality"
                 }
               ],
-              "query": "name:mailet-local-address-error",
+              "query": "name:\"mailet-local-address-error\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1343,7 +1343,7 @@
                   "type": "cardinality"
                 }
               ],
-              "query": "name:mailet-bounce",
+              "query": "name:\"mailet-bounce\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1436,7 +1436,7 @@
                   "type": "cardinality"
                 }
               ],
-              "query": "name:mailet-error",
+              "query": "name:\"mailet-error\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -1561,7 +1561,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:webAdmin",
+              "query": "name:\"webAdmin\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
diff --git a/grafana-reporting/PreDeletionHooks-1553684324244-dashboard.json b/grafana-reporting/PreDeletionHooks-1553684324244-dashboard.json
index 71369c8..f0b2987 100644
--- a/grafana-reporting/PreDeletionHooks-1553684324244-dashboard.json
+++ b/grafana-reporting/PreDeletionHooks-1553684324244-dashboard.json
@@ -97,7 +97,7 @@
               "type": "avg"
             }
           ],
-          "query": "name:preDeletionHook",
+          "query": "name:\"preDeletionHook\"",
           "refId": "A",
           "timeField": "@timestamp"
         }
diff --git a/grafana-reporting/SMTP_board-1488774774172-dashboard.json b/grafana-reporting/SMTP_board-1488774774172-dashboard.json
index 2d2cf03..459e6c2 100644
--- a/grafana-reporting/SMTP_board-1488774774172-dashboard.json
+++ b/grafana-reporting/SMTP_board-1488774774172-dashboard.json
@@ -97,7 +97,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:smtpConnections",
+              "query": "name:\"smtpConnections\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -210,7 +210,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:SMTP-ehlo",
+              "query": "name:\"SMTP-ehlo\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -335,7 +335,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:SMTP-quit",
+              "query": "name:\"SMTP-quit\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -448,7 +448,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:SMTP-DATA",
+              "query": "name:\"SMTP-DATA\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -573,7 +573,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:SMTP-rcpt",
+              "query": "name:\"SMTP-rcpt\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -686,7 +686,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:SMTP-mail",
+              "query": "name:\"SMTP-mail\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
diff --git a/grafana-reporting/SMTP_count_board-1488774761350-dashboard.json b/grafana-reporting/SMTP_count_board-1488774761350-dashboard.json
index 2708463..e54c2b4 100644
--- a/grafana-reporting/SMTP_count_board-1488774761350-dashboard.json
+++ b/grafana-reporting/SMTP_count_board-1488774761350-dashboard.json
@@ -97,7 +97,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:smtpConnections",
+              "query": "name:\"smtpConnections\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -202,7 +202,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:SMTP-ehlo",
+              "query": "name:\"SMTP-ehlo\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -319,7 +319,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:SMTP-DATA",
+              "query": "name:\"SMTP-DATA\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -424,7 +424,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:SMTP-quit",
+              "query": "name:\"SMTP-quit\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -541,7 +541,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:SMTP-rcpt",
+              "query": "name:\"SMTP-rcpt\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -646,7 +646,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:SMTP-mail",
+              "query": "name:\"SMTP-mail\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
diff --git a/grafana-reporting/SpamAssassin-1522226824255-dashboard.json b/grafana-reporting/SpamAssassin-1522226824255-dashboard.json
index ab00c70..ee3940b 100644
--- a/grafana-reporting/SpamAssassin-1522226824255-dashboard.json
+++ b/grafana-reporting/SpamAssassin-1522226824255-dashboard.json
@@ -97,7 +97,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:spamAssassin-check",
+              "query": "name:\"spamAssassin-check\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -210,7 +210,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:spamAssassin-check",
+              "query": "name:\"spamAssassin-check\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -315,7 +315,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:spamAssassin-spam-report",
+              "query": "name:\"spamAssassin-spam-report\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -428,7 +428,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:spamAssassin-spam-report",
+              "query": "name:\"spamAssassin-spam-report\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -533,7 +533,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:spamAssassin-ham-report",
+              "query": "name:\"spamAssassin-ham-report\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -646,7 +646,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:spamAssassin-ham-report",
+              "query": "name:\"spamAssassin-ham-report\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
diff --git a/grafana-reporting/Tika-1522226794419-dashboard.json b/grafana-reporting/Tika-1522226794419-dashboard.json
index ea6a552..66b4d5a 100644
--- a/grafana-reporting/Tika-1522226794419-dashboard.json
+++ b/grafana-reporting/Tika-1522226794419-dashboard.json
@@ -110,7 +110,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:tikaTextExtraction",
+              "query": "name:\"tikaTextExtraction\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -223,7 +223,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:tikaTextExtraction",
+              "query": "name:\"tikaTextExtraction\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -333,7 +333,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:textExtractor.cache.hit.rate",
+              "query": "name:\"textExtractor.cache.hit.rate\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -431,7 +431,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:textExtractor.cache.size",
+              "query": "name:\"textExtractor.cache.size\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -529,7 +529,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:textExtractor.cache.weight",
+              "query": "name:\"textExtractor.cache.weight\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -636,7 +636,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:textExtractor.cache.hit.count",
+              "query": "name:\"textExtractor.cache.hit.count\"",
               "refId": "A",
               "timeField": "@timestamp"
             },
@@ -674,7 +674,7 @@
                   "type": "derivative"
                 }
               ],
-              "query": "name:textExtractor.cache.miss.count",
+              "query": "name:\"textExtractor.cache.miss.count\"",
               "refId": "B",
               "timeField": "@timestamp"
             }
@@ -785,7 +785,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:textExtractor.cache.eviction.count",
+              "query": "name:\"textExtractor.cache.eviction.count\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -884,7 +884,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:textExtractor.cache.load.count",
+              "query": "name:\"textExtractor.cache.load.count\"",
               "refId": "A",
               "timeField": "@timestamp"
             }
@@ -983,7 +983,7 @@
                   "type": "max"
                 }
               ],
-              "query": "name:textExtractor.cache.load.exception.rate",
+              "query": "name:\"textExtractor.cache.load.exception.rate\"",
               "refId": "A",
               "timeField": "@timestamp"
             }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 12/14: JAMES-3016 Extract 7Bit converter to a common class

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit c861ab308caca59e83722182091c1345d4d63683
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Thu Jan 30 13:24:31 2020 +0700

    JAMES-3016 Extract 7Bit converter to a common class
    
    To be used in ConvertTo7Bit mailet and MailDeliverToHost
---
 .../org/apache/mailet/base}/Converter7Bit.java     |  16 ++-
 .../org/apache/mailet/base/Converter7BitTest.java  | 134 +++++++++------------
 .../eml/multipart-7bit-attachment-content.txt      |   0
 .../src/test/resources/eml/multipart-7bit.eml      |   0
 .../eml/multipart-8bit-attachment-content.txt      |   0
 .../src/test/resources/eml/multipart-8bit.eml      |   0
 .../src/test/resources/eml/text-only-7bit.eml      |   0
 .../src/test/resources/eml/text-only-8bit.eml      |   0
 .../apache/james/jdkim/mailets/ConvertTo7Bit.java  |  45 ++-----
 .../remote/delivery/MailDelivrerToHost.java        |   1 +
 10 files changed, 77 insertions(+), 119 deletions(-)

diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Converter7Bit.java b/mailet/base/src/main/java/org/apache/mailet/base/Converter7Bit.java
similarity index 85%
rename from server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Converter7Bit.java
rename to mailet/base/src/main/java/org/apache/mailet/base/Converter7Bit.java
index 2eb44f4..095608f 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Converter7Bit.java
+++ b/mailet/base/src/main/java/org/apache/mailet/base/Converter7Bit.java
@@ -17,13 +17,14 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.transport.mailets.remote.delivery;
+package org.apache.mailet.base;
 
 import java.io.IOException;
 import java.util.List;
 
 import javax.mail.BodyPart;
 import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
 import javax.mail.internet.MimePart;
 
@@ -38,11 +39,16 @@ public class Converter7Bit {
         this.mailetContext = mailetContext;
     }
 
-    public MimePart convertTo7Bit(MimePart part) throws MessagingException, IOException {
+    public void convertTo7Bit(MimeMessage mimeMessage) throws MessagingException, IOException {
+        convertPart(mimeMessage);
+        mimeMessage.saveChanges();
+    }
+
+    private void convertPart(MimePart part) throws MessagingException, IOException {
         if (part.isMimeType("multipart/*")) {
             List<BodyPart> bodyParts = MultipartUtil.retrieveBodyParts((MimeMultipart) part.getContent());
             for (BodyPart bodyPart : bodyParts) {
-                convertTo7Bit((MimePart) bodyPart);
+                convertPart((MimePart) bodyPart);
             }
         } else if ("8bit".equals(part.getEncoding())) {
             // The content may already be in encoded the form (likely with mail
@@ -59,9 +65,9 @@ public class Converter7Bit {
             String contentTransferEncoding = part.isMimeType("text/*") ? "quoted-printable" : "base64";
             part.setContent(part.getContent(), part.getContentType());
             part.setHeader("Content-Transfer-Encoding", contentTransferEncoding);
-            part.addHeader("X-MIME-Autoconverted", "from 8bit to " + contentTransferEncoding + " by " + mailetContext.getServerInfo());
+            part.addHeader("X-MIME-Autoconverted", "from 8bit to "
+                + contentTransferEncoding + " by " + mailetContext.getServerInfo());
         }
-        return part;
     }
 
 }
diff --git a/server/mailet/dkim/src/test/java/org/apache/james/jdkim/mailets/ConvertTo7BitTest.java b/mailet/base/src/test/java/org/apache/mailet/base/Converter7BitTest.java
similarity index 56%
rename from server/mailet/dkim/src/test/java/org/apache/james/jdkim/mailets/ConvertTo7BitTest.java
rename to mailet/base/src/test/java/org/apache/mailet/base/Converter7BitTest.java
index bbee42b..d08b156 100644
--- a/server/mailet/dkim/src/test/java/org/apache/james/jdkim/mailets/ConvertTo7BitTest.java
+++ b/mailet/base/src/test/java/org/apache/mailet/base/Converter7BitTest.java
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jdkim.mailets;
+package org.apache.mailet.base;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -25,12 +25,11 @@ import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 
 import javax.mail.BodyPart;
+import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.util.MimeMessageUtil;
-import org.apache.mailet.Mail;
-import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailetConfig;
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.BeforeEach;
@@ -39,7 +38,7 @@ import org.junit.jupiter.api.Test;
 
 import com.github.fge.lambdas.Throwing;
 
-class ConvertTo7BitTest {
+class Converter7BitTest {
 
     private static final String CONTENT_TRANSFER_ENCODING = "Content-Transfer-Encoding";
     private static final String X_MIME_AUTOCONVERTED = "X-MIME-Autoconverted";
@@ -48,13 +47,13 @@ class ConvertTo7BitTest {
     private static final String MESSAGE_BODY_QUOTED_PRINTABLE = "A 8bit encoded body with =E2=82=ACuro symbol.";
     private static final String BASE64 = "base64";
 
-    private ConvertTo7Bit testee;
+    private Converter7Bit testee;
 
     @BeforeEach
-    void setUp() throws Exception {
-        testee = new ConvertTo7Bit();
-        testee.init(FakeMailetConfig.builder()
-            .build());
+    void setUp() {
+        testee = new Converter7Bit(FakeMailetConfig.builder()
+            .build()
+            .getMailetContext());
     }
 
     @Nested
@@ -62,19 +61,15 @@ class ConvertTo7BitTest {
         @Nested
         class WhenTextContent {
             @Test
-            void serviceShouldKeepMessageContentUnTouch() throws Exception {
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-quoted-printable-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/text-only-7bit.eml")))
-                    .build();
-
-                testee.service(mail);
+            void convertTo7BitShouldKeepMessageContentUnTouched() throws Exception {
+                MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/text-only-7bit.eml"));
+                testee.convertTo7Bit(mimeMessage);
 
                 SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
-                    softly.assertThat(mail.getMessage().getEncoding())
+                    softly.assertThat(mimeMessage.getEncoding())
                         .isEqualTo(QUOTED_PRINTABLE);
-                    softly.assertThat(MimeMessageUtil.asString(mail.getMessage()))
+                    softly.assertThat(MimeMessageUtil.asString(mimeMessage))
                         .contains(MESSAGE_BODY_QUOTED_PRINTABLE);
                 }));
             }
@@ -83,35 +78,29 @@ class ConvertTo7BitTest {
         @Nested
         class WhenMultipart {
             @Test
-            void serviceShouldKeepMessageTextContentUnTouch() throws Exception {
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-7bit-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/multipart-7bit.eml")))
-                    .build();
+            void convertTo7BitShouldKeepMessageTextContentUnTouched() throws Exception {
+                MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/multipart-7bit.eml"));
 
-                testee.service(mail);
-                MimeMultipart multipart = (MimeMultipart) mail.getMessage().getContent();
+                testee.convertTo7Bit(mimeMessage);
+                MimeMultipart multipart = (MimeMultipart) mimeMessage.getContent();
 
                 SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
                     softly.assertThat(multipart.getBodyPart(0).getHeader(CONTENT_TRANSFER_ENCODING))
                         .containsOnly(QUOTED_PRINTABLE);
-                    softly.assertThat(MimeMessageUtil.asString(mail.getMessage()))
+                    softly.assertThat(MimeMessageUtil.asString(mimeMessage))
                         .contains(MESSAGE_BODY_QUOTED_PRINTABLE);
                 }));
             }
 
             @Test
-            void serviceShouldKeepMessageAttachmentsContentUnTouch() throws Exception {
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-7bit-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/multipart-7bit.eml")))
-                    .build();
+            void convertTo7BitShouldKeepMessageAttachmentsContentUnTouched() throws Exception {
+                MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/multipart-7bit.eml"));
 
-                testee.service(mail);
-                MimeMultipart multipart = (MimeMultipart) mail.getMessage().getContent();
-                String messageAsString = MimeMessageUtil.asString(mail.getMessage());
+                testee.convertTo7Bit(mimeMessage);
+                MimeMultipart multipart = (MimeMultipart) mimeMessage.getContent();
+                String messageAsString = MimeMessageUtil.asString(mimeMessage);
 
                 SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
                     softly.assertThat(multipart.getBodyPart(1).getHeader(CONTENT_TRANSFER_ENCODING))
@@ -128,32 +117,26 @@ class ConvertTo7BitTest {
         @Nested
         class WhenTextContent {
             @Test
-            void serviceShouldAlertHeaders() throws Exception {
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-8bit-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/text-only-8bit.eml")))
-                    .build();
-                testee.service(mail);
+            void convertTo7BitShouldAlertHeaders() throws Exception {
+                MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/text-only-8bit.eml"));
+                testee.convertTo7Bit(mimeMessage);
 
                 SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
-                   assertThat(mail.getMessage().getHeader(CONTENT_TRANSFER_ENCODING))
+                   assertThat(mimeMessage.getHeader(CONTENT_TRANSFER_ENCODING))
                        .containsOnly(QUOTED_PRINTABLE);
-                   assertThat(mail.getMessage().getHeader(X_MIME_AUTOCONVERTED))
+                   assertThat(mimeMessage.getHeader(X_MIME_AUTOCONVERTED))
                        .containsOnly("from 8bit to quoted-printable by Mock Server");
                 }));
             }
 
             @Test
-            void serviceShouldConvertContentToQuotedPrintable() throws Exception {
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-8bit-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/text-only-8bit.eml")))
-                    .build();
-                testee.service(mail);
-
-                assertThat(MimeMessageUtil.asString(mail.getMessage()))
+            void convertTo7BitShouldConvertContentToQuotedPrintable() throws Exception {
+                MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/text-only-8bit.eml"));
+                testee.convertTo7Bit(mimeMessage);
+
+                assertThat(MimeMessageUtil.asString(mimeMessage))
                     .contains(MESSAGE_BODY_QUOTED_PRINTABLE)
                     .doesNotContain(MESSAGE_BODY_8BIT);
             }
@@ -163,16 +146,13 @@ class ConvertTo7BitTest {
         class WhenMultipart {
 
             @Test
-            void serviceShouldAlertTextPartHeaders() throws Exception {
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-8bit-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/multipart-8bit.eml")))
-                    .build();
+            void convertTo7BitShouldAlertTextPartHeaders() throws Exception {
+                MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/multipart-8bit.eml"));
 
-                testee.service(mail);
+                testee.convertTo7Bit(mimeMessage);
 
-                BodyPart textPart = ((MimeMultipart) mail.getMessage().getContent())
+                BodyPart textPart = ((MimeMultipart) mimeMessage.getContent())
                     .getBodyPart(0);
 
                 SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
@@ -184,32 +164,26 @@ class ConvertTo7BitTest {
             }
 
             @Test
-            void serviceShouldConvertTextPartContentToQuotedPrintable() throws Exception {
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-8bit-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/multipart-8bit.eml")))
-                    .build();
+            void convertTo7BitShouldConvertTextPartContentToQuotedPrintable() throws Exception {
+                MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/multipart-8bit.eml"));
 
-                testee.service(mail);
+                testee.convertTo7Bit(mimeMessage);
 
-                assertThat(MimeMessageUtil.asString(mail.getMessage()))
+                assertThat(MimeMessageUtil.asString(mimeMessage))
                     .contains(MESSAGE_BODY_QUOTED_PRINTABLE)
                     .doesNotContain(MESSAGE_BODY_8BIT);
             }
 
             @Test
-            void serviceShouldKeepAttachmentPartUnTouchWhenBase64Encoding() throws Exception {
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-8bit-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/multipart-8bit.eml")))
-                    .build();
+            void convertTo7BitShouldKeepAttachmentPartUnTouchedWhenBase64Encoding() throws Exception {
+                MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/multipart-8bit.eml"));
 
-                testee.service(mail);
+                testee.convertTo7Bit(mimeMessage);
 
-                MimeMultipart multipart = (MimeMultipart) mail.getMessage().getContent();
-                String messageAsString = MimeMessageUtil.asString(mail.getMessage());
+                MimeMultipart multipart = (MimeMultipart) mimeMessage.getContent();
+                String messageAsString = MimeMessageUtil.asString(mimeMessage);
 
                 SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
                     softly.assertThat(multipart.getBodyPart(1).getHeader(CONTENT_TRANSFER_ENCODING))
diff --git a/server/mailet/dkim/src/test/resources/eml/multipart-7bit-attachment-content.txt b/mailet/base/src/test/resources/eml/multipart-7bit-attachment-content.txt
similarity index 100%
rename from server/mailet/dkim/src/test/resources/eml/multipart-7bit-attachment-content.txt
rename to mailet/base/src/test/resources/eml/multipart-7bit-attachment-content.txt
diff --git a/server/mailet/dkim/src/test/resources/eml/multipart-7bit.eml b/mailet/base/src/test/resources/eml/multipart-7bit.eml
similarity index 100%
rename from server/mailet/dkim/src/test/resources/eml/multipart-7bit.eml
rename to mailet/base/src/test/resources/eml/multipart-7bit.eml
diff --git a/server/mailet/dkim/src/test/resources/eml/multipart-8bit-attachment-content.txt b/mailet/base/src/test/resources/eml/multipart-8bit-attachment-content.txt
similarity index 100%
rename from server/mailet/dkim/src/test/resources/eml/multipart-8bit-attachment-content.txt
rename to mailet/base/src/test/resources/eml/multipart-8bit-attachment-content.txt
diff --git a/server/mailet/dkim/src/test/resources/eml/multipart-8bit.eml b/mailet/base/src/test/resources/eml/multipart-8bit.eml
similarity index 100%
rename from server/mailet/dkim/src/test/resources/eml/multipart-8bit.eml
rename to mailet/base/src/test/resources/eml/multipart-8bit.eml
diff --git a/server/mailet/dkim/src/test/resources/eml/text-only-7bit.eml b/mailet/base/src/test/resources/eml/text-only-7bit.eml
similarity index 100%
rename from server/mailet/dkim/src/test/resources/eml/text-only-7bit.eml
rename to mailet/base/src/test/resources/eml/text-only-7bit.eml
diff --git a/server/mailet/dkim/src/test/resources/eml/text-only-8bit.eml b/mailet/base/src/test/resources/eml/text-only-8bit.eml
similarity index 100%
rename from server/mailet/dkim/src/test/resources/eml/text-only-8bit.eml
rename to mailet/base/src/test/resources/eml/text-only-8bit.eml
diff --git a/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/ConvertTo7Bit.java b/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/ConvertTo7Bit.java
index 53a4e01..bc6b266 100644
--- a/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/ConvertTo7Bit.java
+++ b/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/ConvertTo7Bit.java
@@ -23,10 +23,10 @@ import java.io.IOException;
 
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
-import javax.mail.internet.MimeMultipart;
-import javax.mail.internet.MimePart;
 
 import org.apache.mailet.Mail;
+import org.apache.mailet.MailetConfig;
+import org.apache.mailet.base.Converter7Bit;
 import org.apache.mailet.base.GenericMailet;
 
 /**
@@ -35,43 +35,20 @@ import org.apache.mailet.base.GenericMailet;
  */
 public class ConvertTo7Bit extends GenericMailet {
 
+    private Converter7Bit converter7Bit;
+
+    @Override
+    public void init(MailetConfig newConfig) throws MessagingException {
+        super.init(newConfig);
+        this.converter7Bit = new Converter7Bit(getMailetContext());
+    }
+
     public void service(Mail mail) throws MessagingException {
         MimeMessage message = mail.getMessage();
         try {
-            convertTo7Bit(message);
-            message.saveChanges();
+            converter7Bit.convertTo7Bit(message);
         } catch (IOException e) {
             throw new MessagingException("IOException converting message to 7bit: " + e.getMessage(), e);
         }
     }
-
-    /**
-     * Converts a message to 7 bit.
-     */
-    private void convertTo7Bit(MimePart part) throws MessagingException, IOException {
-        if (part.isMimeType("multipart/*")) {
-            MimeMultipart parts = (MimeMultipart) part.getContent();
-            int count = parts.getCount();
-            for (int i = 0; i < count; i++) {
-                convertTo7Bit((MimePart) parts.getBodyPart(i));
-            }
-        } else if ("8bit".equals(part.getEncoding())) {
-            // The content may already be in encoded the form (likely with mail
-            // created from a stream). In that case, just changing the encoding
-            // to quoted-printable will mangle the result when this is
-            // transmitted.
-            // We must first convert the content into its native format, set it
-            // back, and only THEN set the transfer encoding to force the
-            // content to be encoded appropriately.
-
-            // if the part doesn't contain text it will be base64 encoded.
-            String contentTransferEncoding = part.isMimeType("text/*") ? "quoted-printable" : "base64";
-            part.setContent(part.getContent(), part.getContentType());
-            part.setHeader("Content-Transfer-Encoding", contentTransferEncoding);
-            part.addHeader("X-MIME-Autoconverted", "from 8bit to "
-                    + contentTransferEncoding + " by "
-                    + getMailetContext().getServerInfo());
-        }
-    }
-
 }
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java
index d51af6c..b414ab5 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java
@@ -31,6 +31,7 @@ import javax.mail.internet.MimeMessage;
 import org.apache.mailet.HostAddress;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailetContext;
+import org.apache.mailet.base.Converter7Bit;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 06/14: [Refactoring] Small access modifiers cleanup in test classes in mailbox-quota-search-elasticsearch module

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 76e0eb1e18ab4c6501dbaa477dee724cbdc1e42a
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Wed Jan 22 10:41:47 2020 +0700

    [Refactoring] Small access modifiers cleanup in test classes in mailbox-quota-search-elasticsearch module
---
 .../james/quota/search/elasticsearch/QuotaQueryConverterTest.java     | 2 +-
 .../james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java   | 4 ++--
 .../search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java  | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/QuotaQueryConverterTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/QuotaQueryConverterTest.java
index 86daa88..be69dce 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/QuotaQueryConverterTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/QuotaQueryConverterTest.java
@@ -33,7 +33,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 class QuotaQueryConverterTest {
-    private QuotaQueryConverter testee;
+    QuotaQueryConverter testee;
 
     @BeforeEach
     void setup() {
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java
index 67102ef..0cdf749 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java
@@ -35,11 +35,11 @@ import nl.jqno.equalsverifier.EqualsVerifier;
 
 class QuotaRatioAsJsonTest {
 
-    private static final Quota<QuotaSizeLimit, QuotaSizeUsage> QUOTA_SIZE = Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+    static final Quota<QuotaSizeLimit, QuotaSizeUsage> QUOTA_SIZE = Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
             .used(QuotaSizeUsage.size(15))
             .computedLimit(QuotaSizeLimit.size(60))
             .build();
-    private static final Quota<QuotaCountLimit, QuotaCountUsage> QUOTA_COUNT = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+    static final Quota<QuotaCountLimit, QuotaCountUsage> QUOTA_COUNT = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
             .used(QuotaCountUsage.count(1))
             .computedLimit(QuotaCountLimit.count(2))
             .build();
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java
index 7b13256..a992127 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java
@@ -36,7 +36,7 @@ import org.apache.james.util.ClassLoaderUtils;
 import org.junit.jupiter.api.Test;
 
 class QuotaRatioToElasticSearchJsonTest {
-    private static Event.EventId EVENT_ID = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b4");
+    static Event.EventId EVENT_ID = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b4");
 
     @Test
     void quotaRatioShouldBeWellConvertedToJson() throws IOException {


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 09/14: [Refactoring] Migrate InMemoryMessageIdTest to JUnit 5

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 8f6ea31784f4ef6e81e44c046732b9320fb151ef
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Tue Jan 21 16:30:27 2020 +0700

    [Refactoring] Migrate InMemoryMessageIdTest to JUnit 5
---
 .../org/apache/james/mailbox/inmemory/InMemoryMessageIdTest.java  | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdTest.java
index 59303a9..97d66bc 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdTest.java
@@ -20,19 +20,19 @@ package org.apache.james.mailbox.inmemory;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-public class InMemoryMessageIdTest {
+class InMemoryMessageIdTest {
 
     @Test
-    public void shouldRespectJavaBeanContract() {
+    void shouldRespectJavaBeanContract() {
         EqualsVerifier.forClass(InMemoryMessageId.class).verify();
     }
 
     @Test
-    public void shouldBeSerializable() {
+    void shouldBeSerializable() {
         assertThat(new InMemoryMessageId.Factory().generate().isSerializable()).isTrue();
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 04/14: [Refactoring] Migrate SpamAssassinListenerTest to JUnit 5

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit c3e93f360ecfa498c523a60e1f5a1ea8affab98e
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Wed Jan 22 10:55:41 2020 +0700

    [Refactoring] Migrate SpamAssassinListenerTest to JUnit 5
---
 .../spamassassin/SpamAssassinListenerTest.java     | 70 +++++++++++-----------
 1 file changed, 35 insertions(+), 35 deletions(-)

diff --git a/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
index 245a8ec..71ecbb3 100644
--- a/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
+++ b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
@@ -54,29 +54,29 @@ import org.apache.james.mailbox.store.event.EventFactory;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
-import org.junit.Before;
-import org.junit.Test;
-
-public class SpamAssassinListenerTest {
-    public static final Username USER = Username.of("user");
-    private static final MailboxSession MAILBOX_SESSION = MailboxSessionUtil.create(USER);
-    private static final int UID_VALIDITY = 43;
-    private static final TestMessageId MESSAGE_ID = TestMessageId.of(45);
-
-    private SpamAssassin spamAssassin;
-    private SpamAssassinListener listener;
-    private Mailbox inbox;
-    private Mailbox mailbox1;
-    private MailboxId mailboxId1;
-    private MailboxId mailboxId2;
-    private MailboxId spamMailboxId;
-    private MailboxId spamCapitalMailboxId;
-    private MailboxId trashMailboxId;
-    private MailboxSessionMapperFactory mapperFactory;
-    private Mailbox mailbox2;
-
-    @Before
-    public void setup() throws Exception {
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+class SpamAssassinListenerTest {
+    static final Username USER = Username.of("user");
+    static final MailboxSession MAILBOX_SESSION = MailboxSessionUtil.create(USER);
+    static final int UID_VALIDITY = 43;
+    static final TestMessageId MESSAGE_ID = TestMessageId.of(45);
+
+    SpamAssassin spamAssassin;
+    SpamAssassinListener listener;
+    Mailbox inbox;
+    Mailbox mailbox1;
+    MailboxId mailboxId1;
+    MailboxId mailboxId2;
+    MailboxId spamMailboxId;
+    MailboxId spamCapitalMailboxId;
+    MailboxId trashMailboxId;
+    MailboxSessionMapperFactory mapperFactory;
+    Mailbox mailbox2;
+
+    @BeforeEach
+    void setup() throws Exception {
         StoreMailboxManager mailboxManager = spy(InMemoryIntegrationResources.defaultResources().getMailboxManager());
         SystemMailboxesProviderImpl systemMailboxesProvider = new SystemMailboxesProviderImpl(mailboxManager);
         when(mailboxManager.createSystemSession(USER))
@@ -99,13 +99,13 @@ public class SpamAssassinListenerTest {
     }
 
     @Test
-    public void deserializeSpamAssassinListenerGroup() throws Exception {
+    void deserializeSpamAssassinListenerGroup() throws Exception {
         assertThat(Group.deserialize("org.apache.james.mailbox.spamassassin.SpamAssassinListener$SpamAssassinListenerGroup"))
             .isEqualTo(new SpamAssassinListener.SpamAssassinListenerGroup());
     }
 
     @Test
-    public void isEventOnSpamMailboxShouldReturnFalseWhenMessageIsMovedToANonSpamMailbox() {
+    void isEventOnSpamMailboxShouldReturnFalseWhenMessageIsMovedToANonSpamMailbox() {
         MessageMoveEvent messageMoveEvent = MessageMoveEvent.builder()
             .session(MAILBOX_SESSION)
             .messageMoves(MessageMoves.builder()
@@ -119,7 +119,7 @@ public class SpamAssassinListenerTest {
     }
 
     @Test
-    public void isEventOnSpamMailboxShouldReturnTrueWhenMailboxIsSpam() {
+    void isEventOnSpamMailboxShouldReturnTrueWhenMailboxIsSpam() {
         MessageMoveEvent messageMoveEvent = MessageMoveEvent.builder()
             .session(MAILBOX_SESSION)
             .messageMoves(MessageMoves.builder()
@@ -133,7 +133,7 @@ public class SpamAssassinListenerTest {
     }
 
     @Test
-    public void isEventOnSpamMailboxShouldReturnFalseWhenMailboxIsSpamOtherCase() {
+    void isEventOnSpamMailboxShouldReturnFalseWhenMailboxIsSpamOtherCase() {
         MessageMoveEvent messageMoveEvent = MessageMoveEvent.builder()
             .session(MAILBOX_SESSION)
             .messageMoves(MessageMoves.builder()
@@ -147,7 +147,7 @@ public class SpamAssassinListenerTest {
     }
 
     @Test
-    public void eventShouldCallSpamAssassinSpamLearningWhenTheEventMatches() throws Exception {
+    void eventShouldCallSpamAssassinSpamLearningWhenTheEventMatches() throws Exception {
         MessageMoveEvent messageMoveEvent = MessageMoveEvent.builder()
             .session(MAILBOX_SESSION)
             .messageMoves(MessageMoves.builder()
@@ -163,7 +163,7 @@ public class SpamAssassinListenerTest {
     }
 
     @Test
-    public void isMessageMovedOutOfSpamMailboxShouldReturnFalseWhenMessageMovedBetweenNonSpamMailboxes() {
+    void isMessageMovedOutOfSpamMailboxShouldReturnFalseWhenMessageMovedBetweenNonSpamMailboxes() {
         MessageMoveEvent messageMoveEvent = MessageMoveEvent.builder()
             .session(MAILBOX_SESSION)
             .messageMoves(MessageMoves.builder()
@@ -177,7 +177,7 @@ public class SpamAssassinListenerTest {
     }
 
     @Test
-    public void isMessageMovedOutOfSpamMailboxShouldReturnFalseWhenMessageMovedOutOfCapitalSpamMailbox() {
+    void isMessageMovedOutOfSpamMailboxShouldReturnFalseWhenMessageMovedOutOfCapitalSpamMailbox() {
         MessageMoveEvent messageMoveEvent = MessageMoveEvent.builder()
             .session(MAILBOX_SESSION)
             .messageMoves(MessageMoves.builder()
@@ -191,7 +191,7 @@ public class SpamAssassinListenerTest {
     }
 
     @Test
-    public void isMessageMovedOutOfSpamMailboxShouldReturnTrueWhenMessageMovedOutOfSpamMailbox() {
+    void isMessageMovedOutOfSpamMailboxShouldReturnTrueWhenMessageMovedOutOfSpamMailbox() {
         MessageMoveEvent messageMoveEvent = MessageMoveEvent.builder()
             .session(MAILBOX_SESSION)
             .messageMoves(MessageMoves.builder()
@@ -205,7 +205,7 @@ public class SpamAssassinListenerTest {
     }
 
     @Test
-    public void isMessageMovedOutOfSpamMailboxShouldReturnFalseWhenMessageMovedToTrash() {
+    void isMessageMovedOutOfSpamMailboxShouldReturnFalseWhenMessageMovedToTrash() {
         MessageMoveEvent messageMoveEvent = MessageMoveEvent.builder()
             .session(MAILBOX_SESSION)
             .messageMoves(MessageMoves.builder()
@@ -219,7 +219,7 @@ public class SpamAssassinListenerTest {
     }
 
     @Test
-    public void eventShouldCallSpamAssassinHamLearningWhenTheEventMatches() throws Exception {
+    void eventShouldCallSpamAssassinHamLearningWhenTheEventMatches() throws Exception {
         MessageMoveEvent messageMoveEvent = MessageMoveEvent.builder()
             .session(MAILBOX_SESSION)
             .messageMoves(MessageMoves.builder()
@@ -235,7 +235,7 @@ public class SpamAssassinListenerTest {
     }
 
     @Test
-    public void eventShouldCallSpamAssassinHamLearningWhenTheMessageIsAddedInInbox() throws Exception {
+    void eventShouldCallSpamAssassinHamLearningWhenTheMessageIsAddedInInbox() throws Exception {
         SimpleMailboxMessage message = createMessage(inbox);
 
         MailboxListener.Added addedEvent = EventFactory.added()
@@ -251,7 +251,7 @@ public class SpamAssassinListenerTest {
     }
 
     @Test
-    public void eventShouldNotCallSpamAssassinHamLearningWhenTheMessageIsAddedInAMailboxOtherThanInbox() throws Exception {
+    void eventShouldNotCallSpamAssassinHamLearningWhenTheMessageIsAddedInAMailboxOtherThanInbox() throws Exception {
         SimpleMailboxMessage message = createMessage(mailbox1);
 
         MailboxListener.Added addedEvent = EventFactory.added()


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 08/14: [Refactoring] Migrate InMemoryMailboxIdDeserializerTest to JUnit 5

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit ab69bf897d6a49cafd208c7302ebe57bbc820692
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Tue Jan 21 16:30:06 2020 +0700

    [Refactoring] Migrate InMemoryMailboxIdDeserializerTest to JUnit 5
---
 .../InMemoryMailboxIdDeserializerTest.java         | 28 ++++++++++++----------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxIdDeserializerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxIdDeserializerTest.java
index d47acd3..d0f83bc 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxIdDeserializerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxIdDeserializerTest.java
@@ -20,33 +20,35 @@
 package org.apache.james.mailbox.inmemory;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.apache.james.mailbox.store.mail.model.MailboxIdDeserialisationException;
 import org.apache.james.mailbox.store.mail.model.MailboxIdDeserializer;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
-public class InMemoryMailboxIdDeserializerTest {
+class InMemoryMailboxIdDeserializerTest {
 
-    private static final String SERIALIZED_ID = "1234567890123";
-    private static final String MALFORMED_SERIALIZED_ID = "aEZ";
-    private static final InMemoryId IN_MEMORY_ID = InMemoryId.of(Long.parseLong(SERIALIZED_ID));
+    static final String SERIALIZED_ID = "1234567890123";
+    static final String MALFORMED_SERIALIZED_ID = "aEZ";
+    static final InMemoryId IN_MEMORY_ID = InMemoryId.of(Long.parseLong(SERIALIZED_ID));
 
-    private MailboxIdDeserializer mailboxIdDeserializer;
+    MailboxIdDeserializer mailboxIdDeserializer;
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
         mailboxIdDeserializer = new InMemoryMailboxIdDeserializer();
     }
 
     @Test
-    public void deserializeShouldWork() throws MailboxIdDeserialisationException {
+    void deserializeShouldWork() throws MailboxIdDeserialisationException {
         assertThat(mailboxIdDeserializer.deserialize(SERIALIZED_ID)).isEqualTo(IN_MEMORY_ID);
     }
 
-    @Test(expected = MailboxIdDeserialisationException.class)
-    public void deserializeShouldThrowOnMalformedData() throws MailboxIdDeserialisationException {
-        mailboxIdDeserializer.deserialize(MALFORMED_SERIALIZED_ID);
+    @Test
+    void deserializeShouldThrowOnMalformedData() {
+        assertThatThrownBy(() -> mailboxIdDeserializer.deserialize(MALFORMED_SERIALIZED_ID))
+            .isInstanceOf(MailboxIdDeserialisationException.class);
     }
 
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 05/14: [Refactoring] Migrate ElasticSearchQuotaMailboxListenerTest to JUnit 5

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 2759aa2e36c2051c7d871586c954ab753552444c
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Wed Jan 22 10:39:26 2020 +0700

    [Refactoring] Migrate ElasticSearchQuotaMailboxListenerTest to JUnit 5
---
 .../ElasticSearchQuotaMailboxListenerTest.java     | 39 +++++++++++-----------
 1 file changed, 20 insertions(+), 19 deletions(-)

diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java
index 1d1ca3c..ba482aa 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java
@@ -26,7 +26,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.IOException;
 
-import org.apache.james.backends.es.DockerElasticSearchRule;
+import org.apache.james.backends.es.DockerElasticSearchExtension;
 import org.apache.james.backends.es.ElasticSearchConfiguration;
 import org.apache.james.backends.es.ElasticSearchIndexer;
 import org.apache.james.backends.es.NodeMappingFactory;
@@ -44,24 +44,25 @@ import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.client.RestHighLevelClient;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class ElasticSearchQuotaMailboxListenerTest {
-    private static Event.EventId EVENT_ID = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b4");
+class ElasticSearchQuotaMailboxListenerTest {
+    static Event.EventId EVENT_ID = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b4");
 
-    private static final int BATCH_SIZE = 1;
+    static final int BATCH_SIZE = 1;
 
-    @Rule
-    public DockerElasticSearchRule elasticSearch = new DockerElasticSearchRule();
-    private ElasticSearchQuotaMailboxListener quotaMailboxListener;
-    private RestHighLevelClient client;
+    @RegisterExtension
+    DockerElasticSearchExtension elasticSearch = new DockerElasticSearchExtension();
 
-    @Before
-    public void setUp() throws IOException {
-        client = elasticSearch.clientProvider().get();
+    ElasticSearchQuotaMailboxListener quotaMailboxListener;
+    RestHighLevelClient client;
+
+    @BeforeEach
+    void setUp() throws IOException {
+        client = elasticSearch.getDockerElasticSearch().clientProvider().get();
 
         QuotaSearchIndexCreationUtil.prepareDefaultClient(client, ElasticSearchConfiguration.builder()
             .addHost(elasticSearch.getDockerElasticSearch().getHttpHost())
@@ -75,19 +76,19 @@ public class ElasticSearchQuotaMailboxListenerTest {
             new UserRoutingKeyFactory());
     }
 
-    @After
-    public void tearDown() throws IOException {
+    @AfterEach
+    void tearDown() throws IOException {
         client.close();
     }
 
     @Test
-    public void deserializeElasticSearchQuotaMailboxListenerGroup() throws Exception {
+    void deserializeElasticSearchQuotaMailboxListenerGroup() throws Exception {
         assertThat(Group.deserialize("org.apache.james.quota.search.elasticsearch.events.ElasticSearchQuotaMailboxListener$ElasticSearchQuotaMailboxListenerGroup"))
             .isEqualTo(new ElasticSearchQuotaMailboxListener.ElasticSearchQuotaMailboxListenerGroup());
     }
 
     @Test
-    public void eventShouldIndexEventWhenQuotaEvent() throws Exception {
+    void eventShouldIndexEventWhenQuotaEvent() throws Exception {
         quotaMailboxListener.event(EventFactory.quotaUpdated()
             .eventId(EVENT_ID)
             .user(BOB_USERNAME)


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 10/14: [Refactoring] Small access modifiers cleanup in test classes in mailbox-memory module

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit e57152cb65390576aa6d643fdec507ff6275df91
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Tue Jan 21 17:39:57 2020 +0700

    [Refactoring] Small access modifiers cleanup in test classes in mailbox-memory module
---
 .../apache/james/mailbox/inmemory/InMemoryCombinationManagerTest.java | 2 +-
 .../apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java | 2 +-
 .../org/apache/james/mailbox/inmemory/MemoryMailboxManagerTest.java   | 2 +-
 .../mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java   | 4 ++--
 .../james/mailbox/inmemory/mail/MemoryAnnotationMapperTest.java       | 2 +-
 .../james/mailbox/inmemory/mail/MemoryMailboxMapperAclTest.java       | 2 +-
 .../apache/james/mailbox/inmemory/mail/MemoryMailboxMapperTest.java   | 2 +-
 .../inmemory/manager/InMemoryQuotaMailboxMessageManagerTest.java      | 4 ++--
 8 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryCombinationManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryCombinationManagerTest.java
index bc4bcc8..d1467fa 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryCombinationManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryCombinationManagerTest.java
@@ -25,7 +25,7 @@ import org.apache.james.mailbox.store.CombinationManagerTestSystem;
 class InMemoryCombinationManagerTest extends AbstractCombinationManagerTest {
     
     @Override
-    public CombinationManagerTestSystem createTestingData() {
+    protected CombinationManagerTestSystem createTestingData() {
         InMemoryIntegrationResources resources = InMemoryIntegrationResources.defaultResources();
 
         return new InMemoryCombinationManagerTestSystem(
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java
index 4f7484b..ea5e1ea 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java
@@ -26,7 +26,7 @@ import org.junit.jupiter.api.BeforeEach;
 
 class MemoryMailboxManagerStressTest implements MailboxManagerStressContract<InMemoryMailboxManager> {
 
-    private InMemoryMailboxManager mailboxManager;
+    InMemoryMailboxManager mailboxManager;
 
     @Override
     public InMemoryMailboxManager getManager() {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerTest.java
index a878764..7eb0846 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerTest.java
@@ -22,7 +22,7 @@ package org.apache.james.mailbox.inmemory;
 import org.apache.james.mailbox.MailboxManagerTest;
 import org.apache.james.mailbox.events.EventBus;
 
-public class MemoryMailboxManagerTest extends MailboxManagerTest<InMemoryMailboxManager> {
+class MemoryMailboxManagerTest extends MailboxManagerTest<InMemoryMailboxManager> {
 
     @Override
     protected InMemoryMailboxManager provideMailboxManager() {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
index f913c8c..4c1c16e 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
@@ -35,8 +35,8 @@ import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
 import org.junit.jupiter.api.BeforeEach;
 
 class InMemoryMailboxManagerAttachmentTest extends AbstractMailboxManagerAttachmentTest {
-    private InMemoryMailboxManager mailboxManager;
-    private InMemoryMailboxManager parseFailingMailboxManager;
+    InMemoryMailboxManager mailboxManager;
+    InMemoryMailboxManager parseFailingMailboxManager;
 
 
     @BeforeEach
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryAnnotationMapperTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryAnnotationMapperTest.java
index 321e461..4bed82c 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryAnnotationMapperTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryAnnotationMapperTest.java
@@ -28,7 +28,7 @@ import org.apache.james.mailbox.store.mail.model.AnnotationMapperTest;
 
 class MemoryAnnotationMapperTest extends AnnotationMapperTest {
 
-    private final AtomicInteger counter = new AtomicInteger();
+    final AtomicInteger counter = new AtomicInteger();
 
     @Override
     protected AnnotationMapper createAnnotationMapper() {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperAclTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperAclTest.java
index c9e7d77..8ff3d8a 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperAclTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperAclTest.java
@@ -27,7 +27,7 @@ import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMapperACLTest;
 
 class MemoryMailboxMapperAclTest extends MailboxMapperACLTest {
-    private final AtomicInteger counter = new AtomicInteger();
+    final AtomicInteger counter = new AtomicInteger();
 
     @Override
     protected MailboxMapper createMailboxMapper() {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperTest.java
index d7c1d34..07fc7aa 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperTest.java
@@ -28,7 +28,7 @@ import org.apache.james.mailbox.store.mail.model.MailboxMapperTest;
 
 class MemoryMailboxMapperTest extends MailboxMapperTest {
 
-    private final AtomicInteger counter = new AtomicInteger();
+    final AtomicInteger counter = new AtomicInteger();
 
     @Override
     protected MailboxMapper createMailboxMapper() {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryQuotaMailboxMessageManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryQuotaMailboxMessageManagerTest.java
index 5c236a5..54af933 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryQuotaMailboxMessageManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryQuotaMailboxMessageManagerTest.java
@@ -32,9 +32,9 @@ import org.junit.jupiter.api.BeforeEach;
  */
 class InMemoryQuotaMailboxMessageManagerTest implements QuotaMessageManagerContract<StoreMailboxManager> {
 
-    private ManagerTestProvisionner provisionner;
+    ManagerTestProvisionner provisionner;
 
-    private  IntegrationResources<StoreMailboxManager> resources;
+    IntegrationResources<StoreMailboxManager> resources;
 
     @BeforeEach
     void setUp() throws Exception {


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 02/14: fix grafana imap dashboard not reporting IMAP CREATE metrics

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 0ed54bfd0da27b14c917e3a8148308c886f8644d
Author: Rémi KOWALSKI <rk...@linagora.com>
AuthorDate: Wed Jan 29 11:57:18 2020 +0100

    fix grafana imap dashboard not reporting IMAP CREATE metrics
---
 grafana-reporting/IMAP_board-1488774825351-dashboard.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/grafana-reporting/IMAP_board-1488774825351-dashboard.json b/grafana-reporting/IMAP_board-1488774825351-dashboard.json
index e532731..99ec5dc 100644
--- a/grafana-reporting/IMAP_board-1488774825351-dashboard.json
+++ b/grafana-reporting/IMAP_board-1488774825351-dashboard.json
@@ -1836,7 +1836,7 @@
           "thresholds": [],
           "timeFrom": null,
           "timeShift": null,
-          "title": "IMAP_LIST",
+          "title": "IMAP-LIST",
           "tooltip": {
             "shared": true,
             "sort": 0,
@@ -1953,7 +1953,7 @@
                   "type": "avg"
                 }
               ],
-              "query": "name:\"IMAP_CREATE\"",
+              "query": "name:\"IMAP-CREATE\"",
               "refId": "A",
               "timeField": "@timestamp"
             }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 03/14: [Refactoring] Migrate SpamAssassinConfigurationTest to JUnit 5

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit d3b38d5a38def7c6f875b8e1c2d677aa0108c89e
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Wed Jan 22 10:55:29 2020 +0700

    [Refactoring] Migrate SpamAssassinConfigurationTest to JUnit 5
---
 .../mailbox/spamassassin/SpamAssassinConfigurationTest.java    | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinConfigurationTest.java b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinConfigurationTest.java
index 5136daa..c27f8f6 100644
--- a/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinConfigurationTest.java
+++ b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinConfigurationTest.java
@@ -23,26 +23,26 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.Optional;
 
 import org.apache.james.util.Host;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-public class SpamAssassinConfigurationTest {
+class SpamAssassinConfigurationTest {
 
     @Test
-    public void spamAssassinConfigurationShouldRespectBeanContract() {
+    void spamAssassinConfigurationShouldRespectBeanContract() {
         EqualsVerifier.forClass(SpamAssassinConfiguration.class)
             .verify();
     }
 
     @Test
-    public void isEnableShouldReturnFalseWhenEmpty() {
+    void isEnableShouldReturnFalseWhenEmpty() {
         SpamAssassinConfiguration configuration = new SpamAssassinConfiguration(Optional.empty());
         assertThat(configuration.isEnable()).isFalse();
     }
 
     @Test
-    public void isEnableShouldReturnTrueWhenConfigured() {
+    void isEnableShouldReturnTrueWhenConfigured() {
         int port = 1;
         SpamAssassinConfiguration configuration = new SpamAssassinConfiguration(Optional.of(Host.from("hostname", port)));
         assertThat(configuration.isEnable()).isTrue();


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 14/14: JAMES-3030 make Reactor toInputStream 50 times faster

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit ea264f3c37eb1623dcb02aa6b052d29872688b8e
Author: Matthieu Baechler <ma...@apache.org>
AuthorDate: Wed Jan 15 18:34:28 2020 +0100

    JAMES-3030 make Reactor toInputStream 50 times faster
    
    	From 500 MiB/s to 10 GiB/s on my workstation
    
    	It's due to the implementation of read(byte[], int off, int len)
    	and some minor optimizations
---
 .../java/org/apache/james/util/ReactorUtils.java   | 77 ++++++++++------------
 .../org/apache/james/util/ReactorUtilsTest.java    | 67 +++++++++++++++----
 2 files changed, 87 insertions(+), 57 deletions(-)

diff --git a/server/container/util/src/main/java/org/apache/james/util/ReactorUtils.java b/server/container/util/src/main/java/org/apache/james/util/ReactorUtils.java
index df51e07..dd9ceba 100644
--- a/server/container/util/src/main/java/org/apache/james/util/ReactorUtils.java
+++ b/server/container/util/src/main/java/org/apache/james/util/ReactorUtils.java
@@ -21,9 +21,8 @@ package org.apache.james.util;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
+import java.util.Iterator;
 import java.util.Optional;
-import java.util.Spliterator;
-import java.util.stream.Stream;
 
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
@@ -33,66 +32,56 @@ public class ReactorUtils {
         return Mono.fromRunnable(runnable).then(Mono.empty());
     }
 
+
     public static InputStream toInputStream(Flux<ByteBuffer> byteArrays) {
-        return new StreamInputStream(byteArrays.toStream(1));
+        return new StreamInputStream(byteArrays.toIterable(1).iterator());
     }
 
-    private static  class StreamInputStream extends InputStream {
+    private static class StreamInputStream extends InputStream {
         private static final int NO_MORE_DATA = -1;
 
-        private final Stream<ByteBuffer> source;
-        private final Spliterator<ByteBuffer> spliterator;
+        private final Iterator<ByteBuffer> source;
         private Optional<ByteBuffer> currentItemByteStream;
 
-        StreamInputStream(Stream<ByteBuffer> source) {
+        StreamInputStream(Iterator<ByteBuffer> source) {
             this.source = source;
-            this.spliterator = source.spliterator();
             this.currentItemByteStream = Optional.empty();
         }
 
         @Override
-        public int read() {
-            try {
-                if (!dataAvailableToRead()) {
-                    switchToNextChunk();
-                }
-
-                if (!dataAvailableToRead()) {
-                    source.close();
-                    return NO_MORE_DATA;
-                }
-
-                return currentItemByteStream
-                    .filter(ByteBuffer::hasRemaining)
-                    .map(buffer -> buffer.get() & 0xFF)
-                    .orElseGet(this::readNextChunk);
-            } catch (Throwable t) {
-                source.close();
-                throw t;
-            }
+        public int read(byte[] b, int off, int len) throws IOException {
+            return nextNonEmptyBuffer()
+                .map(buffer -> {
+                    int toRead = Math.min(len, buffer.remaining());
+                    buffer.get(b, off, toRead);
+                    return toRead;
+                })
+                .orElse(NO_MORE_DATA);
         }
 
-        private boolean dataAvailableToRead() {
-            return currentItemByteStream.isPresent();
+        @Override
+        public int read() {
+            return nextNonEmptyBuffer()
+                .map(ReactorUtils::byteToInt)
+                .orElse(NO_MORE_DATA);
         }
 
-        private void switchToNextChunk() {
-            spliterator.tryAdvance(bytes ->
-                currentItemByteStream = Optional.of(bytes));
+        private Optional<ByteBuffer> nextNonEmptyBuffer() {
+            Boolean needsNewBuffer = currentItemByteStream.map(buffer -> !buffer.hasRemaining()).orElse(true);
+            if (needsNewBuffer) {
+                if (source.hasNext()) {
+                    currentItemByteStream = Optional.of(source.next());
+                    return nextNonEmptyBuffer();
+                } else {
+                    return Optional.empty();
+                }
+            }
+            return currentItemByteStream;
         }
 
-        private Integer readNextChunk() {
-            currentItemByteStream = Optional.empty();
-            return read();
-        }
+    }
 
-        @Override
-        public void close() throws IOException {
-            try {
-                source.close();
-            } finally {
-                super.close();
-            }
-        }
+    private static int byteToInt(ByteBuffer buffer) {
+        return buffer.get() & 0xff;
     }
 }
diff --git a/server/container/util/src/test/java/org/apache/james/util/ReactorUtilsTest.java b/server/container/util/src/test/java/org/apache/james/util/ReactorUtilsTest.java
index 7bdc678..c01d09a 100644
--- a/server/container/util/src/test/java/org/apache/james/util/ReactorUtilsTest.java
+++ b/server/container/util/src/test/java/org/apache/james/util/ReactorUtilsTest.java
@@ -20,18 +20,21 @@ package org.apache.james.util;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
-import java.time.Duration;
+import java.nio.charset.StandardCharsets;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 
+import com.google.common.primitives.Bytes;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
-import reactor.core.scheduler.Scheduler;
 import reactor.core.scheduler.Schedulers;
 
 class ReactorUtilsTest {
@@ -81,6 +84,37 @@ class ReactorUtilsTest {
 
     @Nested
     class ToInputStream {
+
+        @Test
+        void givenAFluxOf3BytesShouldReadSuccessfullyTheWholeSource() throws IOException, InterruptedException {
+            byte[] bytes = "foo bar ...".getBytes(StandardCharsets.US_ASCII);
+
+            Flux<ByteBuffer> source = Flux.fromIterable(Bytes.asList(bytes))
+                .window(3)
+                .flatMapSequential(Flux::collectList)
+                .map(Bytes::toArray)
+                .map(ByteBuffer::wrap);
+
+            InputStream inputStream = ReactorUtils.toInputStream(source);
+
+            assertThat(inputStream).hasSameContentAs(new ByteArrayInputStream(bytes));
+        }
+
+        @Test
+        void givenALongFluxBytesShouldReadSuccessfullyTheWholeSource() throws IOException, InterruptedException {
+            byte[] bytes = RandomStringUtils.randomAlphabetic(41111).getBytes(StandardCharsets.US_ASCII);
+
+            Flux<ByteBuffer> source = Flux.fromIterable(Bytes.asList(bytes))
+                .window(3)
+                .flatMapSequential(Flux::collectList)
+                .map(Bytes::toArray)
+                .map(ByteBuffer::wrap);
+
+            InputStream inputStream = ReactorUtils.toInputStream(source);
+
+            assertThat(inputStream).hasSameContentAs(new ByteArrayInputStream(bytes));
+        }
+
         @Test
         void givenAFluxOnOneByteShouldConsumeOnlyTheReadBytesAndThePrefetch() throws IOException, InterruptedException {
             AtomicInteger generateElements = new AtomicInteger(0);
@@ -92,10 +126,10 @@ class ReactorUtilsTest {
                 .map(ByteBuffer::wrap);
 
             InputStream inputStream = ReactorUtils.toInputStream(source);
-            byte[] readBytes = new byte[5];
-            inputStream.read(readBytes, 0, readBytes.length);
+            byte[] readBytes = IOUtils.readFully(inputStream, 5);
 
             assertThat(readBytes).contains(0, 1, 2, 3, 4);
+            //make sure reactor is done with prefetch
             Thread.sleep(200);
             assertThat(generateElements.get()).isEqualTo(6);
         }
@@ -103,17 +137,20 @@ class ReactorUtilsTest {
         @Test
         void givenAFluxOf3BytesShouldConsumeOnlyTheReadBytesAndThePrefetch() throws IOException, InterruptedException {
             AtomicInteger generateElements = new AtomicInteger(0);
-            Flux<ByteBuffer> source = Flux.just(new byte[] {0, 1, 2}, new byte[] {3, 4, 5}, new byte[] {6, 7, 8})
+            Flux<ByteBuffer> source = Flux.just(
+                new byte[] {0, 1, 2},
+                new byte[] {3, 4, 5},
+                new byte[] {6, 7, 8})
                     .subscribeOn(Schedulers.elastic())
                     .map(ByteBuffer::wrap)
                     .limitRate(2)
                     .doOnRequest(request -> generateElements.getAndAdd((int) request));
 
             InputStream inputStream = ReactorUtils.toInputStream(source);
-            byte[] readBytes = new byte[5];
-            inputStream.read(readBytes, 0, readBytes.length);
+            byte[] readBytes = IOUtils.readFully(inputStream, 5);
 
             assertThat(readBytes).contains(0, 1, 2, 3, 4);
+            //make sure reactor is done with prefetch
             Thread.sleep(200);
             assertThat(generateElements.get()).isEqualTo(3);
         }
@@ -121,19 +158,22 @@ class ReactorUtilsTest {
         @Test
         void givenAFluxOf3BytesWithAnEmptyByteArrayShouldConsumeOnlyTheReadBytesAndThePrefetch() throws IOException, InterruptedException {
             AtomicInteger generateElements = new AtomicInteger(0);
-            Flux<ByteBuffer> source = Flux.just(new byte[] {0, 1, 2}, new byte[] {}, new byte[] {3, 4, 5}, new byte[] {6, 7, 8}, new byte[] {9, 10, 11})
+            Flux<ByteBuffer> source = Flux.just(
+                new byte[] {0, 1, 2},
+                new byte[] {},
+                new byte[] {3, 4, 5},
+                new byte[] {6, 7, 8},
+                new byte[] {9, 10, 11})
                     .subscribeOn(Schedulers.elastic())
                     .map(ByteBuffer::wrap)
                     .limitRate(2)
                     .doOnRequest(request -> generateElements.getAndAdd((int) request));
 
             InputStream inputStream = ReactorUtils.toInputStream(source);
-            byte[] readBytes = new byte[5];
-            inputStream.read(readBytes, 0, readBytes.length);
+            IOUtils.readFully(inputStream, 5);
 
-            assertThat(readBytes).contains(0, 1, 2, 3, 4);
-            Thread.sleep(200);
-            assertThat(generateElements.get()).isEqualTo(4);
+            byte[] readBytesBis = IOUtils.readFully(inputStream, 2);
+            assertThat(readBytesBis).contains(5,6);
         }
 
         @Test
@@ -150,6 +190,7 @@ class ReactorUtilsTest {
             inputStream.read(readBytes, 0, readBytes.length);
 
             assertThat(readBytes).contains(0, 0, 0, 0, 0);
+            //make sure reactor is done with prefetch
             Thread.sleep(200);
             assertThat(generateElements.get()).isEqualTo(1);
         }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 11/14: JAMES-3016 Create ConvertTo7Bit unit test

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 63dda699c6583ffc4aa42b23b172c49d726ab107
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Tue Jan 21 13:16:08 2020 +0700

    JAMES-3016 Create ConvertTo7Bit unit test
---
 .../james/jdkim/mailets/ConvertTo7BitTest.java     | 229 +++++++++++++++++++++
 .../eml/multipart-7bit-attachment-content.txt      |  98 +++++++++
 .../dkim/src/test/resources/eml/multipart-7bit.eml | 142 +++++++++++++
 .../eml/multipart-8bit-attachment-content.txt      |  92 +++++++++
 .../dkim/src/test/resources/eml/multipart-8bit.eml | 128 ++++++++++++
 .../dkim/src/test/resources/eml/text-only-7bit.eml |  27 +++
 .../dkim/src/test/resources/eml/text-only-8bit.eml |  29 +++
 7 files changed, 745 insertions(+)

diff --git a/server/mailet/dkim/src/test/java/org/apache/james/jdkim/mailets/ConvertTo7BitTest.java b/server/mailet/dkim/src/test/java/org/apache/james/jdkim/mailets/ConvertTo7BitTest.java
new file mode 100644
index 0000000..bbee42b
--- /dev/null
+++ b/server/mailet/dkim/src/test/java/org/apache/james/jdkim/mailets/ConvertTo7BitTest.java
@@ -0,0 +1,229 @@
+/****************************************************************
+ * 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.jdkim.mailets;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+import javax.mail.BodyPart;
+import javax.mail.internet.MimeMultipart;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.james.util.MimeMessageUtil;
+import org.apache.mailet.Mail;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMailetConfig;
+import org.assertj.core.api.SoftAssertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+import com.github.fge.lambdas.Throwing;
+
+class ConvertTo7BitTest {
+
+    private static final String CONTENT_TRANSFER_ENCODING = "Content-Transfer-Encoding";
+    private static final String X_MIME_AUTOCONVERTED = "X-MIME-Autoconverted";
+    private static final String QUOTED_PRINTABLE = "quoted-printable";
+    private static final String MESSAGE_BODY_8BIT = "A 8bit encoded body with €uro symbol.";
+    private static final String MESSAGE_BODY_QUOTED_PRINTABLE = "A 8bit encoded body with =E2=82=ACuro symbol.";
+    private static final String BASE64 = "base64";
+
+    private ConvertTo7Bit testee;
+
+    @BeforeEach
+    void setUp() throws Exception {
+        testee = new ConvertTo7Bit();
+        testee.init(FakeMailetConfig.builder()
+            .build());
+    }
+
+    @Nested
+    class When7BitMail {
+        @Nested
+        class WhenTextContent {
+            @Test
+            void serviceShouldKeepMessageContentUnTouch() throws Exception {
+                Mail mail = FakeMail.builder()
+                    .name("a-mail-with-quoted-printable-encoding")
+                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/text-only-7bit.eml")))
+                    .build();
+
+                testee.service(mail);
+
+                SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+                    softly.assertThat(mail.getMessage().getEncoding())
+                        .isEqualTo(QUOTED_PRINTABLE);
+                    softly.assertThat(MimeMessageUtil.asString(mail.getMessage()))
+                        .contains(MESSAGE_BODY_QUOTED_PRINTABLE);
+                }));
+            }
+        }
+
+        @Nested
+        class WhenMultipart {
+            @Test
+            void serviceShouldKeepMessageTextContentUnTouch() throws Exception {
+                Mail mail = FakeMail.builder()
+                    .name("a-mail-with-7bit-encoding")
+                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/multipart-7bit.eml")))
+                    .build();
+
+                testee.service(mail);
+                MimeMultipart multipart = (MimeMultipart) mail.getMessage().getContent();
+
+                SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+                    softly.assertThat(multipart.getBodyPart(0).getHeader(CONTENT_TRANSFER_ENCODING))
+                        .containsOnly(QUOTED_PRINTABLE);
+                    softly.assertThat(MimeMessageUtil.asString(mail.getMessage()))
+                        .contains(MESSAGE_BODY_QUOTED_PRINTABLE);
+                }));
+            }
+
+            @Test
+            void serviceShouldKeepMessageAttachmentsContentUnTouch() throws Exception {
+                Mail mail = FakeMail.builder()
+                    .name("a-mail-with-7bit-encoding")
+                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/multipart-7bit.eml")))
+                    .build();
+
+                testee.service(mail);
+                MimeMultipart multipart = (MimeMultipart) mail.getMessage().getContent();
+                String messageAsString = MimeMessageUtil.asString(mail.getMessage());
+
+                SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+                    softly.assertThat(multipart.getBodyPart(1).getHeader(CONTENT_TRANSFER_ENCODING))
+                        .containsOnly(BASE64);
+                    softly.assertThat(messageAsString)
+                        .contains(fileContent("eml/multipart-7bit-attachment-content.txt"));
+                }));
+            }
+        }
+    }
+
+    @Nested
+    class When8BitMail {
+        @Nested
+        class WhenTextContent {
+            @Test
+            void serviceShouldAlertHeaders() throws Exception {
+                Mail mail = FakeMail.builder()
+                    .name("a-mail-with-8bit-encoding")
+                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/text-only-8bit.eml")))
+                    .build();
+                testee.service(mail);
+
+                SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+                   assertThat(mail.getMessage().getHeader(CONTENT_TRANSFER_ENCODING))
+                       .containsOnly(QUOTED_PRINTABLE);
+                   assertThat(mail.getMessage().getHeader(X_MIME_AUTOCONVERTED))
+                       .containsOnly("from 8bit to quoted-printable by Mock Server");
+                }));
+            }
+
+            @Test
+            void serviceShouldConvertContentToQuotedPrintable() throws Exception {
+                Mail mail = FakeMail.builder()
+                    .name("a-mail-with-8bit-encoding")
+                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/text-only-8bit.eml")))
+                    .build();
+                testee.service(mail);
+
+                assertThat(MimeMessageUtil.asString(mail.getMessage()))
+                    .contains(MESSAGE_BODY_QUOTED_PRINTABLE)
+                    .doesNotContain(MESSAGE_BODY_8BIT);
+            }
+        }
+
+        @Nested
+        class WhenMultipart {
+
+            @Test
+            void serviceShouldAlertTextPartHeaders() throws Exception {
+                Mail mail = FakeMail.builder()
+                    .name("a-mail-with-8bit-encoding")
+                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/multipart-8bit.eml")))
+                    .build();
+
+                testee.service(mail);
+
+                BodyPart textPart = ((MimeMultipart) mail.getMessage().getContent())
+                    .getBodyPart(0);
+
+                SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+                   assertThat(textPart.getHeader(CONTENT_TRANSFER_ENCODING))
+                       .containsOnly(QUOTED_PRINTABLE);
+                   assertThat(textPart.getHeader(X_MIME_AUTOCONVERTED))
+                       .containsOnly("from 8bit to quoted-printable by Mock Server");
+                }));
+            }
+
+            @Test
+            void serviceShouldConvertTextPartContentToQuotedPrintable() throws Exception {
+                Mail mail = FakeMail.builder()
+                    .name("a-mail-with-8bit-encoding")
+                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/multipart-8bit.eml")))
+                    .build();
+
+                testee.service(mail);
+
+                assertThat(MimeMessageUtil.asString(mail.getMessage()))
+                    .contains(MESSAGE_BODY_QUOTED_PRINTABLE)
+                    .doesNotContain(MESSAGE_BODY_8BIT);
+            }
+
+            @Test
+            void serviceShouldKeepAttachmentPartUnTouchWhenBase64Encoding() throws Exception {
+                Mail mail = FakeMail.builder()
+                    .name("a-mail-with-8bit-encoding")
+                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/multipart-8bit.eml")))
+                    .build();
+
+                testee.service(mail);
+
+                MimeMultipart multipart = (MimeMultipart) mail.getMessage().getContent();
+                String messageAsString = MimeMessageUtil.asString(mail.getMessage());
+
+                SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+                    softly.assertThat(multipart.getBodyPart(1).getHeader(CONTENT_TRANSFER_ENCODING))
+                        .containsOnly(BASE64);
+                    softly.assertThat(messageAsString)
+                        .contains(fileContent("eml/multipart-8bit-attachment-content.txt"));
+                }));
+            }
+        }
+    }
+
+    private String fileContent(String fileName) throws IOException {
+        return IOUtils.toString(
+            ClassLoader.getSystemResourceAsStream(fileName),
+            StandardCharsets.UTF_8);
+    }
+}
\ No newline at end of file
diff --git a/server/mailet/dkim/src/test/resources/eml/multipart-7bit-attachment-content.txt b/server/mailet/dkim/src/test/resources/eml/multipart-7bit-attachment-content.txt
new file mode 100644
index 0000000..82492c7
--- /dev/null
+++ b/server/mailet/dkim/src/test/resources/eml/multipart-7bit-attachment-content.txt
@@ -0,0 +1,98 @@
+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
+RK5CYII=
\ No newline at end of file
diff --git a/server/mailet/dkim/src/test/resources/eml/multipart-7bit.eml b/server/mailet/dkim/src/test/resources/eml/multipart-7bit.eml
new file mode 100644
index 0000000..655af28
--- /dev/null
+++ b/server/mailet/dkim/src/test/resources/eml/multipart-7bit.eml
@@ -0,0 +1,142 @@
+Return-Path: <bo...@james.org>
+MIME-Version: 1.0
+Delivered-To: bob@james.org
+Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83])
+          by james-0 (JAMES SMTP Server ) with ESMTP ID -973333758
+          for <bo...@james.james.org>;
+          Wed, 22 Jan 2020 03:47:32 +0000 (UTC)
+Received: from smtp.james.org (unknown [10.233.65.0])
+	by incoming.james.org (Postfix) with ESMTPS id 8151D43
+	for <bo...@james.james.org>; Wed, 22 Jan 2020 03:47:32 +0000 (UTC)
+Received: from [10.116.29.102] (unknown [1.54.162.156])
+	(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
+	(No client certificate requested)
+	by smtp.james.org (Postfix) with ESMTPSA id D6C653F38C
+	for <bo...@james.org>; Wed, 22 Jan 2020 04:47:31 +0100 (CET)
+To: bob@james.org
+X-LINAGORA-Copy-Delivery-Done: 1
+From: Uncle Bob <bo...@james.org>
+Subject: multipart
+Message-ID: <69...@james.org>
+Date: Wed, 22 Jan 2020 10:47:17 +0700
+User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101
+ Thunderbird/60.2.1
+Content-Type: multipart/mixed;
+ boundary="------------C3FD44EAF9B6A93E163D9176"
+Content-Language: en-US
+
+This is a multi-part message in MIME format.
+--------------C3FD44EAF9B6A93E163D9176
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: quoted-printable
+
+A 8bit encoded body with =E2=82=ACuro symbol.
+
+
+
+--------------C3FD44EAF9B6A93E163D9176
+Content-Type: image/png;
+ name="james-logo.png"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="james-logo.png"
+
+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
+RK5CYII=
+--------------C3FD44EAF9B6A93E163D9176--
diff --git a/server/mailet/dkim/src/test/resources/eml/multipart-8bit-attachment-content.txt b/server/mailet/dkim/src/test/resources/eml/multipart-8bit-attachment-content.txt
new file mode 100644
index 0000000..2442749
--- /dev/null
+++ b/server/mailet/dkim/src/test/resources/eml/multipart-8bit-attachment-content.txt
@@ -0,0 +1,92 @@
+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
diff --git a/server/mailet/dkim/src/test/resources/eml/multipart-8bit.eml b/server/mailet/dkim/src/test/resources/eml/multipart-8bit.eml
new file mode 100644
index 0000000..3c8c8f4
--- /dev/null
+++ b/server/mailet/dkim/src/test/resources/eml/multipart-8bit.eml
@@ -0,0 +1,128 @@
+Return-Path: <bo...@james.org>
+MIME-Version: 1.0
+Delivered-To: bob@james.org
+Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83])
+          by james-0 (JAMES SMTP Server ) with ESMTP ID 926590876
+          for <bo...@james.james.org>;
+          Tue, 21 Jan 2020 07:12:56 +0000 (UTC)
+Received: from smtp.james.org (unknown [10.233.68.1])
+	by incoming.james.org (Postfix) with ESMTPS id B39A643
+	for <bo...@james.james.org>; Tue, 21 Jan 2020 07:12:56 +0000 (UTC)
+Received: from duc-HP-ProBook-450-G4 (unknown [1.54.162.156])
+	(using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits))
+	(No client certificate requested)
+	by smtp.james.org (Postfix) with ESMTPSA id F11B13F386
+	for <bo...@james.org>; Tue, 21 Jan 2020 08:12:55 +0100 (CET)
+Date: Tue, 21 Jan 2020 14:12:39 +0700 (ICT)
+X-LINAGORA-Copy-Delivery-Done: 1
+From: bob@james.org
+To: bob@james.org
+Message-ID: <42...@duc-HP-ProBook-450-G4>
+Subject: UTF-8 8bit multipart
+Content-Type: multipart/mixed; 
+	boundary="----=_Part_0_238762799.1579590759052"
+
+------=_Part_0_238762799.1579590759052
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+A 8bit encoded body with €uro symbol.
+------=_Part_0_238762799.1579590759052
+Content-Type: application/octet-stream; name=james-logo.png
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename=james-logo.png
+
+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
+
+------=_Part_0_238762799.1579590759052--
diff --git a/server/mailet/dkim/src/test/resources/eml/text-only-7bit.eml b/server/mailet/dkim/src/test/resources/eml/text-only-7bit.eml
new file mode 100644
index 0000000..84ece72
--- /dev/null
+++ b/server/mailet/dkim/src/test/resources/eml/text-only-7bit.eml
@@ -0,0 +1,27 @@
+Return-Path: <bo...@james.org>
+MIME-Version: 1.0
+Delivered-To: bob@james.org
+Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83])
+          by james-0 (JAMES SMTP Server ) with ESMTP ID -1705393842
+          for <bo...@james.james.org>;
+          Wed, 22 Jan 2020 04:11:54 +0000 (UTC)
+Received: from smtp.james.org (unknown [10.233.65.0])
+	by incoming.james.org (Postfix) with ESMTPS id CCCA943
+	for <bo...@james.james.org>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC)
+Received: from [10.116.29.102] (unknown [1.54.162.156])
+	(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
+	(No client certificate requested)
+	by smtp.james.org (Postfix) with ESMTPSA id 2B7D13F393
+	for <bo...@james.org>; Wed, 22 Jan 2020 05:11:53 +0100 (CET)
+To: bob@james.org
+X-LINAGORA-Copy-Delivery-Done: 1
+From: Uncle Bob <bo...@james.org>
+Subject: quoted
+Message-ID: <f4...@james.org>
+Date: Wed, 22 Jan 2020 11:11:38 +0700
+User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101
+ Thunderbird/60.2.1
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: quoted-printable
+
+A 8bit encoded body with =E2=82=ACuro symbol.
diff --git a/server/mailet/dkim/src/test/resources/eml/text-only-8bit.eml b/server/mailet/dkim/src/test/resources/eml/text-only-8bit.eml
new file mode 100644
index 0000000..ebe1cc7
--- /dev/null
+++ b/server/mailet/dkim/src/test/resources/eml/text-only-8bit.eml
@@ -0,0 +1,29 @@
+Return-Path: <bo...@james.org>
+MIME-Version: 1.0
+Delivered-To: bob@james.org
+Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83])
+          by james-0 (JAMES SMTP Server ) with ESMTP ID -1705393842
+          for <bo...@james.james.org>;
+          Wed, 22 Jan 2020 04:11:54 +0000 (UTC)
+Received: from smtp.james.org (unknown [10.233.65.0])
+	by incoming.james.org (Postfix) with ESMTPS id CCCA943
+	for <bo...@james.james.org>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC)
+Received: from [10.116.29.102] (unknown [1.54.162.156])
+	(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
+	(No client certificate requested)
+	by smtp.james.org (Postfix) with ESMTPSA id 2B7D13F393
+	for <bo...@james.org>; Wed, 22 Jan 2020 05:11:53 +0100 (CET)
+To: bob@james.org
+X-LINAGORA-Copy-Delivery-Done: 1
+From: Uncle Bob <bo...@james.org>
+Subject: quoted
+Message-ID: <f4...@james.org>
+Date: Wed, 22 Jan 2020 11:11:38 +0700
+User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101
+ Thunderbird/60.2.1
+Content-Type: text/plain; charset=utf-8; format=flowed
+Content-Transfer-Encoding: 8bit
+Content-Language: en-US
+
+A 8bit encoded body with €uro symbol.
+


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 13/14: JAMES-3016 Converter7Bit tail recursive optimization

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit c4457840ad9eed8fe3f43b9a52e28da388ad00b1
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Thu Jan 30 13:27:21 2020 +0700

    JAMES-3016 Converter7Bit tail recursive optimization
---
 .../main/java/org/apache/mailet/base/Converter7Bit.java   | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/mailet/base/src/main/java/org/apache/mailet/base/Converter7Bit.java b/mailet/base/src/main/java/org/apache/mailet/base/Converter7Bit.java
index 095608f..12de427 100644
--- a/mailet/base/src/main/java/org/apache/mailet/base/Converter7Bit.java
+++ b/mailet/base/src/main/java/org/apache/mailet/base/Converter7Bit.java
@@ -20,9 +20,7 @@
 package org.apache.mailet.base;
 
 import java.io.IOException;
-import java.util.List;
 
-import javax.mail.BodyPart;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
@@ -31,6 +29,8 @@ import javax.mail.internet.MimePart;
 import org.apache.james.javax.MultipartUtil;
 import org.apache.mailet.MailetContext;
 
+import com.github.fge.lambdas.Throwing;
+
 public class Converter7Bit {
 
     private final MailetContext mailetContext;
@@ -45,12 +45,7 @@ public class Converter7Bit {
     }
 
     private void convertPart(MimePart part) throws MessagingException, IOException {
-        if (part.isMimeType("multipart/*")) {
-            List<BodyPart> bodyParts = MultipartUtil.retrieveBodyParts((MimeMultipart) part.getContent());
-            for (BodyPart bodyPart : bodyParts) {
-                convertPart((MimePart) bodyPart);
-            }
-        } else if ("8bit".equals(part.getEncoding())) {
+        if ("8bit".equals(part.getEncoding())) {
             // The content may already be in encoded the form (likely with mail
             // created from a
             // stream). In that case, just changing the encoding to
@@ -67,7 +62,9 @@ public class Converter7Bit {
             part.setHeader("Content-Transfer-Encoding", contentTransferEncoding);
             part.addHeader("X-MIME-Autoconverted", "from 8bit to "
                 + contentTransferEncoding + " by " + mailetContext.getServerInfo());
+        } else if (part.isMimeType("multipart/*")) {
+            MultipartUtil.retrieveBodyParts((MimeMultipart) part.getContent())
+                .forEach(Throwing.consumer(bodyPart -> convertPart((MimePart) bodyPart)));
         }
     }
-
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 07/14: [Refactoring] Migrate InMemoryCurrentQuotaManagerTest to JUnit 5

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit f2e375aa4ea1b60e916b455d8e94012f808160fc
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Tue Jan 21 16:29:53 2020 +0700

    [Refactoring] Migrate InMemoryCurrentQuotaManagerTest to JUnit 5
---
 .../quota/InMemoryCurrentQuotaManagerTest.java     | 79 ++++++++++++----------
 1 file changed, 44 insertions(+), 35 deletions(-)

diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
index 3c60d77..182978b 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.inmemory.quota;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -30,24 +31,24 @@ import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.SessionProvider;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
-public class InMemoryCurrentQuotaManagerTest {
+class InMemoryCurrentQuotaManagerTest {
 
-    public static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", Optional.empty());
+    static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", Optional.empty());
 
-    private InMemoryCurrentQuotaManager testee;
-    private CurrentQuotaCalculator mockedCurrentQuotaCalculator;
+    InMemoryCurrentQuotaManager testee;
+    CurrentQuotaCalculator mockedCurrentQuotaCalculator;
 
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp() {
         mockedCurrentQuotaCalculator = mock(CurrentQuotaCalculator.class);
         testee = new InMemoryCurrentQuotaManager(mockedCurrentQuotaCalculator, mock(SessionProvider.class));
     }
 
     @Test
-    public void getCurrentMessageCountShouldReturnRecalculateMessageCountWhenEntryIsNotInitialized() throws Exception {
+    void getCurrentMessageCountShouldReturnRecalculateMessageCountWhenEntryIsNotInitialized() throws Exception {
         when(mockedCurrentQuotaCalculator.recalculateCurrentQuotas(QUOTA_ROOT, null))
             .thenReturn(new CurrentQuotaCalculator.CurrentQuotas(18, 512));
 
@@ -55,7 +56,7 @@ public class InMemoryCurrentQuotaManagerTest {
     }
 
     @Test
-    public void getCurrentStorageShouldReturnRecalculateSizeWhenEntryIsNotInitialized() throws Exception {
+    void getCurrentStorageShouldReturnRecalculateSizeWhenEntryIsNotInitialized() throws Exception {
         when(mockedCurrentQuotaCalculator.recalculateCurrentQuotas(QUOTA_ROOT, null))
             .thenReturn(new CurrentQuotaCalculator.CurrentQuotas(18, 512));
 
@@ -63,7 +64,7 @@ public class InMemoryCurrentQuotaManagerTest {
     }
 
     @Test
-    public void getCurrentStorageShouldReRetrieveStoredQuotasWhenCalculateOnUnknownQuotaIsTrue() throws Exception {
+    void getCurrentStorageShouldReRetrieveStoredQuotasWhenCalculateOnUnknownQuotaIsTrue() throws Exception {
         when(mockedCurrentQuotaCalculator.recalculateCurrentQuotas(QUOTA_ROOT, null))
             .thenReturn(new CurrentQuotaCalculator.CurrentQuotas(18, 512));
 
@@ -73,44 +74,52 @@ public class InMemoryCurrentQuotaManagerTest {
         assertThat(testee.getCurrentStorage(QUOTA_ROOT)).isEqualTo(QuotaSizeUsage.size(612));
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void increaseShouldThrowOnZeroCount() throws Exception {
-        testee.increase(QUOTA_ROOT, 0, 5);
+    @Test
+    void increaseShouldThrowOnZeroCount() {
+        assertThatThrownBy(() -> testee.increase(QUOTA_ROOT, 0, 5))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void increaseShouldThrowOnNegativeCount() throws Exception {
-        testee.increase(QUOTA_ROOT, -1, 5);
+    @Test
+    void increaseShouldThrowOnNegativeCount() {
+        assertThatThrownBy(() -> testee.increase(QUOTA_ROOT, -1, 5))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void increaseShouldThrowOnZeroSize() throws Exception {
-        testee.increase(QUOTA_ROOT, 5, 0);
+    @Test
+    void increaseShouldThrowOnZeroSize() {
+        assertThatThrownBy(() -> testee.increase(QUOTA_ROOT, 5, 0))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void increaseShouldThrowOnNegativeSize() throws Exception {
-        testee.increase(QUOTA_ROOT, 5, -1);
+    @Test
+    void increaseShouldThrowOnNegativeSize() {
+        assertThatThrownBy(() -> testee.increase(QUOTA_ROOT, 5, -1))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void decreaseShouldThrowOnZeroCount() throws Exception {
-        testee.decrease(QUOTA_ROOT, 0, 5);
+    @Test
+    void decreaseShouldThrowOnZeroCount() {
+        assertThatThrownBy(() -> testee.decrease(QUOTA_ROOT, 0, 5))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void decreaseShouldThrowOnNegativeCount() throws Exception {
-        testee.decrease(QUOTA_ROOT, -1, 5);
+    @Test
+    void decreaseShouldThrowOnNegativeCount() {
+        assertThatThrownBy(() -> testee.decrease(QUOTA_ROOT, -1, 5))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void decreaseShouldThrowOnZeroSize() throws Exception {
-        testee.decrease(QUOTA_ROOT, 5, 0);
+    @Test
+    void decreaseShouldThrowOnZeroSize() {
+        assertThatThrownBy(() -> testee.decrease(QUOTA_ROOT, 5, 0))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void decreaseShouldThrowOnNegativeSize() throws Exception {
-        testee.decrease(QUOTA_ROOT, 5, -1);
+    @Test
+    void decreaseShouldThrowOnNegativeSize() {
+        assertThatThrownBy(() -> testee.decrease(QUOTA_ROOT, 5, -1))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org