You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/07/10 01:49:02 UTC

[james-project] branch master updated (7080bd4 -> 5331338)

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

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


    from 7080bd4  fixup! JAMES-2982 Improve Username validation error messages
     new bcb75a6  [REFACTORING] Use Optional.stream
     new 0b47d96  [REFACTORING] Use Predicate.{not, equals}
     new 4eb9d55  JAMES-3295 Add an AtMost matcher
     new 3a80f69  JAMES-3295 remoteDeliveryShouldStoreTemporaryFailureAsPermanentWhenExceedsMaximumRetries
     new 45e9324  JAMES-3295 Matcher for permanent error SMTP code
     new 29cd7d4  JAMES-3295 Matcher for permanent delivery error
     new d8c498c  JAMES-3295 Permanent delivery error matcher implementation/test
     new eb7510b  JAMES-3302 Documentation skeleton for the distributed James server
     new 5331338  Fix anchor links

The 9 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:
 README.adoc                                        |   8 +-
 .../cassandra/init/CassandraTableManager.java      |   5 +-
 .../java/org/apache/james/core/MaybeSender.java    |   3 +-
 docs/modules/servers/nav.adoc                      |  14 ++
 docs/modules/servers/pages/distributed.adoc        |  18 ++-
 .../servers/pages/distributed/architecture.adoc    |  16 ++
 .../servers/pages/distributed/configure/index.adoc |   7 +
 .../servers/pages/distributed/extend/index.adoc    |  18 +++
 .../pages/distributed/extend/mail-processing.adoc  |   3 +
 .../distributed/extend/mailbox-listeners.adoc      |   3 +
 .../pages/distributed/extend/smtp-hooks.adoc       |   3 +
 .../pages/distributed/extend/webadmin-routes.adoc  |   3 +
 .../servers/pages/distributed/operate/cli.adoc     |   4 +
 .../servers/pages/distributed/operate/guide.adoc   |   4 +
 .../servers/pages/distributed/operate/index.adoc   |  20 +++
 .../servers/pages/distributed/operate/metrics.adoc |   4 +
 .../pages/distributed/operate/webadmin.adoc        |   4 +
 .../servers/pages/distributed/run-docker.adoc      |   4 +
 docs/modules/servers/pages/distributed/run.adoc    |   4 +
 .../org/apache/james/mailbox/model/MailboxACL.java |   3 +-
 .../apache/james/mailbox/model/MailboxPath.java    |   3 +-
 .../mailbox/model/MessageAttachmentMetadata.java   |   3 +-
 .../james/mailbox/quota/MaxQuotaManager.java       |   6 +-
 .../mailbox/cassandra/DeleteMessageListener.java   |   3 +-
 .../task/SolveMessageInconsistenciesService.java   |   3 +-
 .../quota/CassandraCurrentQuotaManager.java        |   4 +-
 .../elasticsearch/json/IndexableMessage.java       |   3 +-
 .../james/mailbox/elasticsearch/json/MimePart.java |   7 +-
 .../james/mailbox/events/GroupRegistration.java    |   3 +-
 .../mailbox/events/KeyRegistrationHandler.java     |   3 +-
 .../maildir/user/MaildirSubscriptionMapper.java    |   4 +-
 .../inmemory/mail/InMemoryMessageMapper.java       |   5 +-
 .../quota/InMemoryCurrentQuotaManager.java         |   3 +-
 .../james/mailbox/store/StoreMessageIdManager.java |   3 +-
 .../mailbox/store/mail/model/FlagsFactory.java     |   3 +-
 .../store/mail/model/impl/MessageParser.java       |   9 +-
 .../api/src/main/java/org/apache/mailet/Mail.java  |   3 +-
 .../james/transport/mailets/SetErrorMessage.java   |   4 +-
 .../{TooManyRecipients.java => AtMost.java}        |  37 +++--
 .../utils/MailAddressCollectionReader.java         |   3 +-
 .../james/transport/matchers/AtMostTest.java       | 158 +++++++++++++++++++
 .../imap/decode/parser/CreateCommandParser.java    |   4 +-
 .../ObjectStorageBlobConfiguration.java            |   3 +-
 .../james/modules/protocols/ImapGuiceProbe.java    |  16 +-
 .../org/apache/james/jmap/draft/JMAPModule.java    |   3 +-
 .../java/org/apache/james/util/OptionalUtils.java  |   3 +-
 .../java/org/apache/james/util/UnitParser.java     |   3 +-
 .../james/util/mime/MessageContentExtractor.java   |   5 +-
 .../CassandraRecipientRewriteTableDAO.java         |   4 +-
 .../MessageFastViewPrecomputedProperties.java      |   3 +-
 .../domainlist/lib/DomainListConfiguration.java    |   3 +-
 .../mailets/RemoteDeliveryErrorHandlingTest.java   |  27 +++-
 .../mailetcontainer/impl/JamesMailetContext.java   |   3 +-
 .../james/transport/mailets/SpamAssassin.java      |   3 +-
 .../transport/mailets/jsieve/DiscardAction.java    |   4 +-
 .../transport/mailets/remote/delivery/Bouncer.java |   2 +
 .../mailets/remote/delivery/DeliveryRunnable.java  |  10 +-
 .../matchers/IsRemoteDeliveryPermanentError.java   |  18 ++-
 .../matchers/RemoteDeliveryFailedWithSMTPCode.java |  30 ++--
 .../IsRemoteDeliveryPermanentErrorTest.java        | 102 ++++++++++++
 .../RemoteDeliveryFailedWithSMTPCodeTest.java      | 173 +++++++++++++++++++++
 .../cucumber/util/ObjectFromStringExtractor.java   |   3 +-
 .../jmap/draft/methods/MIMEMessageConverter.java   |   3 +-
 .../methods/SetMailboxesDestructionProcessor.java  |   3 +-
 .../draft/methods/SetMailboxesUpdateProcessor.java |   4 +-
 .../org/apache/james/jmap/draft/model/Emailer.java |   4 +-
 .../jmap/draft/model/GetMailboxesRequest.java      |   3 +-
 .../james/jmap/draft/model/mailbox/Rights.java     |   3 +-
 .../model/message/view/MessageFullViewFactory.java |   6 +-
 .../model/message/view/MessageViewFactory.java     |   3 +-
 .../jmap/draft/utils/JsoupHtmlTextExtractor.java   |   5 +-
 .../jmap/event/PropagateLookupRightListener.java   |   3 +-
 .../jmap/http/DefaultMailboxesProvisionerTest.java |   3 +-
 .../apache/james/webadmin/routes/TasksRoutes.java  |   3 +-
 .../service/MailRepositoryStoreService.java        |   7 +-
 75 files changed, 772 insertions(+), 118 deletions(-)
 create mode 100644 docs/modules/servers/pages/distributed/architecture.adoc
 create mode 100644 docs/modules/servers/pages/distributed/configure/index.adoc
 create mode 100644 docs/modules/servers/pages/distributed/extend/index.adoc
 create mode 100644 docs/modules/servers/pages/distributed/extend/mail-processing.adoc
 create mode 100644 docs/modules/servers/pages/distributed/extend/mailbox-listeners.adoc
 create mode 100644 docs/modules/servers/pages/distributed/extend/smtp-hooks.adoc
 create mode 100644 docs/modules/servers/pages/distributed/extend/webadmin-routes.adoc
 create mode 100644 docs/modules/servers/pages/distributed/operate/cli.adoc
 create mode 100644 docs/modules/servers/pages/distributed/operate/guide.adoc
 create mode 100644 docs/modules/servers/pages/distributed/operate/index.adoc
 create mode 100644 docs/modules/servers/pages/distributed/operate/metrics.adoc
 create mode 100644 docs/modules/servers/pages/distributed/operate/webadmin.adoc
 create mode 100644 docs/modules/servers/pages/distributed/run-docker.adoc
 create mode 100644 docs/modules/servers/pages/distributed/run.adoc
 copy mailet/standard/src/main/java/org/apache/james/transport/matchers/{TooManyRecipients.java => AtMost.java} (56%)
 create mode 100644 mailet/standard/src/test/java/org/apache/james/transport/matchers/AtMostTest.java
 copy mailet/standard/src/main/java/org/apache/james/transport/matchers/SentByMailet.java => server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsRemoteDeliveryPermanentError.java (76%)
 copy mailet/standard/src/main/java/org/apache/james/transport/matchers/SentByMailet.java => server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/RemoteDeliveryFailedWithSMTPCode.java (67%)
 create mode 100644 server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsRemoteDeliveryPermanentErrorTest.java
 create mode 100644 server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/RemoteDeliveryFailedWithSMTPCodeTest.java


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


[james-project] 09/09: Fix anchor links

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

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

commit 533133888d20ad78047cacfbf9ca6e8465a9a472
Author: Noriyuki Kazusawa <no...@bm-sms.co.jp>
AuthorDate: Thu Jul 9 19:23:47 2020 +0900

    Fix anchor links
---
 README.adoc | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/README.adoc b/README.adoc
index 872e555..1d9e287 100644
--- a/README.adoc
+++ b/README.adoc
@@ -44,10 +44,10 @@ There is many other ways one can help us: packaging, communication, etc ...
  * link:#how-to-release-via-maven-release-plugin[How to release via maven release plugin]
  * link:#how-to-check-the-compilation[How to check the compilation]
  * link:#how-to-run-james-in-docker[How to run James in Docker]
- ** link:#run-james-with-%2Dguice-%2Dcassandra-%2Drabbitmq-%2Dswift-%2Delasticsearch[Run James with Guice + Cassandra + RabbitMQ + Swift + ElasticSearch]
- ** link:#run-james-with-%2Dguice-%2Dcassandra-%2Delasticsearch[Run James with Guice + Cassandra + ElasticSearch]
- ** link:#run-james-with-%2Dguice-%2Djpa-%2Dlucene[Run James with Guice + JPA + Lucene]
- ** link:#run-james-with-%2Dspring-%2Djpa[Run James with Spring + JPA]
+ ** link:#run-james-with-guice-%2Dcassandra-%2Drabbitmq-%2Dswift-%2Delasticsearch[Run James with Guice + Cassandra + RabbitMQ + Swift + ElasticSearch]
+ ** link:#run-james-with-guice-%2Dcassandra-%2Delasticsearch[Run James with Guice + Cassandra + ElasticSearch]
+ ** link:#run-james-with-guice-%2Djpa-%2Dlucene[Run James with Guice + JPA + Lucene]
+ ** link:#run-james-with-spring-%2Djpa[Run James with Spring + JPA]
  * link:#other-useful-commands[Other Useful commands]
  ** link:#how-to-add-a-domain-[How to add a domain?]
  ** link:#how-to-add-a-user-[How to add a user?]


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


[james-project] 03/09: JAMES-3295 Add an AtMost matcher

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

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

commit 4eb9d55bd7b556e236ffbd9f5f91c43f31b26b8b
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Mon Jul 6 16:19:15 2020 +0700

    JAMES-3295 Add an AtMost matcher
---
 .../apache/james/transport/matchers/AtMost.java    |  73 ++++++++++
 .../james/transport/matchers/AtMostTest.java       | 158 +++++++++++++++++++++
 2 files changed, 231 insertions(+)

diff --git a/mailet/standard/src/main/java/org/apache/james/transport/matchers/AtMost.java b/mailet/standard/src/main/java/org/apache/james/transport/matchers/AtMost.java
new file mode 100644
index 0000000..f3fee35
--- /dev/null
+++ b/mailet/standard/src/main/java/org/apache/james/transport/matchers/AtMost.java
@@ -0,0 +1,73 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+import java.util.Collection;
+import java.util.Optional;
+
+import javax.mail.MessagingException;
+
+import org.apache.james.core.MailAddress;
+import org.apache.mailet.Attribute;
+import org.apache.mailet.AttributeName;
+import org.apache.mailet.AttributeUtils;
+import org.apache.mailet.AttributeValue;
+import org.apache.mailet.Mail;
+import org.apache.mailet.base.GenericMatcher;
+import org.apache.mailet.base.MailetUtil;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Checks that a mail did at most X executions on a specific operation.
+ *
+ * If no executions have been performed previously, it sets up an attribute `AT_MOST_EXECUTIONS`
+ * in the mail that will be incremented every time the check succeeds.
+ *
+ * The check fails when the defined X limit is reached.
+ *
+ * <p>The example below will match a mail with at most 3 executions on the mailet</p>
+ *
+ * <pre><code>
+ * &lt;mailet match=&quot;AtMost=3&quot; class=&quot;&lt;any-class&gt;&quot;&gt;
+ * &lt;/mailet&gt;
+ * </code></pre>
+ */
+public class AtMost extends GenericMatcher {
+    static final AttributeName AT_MOST_EXECUTIONS = AttributeName.of("AT_MOST_EXECUTIONS");
+    private Integer atMostExecutions;
+
+    @Override
+    public void init() throws MessagingException {
+        this.atMostExecutions = MailetUtil.getInitParameterAsStrictlyPositiveInteger(getCondition());
+    }
+
+    @Override
+    public Collection<MailAddress> match(Mail mail) throws MessagingException {
+        return AttributeUtils.getValueAndCastFromMail(mail, AT_MOST_EXECUTIONS, Integer.class)
+            .or(() -> Optional.of(0))
+            .filter(executions -> executions < atMostExecutions)
+            .map(executions -> {
+                mail.setAttribute(new Attribute(AT_MOST_EXECUTIONS, AttributeValue.of(executions + 1)));
+                return mail.getRecipients();
+            })
+            .orElse(ImmutableList.of());
+    }
+}
diff --git a/mailet/standard/src/test/java/org/apache/james/transport/matchers/AtMostTest.java b/mailet/standard/src/test/java/org/apache/james/transport/matchers/AtMostTest.java
new file mode 100644
index 0000000..3be5f12
--- /dev/null
+++ b/mailet/standard/src/test/java/org/apache/james/transport/matchers/AtMostTest.java
@@ -0,0 +1,158 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+import static org.apache.james.transport.matchers.AtMost.AT_MOST_EXECUTIONS;
+import static org.apache.mailet.base.MailAddressFixture.RECIPIENT1;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.util.Collection;
+
+import javax.mail.MessagingException;
+
+import org.apache.james.core.MailAddress;
+import org.apache.mailet.Attribute;
+import org.apache.mailet.AttributeValue;
+import org.apache.mailet.Mail;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMatcherConfig;
+import org.assertj.core.api.SoftAssertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import com.github.fge.lambdas.Throwing;
+
+class AtMostTest {
+    private static final String CONDITION = "2";
+
+    private AtMost matcher;
+
+    private Mail createMail() throws MessagingException {
+        return FakeMail.builder()
+            .name("test-message")
+            .recipient(RECIPIENT1)
+            .build();
+    }
+
+    @BeforeEach
+    void setup() throws MessagingException {
+        this.matcher = new AtMost();
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+            .matcherName("AtMost")
+            .condition(CONDITION)
+            .build();
+
+        matcher.init(matcherConfig);
+    }
+
+    @Test
+    void shouldMatchWhenAttributeNotSet() throws MessagingException {
+        Mail mail = createMail();
+
+        Collection<MailAddress> actual = matcher.match(mail);
+
+        assertThat(actual).containsOnly(RECIPIENT1);
+    }
+
+    @Test
+    void shouldMatchWhenNoRetries() throws MessagingException {
+        Mail mail = createMail();
+        mail.setAttribute(new Attribute(AT_MOST_EXECUTIONS, AttributeValue.of(0)));
+
+        Collection<MailAddress> actual = matcher.match(mail);
+
+        assertThat(actual).containsOnly(RECIPIENT1);
+    }
+
+    @Test
+    void shouldNotMatchWhenOverAtMost() throws MessagingException {
+        Mail mail = createMail();
+        mail.setAttribute(new Attribute(AT_MOST_EXECUTIONS, AttributeValue.of(3)));
+
+        Collection<MailAddress> actual = matcher.match(mail);
+
+        assertThat(actual).isEmpty();
+    }
+
+    @Test
+    void shouldNotMatchWhenEqualToAtMost() throws MessagingException {
+        Mail mail = createMail();
+        mail.setAttribute(new Attribute(AT_MOST_EXECUTIONS, AttributeValue.of(2)));
+
+        Collection<MailAddress> actual = matcher.match(mail);
+
+        assertThat(actual).isEmpty();
+    }
+
+    @Test
+    void shouldThrowWithEmptyCondition() {
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+            .matcherName("AtMost")
+            .build();
+
+        assertThatThrownBy(() -> matcher.init(matcherConfig))
+            .isInstanceOf(MessagingException.class);
+    }
+
+    @Test
+    void shouldThrowWithInvalidCondition() {
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+            .matcherName("AtMost")
+            .condition("invalid")
+            .build();
+
+        assertThatThrownBy(() -> matcher.init(matcherConfig))
+            .isInstanceOf(MessagingException.class);
+    }
+
+    @Test
+    void shouldThrowWithNegativeCondition() {
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+            .matcherName("AtMost")
+            .condition("-1")
+            .build();
+
+        assertThatThrownBy(() -> matcher.init(matcherConfig))
+            .isInstanceOf(MessagingException.class);
+    }
+
+    @Test
+    void shouldThrowWithConditionToZero() {
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+            .matcherName("AtMost")
+            .condition("0")
+            .build();
+
+        assertThatThrownBy(() -> matcher.init(matcherConfig))
+            .isInstanceOf(MessagingException.class);
+    }
+
+    @Test
+    void shouldMatchUntilOverAtMost() throws MessagingException {
+        Mail mail = createMail();
+
+        SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+            softly.assertThat(matcher.match(mail)).describedAs("First execution").contains(RECIPIENT1);
+            softly.assertThat(matcher.match(mail)).describedAs("Second execution").contains(RECIPIENT1);
+            softly.assertThat(matcher.match(mail)).describedAs("Third execution").isEmpty();
+        }));
+    }
+}


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


[james-project] 07/09: JAMES-3295 Permanent delivery error matcher implementation/test

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

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

commit d8c498c7002323ebbd91011d6277c8d3095e4be3
Author: LanKhuat <dl...@linagora.com>
AuthorDate: Wed Jul 8 15:45:08 2020 +0700

    JAMES-3295 Permanent delivery error matcher implementation/test
---
 .../transport/mailets/RemoteDeliveryErrorHandlingTest.java     |  7 +++++--
 .../james/transport/mailets/remote/delivery/Bouncer.java       |  2 ++
 .../transport/mailets/remote/delivery/DeliveryRunnable.java    | 10 +++++++++-
 .../transport/matchers/IsRemoteDeliveryPermanentError.java     |  2 --
 4 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/RemoteDeliveryErrorHandlingTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/RemoteDeliveryErrorHandlingTest.java
index 0db780c..991d0f7 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/RemoteDeliveryErrorHandlingTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/RemoteDeliveryErrorHandlingTest.java
@@ -47,6 +47,7 @@ import org.apache.james.modules.protocols.SmtpGuiceProbe;
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.transport.matchers.All;
 import org.apache.james.transport.matchers.AtMost;
+import org.apache.james.transport.matchers.IsRemoteDeliveryPermanentError;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.MailRepositoryProbeImpl;
 import org.apache.james.utils.SMTPMessageSender;
@@ -55,7 +56,6 @@ import org.apache.james.utils.WebAdminGuiceProbe;
 import org.apache.james.webadmin.WebAdminUtils;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.io.TempDir;
@@ -110,6 +110,10 @@ public class RemoteDeliveryErrorHandlingTest {
                 .putProcessor(ProcessorConfiguration.builder()
                     .state("remote-delivery-error")
                     .addMailet(MailetConfiguration.builder()
+                        .mailet(ToRepository.class)
+                        .matcher(IsRemoteDeliveryPermanentError.class)
+                        .addProperty("repositoryPath", REMOTE_DELIVERY_PERMANENT_ERROR_REPOSITORY.asString()))
+                    .addMailet(MailetConfiguration.builder()
                         .matcher(All.class)
                         .mailet(ToRepository.class)
                         .addProperty("repositoryPath", REMOTE_DELIVERY_TEMPORARY_ERROR_REPOSITORY.asString()))))
@@ -188,7 +192,6 @@ public class RemoteDeliveryErrorHandlingTest {
     }
 
     @Test
-    @Disabled("Remote delivery should attach failures information to the mail, and we should provide a Matcher for it")
     void remoteDeliveryShouldStorePermanentFailuresSeparately(SMTPMessageSender smtpMessageSender, DockerMockSmtp dockerMockSmtp) throws Exception {
         // Given a permanent failing remote server
         dockerMockSmtp.getConfigurationClient()
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Bouncer.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Bouncer.java
index b979cc6..92ae455 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Bouncer.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Bouncer.java
@@ -43,6 +43,8 @@ public class Bouncer {
 
     public static final AttributeName DELIVERY_ERROR = AttributeName.of("delivery-error");
     public static final AttributeName DELIVERY_ERROR_CODE = AttributeName.of("delivery-error-code");
+    public static final AttributeName IS_DELIVERY_PERMANENT_ERROR = AttributeName.of("is-delivery-permanent-error");
+
     private final RemoteDeliveryConfiguration configuration;
     private final MailetContext mailetContext;
 
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/DeliveryRunnable.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/DeliveryRunnable.java
index ec38617..36e65e2 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/DeliveryRunnable.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/DeliveryRunnable.java
@@ -20,6 +20,7 @@
 package org.apache.james.transport.mailets.remote.delivery;
 
 import static org.apache.james.metrics.api.TimeMetric.ExecutionResult.DEFAULT_100_MS_THRESHOLD;
+import static org.apache.james.transport.mailets.remote.delivery.Bouncer.IS_DELIVERY_PERMANENT_ERROR;
 
 import java.time.Duration;
 import java.util.Date;
@@ -32,6 +33,8 @@ import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.metrics.api.TimeMetric;
 import org.apache.james.queue.api.MailPrioritySupport;
 import org.apache.james.queue.api.MailQueue;
+import org.apache.mailet.Attribute;
+import org.apache.mailet.AttributeValue;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailetContext;
 import org.slf4j.Logger;
@@ -131,11 +134,16 @@ public class DeliveryRunnable implements Disposable {
                 handleTemporaryFailure(mail, executionResult);
                 break;
             case PERMANENT_FAILURE:
-                bouncer.bounce(mail, executionResult.getException().orElse(null));
+                handlePermanentFailure(mail, executionResult);
                 break;
         }
     }
 
+    private void handlePermanentFailure(Mail mail, ExecutionResult executionResult) {
+        mail.setAttribute(new Attribute(IS_DELIVERY_PERMANENT_ERROR, AttributeValue.of(true)));
+        bouncer.bounce(mail, executionResult.getException().orElse(null));
+    }
+
     private void handleTemporaryFailure(Mail mail, ExecutionResult executionResult) throws MailQueue.MailQueueException {
         if (!mail.getState().equals(Mail.ERROR)) {
             mail.setState(Mail.ERROR);
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsRemoteDeliveryPermanentError.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsRemoteDeliveryPermanentError.java
index 111a23c..9033e2b 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsRemoteDeliveryPermanentError.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsRemoteDeliveryPermanentError.java
@@ -43,8 +43,6 @@ import com.google.common.collect.ImmutableList;
  */
 public class IsRemoteDeliveryPermanentError extends GenericMatcher {
 
-    public static final AttributeName IS_DELIVERY_PERMANENT_ERROR = AttributeName.of("is-delivery-permanent-error");
-
     @Override
     public Collection<MailAddress> match(Mail mail) {
         return AttributeUtils.getValueAndCastFromMail(mail, IS_DELIVERY_PERMANENT_ERROR, Boolean.class)


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


[james-project] 06/09: JAMES-3295 Matcher for permanent delivery error

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

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

commit 29cd7d4ed85e2f82a0c97125bb18942c608997d3
Author: LanKhuat <dl...@linagora.com>
AuthorDate: Wed Jul 8 15:14:40 2020 +0700

    JAMES-3295 Matcher for permanent delivery error
---
 .../matchers/IsRemoteDeliveryPermanentError.java   |  55 +++++++++++
 .../IsRemoteDeliveryPermanentErrorTest.java        | 102 +++++++++++++++++++++
 2 files changed, 157 insertions(+)

diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsRemoteDeliveryPermanentError.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsRemoteDeliveryPermanentError.java
new file mode 100644
index 0000000..111a23c
--- /dev/null
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsRemoteDeliveryPermanentError.java
@@ -0,0 +1,55 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+import static org.apache.james.transport.mailets.remote.delivery.Bouncer.IS_DELIVERY_PERMANENT_ERROR;
+
+import java.util.Collection;
+
+import org.apache.james.core.MailAddress;
+import org.apache.mailet.AttributeUtils;
+import org.apache.mailet.Mail;
+import org.apache.mailet.base.GenericMatcher;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * <p>
+ * Checks if the mail has a permanent remote delivery failure attribute
+ * </p>
+ *
+ * Example:
+ *
+ * <pre><code>
+ * &lt;mailet match=&quot;IsRemoteDeliveryPermanentError&quot; class=&quot;&lt;any-class&gt;&quot;/&gt;
+ * </code></pre>
+ */
+public class IsRemoteDeliveryPermanentError extends GenericMatcher {
+
+    public static final AttributeName IS_DELIVERY_PERMANENT_ERROR = AttributeName.of("is-delivery-permanent-error");
+
+    @Override
+    public Collection<MailAddress> match(Mail mail) {
+        return AttributeUtils.getValueAndCastFromMail(mail, IS_DELIVERY_PERMANENT_ERROR, Boolean.class)
+            .filter(Boolean::booleanValue)
+            .map(any -> mail.getRecipients())
+            .orElse(ImmutableList.of());
+    }
+}
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsRemoteDeliveryPermanentErrorTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsRemoteDeliveryPermanentErrorTest.java
new file mode 100644
index 0000000..5c35156
--- /dev/null
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsRemoteDeliveryPermanentErrorTest.java
@@ -0,0 +1,102 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+import static org.apache.james.transport.mailets.remote.delivery.Bouncer.IS_DELIVERY_PERMANENT_ERROR;
+import static org.apache.mailet.base.MailAddressFixture.RECIPIENT1;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Collection;
+
+import javax.mail.MessagingException;
+
+import org.apache.james.core.MailAddress;
+import org.apache.mailet.Attribute;
+import org.apache.mailet.AttributeValue;
+import org.apache.mailet.Mail;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMatcherConfig;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+public class IsRemoteDeliveryPermanentErrorTest {
+
+    private IsRemoteDeliveryPermanentError testee;
+
+    private Mail createMail() throws MessagingException {
+        return FakeMail.builder()
+            .name("test-message")
+            .recipient(RECIPIENT1)
+            .build();
+    }
+
+    @BeforeEach
+    void setUp() throws Exception {
+        testee = new IsRemoteDeliveryPermanentError();
+
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+            .matcherName("IsRemoteDeliveryPermanentError")
+            .build();
+
+        testee.init(matcherConfig);
+    }
+
+    @Test
+    void shouldMatchWhenAttributeIsPresent() throws Exception {
+        Mail mail = createMail();
+        mail.setAttribute(new Attribute(IS_DELIVERY_PERMANENT_ERROR, AttributeValue.of(true)));
+
+        Collection<MailAddress> actual = testee.match(mail);
+
+        assertThat(actual).containsOnly(RECIPIENT1);
+    }
+
+    @Test
+    void shouldNotMatchWhenAttributeIsMissing() throws Exception {
+        Mail mail = createMail();
+
+        Collection<MailAddress> actual = testee.match(mail);
+
+        assertThat(actual).isEmpty();
+    }
+
+    @Test
+    void shouldNotMatchWhenAttributeIsFalse() throws Exception {
+        Mail mail = createMail();
+        mail.setAttribute(new Attribute(IS_DELIVERY_PERMANENT_ERROR, AttributeValue.of(false)));
+
+        Collection<MailAddress> actual = testee.match(mail);
+
+        assertThat(actual).isEmpty();
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {"abc", "1"})
+    void shouldNotMatchWhenAttributeIsInvalid(String value) throws Exception {
+        Mail mail = createMail();
+        mail.setAttribute(new Attribute(IS_DELIVERY_PERMANENT_ERROR, AttributeValue.of(value)));
+
+        Collection<MailAddress> actual = testee.match(mail);
+
+        assertThat(actual).isEmpty();
+    }
+}


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


[james-project] 05/09: JAMES-3295 Matcher for permanent error SMTP code

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

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

commit 45e9324bd3ad2923836ee51594d38e79b5bcc0b2
Author: LanKhuat <kh...@gmail.com>
AuthorDate: Tue Jul 7 11:15:50 2020 +0700

    JAMES-3295 Matcher for permanent error SMTP code
---
 .../matchers/RemoteDeliveryFailedWithSMTPCode.java |  59 +++++++
 .../RemoteDeliveryFailedWithSMTPCodeTest.java      | 173 +++++++++++++++++++++
 2 files changed, 232 insertions(+)

diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/RemoteDeliveryFailedWithSMTPCode.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/RemoteDeliveryFailedWithSMTPCode.java
new file mode 100644
index 0000000..5fbe8e3
--- /dev/null
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/RemoteDeliveryFailedWithSMTPCode.java
@@ -0,0 +1,59 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+import static org.apache.james.transport.mailets.remote.delivery.Bouncer.DELIVERY_ERROR_CODE;
+
+import java.util.Collection;
+
+import javax.mail.MessagingException;
+
+import org.apache.james.core.MailAddress;
+import org.apache.mailet.AttributeUtils;
+import org.apache.mailet.Mail;
+import org.apache.mailet.base.GenericMatcher;
+import org.apache.mailet.base.MailetUtil;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+/**
+ * <p>
+ * Checks the SMTP error code attached to remote delivery failures 
+ * </p>
+ */
+public class RemoteDeliveryFailedWithSMTPCode extends GenericMatcher {
+
+    private Integer errorCode;
+
+    @Override
+    public void init() throws MessagingException {
+        this.errorCode = MailetUtil.getInitParameterAsStrictlyPositiveInteger(getCondition());
+        Preconditions.checkArgument(errorCode >= 101 && errorCode <= 554, "Invalid SMTP code");
+    }
+
+    @Override
+    public Collection<MailAddress> match(Mail mail) {
+        return AttributeUtils.getValueAndCastFromMail(mail, DELIVERY_ERROR_CODE, Integer.class)
+            .filter(errorCode::equals)
+            .map(any -> mail.getRecipients())
+            .orElse(ImmutableList.of());
+    }
+}
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/RemoteDeliveryFailedWithSMTPCodeTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/RemoteDeliveryFailedWithSMTPCodeTest.java
new file mode 100644
index 0000000..95fea28
--- /dev/null
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/RemoteDeliveryFailedWithSMTPCodeTest.java
@@ -0,0 +1,173 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+import static org.apache.james.transport.mailets.remote.delivery.Bouncer.DELIVERY_ERROR_CODE;
+import static org.apache.mailet.base.MailAddressFixture.RECIPIENT1;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.util.Collection;
+
+import javax.mail.MessagingException;
+
+import org.apache.james.core.MailAddress;
+import org.apache.mailet.Attribute;
+import org.apache.mailet.AttributeValue;
+import org.apache.mailet.Mail;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMatcherConfig;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+public class RemoteDeliveryFailedWithSMTPCodeTest {
+
+    private static final String CONDITION = "521";
+    public static final int SMTP_ERROR_CODE_521 = 521;
+
+    private RemoteDeliveryFailedWithSMTPCode testee;
+
+    private Mail createMail() throws MessagingException {
+        return FakeMail.builder()
+            .name("test-message")
+            .recipient(RECIPIENT1)
+            .build();
+    }
+
+    @BeforeEach
+    void setUp() throws Exception {
+        testee = new RemoteDeliveryFailedWithSMTPCode();
+
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+            .matcherName("RemoteDeliveryFailedWithSMTPCode")
+            .condition(CONDITION)
+            .build();
+
+        testee.init(matcherConfig);
+    }
+
+    @Test
+    void shouldMatchWhenErrorCodeIsEqual() throws Exception {
+        Mail mail = createMail();
+        mail.setAttribute(new Attribute(DELIVERY_ERROR_CODE, AttributeValue.of(SMTP_ERROR_CODE_521)));
+
+        Collection<MailAddress> actual = testee.match(mail);
+
+        assertThat(actual).containsOnly(RECIPIENT1);
+    }
+
+    @Test
+    void shouldNotMatchWhenErrorCodeIsNotEqual() throws Exception {
+        Mail mail = createMail();
+        mail.setAttribute(new Attribute(DELIVERY_ERROR_CODE, AttributeValue.of(522)));
+
+        Collection<MailAddress> actual = testee.match(mail);
+
+        assertThat(actual).isEmpty();
+    }
+
+    @Test
+    void shouldNotMatchWhenErrorCodeIsMissing() throws Exception {
+        Mail mail = createMail();
+
+        Collection<MailAddress> actual = testee.match(mail);
+
+        assertThat(actual).isEmpty();
+    }
+
+    @Test
+    void shouldNotMatchWhenErrorCodeIsInvalid() throws Exception {
+        Mail mail = createMail();
+        mail.setAttribute(new Attribute(DELIVERY_ERROR_CODE, AttributeValue.of("abc")));
+
+        Collection<MailAddress> actual = testee.match(mail);
+
+        assertThat(actual).isEmpty();
+    }
+
+    @Test
+    void shouldThrowWhenConditionIsEmpty() {
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+            .matcherName("RemoteDeliveryFailedWithSMTPCode")
+            .build();
+
+        assertThatThrownBy(() -> testee.init(matcherConfig))
+            .isInstanceOf(MessagingException.class);
+    }
+
+    @Test
+    void shouldThrowWhenConditionIsInvalid() {
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+            .matcherName("RemoteDeliveryFailedWithSMTPCode")
+            .condition("abc")
+            .build();
+
+        assertThatThrownBy(() -> testee.init(matcherConfig))
+            .isInstanceOf(MessagingException.class);
+    }
+
+    @Test
+    void shouldThrowWhenConditionIsNegative() {
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+            .matcherName("RemoteDeliveryFailedWithSMTPCode")
+            .condition("-1")
+            .build();
+
+        assertThatThrownBy(() -> testee.init(matcherConfig))
+            .isInstanceOf(MessagingException.class);
+    }
+
+    @Test
+    void shouldThrowWhenConditionIsZero() {
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+            .matcherName("RemoteDeliveryFailedWithSMTPCode")
+            .condition("0")
+            .build();
+
+        assertThatThrownBy(() -> testee.init(matcherConfig))
+            .isInstanceOf(MessagingException.class);
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {"99", "555"})
+    void shouldThrowWhenInvalidErrorCode(String condition) {
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+            .matcherName("RemoteDeliveryFailedWithSMTPCode")
+            .condition(condition)
+            .build();
+
+        assertThatThrownBy(() -> testee.init(matcherConfig))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {"101", "554"})
+    void shouldNotThrowWhenValidErrorCode(String condition) {
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+            .matcherName("RemoteDeliveryFailedWithSMTPCode")
+            .condition(condition)
+            .build();
+
+        assertThatCode(() -> testee.init(matcherConfig)).doesNotThrowAnyException();
+    }
+}


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


[james-project] 02/09: [REFACTORING] Use Predicate.{not, equals}

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

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

commit 0b47d96f25b62248115266ca9d36d1461abd9e67
Author: Gautier DI FOLCO <gd...@linagora.com>
AuthorDate: Thu Jul 2 21:09:14 2020 +0200

    [REFACTORING] Use Predicate.{not, equals}
---
 .../backends/cassandra/init/CassandraTableManager.java   |  5 ++++-
 .../src/main/java/org/apache/james/core/MaybeSender.java |  3 ++-
 .../java/org/apache/james/mailbox/model/MailboxACL.java  |  3 ++-
 .../java/org/apache/james/mailbox/model/MailboxPath.java |  3 ++-
 .../james/mailbox/model/MessageAttachmentMetadata.java   |  3 ++-
 .../james/mailbox/cassandra/DeleteMessageListener.java   |  3 ++-
 .../mail/task/SolveMessageInconsistenciesService.java    |  3 ++-
 .../cassandra/quota/CassandraCurrentQuotaManager.java    |  4 +++-
 .../mailbox/elasticsearch/json/IndexableMessage.java     |  3 ++-
 .../apache/james/mailbox/events/GroupRegistration.java   |  3 ++-
 .../james/mailbox/events/KeyRegistrationHandler.java     |  3 ++-
 .../mailbox/maildir/user/MaildirSubscriptionMapper.java  |  4 +++-
 .../mailbox/inmemory/mail/InMemoryMessageMapper.java     |  5 +++--
 .../inmemory/quota/InMemoryCurrentQuotaManager.java      |  3 ++-
 .../james/mailbox/store/StoreMessageIdManager.java       |  3 ++-
 .../james/mailbox/store/mail/model/FlagsFactory.java     |  3 ++-
 .../mailbox/store/mail/model/impl/MessageParser.java     |  4 +++-
 .../apache/james/transport/mailets/SetErrorMessage.java  |  4 +++-
 .../matchers/utils/MailAddressCollectionReader.java      |  3 ++-
 .../james/imap/decode/parser/CreateCommandParser.java    |  4 +++-
 .../objectstorage/ObjectStorageBlobConfiguration.java    |  3 ++-
 .../apache/james/modules/protocols/ImapGuiceProbe.java   | 16 ++++++++--------
 .../main/java/org/apache/james/util/OptionalUtils.java   |  3 ++-
 .../src/main/java/org/apache/james/util/UnitParser.java  |  3 ++-
 .../apache/james/util/mime/MessageContentExtractor.java  |  5 ++---
 .../rrt/cassandra/CassandraRecipientRewriteTableDAO.java |  4 +++-
 .../MessageFastViewPrecomputedProperties.java            |  3 ++-
 .../james/domainlist/lib/DomainListConfiguration.java    |  3 ++-
 .../james/mailetcontainer/impl/JamesMailetContext.java   |  3 ++-
 .../org/apache/james/transport/mailets/SpamAssassin.java |  3 ++-
 .../james/transport/mailets/jsieve/DiscardAction.java    |  4 +++-
 .../james/jmap/draft/methods/MIMEMessageConverter.java   |  3 ++-
 .../jmap/draft/methods/SetMailboxesUpdateProcessor.java  |  4 +---
 .../java/org/apache/james/jmap/draft/model/Emailer.java  |  4 +++-
 .../apache/james/jmap/draft/model/mailbox/Rights.java    |  3 ++-
 .../draft/model/message/view/MessageFullViewFactory.java |  6 +++---
 .../draft/model/message/view/MessageViewFactory.java     |  3 ++-
 .../james/jmap/draft/utils/JsoupHtmlTextExtractor.java   |  5 ++++-
 .../james/jmap/event/PropagateLookupRightListener.java   |  3 ++-
 .../james/jmap/http/DefaultMailboxesProvisionerTest.java |  3 ++-
 .../org/apache/james/webadmin/routes/TasksRoutes.java    |  3 ++-
 41 files changed, 101 insertions(+), 55 deletions(-)

diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTableManager.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTableManager.java
index ee0e2c4..bf72196 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTableManager.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTableManager.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.backends.cassandra.init;
 
+import java.util.function.Predicate;
+
 import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.components.CassandraModule;
@@ -27,6 +29,7 @@ import org.apache.james.backends.cassandra.components.CassandraTable.Initializat
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 
 import com.datastax.driver.core.KeyspaceMetadata;
+import com.datastax.driver.core.PagingIterable;
 import com.datastax.driver.core.Session;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
 
@@ -73,7 +76,7 @@ public class CassandraTableManager {
                         .from(name)
                         .limit(1)
                         .setFetchSize(1))
-                .filter(resultSet -> !resultSet.isExhausted())
+                .filter(Predicate.not(PagingIterable::isExhausted))
                 .flatMap(ignored -> executor.executeVoid(QueryBuilder.truncate(name)));
     }
 }
diff --git a/core/src/main/java/org/apache/james/core/MaybeSender.java b/core/src/main/java/org/apache/james/core/MaybeSender.java
index 6460ddc..824a666 100644
--- a/core/src/main/java/org/apache/james/core/MaybeSender.java
+++ b/core/src/main/java/org/apache/james/core/MaybeSender.java
@@ -22,6 +22,7 @@ package org.apache.james.core;
 import java.util.NoSuchElementException;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.function.Predicate;
 import java.util.stream.Stream;
 
 import javax.mail.internet.AddressException;
@@ -58,7 +59,7 @@ public class MaybeSender {
     @SuppressWarnings("deprecation")
     public static MaybeSender of(MailAddress mailAddress) {
         return new MaybeSender(Optional.ofNullable(mailAddress)
-            .filter(address -> !address.isNullSender()));
+            .filter(Predicate.not(MailAddress::isNullSender)));
     }
 
     private final Optional<MailAddress> mailAddress;
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
index e0d58ae..22b7f8f 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Properties;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -823,7 +824,7 @@ public class MailboxACL {
                     .collect(Guavate.toImmutableMap(Pair::getKey, Pair::getValue)));
         } else {
             return Optional.ofNullable(replacement)
-                .filter(rights -> !rights.isEmpty())
+                .filter(Predicate.not(Rfc4314Rights::isEmpty))
                 .map(replacementValue ->  new MailboxACL(
                     ImmutableMap.<EntryKey, Rfc4314Rights>builder()
                         .putAll(entries)
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
index 36340ee..4e6b194 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.function.Predicate;
 
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.DefaultMailboxes;
@@ -70,7 +71,7 @@ public class MailboxPath {
     
     public MailboxPath(String namespace, Username user, String name) {
         this.namespace = Optional.ofNullable(namespace)
-            .filter(s -> !s.isEmpty())
+            .filter(Predicate.not(String::isEmpty))
             .orElse(MailboxConstants.USER_NAMESPACE);
         this.user = user;
         this.name = name;
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageAttachmentMetadata.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageAttachmentMetadata.java
index 1093bd0..731e9ae 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageAttachmentMetadata.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageAttachmentMetadata.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.model;
 
 import java.util.List;
 import java.util.Optional;
+import java.util.function.Predicate;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
@@ -85,7 +86,7 @@ public class MessageAttachmentMetadata {
 
     public static boolean hasNonInlinedAttachment(List<MessageAttachmentMetadata> attachments) {
         return attachments.stream()
-            .anyMatch(messageAttachment -> !messageAttachment.isInlinedWithCid());
+            .anyMatch(Predicate.not(MessageAttachmentMetadata::isInlinedWithCid));
     }
 
     private final AttachmentMetadata attachment;
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java
index e3d2eab..e7e3627 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java
@@ -22,6 +22,7 @@ package org.apache.james.mailbox.cassandra;
 import static org.apache.james.util.FunctionalUtils.negate;
 
 import java.util.Optional;
+import java.util.function.Predicate;
 
 import javax.inject.Inject;
 
@@ -204,7 +205,7 @@ public class DeleteMessageListener implements MailboxListener.GroupMailboxListen
 
     private Mono<Boolean> hasOtherMessagesReferences(MessageRepresentation message, MessageAttachmentRepresentation attachment) {
         return attachmentMessageIdDAO.getOwnerMessageIds(attachment.getAttachmentId())
-            .filter(messageId -> !message.getMessageId().equals(messageId))
+            .filter(Predicate.not(Predicate.isEqual(message.getMessageId())))
             .hasElements()
             .map(negate());
     }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesService.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesService.java
index 5279d56..49936ee 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesService.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesService.java
@@ -27,6 +27,7 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentLinkedDeque;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Predicate;
 
 import javax.inject.Inject;
 
@@ -456,7 +457,7 @@ public class SolveMessageInconsistenciesService {
 
     private Mono<Inconsistency> detectOutdatedMessageIdEntry(CassandraId mailboxId, CassandraMessageId messageId, ComposedMessageIdWithMetaData messageIdRecord) {
         return messageIdToImapUidDAO.retrieve(messageId, Optional.of(mailboxId))
-            .filter(upToDateMessageFromImapUid -> !upToDateMessageFromImapUid.equals(messageIdRecord))
+            .filter(Predicate.not(Predicate.isEqual(messageIdRecord)))
             .<Inconsistency>map(upToDateMessageFromImapUid -> new OutdatedMessageIdEntry(messageIdRecord, upToDateMessageFromImapUid))
             .next()
             .switchIfEmpty(Mono.just(NO_INCONSISTENCY));
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
index 675b3e2..79158dd 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
@@ -30,6 +30,8 @@ import static org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota.QUO
 import static org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota.STORAGE;
 import static org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota.TABLE_NAME;
 
+import java.util.function.Predicate;
+
 import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
@@ -117,7 +119,7 @@ public class CassandraCurrentQuotaManager implements CurrentQuotaManager {
     @Override
     public Mono<Void> setCurrentQuotas(QuotaOperation quotaOperation) {
         return getCurrentQuotas(quotaOperation.quotaRoot())
-            .filter(storedQuotas -> !storedQuotas.equals(CurrentQuotas.from(quotaOperation)))
+            .filter(Predicate.not(Predicate.isEqual(CurrentQuotas.from(quotaOperation))))
             .flatMap(storedQuotas -> decrease(new QuotaOperation(quotaOperation.quotaRoot(), storedQuotas.count(), storedQuotas.size()))
                 .then(increase(quotaOperation)));
     }
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
index 82dc941..e24f75a 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
@@ -26,6 +26,7 @@ import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.Optional;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -128,7 +129,7 @@ public class IndexableMessage {
                         subjects.serialize(),
                         bodyText.orElse(null),
                         bodyHtml.orElse(null))
-                    .filter(str -> !Strings.isNullOrEmpty(str))
+                    .filter(Predicate.not(Strings::isNullOrEmpty))
                     .collect(Collectors.joining(" "));
 
             long uid = message.getUid().asLong();
diff --git a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupRegistration.java b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupRegistration.java
index 34b0051..cade1c8 100644
--- a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupRegistration.java
+++ b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupRegistration.java
@@ -30,6 +30,7 @@ import static org.apache.james.mailbox.events.RabbitMQEventBus.MAILBOX_EVENT_EXC
 import java.nio.charset.StandardCharsets;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.function.Predicate;
 
 import org.apache.james.backends.rabbitmq.ReceiverProvider;
 import org.apache.james.event.json.EventSerializer;
@@ -168,7 +169,7 @@ class GroupRegistration implements Registration {
 
     @Override
     public void unregister() {
-        receiverSubscriber.filter(subscriber -> !subscriber.isDisposed())
+        receiverSubscriber.filter(Predicate.not(Disposable::isDisposed))
             .ifPresent(Disposable::dispose);
         receiver.close();
         unregisterGroup.run();
diff --git a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java
index 8b79d06..6f3ddc6 100644
--- a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java
+++ b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java
@@ -29,6 +29,7 @@ import java.time.Duration;
 import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Predicate;
 
 import org.apache.james.backends.rabbitmq.ReceiverProvider;
 import org.apache.james.event.json.EventSerializer;
@@ -121,7 +122,7 @@ class KeyRegistrationHandler {
     }
 
     void stop() {
-        receiverSubscriber.filter(subscriber -> !subscriber.isDisposed())
+        receiverSubscriber.filter(Predicate.not(Disposable::isDisposed))
             .ifPresent(Disposable::dispose);
         receiver.close();
         sender.delete(QueueSpecification.queue(registrationQueue.asString()))
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java
index 0d6275b..c36096a 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java
@@ -28,6 +28,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Predicate;
 
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.SubscriptionException;
@@ -37,6 +38,7 @@ import org.apache.james.mailbox.store.user.SubscriptionMapper;
 import org.apache.james.mailbox.store.user.model.Subscription;
 
 import com.github.steveash.guavate.Guavate;
+import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 
@@ -123,7 +125,7 @@ public class MaildirSubscriptionMapper extends NonTransactionalMapper implements
         try (FileReader fileReader = new FileReader(subscriptionFile)) {
             try (BufferedReader reader = new BufferedReader(fileReader)) {
                 return reader.lines()
-                    .filter(subscription -> !subscription.equals(""))
+                    .filter(Predicate.not(Strings::isNullOrEmpty))
                     .collect(Guavate.toImmutableSet());
             }
         }
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
index 4bf22c1..df9b8b2 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
@@ -25,6 +25,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Predicate;
 
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
@@ -93,7 +94,7 @@ public class InMemoryMessageMapper extends AbstractMessageMapper {
     private long countUnseenMessagesInMailbox(MailboxId mailboxId) {
         return getMembershipByUidForMailbox(mailboxId).values()
             .stream()
-            .filter(member -> !member.isSeen())
+            .filter(Predicate.not(MailboxMessage::isSeen))
             .count();
     }
 
@@ -139,7 +140,7 @@ public class InMemoryMessageMapper extends AbstractMessageMapper {
         List<MailboxMessage> memberships = new ArrayList<>(getMembershipByUidForMailbox(mailbox).values());
         Collections.sort(memberships);
         return memberships.stream()
-            .filter(m -> !m.isSeen())
+            .filter(Predicate.not(MailboxMessage::isSeen))
             .findFirst()
             .map(MailboxMessage::getUid)
             .orElse(null);
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
index cd9c5c7..120df80 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.inmemory.quota;
 
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Predicate;
 import java.util.function.UnaryOperator;
 
 import javax.inject.Inject;
@@ -97,7 +98,7 @@ public class InMemoryCurrentQuotaManager implements CurrentQuotaManager {
     @Override
     public Mono<Void> setCurrentQuotas(QuotaOperation quotaOperation) {
         return getCurrentQuotas(quotaOperation.quotaRoot())
-            .filter(storedQuotas -> !storedQuotas.equals(CurrentQuotas.from(quotaOperation)))
+            .filter(Predicate.not(Predicate.isEqual(CurrentQuotas.from(quotaOperation))))
             .flatMap(storedQuotas -> decrease(new QuotaOperation(quotaOperation.quotaRoot(), storedQuotas.count(), storedQuotas.size()))
                 .then(increase(quotaOperation)))
             .subscribeOn(Schedulers.elastic());
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
index d934faf..e84d747 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
@@ -68,6 +68,7 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
 import org.apache.james.mailbox.store.quota.QuotaChecker;
+import org.apache.james.util.FunctionalUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -447,7 +448,7 @@ public class StoreMessageIdManager implements MessageIdManager {
 
     private Mono<Void> assertRightsOnMailboxIds(Collection<MailboxId> mailboxIds, MailboxSession mailboxSession, Right... rights) {
         return Flux.fromIterable(mailboxIds)
-            .filterWhen(hasRightsOnMailboxReactive(mailboxSession, rights).andThen(result -> result.map(b -> !b)))
+            .filterWhen(hasRightsOnMailboxReactive(mailboxSession, rights).andThen(result -> result.map(FunctionalUtils.negate())))
             .next()
             .flatMap(mailboxForbidden -> {
                 LOGGER.info("Mailbox with Id {} does not belong to {}", mailboxForbidden, mailboxSession.getUser().asString());
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/FlagsFactory.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/FlagsFactory.java
index 3f506cd..c1d9b15 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/FlagsFactory.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/FlagsFactory.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.store.mail.model;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Optional;
+import java.util.function.Predicate;
 import java.util.stream.Stream;
 
 import javax.mail.Flags;
@@ -115,7 +116,7 @@ public class FlagsFactory {
                         toUserFlagStream(flagsOrEmpty),
                         userFlags.stream())
                     .distinct()
-                    .filter(s -> !Strings.isNullOrEmpty(s))
+                    .filter(Predicate.not(Strings::isNullOrEmpty))
                     .filter(flagsFilter.getUserFlagFilter());
 
             final Flags result = new Flags();
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
index b693f0e..9258a83 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
@@ -25,6 +25,7 @@ import java.io.InputStream;
 import java.util.List;
 import java.util.Locale;
 import java.util.Optional;
+import java.util.function.Predicate;
 import java.util.stream.Stream;
 
 import org.apache.james.mailbox.model.Cid;
@@ -48,6 +49,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.github.steveash.guavate.Guavate;
+import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 
 public class MessageParser {
@@ -124,7 +126,7 @@ public class MessageParser {
         Optional<ContentTypeField> contentTypeField = getContentTypeField(entity);
         Optional<ContentDispositionField> contentDispositionField = getContentDispositionField(entity);
         Optional<ContentType> contentType = contentTypeField.map(ContentTypeField::getBody)
-            .filter(string -> !string.isEmpty())
+            .filter(Predicate.not(Strings::isNullOrEmpty))
             .map(ContentType::of);
         Optional<String> name = name(contentTypeField, contentDispositionField);
         Optional<Cid> cid = cid(readHeader(entity, CONTENT_ID, ContentIdField.class));
diff --git a/mailet/standard/src/main/java/org/apache/james/transport/mailets/SetErrorMessage.java b/mailet/standard/src/main/java/org/apache/james/transport/mailets/SetErrorMessage.java
index d6acfb4..f856d08 100644
--- a/mailet/standard/src/main/java/org/apache/james/transport/mailets/SetErrorMessage.java
+++ b/mailet/standard/src/main/java/org/apache/james/transport/mailets/SetErrorMessage.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.transport.mailets;
 
+import java.util.function.Predicate;
+
 import javax.mail.MessagingException;
 
 import org.apache.mailet.Mail;
@@ -30,7 +32,7 @@ public class SetErrorMessage extends GenericMailet {
     @Override
     public void init() throws MessagingException {
         errorMessage = getInitParameterAsOptional("errorMessage")
-            .filter(string -> !string.isEmpty())
+            .filter(Predicate.not(String::isEmpty))
             .orElseThrow(() -> new IllegalStateException("'errorMessage' needs to be specified and cannot be empty"));
     }
 
diff --git a/mailet/standard/src/main/java/org/apache/james/transport/matchers/utils/MailAddressCollectionReader.java b/mailet/standard/src/main/java/org/apache/james/transport/matchers/utils/MailAddressCollectionReader.java
index 733d4dc..f22d18f 100644
--- a/mailet/standard/src/main/java/org/apache/james/transport/matchers/utils/MailAddressCollectionReader.java
+++ b/mailet/standard/src/main/java/org/apache/james/transport/matchers/utils/MailAddressCollectionReader.java
@@ -21,6 +21,7 @@ package org.apache.james.transport.matchers.utils;
 
 import java.util.Optional;
 import java.util.Set;
+import java.util.function.Predicate;
 
 import javax.mail.internet.AddressException;
 
@@ -38,7 +39,7 @@ public class MailAddressCollectionReader {
         Preconditions.checkArgument(!Strings.isNullOrEmpty(condition));
         return Splitter.onPattern("(,| |\t)").splitToList(condition)
             .stream()
-            .filter(s -> !Strings.isNullOrEmpty(s))
+            .filter(Predicate.not(Strings::isNullOrEmpty))
             .map(MailAddressCollectionReader::getMailAddress)
             .collect(Guavate.toImmutableSet());
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CreateCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CreateCommandParser.java
index 419618a..722b91b 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CreateCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CreateCommandParser.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.imap.decode.parser;
 
+import java.util.function.Predicate;
+
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.Tag;
@@ -68,7 +70,7 @@ public class CreateCommandParser extends AbstractImapCommandParser {
         Splitter.on(delimiter)
             .splitToList(mailboxName)
             .stream()
-            .filter(s -> !Strings.isNullOrEmpty(s))
+            .filter(Predicate.not(Strings::isNullOrEmpty))
             .findAny()
             .orElseThrow(() -> new DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, "Invalid mailbox name"));
     }
diff --git a/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageBlobConfiguration.java b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageBlobConfiguration.java
index 3f3703d..2ab0e38 100644
--- a/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageBlobConfiguration.java
+++ b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageBlobConfiguration.java
@@ -22,6 +22,7 @@ package org.apache.james.modules.objectstorage;
 import java.util.Arrays;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.function.Predicate;
 
 import org.apache.commons.configuration2.Configuration;
 import org.apache.commons.configuration2.ex.ConfigurationException;
@@ -172,7 +173,7 @@ public class ObjectStorageBlobConfiguration {
 
             public ObjectStorageBlobConfiguration build() {
                 if (payloadCodecFactory == PayloadCodecFactory.AES256) {
-                    aesSalt.filter(s -> !s.isEmpty())
+                    aesSalt.filter(Predicate.not(Strings::isNullOrEmpty))
                         .orElseThrow(() -> new IllegalStateException("AES code requires an non-empty salt parameter"));
                     aesPassword.filter(s -> s.length > 0)
                         .orElseThrow(() -> new IllegalStateException("AES code requires an non-empty password parameter"));
diff --git a/server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/ImapGuiceProbe.java b/server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/ImapGuiceProbe.java
index 0c7c1fc..3786b3b 100644
--- a/server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/ImapGuiceProbe.java
+++ b/server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/ImapGuiceProbe.java
@@ -39,20 +39,20 @@ public class ImapGuiceProbe implements GuiceProbe {
     }
 
     public int getImapPort() {
-        return getPort(server -> !server.getStartTLSSupported())
-                .orElseThrow(() -> new IllegalStateException("IMAP server not defined"));
+        return getPort(Predicate.not(AbstractConfigurableAsyncServer::getStartTLSSupported))
+            .orElseThrow(() -> new IllegalStateException("IMAP server not defined"));
     }
 
     public int getImapsPort() {
-        return getPort(server -> server.getStartTLSSupported())
-                .orElseThrow(() -> new IllegalStateException("IMAPS server not defined"));
+        return getPort(AbstractConfigurableAsyncServer::getStartTLSSupported)
+            .orElseThrow(() -> new IllegalStateException("IMAPS server not defined"));
     }
 
     private Optional<Integer> getPort(Predicate<? super AbstractConfigurableAsyncServer> filter) {
         return imapServerFactory.getServers().stream()
-                .filter(filter)
-                .findFirst()
-                .flatMap(server -> server.getListenAddresses().stream().findFirst())
-                .map(InetSocketAddress::getPort);
+            .filter(filter)
+            .findFirst()
+            .flatMap(server -> server.getListenAddresses().stream().findFirst())
+            .map(InetSocketAddress::getPort);
     }
 }
diff --git a/server/container/util/src/main/java/org/apache/james/util/OptionalUtils.java b/server/container/util/src/main/java/org/apache/james/util/OptionalUtils.java
index 8e258e1..7372432 100644
--- a/server/container/util/src/main/java/org/apache/james/util/OptionalUtils.java
+++ b/server/container/util/src/main/java/org/apache/james/util/OptionalUtils.java
@@ -20,6 +20,7 @@ package org.apache.james.util;
 
 import java.util.Optional;
 import java.util.function.BiPredicate;
+import java.util.function.Predicate;
 
 public class OptionalUtils {
 
@@ -37,7 +38,7 @@ public class OptionalUtils {
 
     public static <T> boolean containsDifferent(Optional<T> requestValue, T storeValue) {
         return requestValue
-            .filter(value -> !value.equals(storeValue))
+            .filter(Predicate.not(Predicate.isEqual(storeValue)))
             .isPresent();
     }
 
diff --git a/server/container/util/src/main/java/org/apache/james/util/UnitParser.java b/server/container/util/src/main/java/org/apache/james/util/UnitParser.java
index 2f6e7d7..4960b7a 100644
--- a/server/container/util/src/main/java/org/apache/james/util/UnitParser.java
+++ b/server/container/util/src/main/java/org/apache/james/util/UnitParser.java
@@ -20,6 +20,7 @@
 package org.apache.james.util;
 
 import java.util.Optional;
+import java.util.function.Predicate;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -57,7 +58,7 @@ class UnitParser {
             String amountAsString = res.group(AMOUNT);
             long amount = Integer.parseInt(amountAsString.trim());
 
-            return new ParsingResult(amount, Optional.of(unitAsString).filter(s -> !Strings.isNullOrEmpty(s)));
+            return new ParsingResult(amount, Optional.of(unitAsString).filter(Predicate.not(Strings::isNullOrEmpty)));
         }
         throw new NumberFormatException("Supplied value do not follow the unit format (number optionally suffixed with a string representing the unit");
     }
diff --git a/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java b/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java
index 5a3292a..515c050 100644
--- a/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java
+++ b/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java
@@ -224,9 +224,8 @@ public class MessageContentExtractor {
 
         public Optional<String> extractMainTextContent(HtmlTextExtractor htmlTextExtractor) {
             return htmlBody.map(htmlTextExtractor::toPlainText)
-                .filter(s -> !Strings.isNullOrEmpty(s))
-                .map(Optional::of)
-                .orElse(textBody);
+                .filter(Predicate.not(Strings::isNullOrEmpty))
+                .or(() -> textBody);
         }
 
         @Override
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableDAO.java b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableDAO.java
index 72eaf48..db31072 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableDAO.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableDAO.java
@@ -29,6 +29,8 @@ import static org.apache.james.rrt.cassandra.tables.CassandraRecipientRewriteTab
 import static org.apache.james.rrt.cassandra.tables.CassandraRecipientRewriteTableTable.TABLE_NAME;
 import static org.apache.james.rrt.cassandra.tables.CassandraRecipientRewriteTableTable.USER;
 
+import java.util.function.Predicate;
+
 import javax.inject.Inject;
 
 import org.apache.commons.lang3.tuple.Pair;
@@ -112,7 +114,7 @@ public class CassandraRecipientRewriteTableDAO {
                 .map(row -> row.getString(MAPPING))
                 .collect(Guavate.toImmutableList()))
             .map(MappingsImpl::fromCollection)
-            .filter(mappings -> !mappings.isEmpty());
+            .filter(Predicate.not(MappingsImpl::isEmpty));
     }
 
     public Flux<Pair<MappingSource, Mapping>> getAllMappings() {
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewPrecomputedProperties.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewPrecomputedProperties.java
index 3c1cee9..ac396a4 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewPrecomputedProperties.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewPrecomputedProperties.java
@@ -22,6 +22,7 @@ package org.apache.james.jmap.api.projections;
 import java.io.IOException;
 import java.util.List;
 import java.util.Objects;
+import java.util.function.Predicate;
 
 import javax.inject.Inject;
 
@@ -90,7 +91,7 @@ public class MessageFastViewPrecomputedProperties {
 
         private boolean hasAttachment(List<MessageAttachmentMetadata> attachments) {
             return attachments.stream()
-                .anyMatch(attachment -> !attachment.isInlinedWithCid());
+                .anyMatch(Predicate.not(MessageAttachmentMetadata::isInlinedWithCid));
         }
     }
 
diff --git a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/DomainListConfiguration.java b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/DomainListConfiguration.java
index 5260b68..0aa03ef 100644
--- a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/DomainListConfiguration.java
+++ b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/DomainListConfiguration.java
@@ -24,6 +24,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.function.Predicate;
 
 import org.apache.commons.configuration2.HierarchicalConfiguration;
 import org.apache.commons.configuration2.tree.ImmutableNode;
@@ -113,7 +114,7 @@ public class DomainListConfiguration {
 
     public static DomainListConfiguration from(HierarchicalConfiguration<ImmutableNode> config) {
         ImmutableList<Domain> configuredDomains = StreamUtils.ofNullable(config.getStringArray(CONFIGURE_DOMAIN_NAMES))
-            .filter(s -> !s.isEmpty())
+            .filter(Predicate.not(String::isEmpty))
             .map(Domain::of)
             .collect(Guavate.toImmutableList());
 
diff --git a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
index 99f0c5d..ab557ff 100644
--- a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
+++ b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
@@ -30,6 +30,7 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Predicate;
 
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
@@ -422,7 +423,7 @@ public class JamesMailetContext implements MailetContext, Configurable, Disposab
             // doesn't work, use the hostname, even if it is localhost.
             if (postMasterAddress.indexOf('@') < 0) {
                 Domain domainName = domains.getDomains().stream()
-                    .filter(domain -> !Domain.LOCALHOST.equals(domain))
+                    .filter(Predicate.not(Predicate.isEqual(Domain.LOCALHOST)))
                     .findFirst()
                     .orElse(domains.getDefaultDomain());
 
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
index 4216832..00b5617 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
@@ -20,6 +20,7 @@
 package org.apache.james.transport.mailets;
 
 import java.util.Optional;
+import java.util.function.Predicate;
 
 import javax.inject.Inject;
 import javax.mail.MessagingException;
@@ -87,7 +88,7 @@ public class SpamAssassin extends GenericMailet {
     @Override
     public void init() throws MessagingException {
         spamdHost = Optional.ofNullable(getInitParameter(SPAMD_HOST))
-            .filter(s -> !Strings.isNullOrEmpty(s))
+            .filter(Predicate.not(Strings::isNullOrEmpty))
             .orElse(DEFAULT_HOST);
 
         spamdPort = MailetUtil.getInitParameterAsStrictlyPositiveInteger(getInitParameter(SPAMD_PORT), DEFAULT_PORT);
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/DiscardAction.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/DiscardAction.java
index ec207da..192c0c6 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/DiscardAction.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/DiscardAction.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.transport.mailets.jsieve;
 
+import java.util.function.Predicate;
+
 import javax.mail.MessagingException;
 
 import org.apache.jsieve.mail.Action;
@@ -40,7 +42,7 @@ public class DiscardAction extends FileIntoAction implements MailAction {
     public static void removeRecipient(Mail mail, ActionContext context) {
         mail.setRecipients(mail.getRecipients()
             .stream()
-            .filter(mailAddress -> !mailAddress.equals(context.getRecipient()))
+            .filter(Predicate.not(Predicate.isEqual(context.getRecipient())))
             .collect(Guavate.toImmutableList()));
     }
 }
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
index 3396256..73fdbd1 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.TimeZone;
 import java.util.function.Consumer;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 import javax.inject.Inject;
@@ -230,7 +231,7 @@ public class MIMEMessageConverter {
             .filter(MessageAttachmentMetadata::isInline)
             .collect(Guavate.toImmutableList());
         List<MessageAttachmentMetadata> besideAttachments = messageAttachments.stream()
-            .filter(attachment -> !attachment.isInline())
+            .filter(Predicate.not(MessageAttachmentMetadata::isInline))
             .collect(Guavate.toImmutableList());
 
         if (inlineAttachments.size() > 0) {
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMailboxesUpdateProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMailboxesUpdateProcessor.java
index 1d79ceb..acf2747 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMailboxesUpdateProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMailboxesUpdateProcessor.java
@@ -173,9 +173,7 @@ public class SetMailboxesUpdateProcessor implements SetMailboxesProcessor {
 
     @VisibleForTesting
     <T> boolean requestChanged(Optional<T> requestValue, Optional<T> storeValue) {
-        return requestValue
-            .filter(value -> !requestValue.equals(storeValue))
-            .isPresent();
+        return requestValue.isPresent() && !requestValue.equals(storeValue);
     }
 
     private Mailbox getMailbox(MailboxId mailboxId, MailboxSession mailboxSession) throws MailboxNotFoundException {
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Emailer.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Emailer.java
index ffb037c..abbb232 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Emailer.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Emailer.java
@@ -22,6 +22,7 @@ package org.apache.james.jmap.draft.model;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.function.Predicate;
 
 import javax.mail.internet.AddressException;
 
@@ -40,6 +41,7 @@ import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 
 @JsonDeserialize(builder = Emailer.Builder.class)
@@ -141,7 +143,7 @@ public class Emailer {
         }
 
         private Optional<String> replaceIfNeeded(Optional<String> value) {
-            return value.filter(s -> !s.isEmpty());
+            return value.filter(Predicate.not(Strings::isNullOrEmpty));
         }
     }
 
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/mailbox/Rights.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/mailbox/Rights.java
index 1a941bb..cbe15b0 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/mailbox/Rights.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/mailbox/Rights.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.function.BinaryOperator;
+import java.util.function.Predicate;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.core.Username;
@@ -232,7 +233,7 @@ public class Rights {
 
     private Optional<Boolean> containsRight(Username username, Right right) {
         return Optional.ofNullable(rights.get(username))
-            .filter(rightList -> !rightList.isEmpty())
+            .filter(Predicate.not(Collection::isEmpty))
             .map(rightList -> rightList.contains(right));
     }
 
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactory.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactory.java
index 3f38ad3..5741c5f 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactory.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactory.java
@@ -26,6 +26,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
+import java.util.function.Predicate;
 import java.util.function.Supplier;
 
 import javax.inject.Inject;
@@ -204,9 +205,8 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
     private Optional<String> mainTextContent(MessageContent messageContent) {
         return messageContent.getHtmlBody()
             .map(htmlTextExtractor::toPlainText)
-            .filter(s -> !Strings.isNullOrEmpty(s))
-            .map(Optional::of)
-            .orElse(messageContent.getTextBody());
+            .filter(Predicate.not(Strings::isNullOrEmpty))
+            .or(messageContent::getTextBody);
     }
     
     private List<Attachment> getAttachments(List<MessageAttachmentMetadata> attachments) {
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactory.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactory.java
index 11c9cd3..dc9409f 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactory.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactory.java
@@ -28,6 +28,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.function.Function;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 import org.apache.james.jmap.draft.model.Keywords;
@@ -132,7 +133,7 @@ public interface MessageViewFactory<T extends MessageView> {
             return messageResults
                 .groupBy(MessageResult::getMessageId)
                 .flatMap(Flux::collectList)
-                .filter(list -> !list.isEmpty())
+                .filter(Predicate.not(List::isEmpty))
                 .flatMap(toMessageViews(converter));
         }
 
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/JsoupHtmlTextExtractor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/JsoupHtmlTextExtractor.java
index c697c4e..b4ea0c0 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/JsoupHtmlTextExtractor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/JsoupHtmlTextExtractor.java
@@ -20,6 +20,7 @@
 package org.apache.james.jmap.draft.utils;
 
 import java.util.Optional;
+import java.util.function.Predicate;
 import java.util.stream.Stream;
 
 import org.apache.commons.lang3.StringUtils;
@@ -32,6 +33,8 @@ import org.jsoup.nodes.TextNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Strings;
+
 public class JsoupHtmlTextExtractor implements HtmlTextExtractor {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(JsoupHtmlTextExtractor.class);
@@ -93,7 +96,7 @@ public class JsoupHtmlTextExtractor implements HtmlTextExtractor {
     private String generateImageAlternativeText(Element element) {
         return Optional.ofNullable(element.attributes().get(ALT_TAG))
             .map(StringUtils::normalizeSpace)
-            .filter(s -> !s.isEmpty())
+            .filter(Predicate.not(Strings::isNullOrEmpty))
             .map(s -> "[" + s + "]")
             .orElse("");
     }
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
index 56ab963..138bc77 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.jmap.event;
 
+import java.util.function.Predicate;
 import java.util.stream.Stream;
 
 import javax.inject.Inject;
@@ -111,7 +112,7 @@ public class PropagateLookupRightListener implements MailboxListener.GroupMailbo
     private Stream<MailboxPath> listAncestors(MailboxSession mailboxSession, MailboxPath mailboxPath) {
         return mailboxPath.getHierarchyLevels(mailboxSession.getPathDelimiter())
             .stream()
-            .filter(hierarchyMailboxPath -> !hierarchyMailboxPath.equals(mailboxPath));
+            .filter(Predicate.not(Predicate.isEqual(mailboxPath)));
     }
 
     private void applyLookupRight(MailboxSession session, MailboxPath mailboxPath, Entry entry) {
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/DefaultMailboxesProvisionerTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/DefaultMailboxesProvisionerTest.java
index 4120f0c..267d450 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/DefaultMailboxesProvisionerTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/DefaultMailboxesProvisionerTest.java
@@ -21,6 +21,7 @@ package org.apache.james.jmap.http;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.time.Duration;
+import java.util.function.Predicate;
 
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.DefaultMailboxes;
@@ -70,7 +71,7 @@ public class DefaultMailboxesProvisionerTest {
     public void createMailboxesIfNeededShouldCreateSpamWhenOtherSystemMailboxesExist() throws Exception {
         DefaultMailboxes.DEFAULT_MAILBOXES
             .stream()
-            .filter(mailbox -> !DefaultMailboxes.SPAM.equals(mailbox))
+            .filter(Predicate.not(Predicate.isEqual(DefaultMailboxes.SPAM)))
             .forEach(Throwing.consumer(mailbox -> mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, mailbox), session)));
 
         testee.createMailboxesIfNeeded(session).block();
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/TasksRoutes.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/TasksRoutes.java
index 35ad151..c0f8440 100644
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/TasksRoutes.java
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/TasksRoutes.java
@@ -23,6 +23,7 @@ import java.time.Duration;
 import java.time.temporal.ChronoUnit;
 import java.util.List;
 import java.util.Optional;
+import java.util.function.Predicate;
 import java.util.function.Supplier;
 
 import javax.inject.Inject;
@@ -201,7 +202,7 @@ public class TasksRoutes implements Routes {
     private Duration getTimeout(Request req) {
         try {
             Duration timeout =  Optional.ofNullable(req.queryParams("timeout"))
-                .filter(parameter -> !parameter.isEmpty())
+                .filter(Predicate.not(String::isEmpty))
                 .map(rawString -> DurationParser.parse(rawString, ChronoUnit.SECONDS))
                 .orElse(MAXIMUM_AWAIT_TIMEOUT);
 


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


[james-project] 01/09: [REFACTORING] Use Optional.stream

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

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

commit bcb75a6df39df92c7996e771eb4f4dedd9287c25
Author: Gautier DI FOLCO <gd...@linagora.com>
AuthorDate: Thu Jul 2 20:13:31 2020 +0200

    [REFACTORING] Use Optional.stream
---
 .../main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java  | 6 ++----
 .../java/org/apache/james/mailbox/elasticsearch/json/MimePart.java | 7 +++----
 .../apache/james/mailbox/store/mail/model/impl/MessageParser.java  | 5 ++---
 mailet/api/src/main/java/org/apache/mailet/Mail.java               | 3 +--
 .../jmap/src/main/java/org/apache/james/jmap/draft/JMAPModule.java | 3 +--
 .../integration/cucumber/util/ObjectFromStringExtractor.java       | 3 +--
 .../james/jmap/draft/methods/SetMailboxesDestructionProcessor.java | 3 +--
 .../org/apache/james/jmap/draft/model/GetMailboxesRequest.java     | 3 +--
 .../apache/james/webadmin/service/MailRepositoryStoreService.java  | 7 +++----
 9 files changed, 15 insertions(+), 25 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java
index 1030620..adf979e 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java
@@ -169,8 +169,7 @@ public interface MaxQuotaManager {
                 Throwing.supplier(() -> getDomainMaxMessage(domain)).sneakyThrow(),
                 Throwing.supplier(this::getGlobalMaxMessage).sneakyThrow())
             .map(Supplier::get)
-            .filter(Optional::isPresent)
-            .map(Optional::get)
+            .flatMap(Optional::stream)
             .findFirst();
     }
 
@@ -179,8 +178,7 @@ public interface MaxQuotaManager {
                 Throwing.supplier(() -> getDomainMaxStorage(domain)).sneakyThrow(),
                 Throwing.supplier(this::getGlobalMaxStorage).sneakyThrow())
             .map(Supplier::get)
-            .filter(Optional::isPresent)
-            .map(Optional::get)
+            .flatMap(Optional::stream)
             .findFirst();
     }
 }
\ No newline at end of file
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MimePart.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MimePart.java
index d818cfd..6f94526 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MimePart.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MimePart.java
@@ -270,10 +270,9 @@ public class MimePart {
 
     private Optional<String> firstBody(Stream<MimePart> mimeParts) {
         return mimeParts
-                .map((mimePart) -> mimePart.bodyTextContent)
-                .filter(Optional::isPresent)
-                .map(Optional::get)
-                .findFirst();
+            .map(mimePart -> mimePart.bodyTextContent)
+            .flatMap(Optional::stream)
+            .findFirst();
     }
 
     private Stream<MimePart> textAttachments() {
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
index 328a98d..b693f0e 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
@@ -160,9 +160,8 @@ public class MessageParser {
 
     private Optional<String> name(Optional<ContentTypeField> contentTypeField, Optional<ContentDispositionField> contentDispositionField) {
         return contentTypeField
-            .map(field -> Optional.ofNullable(field.getParameter("name")))
-            .filter(Optional::isPresent)
-            .orElseGet(() -> contentDispositionField.map(ContentDispositionField::getFilename))
+            .flatMap(field -> Optional.ofNullable(field.getParameter("name")))
+            .or(() -> contentDispositionField.map(ContentDispositionField::getFilename))
             .map(MimeUtil::unscrambleHeaderValue);
     }
 
diff --git a/mailet/api/src/main/java/org/apache/mailet/Mail.java b/mailet/api/src/main/java/org/apache/mailet/Mail.java
index 2ab5499..2250811 100644
--- a/mailet/api/src/main/java/org/apache/mailet/Mail.java
+++ b/mailet/api/src/main/java/org/apache/mailet/Mail.java
@@ -417,8 +417,7 @@ public interface Mail extends Serializable, Cloneable {
     default Map<AttributeName, Attribute> attributesMap() {
         return attributeNames()
             .map(name -> getAttribute(name).map(attribute -> Pair.of(name, attribute)))
-            .filter(Optional::isPresent)
-            .map(Optional::get)
+            .flatMap(Optional::stream)
             .collect(ImmutableMap.toImmutableMap(Pair::getKey, Pair::getValue));
     }
 }
diff --git a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPModule.java b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPModule.java
index f842c2a..f31b10d 100644
--- a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPModule.java
+++ b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPModule.java
@@ -190,8 +190,7 @@ public class JMAPModule extends AbstractModule {
                         "Attachment Search support in MailboxManager is required by JMAP Module"),
                     badCheckDescription(searchCapabilities.contains(SearchCapabilities.AttachmentFileName),
                     "Attachment file name Search support in MailboxManager is required by JMAP Module"))
-                .filter(Optional::isPresent)
-                .map(Optional::get)
+                .flatMap(Optional::stream)
                 .collect(Guavate.toImmutableList());
 
             if (!badCheckDescriptions.isEmpty()) {
diff --git a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/cucumber/util/ObjectFromStringExtractor.java b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/cucumber/util/ObjectFromStringExtractor.java
index 7e18f0c..1c8d4e5 100644
--- a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/cucumber/util/ObjectFromStringExtractor.java
+++ b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/cucumber/util/ObjectFromStringExtractor.java
@@ -34,8 +34,7 @@ public class ObjectFromStringExtractor {
     public Object extract(String value) {
         return EXTRACTORS.stream()
             .map(extractor -> extractor.extract(value))
-            .filter(Optional::isPresent)
-            .map(Optional::get)
+            .flatMap(Optional::stream)
             .findFirst()
             .orElse(null);
     }
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMailboxesDestructionProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMailboxesDestructionProcessor.java
index 575597a..1238147 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMailboxesDestructionProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMailboxesDestructionProcessor.java
@@ -99,8 +99,7 @@ public class SetMailboxesDestructionProcessor implements SetMailboxesProcessor {
                     .id(id)
                     .session(mailboxSession)
                     .build())
-            .filter(Optional::isPresent)
-            .map(Optional::get)
+            .flatMap(Optional::stream)
             .forEach(mailbox -> idToMailboxBuilder.put(mailbox.getId(), mailbox));
         return idToMailboxBuilder.build();
     }
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/GetMailboxesRequest.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/GetMailboxesRequest.java
index ff01a27..6a495de 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/GetMailboxesRequest.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/GetMailboxesRequest.java
@@ -69,8 +69,7 @@ public class GetMailboxesRequest implements JmapRequest {
             this.properties = Optional.of(
                 properties.stream()
                     .map(MailboxProperty::findProperty)
-                    .filter(Optional::isPresent)
-                    .map(Optional::get)
+                    .flatMap(Optional::stream)
                     .collect(Guavate.toImmutableSet()));
             return this;
         }
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/MailRepositoryStoreService.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/MailRepositoryStoreService.java
index b9fc716..65f3a68 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/MailRepositoryStoreService.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/MailRepositoryStoreService.java
@@ -121,9 +121,8 @@ public class MailRepositoryStoreService {
 
     private Optional<Mail> fecthMail(MailRepositoryPath path, MailKey mailKey) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
         return getRepositories(path)
-                .map(Throwing.function((MailRepository repository) -> Optional.ofNullable(repository.retrieve(mailKey))).sneakyThrow())
-                .filter(Optional::isPresent)
-                .findFirst()
-                .orElse(Optional.empty());
+            .map(Throwing.function((MailRepository repository) -> Optional.ofNullable(repository.retrieve(mailKey))).sneakyThrow())
+            .flatMap(Optional::stream)
+            .findFirst();
         }
 }


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


[james-project] 04/09: JAMES-3295 remoteDeliveryShouldStoreTemporaryFailureAsPermanentWhenExceedsMaximumRetries

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

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

commit 3a80f69e9643c577f3b5fcffabb0db9e7212235b
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Mon Jul 6 16:52:29 2020 +0700

    JAMES-3295 remoteDeliveryShouldStoreTemporaryFailureAsPermanentWhenExceedsMaximumRetries
---
 .../mailets/RemoteDeliveryErrorHandlingTest.java     | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/RemoteDeliveryErrorHandlingTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/RemoteDeliveryErrorHandlingTest.java
index e9fcb39..0db780c 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/RemoteDeliveryErrorHandlingTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/RemoteDeliveryErrorHandlingTest.java
@@ -46,6 +46,7 @@ import org.apache.james.mock.smtp.server.testing.MockSmtpServerExtension.DockerM
 import org.apache.james.modules.protocols.SmtpGuiceProbe;
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.transport.matchers.All;
+import org.apache.james.transport.matchers.AtMost;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.MailRepositoryProbeImpl;
 import org.apache.james.utils.SMTPMessageSender;
@@ -70,6 +71,7 @@ public class RemoteDeliveryErrorHandlingTest {
     private static final String LOCALHOST = "localhost";
     private static final MailRepositoryUrl REMOTE_DELIVERY_TEMPORARY_ERROR_REPOSITORY = MailRepositoryUrl.from("memory://var/mail/error/remote-delivery/temporary");
     private static final MailRepositoryUrl REMOTE_DELIVERY_PERMANENT_ERROR_REPOSITORY = MailRepositoryUrl.from("memory://var/mail/error/remote-delivery/permanent");
+    private static final Integer MAX_EXECUTIONS = 2;
 
     @RegisterExtension
     static MockSmtpServerExtension mockSmtpServerExtension = new MockSmtpServerExtension();
@@ -99,7 +101,12 @@ public class RemoteDeliveryErrorHandlingTest {
                         .addProperty("maxRetries", "1")
                         .addProperty("delayTime", "0")
                         .addProperty("bounceProcessor", "remote-delivery-error")
-                        .matcher(All.class)))
+                        .matcher(AtMost.class)
+                        .matcherCondition(MAX_EXECUTIONS.toString()))
+                    .addMailet(MailetConfiguration.builder()
+                        .matcher(All.class)
+                        .mailet(ToRepository.class)
+                        .addProperty("repositoryPath", REMOTE_DELIVERY_PERMANENT_ERROR_REPOSITORY.asString())))
                 .putProcessor(ProcessorConfiguration.builder()
                     .state("remote-delivery-error")
                     .addMailet(MailetConfiguration.builder()
@@ -205,7 +212,6 @@ public class RemoteDeliveryErrorHandlingTest {
     }
 
     @Test
-    @Disabled("We need to count retries")
     void remoteDeliveryShouldStoreTemporaryFailureAsPermanentWhenExceedsMaximumRetries(SMTPMessageSender smtpMessageSender, DockerMockSmtp dockerMockSmtp) throws Exception {
         // Given a failed remote delivery
         dockerMockSmtp.getConfigurationClient()
@@ -230,6 +236,16 @@ public class RemoteDeliveryErrorHandlingTest {
             .param("queue", MailQueueFactory.SPOOL.asString())
             .param("processor", TRANSPORT_PROCESSOR)
             .patch("/mailRepositories/" + REMOTE_DELIVERY_TEMPORARY_ERROR_REPOSITORY.getPath().urlEncoded() + "/mails");
+        awaitAtMostOneMinute
+            .untilAsserted(() -> assertThat(jamesServer.getProbe(MailRepositoryProbeImpl.class)
+                .getRepositoryMailCount(REMOTE_DELIVERY_TEMPORARY_ERROR_REPOSITORY))
+                .isEqualTo(1));
+        given()
+            .spec(webAdminApi)
+            .param("action", "reprocess")
+            .param("queue", MailQueueFactory.SPOOL.asString())
+            .param("processor", TRANSPORT_PROCESSOR)
+            .patch("/mailRepositories/" + REMOTE_DELIVERY_TEMPORARY_ERROR_REPOSITORY.getPath().urlEncoded() + "/mails");
 
         // Then mail should be stored in permanent error repository
         awaitAtMostOneMinute


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


[james-project] 08/09: JAMES-3302 Documentation skeleton for the distributed James server

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

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

commit eb7510bee9ad66ae44c41b93e48308a77a10914c
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sun Jul 5 22:31:04 2020 +0700

    JAMES-3302 Documentation skeleton for the distributed James server
---
 docs/modules/servers/nav.adoc                        | 14 ++++++++++++++
 docs/modules/servers/pages/distributed.adoc          | 18 +++++++++++++++++-
 .../servers/pages/distributed/architecture.adoc      | 16 ++++++++++++++++
 .../servers/pages/distributed/configure/index.adoc   |  7 +++++++
 .../servers/pages/distributed/extend/index.adoc      | 18 ++++++++++++++++++
 .../pages/distributed/extend/mail-processing.adoc    |  3 +++
 .../pages/distributed/extend/mailbox-listeners.adoc  |  3 +++
 .../servers/pages/distributed/extend/smtp-hooks.adoc |  3 +++
 .../pages/distributed/extend/webadmin-routes.adoc    |  3 +++
 .../servers/pages/distributed/operate/cli.adoc       |  4 ++++
 .../servers/pages/distributed/operate/guide.adoc     |  4 ++++
 .../servers/pages/distributed/operate/index.adoc     | 20 ++++++++++++++++++++
 .../servers/pages/distributed/operate/metrics.adoc   |  4 ++++
 .../servers/pages/distributed/operate/webadmin.adoc  |  4 ++++
 .../servers/pages/distributed/run-docker.adoc        |  4 ++++
 docs/modules/servers/pages/distributed/run.adoc      |  4 ++++
 16 files changed, 128 insertions(+), 1 deletion(-)

diff --git a/docs/modules/servers/nav.adoc b/docs/modules/servers/nav.adoc
index b978f9a..ffd4c6e 100644
--- a/docs/modules/servers/nav.adoc
+++ b/docs/modules/servers/nav.adoc
@@ -5,3 +5,17 @@
 ** xref:local.adoc[]
 ** xref:redundant.adoc[]
 ** xref:distributed.adoc[]
+*** xref:distributed/architecture.adoc[]
+*** xref:distributed/run.adoc[]
+*** xref:distributed/run-docker.adoc[]
+*** xref:distributed/configure/index.adoc[]
+*** xref:distributed/operate/index.adoc[]
+**** xref:distributed/operate/guide.adoc[]
+**** xref:distributed/operate/webadmin.adoc[]
+**** xref:distributed/operate/metrics.adoc[]
+**** xref:distributed/operate/cli.adoc[]
+*** xref:distributed/extend/index.adoc[]
+**** xref:distributed/extend/mail-processing.adoc[]
+**** xref:distributed/extend/mailbox-listeners.adoc[]
+**** xref:distributed/extend/smtp-hooks.adoc[]
+**** xref:distributed/extend/webadmin-routes.adoc[]
diff --git a/docs/modules/servers/pages/distributed.adoc b/docs/modules/servers/pages/distributed.adoc
index b795e46..9f298bf 100644
--- a/docs/modules/servers/pages/distributed.adoc
+++ b/docs/modules/servers/pages/distributed.adoc
@@ -1,5 +1,21 @@
 = James Distributed Mail Server
 :navtitle: Distributed
 
-(TODO)
+The Distributed server offers an easy way to scale email server. Based on
+noSQL solutions, it is intended to be easy to operate for large
+deployments, without needing sharding and protocol aware load balancing.
 
+This server is:
+
+* Intended for use by experts only
+* Used for large-scale distributed deployments
+* Is designed for Mail Delivery use cases but can also carry out mail processing
+* The most feature-rich server, but also by far the most complex
+
+You will find information about its
+xref:main:servers:distributed:architecture.adoc[architecture], how to
+xref:main:servers:distributed:run.adoc[run it], how to
+xref:main:servers:distributed:run-docker.adoc[run it with Docker], how to
+xref:main:servers:distributed:configure/index.adoc[configure it], how to
+xref:main:servers:distributed:operate/index.adoc[operate it], how to
+xref:main:servers:distributed:extend/index.adoc[extend it].
diff --git a/docs/modules/servers/pages/distributed/architecture.adoc b/docs/modules/servers/pages/distributed/architecture.adoc
new file mode 100644
index 0000000..73de370
--- /dev/null
+++ b/docs/modules/servers/pages/distributed/architecture.adoc
@@ -0,0 +1,16 @@
+= Architecture
+
+This sections presents the Distributed Server architecture.
+
+In order to deliver its promises, the Distributed Server leverages the following storage strategies:
+
+(TODO picture)
+
+ * *Cassandra* is used for metadata storage
+ * The *blob store* storage interface is responsible of storing potentially large binary data. For instance
+ email bodies, headers or attachments. Different technologies can be used: *Cassandra*, or *Object Storage*
+(S3 or Swift)
+ * *ElasticSearch* component empowers full text search on emails.
+ * *RabbitMQ* enables James nodes of a same cluster to collaborate together.
+ * *Tika* (optional) enables text extraction from attachments, thus improving full text search results.
+ * *SpamAssassin* (optional) can be used for Spam detection and user feedback is supported.
diff --git a/docs/modules/servers/pages/distributed/configure/index.adoc b/docs/modules/servers/pages/distributed/configure/index.adoc
new file mode 100644
index 0000000..dae4ee1
--- /dev/null
+++ b/docs/modules/servers/pages/distributed/configure/index.adoc
@@ -0,0 +1,7 @@
+= Configuration
+
+This section presents how to configure the Distributed server.
+
+The following configuration files are exposed:
+
+(TODO)
\ No newline at end of file
diff --git a/docs/modules/servers/pages/distributed/extend/index.adoc b/docs/modules/servers/pages/distributed/extend/index.adoc
new file mode 100644
index 0000000..ee0b7e2
--- /dev/null
+++ b/docs/modules/servers/pages/distributed/extend/index.adoc
@@ -0,0 +1,18 @@
+= Extending the behavior of the Distributed Server
+
+The Distributed Server exposes several interfaces allowing the user to write custom extensions in
+order to extend the Distributed Server behavior.
+
+Writing *Mailets* and *Matchers* allows one to supply custom components for the
+xref:main:servers:distributed:extend:mail-processing.adoc[Mail Processing] and
+enables to take decisions, and implement your business logic at the transport level.
+
+Writing xref:main:servers:distributed:extend:mailbox-listeners.adoc[Mailbox listeners] enables to
+react to your user interaction with their mailbox. This powerful tool allows build advanced features
+for mail delivery servers.
+
+Writing xref:main:servers:distributed:extend:smtp-hooks.adoc[SMTP hookd] enables to
+add features to your SMTP server.
+
+Writing xref:main:servers:distributed:extend:webadmin-routes.adoc[WebAdmin routes] enables to
+add features to the WebAdmin REST API.
diff --git a/docs/modules/servers/pages/distributed/extend/mail-processing.adoc b/docs/modules/servers/pages/distributed/extend/mail-processing.adoc
new file mode 100644
index 0000000..372737e
--- /dev/null
+++ b/docs/modules/servers/pages/distributed/extend/mail-processing.adoc
@@ -0,0 +1,3 @@
+= Custom mail processing components
+
+(TODO)
\ No newline at end of file
diff --git a/docs/modules/servers/pages/distributed/extend/mailbox-listeners.adoc b/docs/modules/servers/pages/distributed/extend/mailbox-listeners.adoc
new file mode 100644
index 0000000..5435605
--- /dev/null
+++ b/docs/modules/servers/pages/distributed/extend/mailbox-listeners.adoc
@@ -0,0 +1,3 @@
+= Custom Mailbox Listeners
+
+(TODO can http://james.apache.org/howTo/custom-listeners.html be used ?)
\ No newline at end of file
diff --git a/docs/modules/servers/pages/distributed/extend/smtp-hooks.adoc b/docs/modules/servers/pages/distributed/extend/smtp-hooks.adoc
new file mode 100644
index 0000000..8d58288
--- /dev/null
+++ b/docs/modules/servers/pages/distributed/extend/smtp-hooks.adoc
@@ -0,0 +1,3 @@
+= Custom SMTP hooks
+
+(TODO)
\ No newline at end of file
diff --git a/docs/modules/servers/pages/distributed/extend/webadmin-routes.adoc b/docs/modules/servers/pages/distributed/extend/webadmin-routes.adoc
new file mode 100644
index 0000000..7362f6a
--- /dev/null
+++ b/docs/modules/servers/pages/distributed/extend/webadmin-routes.adoc
@@ -0,0 +1,3 @@
+= Custom WebAdmin routes
+
+(TODO)
\ No newline at end of file
diff --git a/docs/modules/servers/pages/distributed/operate/cli.adoc b/docs/modules/servers/pages/distributed/operate/cli.adoc
new file mode 100644
index 0000000..35d6fee
--- /dev/null
+++ b/docs/modules/servers/pages/distributed/operate/cli.adoc
@@ -0,0 +1,4 @@
+= Command Line Interface
+
+(TODO migrate and adapt content from
+https://github.com/linagora/james-project/blob/master/src/site/markdown/server/manage-cli.md)
\ No newline at end of file
diff --git a/docs/modules/servers/pages/distributed/operate/guide.adoc b/docs/modules/servers/pages/distributed/operate/guide.adoc
new file mode 100644
index 0000000..87adad0
--- /dev/null
+++ b/docs/modules/servers/pages/distributed/operate/guide.adoc
@@ -0,0 +1,4 @@
+= Operator guide
+
+(TODO migrate and adapt content from
+https://github.com/linagora/james-project/blob/master/src/site/markdown/server/manage-guice-distributed-james.md)
\ No newline at end of file
diff --git a/docs/modules/servers/pages/distributed/operate/index.adoc b/docs/modules/servers/pages/distributed/operate/index.adoc
new file mode 100644
index 0000000..4c62a69
--- /dev/null
+++ b/docs/modules/servers/pages/distributed/operate/index.adoc
@@ -0,0 +1,20 @@
+= Operate the Distributed server
+
+The following pages detail how to operate the Distributed server.
+
+Once you have a Distributed James server up and running you then need to ensure it operates correctly.
+You may also need to perform some operation maintenance or recover from incidents. This section covers
+these topics.
+
+The xref:main:servers:distributed:operate:webadmin.adoc[WebAdmin Restfull administration API] is the
+recommended way to operate the Distributed James server. It allows managing and interacting with most
+server components.
+
+The xref:main:servers:distributed:operate:cli.adoc[Command line interface] allows to interact with some
+server components. However it relies on JMX technologies and its use is discouraged.
+
+The xref:main:servers:distributed:operate:metrics.adoc[metrics] allows to build latency and throughput
+graphs, that can be visualized, for instance in *Grafana*.
+
+Finally, we did put together a xref:main:servers:distributed:operate:metrics.adoc[detailed guide] for
+distributed James operators.
diff --git a/docs/modules/servers/pages/distributed/operate/metrics.adoc b/docs/modules/servers/pages/distributed/operate/metrics.adoc
new file mode 100644
index 0000000..e46ca99
--- /dev/null
+++ b/docs/modules/servers/pages/distributed/operate/metrics.adoc
@@ -0,0 +1,4 @@
+= Metrics
+
+(TODO migrate and adapt content from
+https://github.com/linagora/james-project/blob/master/src/site/xdoc/server/metrics.xml)
\ No newline at end of file
diff --git a/docs/modules/servers/pages/distributed/operate/webadmin.adoc b/docs/modules/servers/pages/distributed/operate/webadmin.adoc
new file mode 100644
index 0000000..ed1b75a
--- /dev/null
+++ b/docs/modules/servers/pages/distributed/operate/webadmin.adoc
@@ -0,0 +1,4 @@
+= WebAdmin REST administration API
+
+(TODO migrate and adapt content from
+https://github.com/linagora/james-project/blob/master/src/site/markdown/server/manage-webadmin.md)
\ No newline at end of file
diff --git a/docs/modules/servers/pages/distributed/run-docker.adoc b/docs/modules/servers/pages/distributed/run-docker.adoc
new file mode 100644
index 0000000..806e6dd
--- /dev/null
+++ b/docs/modules/servers/pages/distributed/run-docker.adoc
@@ -0,0 +1,4 @@
+= Run with docker
+
+(TODO adapt content from
+https://github.com/linagora/james-project#run-james-with-guice--cassandra--rabbitmq--swift--elasticsearch)
\ No newline at end of file
diff --git a/docs/modules/servers/pages/distributed/run.adoc b/docs/modules/servers/pages/distributed/run.adoc
new file mode 100644
index 0000000..d04f912
--- /dev/null
+++ b/docs/modules/servers/pages/distributed/run.adoc
@@ -0,0 +1,4 @@
+= Run
+
+(TODO adapt content from
+https://github.com/linagora/james-project/blob/master/src/site/markdown/server/install/guice-cassandra-rabbitmq-swift.md)
\ No newline at end of file


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