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/01/07 07:33:54 UTC

[james-project] branch master updated (4309508 -> 1ac5f34)

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 4309508  Merge remote-tracking branch 'mine/readme-better-anchors'
     new a2c33cb  JAMES-3021 try to retrieve the container IP from inspect output
     new e2bba58  JAMES-2321 Clarify additional fields only work with "application/json"
     new 07bd60d  [Refactoring] ErrorResponder::message formatting
     new a8bcc04  [Refactoring] DLPConfigurationRoute should rely on standard error handling
     new f59f303  JAMES-2993 Fixing typo
     new a150fdb  JAMES-2993 Task DTO & serialization test for user preview recomputation
     new 910fae2  JAMES-2993 Task generator for recompute user JMAP fastView projection
     new 9dc53ad  JAMES-2993 Guice bindings for recompute user JMAP fastView projection
     new 5904577  JAMES-2993 Integration test for recompute user JMAP fastView projection
     new 31281c5  JAMES-2993 Rename `Previews` to `FastView` under discrepancy naming
     new 8c7a64f  JAMES-2993 Using elastic scheduler in recomputing all
     new b1bc7d6  [Refactor] Rename misleading method name
     new 9703554  JAMES-3014 Give a probe for clearing MessageFastViewProjection
     new 16ade2d  JAMES-3014 FastProjection HealthCheck Integration Test
     new d3db62d  JAMES-3014 Integration test with distributed James
     new 1ac5f34  JAMES-3014 Use JUNIT 5 to run FastViewProjectionHealthCheckIntegrationTest

The 16 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:
 .../james/modules/TaskSerializationModule.java     |  16 +-
 .../apache/james/jmap/draft/JmapGuiceProbe.java    |  11 +-
 .../james/modules/protocols/SmtpGuiceProbe.java    |   4 +-
 .../james/modules/server/JmapTasksModule.java      |   6 +
 .../CassandraMessageFastViewProjection.java        |  16 +-
 .../api/projections/MessageFastViewProjection.java |   2 +
 .../MemoryMessageFastViewProjection.java           |  15 +-
 .../MessageFastViewProjectionContract.java         |  80 +++++----
 ...stViewProjectionHealthCheckIntegrationTest.java |  12 +-
 ...tViewProjectionHealthCheckIntegrationTest.java} |   9 +-
 ...ewProjectionHealthCheckIntegrationContract.java | 193 +++++++++++++++++++++
 .../integration/WebAdminServerIntegrationTest.java |  22 ++-
 .../org/apache/james/webadmin/WebAdminServer.java  |   2 +-
 .../james/webadmin/routes/HealthCheckRoutes.java   |   2 +-
 .../apache/james/webadmin/routes/TasksRoutes.java  |   2 +-
 .../james/webadmin/utils/ErrorResponder.java       |   5 +
 .../james/webadmin/utils/ParametersExtractor.java  |   6 +-
 .../james/webadmin/utils/ErrorResponderTest.java   |  36 ++--
 .../webadmin/routes/DLPConfigurationRoutes.java    |  11 --
 .../james/webadmin/routes/DomainsRoutes.java       |  14 +-
 .../james/webadmin/routes/MailAddressParser.java   |   3 +-
 .../james/webadmin/routes/SieveQuotaRoutes.java    |   4 +-
 .../routes/DLPConfigurationRoutesTest.java         |   6 +-
 .../jmap/MessageFastViewProjectionCorrector.java   |   8 +-
 .../RecomputeAllFastViewProjectionItemsTask.java   |  12 +-
 ...teAllFastViewTaskAdditionalInformationDTO.java} |  10 +-
 ...eUserFastViewProjectionItemsRequestToTask.java} |  41 +++--
 ... RecomputeUserFastViewProjectionItemsTask.java} |  63 +++----
 ...eUserFastViewTaskAdditionalInformationDTO.java} |  52 +++---
 ...llFastViewProjectionItemsRequestToTaskTest.java |  10 +-
 ...ctionItemsTaskAdditionalInformationDTOTest.java |   2 +-
 ...rFastViewProjectionItemsRequestToTaskTest.java} | 159 ++++++++++++-----
 ...tionItemsTaskAdditionalInformationDTOTest.java} |  10 +-
 ...tViewProjectionItemsTaskSerializationTest.java} |   9 +-
 .../json/recomputeUser.additionalInformation.json  |   7 +
 .../test/resources/json/recomputeUser.task.json    |   4 +
 .../vault/routes/DeletedMessagesVaultRoutes.java   |   4 +-
 .../webadmin/routes/EventDeadLettersRoutes.java    |   4 +-
 .../james/webadmin/routes/MailboxesRoutes.java     |   2 +-
 .../james/webadmin/routes/MailQueueRoutes.java     |  12 +-
 .../webadmin/routes/MailRepositoriesRoutes.java    |  12 +-
 .../service/MailRepositoryStoreService.java        |   2 +-
 .../apache/james/util/docker/DockerContainer.java  |  10 +-
 src/site/markdown/server/manage-webadmin.md        |   4 +-
 44 files changed, 636 insertions(+), 278 deletions(-)
 copy backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/ClientProviderImplConnectionNoAuthESTest.java => server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java (72%)
 copy server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/{MemoryUnauthorizedEndpointsTest.java => MemoryFastViewProjectionHealthCheckIntegrationTest.java} (83%)
 create mode 100644 server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/FastViewProjectionHealthCheckIntegrationContract.java
 copy server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/{RecomputeAllPreviewsTaskAdditionalInformationDTO.java => RecomputeAllFastViewTaskAdditionalInformationDTO.java} (92%)
 copy server/{container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticator.java => protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTask.java} (52%)
 copy server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/{RecomputeAllFastViewProjectionItemsTask.java => RecomputeUserFastViewProjectionItemsTask.java} (65%)
 rename server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/{RecomputeAllPreviewsTaskAdditionalInformationDTO.java => RecomputeUserFastViewTaskAdditionalInformationDTO.java} (57%)
 copy server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/{RecomputeAllFastViewProjectionItemsRequestToTaskTest.java => RecomputeUserFastViewProjectionItemsRequestToTaskTest.java} (69%)
 copy server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/{RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest.java => RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java} (77%)
 copy server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/{RecomputeAllFastViewProjectionItemsTaskSerializationTest.java => RecomputeUserFastViewProjectionItemsTaskSerializationTest.java} (84%)
 create mode 100644 server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.additionalInformation.json
 create mode 100644 server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.task.json


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


[james-project] 04/16: [Refactoring] DLPConfigurationRoute should rely on standard error handling

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 a8bcc04c15957fa7bc35e1f97a6d82771ad69c7c
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Jan 3 14:36:08 2020 +0700

    [Refactoring] DLPConfigurationRoute should rely on standard error handling
---
 .../apache/james/webadmin/routes/DLPConfigurationRoutes.java  | 11 -----------
 .../james/webadmin/routes/DLPConfigurationRoutesTest.java     |  6 +++---
 2 files changed, 3 insertions(+), 14 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DLPConfigurationRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DLPConfigurationRoutes.java
index cde7141..9dc3e32 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DLPConfigurationRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DLPConfigurationRoutes.java
@@ -239,8 +239,6 @@ public class DLPConfigurationRoutes implements Routes {
             validateDomainInList(domain);
 
             return domain;
-        } catch (IllegalArgumentException e) {
-            throw invalidDomain(String.format("Invalid request for domain: %s", domainName), e);
         } catch (DomainListException e) {
             throw serverError(String.format("Cannot recognize domain: %s in domain list", domainName), e);
         }
@@ -252,15 +250,6 @@ public class DLPConfigurationRoutes implements Routes {
         }
     }
 
-    private HaltException invalidDomain(String message, Exception e) {
-        return ErrorResponder.builder()
-            .statusCode(HttpStatus.BAD_REQUEST_400)
-            .type(ErrorType.INVALID_ARGUMENT)
-            .message(message)
-            .cause(e)
-            .haltError();
-    }
-
     private HaltException serverError(String message, Exception e) {
         return ErrorResponder.builder()
             .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500)
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DLPConfigurationRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DLPConfigurationRoutesTest.java
index 151f622..68a2ae8 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DLPConfigurationRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DLPConfigurationRoutesTest.java
@@ -325,7 +325,7 @@ class DLPConfigurationRoutesTest {
                 .contentType(JSON_CONTENT_TYPE)
                 .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
                 .body("type", is("InvalidArgument"))
-                .body("message", is("Invalid request for domain: dr@strange.com"))
+                .body("message", is("Invalid arguments supplied in the user request"))
                 .body("details", is("Domain can not be empty nor contain `@` nor `/`"));
         }
 
@@ -642,7 +642,7 @@ class DLPConfigurationRoutesTest {
                 .contentType(JSON_CONTENT_TYPE)
                 .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
                 .body("type", is("InvalidArgument"))
-                .body("message", is("Invalid request for domain: dr@strange.com"))
+                .body("message", is("Invalid arguments supplied in the user request"))
                 .body("details", is("Domain can not be empty nor contain `@` nor `/`"));
         }
     }
@@ -855,7 +855,7 @@ class DLPConfigurationRoutesTest {
                 .contentType(JSON_CONTENT_TYPE)
                 .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
                 .body("type", is("InvalidArgument"))
-                .body("message", is("Invalid request for domain: dr@strange.com"))
+                .body("message", is("Invalid arguments supplied in the user request"))
                 .body("details", is("Domain can not be empty nor contain `@` nor `/`"));
         }
     }


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


[james-project] 14/16: JAMES-3014 FastProjection HealthCheck Integration 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 16ade2dc39f2dc4fe63a75e5983ec999925ac32b
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Mon Dec 16 20:28:59 2019 +0700

    JAMES-3014 FastProjection HealthCheck Integration Test
    
    Memory + Contract
---
 ...stViewProjectionHealthCheckIntegrationTest.java |  38 ++++
 ...stViewProjectionHealthCheckIntegrationTest.java | 226 +++++++++++++++++++++
 2 files changed, 264 insertions(+)

diff --git a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryFastViewProjectionHealthCheckIntegrationTest.java b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryFastViewProjectionHealthCheckIntegrationTest.java
new file mode 100644
index 0000000..19b5688
--- /dev/null
+++ b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryFastViewProjectionHealthCheckIntegrationTest.java
@@ -0,0 +1,38 @@
+/****************************************************************
+ * 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.webadmin.integration.memory;
+
+import org.apache.james.GuiceJamesServer;
+import org.apache.james.MemoryJmapTestRule;
+import org.apache.james.webadmin.WebAdminConfiguration;
+import org.apache.james.webadmin.integration.FastViewProjectionHealthCheckIntegrationTest;
+import org.junit.Rule;
+
+public class MemoryFastViewProjectionHealthCheckIntegrationTest extends FastViewProjectionHealthCheckIntegrationTest {
+
+    @Rule
+    public MemoryJmapTestRule memoryJmap = new MemoryJmapTestRule();
+
+    @Override
+    public GuiceJamesServer createJamesServer() throws Exception {
+        return memoryJmap.jmapServer(
+            binder -> binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION));
+    }
+}
\ No newline at end of file
diff --git a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/FastViewProjectionHealthCheckIntegrationTest.java b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/FastViewProjectionHealthCheckIntegrationTest.java
new file mode 100644
index 0000000..da228bf
--- /dev/null
+++ b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/FastViewProjectionHealthCheckIntegrationTest.java
@@ -0,0 +1,226 @@
+/****************************************************************
+ * 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.webadmin.integration;
+
+import static io.restassured.RestAssured.with;
+import static org.apache.james.jmap.HttpJmapAuthentication.authenticateJamesUser;
+import static org.apache.james.jmap.JMAPTestingConstants.ALICE;
+import static org.apache.james.jmap.JMAPTestingConstants.ALICE_PASSWORD;
+import static org.apache.james.jmap.JMAPTestingConstants.ARGUMENTS;
+import static org.apache.james.jmap.JMAPTestingConstants.BOB;
+import static org.apache.james.jmap.JMAPTestingConstants.BOB_PASSWORD;
+import static org.apache.james.jmap.JMAPTestingConstants.CEDRIC;
+import static org.apache.james.jmap.JMAPTestingConstants.CEDRIC_PASSWORD;
+import static org.apache.james.jmap.JMAPTestingConstants.DOMAIN;
+import static org.apache.james.jmap.JMAPTestingConstants.calmlyAwait;
+import static org.apache.james.jmap.JMAPTestingConstants.jmapRequestSpecBuilder;
+import static org.apache.james.jmap.JmapCommonRequests.bodyOfMessage;
+import static org.apache.james.jmap.JmapCommonRequests.getLastMessageId;
+import static org.apache.james.jmap.JmapCommonRequests.getOutboxId;
+import static org.apache.james.jmap.JmapCommonRequests.listMessageIdsForAccount;
+import static org.apache.james.jmap.LocalHostURIBuilder.baseUri;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+
+import java.util.stream.IntStream;
+
+import org.apache.james.GuiceJamesServer;
+import org.apache.james.core.healthcheck.ResultStatus;
+import org.apache.james.jmap.AccessToken;
+import org.apache.james.jmap.draft.JmapGuiceProbe;
+import org.apache.james.probe.DataProbe;
+import org.apache.james.util.Port;
+import org.apache.james.utils.DataProbeImpl;
+import org.apache.james.utils.WebAdminGuiceProbe;
+import org.apache.james.webadmin.WebAdminUtils;
+import org.eclipse.jetty.http.HttpStatus;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import io.restassured.RestAssured;
+import io.restassured.specification.RequestSpecification;
+
+public abstract class FastViewProjectionHealthCheckIntegrationTest {
+
+    private static final String MESSAGE_FAST_VIEW_PROJECTION = "MessageFastViewProjection";
+
+    private GuiceJamesServer guiceJamesServer;
+    private RequestSpecification webAdminApi;
+    private AccessToken bobAccessToken;
+    private AccessToken aliceAccessToken;
+
+    @Before
+    public void setUp() throws Exception {
+        guiceJamesServer = createJamesServer();
+        guiceJamesServer.start();
+
+        DataProbe dataProbe = guiceJamesServer.getProbe(DataProbeImpl.class);
+        dataProbe.addDomain(DOMAIN);
+        dataProbe.addUser(BOB.asString(), BOB_PASSWORD);
+        dataProbe.addUser(ALICE.asString(), ALICE_PASSWORD);
+        dataProbe.addUser(CEDRIC.asString(), CEDRIC_PASSWORD);
+
+        Port jmapPort = guiceJamesServer.getProbe(JmapGuiceProbe.class).getJmapPort();
+        RestAssured.requestSpecification = jmapRequestSpecBuilder
+            .setPort(jmapPort.getValue())
+            .build();
+
+        bobAccessToken = authenticateJamesUser(baseUri(jmapPort), BOB, BOB_PASSWORD);
+        aliceAccessToken = authenticateJamesUser(baseUri(jmapPort), ALICE, ALICE_PASSWORD);
+
+        webAdminApi = WebAdminUtils.spec(guiceJamesServer.getProbe(WebAdminGuiceProbe.class).getWebAdminPort());
+    }
+
+    @After
+    public void tearDown() {
+        guiceJamesServer.stop();
+    }
+
+    protected abstract GuiceJamesServer createJamesServer() throws Exception;
+
+    @Test
+    public void checkShouldReturnHealthyWhenNoMessage() {
+        webAdminApi.when()
+            .get("/healthcheck/checks/" + MESSAGE_FAST_VIEW_PROJECTION)
+        .then()
+            .statusCode(HttpStatus.OK_200)
+            .body("componentName", equalTo(MESSAGE_FAST_VIEW_PROJECTION))
+            .body("escapedComponentName", equalTo(MESSAGE_FAST_VIEW_PROJECTION))
+            .body("status", equalTo(ResultStatus.HEALTHY.getValue()));
+    }
+
+    @Test
+    public void checkShouldReturnHealthyAfterSendingMessagesWithoutReading() {
+        IntStream.rangeClosed(1, 5)
+            .forEach(counter -> bobSendAMessageToAlice());
+        calmlyAwait.until(() -> listMessageIdsForAccount(aliceAccessToken).size() == 5);
+
+        webAdminApi.when()
+            .get("/healthcheck/checks/" + MESSAGE_FAST_VIEW_PROJECTION)
+        .then()
+            .statusCode(HttpStatus.OK_200)
+            .body("componentName", equalTo(MESSAGE_FAST_VIEW_PROJECTION))
+            .body("escapedComponentName", equalTo(MESSAGE_FAST_VIEW_PROJECTION))
+            .body("status", equalTo(ResultStatus.HEALTHY.getValue()));
+    }
+
+    @Test
+    public void checkShouldReturnHealthyAfterSendingAMessageWithReads() {
+        bobSendAMessageToAlice();
+        calmlyAwait.untilAsserted(() -> assertThat(listMessageIdsForAccount(aliceAccessToken))
+            .hasSize(1));
+
+        IntStream.rangeClosed(1, 5)
+            .forEach(counter -> aliceReadLastMessage());
+
+        webAdminApi.when()
+            .get("/healthcheck/checks/" + MESSAGE_FAST_VIEW_PROJECTION)
+        .then()
+            .statusCode(HttpStatus.OK_200)
+            .body("componentName", equalTo(MESSAGE_FAST_VIEW_PROJECTION))
+            .body("escapedComponentName", equalTo(MESSAGE_FAST_VIEW_PROJECTION))
+            .body("status", equalTo(ResultStatus.HEALTHY.getValue()));
+    }
+
+    @Test
+    public void checkShouldReturnDegradedAfterFewReadsOnAMissedProjection() {
+        bobSendAMessageToAlice();
+        calmlyAwait.untilAsserted(() -> assertThat(listMessageIdsForAccount(aliceAccessToken))
+            .hasSize(1));
+        guiceJamesServer.getProbe(JmapGuiceProbe.class)
+            .clearMessageFastViewProjection();
+
+        IntStream.rangeClosed(1, 3) // Will miss at the first time as we cleared the preview
+            .forEach(counter -> aliceReadLastMessage());
+
+        webAdminApi.when()
+            .get("/healthcheck/checks/" + MESSAGE_FAST_VIEW_PROJECTION)
+        .then()
+            .statusCode(HttpStatus.OK_200)
+            .body("componentName", equalTo(MESSAGE_FAST_VIEW_PROJECTION))
+            .body("escapedComponentName", equalTo(MESSAGE_FAST_VIEW_PROJECTION))
+            .body("status", equalTo(ResultStatus.DEGRADED.getValue()))
+            .body("cause", equalTo("retrieveMissCount percentage 25.0% (1/4) is higher than the threshold 10.0%"));
+    }
+
+    @Test
+    public void checkShouldTurnFromDegradedToHealthyAfterMoreReadsOnAMissedProjection() {
+        bobSendAMessageToAlice();
+        calmlyAwait.untilAsserted(() -> assertThat(listMessageIdsForAccount(aliceAccessToken))
+            .hasSize(1));
+        makeHealthCheckDegraded();
+
+        IntStream.rangeClosed(1, 10)
+            .forEach(counter -> aliceReadLastMessage());
+
+        webAdminApi.when()
+            .get("/healthcheck/checks/" + MESSAGE_FAST_VIEW_PROJECTION)
+        .then()
+            .statusCode(HttpStatus.OK_200)
+            .body("componentName", equalTo(MESSAGE_FAST_VIEW_PROJECTION))
+            .body("escapedComponentName", equalTo(MESSAGE_FAST_VIEW_PROJECTION))
+            .body("status", equalTo(ResultStatus.HEALTHY.getValue()));
+    }
+
+    private void makeHealthCheckDegraded() {
+        guiceJamesServer.getProbe(JmapGuiceProbe.class)
+            .clearMessageFastViewProjection();
+        aliceReadLastMessage();
+
+        webAdminApi.when()
+            .get("/healthcheck/checks/" + MESSAGE_FAST_VIEW_PROJECTION)
+        .then()
+            .body("status", equalTo(ResultStatus.DEGRADED.getValue()));
+    }
+
+    private void bobSendAMessageToAlice() {
+        String messageCreationId = "creationId";
+        String outboxId = getOutboxId(bobAccessToken);
+        String requestBody = "[" +
+            "  [" +
+            "    \"setMessages\"," +
+            "    {" +
+            "      \"create\": { \"" + messageCreationId  + "\" : {" +
+            "        \"from\": { \"name\": \"Bob\", \"email\": \"" + BOB.asString() + "\"}," +
+            "        \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
+            "        \"subject\": \"bob to alice\"," +
+            "        \"textBody\": \"body\"," +
+            "        \"htmlBody\": \"Test <b>body</b>, HTML version\"," +
+            "        \"mailboxIds\": [\"" + outboxId + "\"] " +
+            "      }}" +
+            "    }," +
+            "    \"#0\"" +
+            "  ]" +
+            "]";
+        with()
+            .header("Authorization", bobAccessToken.asString())
+            .body(requestBody)
+            .post("/jmap")
+        .then()
+            .extract()
+            .body()
+            .path(ARGUMENTS + ".created." + messageCreationId + ".id");
+    }
+
+    private void aliceReadLastMessage() {
+        bodyOfMessage(aliceAccessToken, getLastMessageId(aliceAccessToken));
+    }
+}


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


[james-project] 01/16: JAMES-3021 try to retrieve the container IP from inspect output

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 a2c33cbfab125bfced6d028d4c5d2ab1a1967f07
Author: Matthieu Baechler <ma...@apache.org>
AuthorDate: Mon Jan 6 15:36:17 2020 +0100

    JAMES-3021 try to retrieve the container IP from inspect output
---
 .../java/org/apache/james/util/docker/DockerContainer.java     | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/server/testing/src/main/java/org/apache/james/util/docker/DockerContainer.java b/server/testing/src/main/java/org/apache/james/util/docker/DockerContainer.java
index 73b9162..d14d785 100644
--- a/server/testing/src/main/java/org/apache/james/util/docker/DockerContainer.java
+++ b/server/testing/src/main/java/org/apache/james/util/docker/DockerContainer.java
@@ -39,6 +39,7 @@ import org.testcontainers.containers.output.OutputFrame;
 import org.testcontainers.containers.wait.strategy.WaitStrategy;
 import org.testcontainers.images.builder.ImageFromDockerfile;
 
+import com.github.dockerjava.api.model.ContainerNetwork;
 import com.google.common.base.Strings;
 
 public class DockerContainer implements TestRule {
@@ -157,7 +158,14 @@ public class DockerContainer implements TestRule {
 
     @SuppressWarnings("deprecation")
     public String getContainerIp() {
-        return container.getContainerInfo().getNetworkSettings().getIpAddress();
+        return container.getContainerInfo()
+            .getNetworkSettings()
+            .getNetworks()
+            .values()
+            .stream()
+            .map(ContainerNetwork::getIpAddress)
+            .findFirst()
+            .orElseThrow(IllegalStateException::new);
     }
     
     public String getHostIp() {


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


[james-project] 09/16: JAMES-2993 Integration test for recompute user JMAP fastView projection

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 59045778c8dbe1e222be4c027768a5b9633e3a21
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Fri Jan 3 10:48:57 2020 +0700

    JAMES-2993 Integration test for recompute user JMAP fastView projection
---
 .../integration/WebAdminServerIntegrationTest.java | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
index 4e83ebe..5da8f67 100644
--- a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
@@ -323,6 +323,26 @@ public abstract class WebAdminServerIntegrationTest {
         .when()
             .get(taskId + "/await")
         .then()
-            .body("status", is("completed"));
+            .body("status", is("completed"))
+            .body("type", is("RecomputeAllFastViewProjectionItemsTask"));
+    }
+
+    @Test
+    public void jmapUserTasksShouldBeExposed() throws Exception {
+        dataProbe.addUser(USERNAME, "anyPassword");
+
+        String taskId = with()
+            .queryParam("task", "recomputeFastViewProjectionItems")
+            .post("/users/" + USERNAME + "/mailboxes")
+            .jsonPath()
+            .get("taskId");
+
+        given()
+            .basePath(TasksRoutes.BASE)
+        .when()
+            .get(taskId + "/await")
+        .then()
+            .body("status", is("completed"))
+            .body("type", is("RecomputeUserFastViewProjectionItemsTask"));
     }
 }
\ 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


[james-project] 03/16: [Refactoring] ErrorResponder::message formatting

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 07bd60df016c63e5fb79bcc8a74f8fd995b52f66
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Jan 3 14:33:15 2020 +0700

    [Refactoring] ErrorResponder::message formatting
---
 .../org/apache/james/webadmin/WebAdminServer.java  |  2 +-
 .../james/webadmin/routes/HealthCheckRoutes.java   |  2 +-
 .../apache/james/webadmin/routes/TasksRoutes.java  |  2 +-
 .../james/webadmin/utils/ErrorResponder.java       |  5 +++
 .../james/webadmin/utils/ParametersExtractor.java  |  6 ++--
 .../james/webadmin/utils/ErrorResponderTest.java   | 36 ++++++++++++++--------
 .../james/webadmin/routes/DomainsRoutes.java       | 14 ++++-----
 .../james/webadmin/routes/MailAddressParser.java   |  3 +-
 .../james/webadmin/routes/SieveQuotaRoutes.java    |  4 +--
 .../vault/routes/DeletedMessagesVaultRoutes.java   |  4 +--
 .../webadmin/routes/EventDeadLettersRoutes.java    |  4 +--
 .../james/webadmin/routes/MailboxesRoutes.java     |  2 +-
 .../james/webadmin/routes/MailQueueRoutes.java     | 12 ++++----
 .../webadmin/routes/MailRepositoriesRoutes.java    | 12 ++++----
 .../service/MailRepositoryStoreService.java        |  2 +-
 15 files changed, 64 insertions(+), 46 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java
index 92b28fc..1c9f00a 100644
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java
@@ -149,7 +149,7 @@ public class WebAdminServer implements Startable {
         service.notFound((req, res) -> ErrorResponder.builder()
             .statusCode(NOT_FOUND_404)
             .type(NOT_FOUND)
-            .message(String.format("%s %s can not be found", req.requestMethod(), req.pathInfo()))
+            .message("%s %s can not be found", req.requestMethod(), req.pathInfo())
             .asString());
 
         service.internalServerError((req, res) -> ErrorResponder.builder()
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/HealthCheckRoutes.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/HealthCheckRoutes.java
index 45d9543..520a7a5 100644
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/HealthCheckRoutes.java
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/HealthCheckRoutes.java
@@ -189,7 +189,7 @@ public class HealthCheckRoutes implements PublicRoutes {
     
     private HaltException throw404(String componentName) {
         return ErrorResponder.builder()
-            .message(String.format("Component with name %s cannot be found", componentName))
+            .message("Component with name %s cannot be found", componentName)
             .statusCode(HttpStatus.NOT_FOUND_404)
             .type(ErrorResponder.ErrorType.NOT_FOUND)
             .haltError();
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 a01fc99..231388a 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
@@ -156,7 +156,7 @@ public class TasksRoutes implements Routes {
             return ExecutionDetailsDto.from(executionDetails);
         } catch (TaskNotFoundException e) {
             throw ErrorResponder.builder()
-                .message(String.format("%s can not be found", taskId.getValue()))
+                .message("%s can not be found", taskId.getValue())
                 .statusCode(HttpStatus.NOT_FOUND_404)
                 .type(ErrorResponder.ErrorType.NOT_FOUND)
                 .haltError();
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/ErrorResponder.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/ErrorResponder.java
index e72cbec..72361e0 100644
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/ErrorResponder.java
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/ErrorResponder.java
@@ -77,6 +77,11 @@ public class ErrorResponder {
         return this;
     }
 
+    public ErrorResponder message(String message, Object... args) {
+        this.message = String.format(message, args);
+        return this;
+    }
+
     public ErrorResponder message(String message) {
         this.message = message;
         return this;
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/ParametersExtractor.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/ParametersExtractor.java
index 582f1d2..0cc0fc1 100644
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/ParametersExtractor.java
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/ParametersExtractor.java
@@ -62,7 +62,7 @@ public class ParametersExtractor {
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
                 .cause(e)
-                .message("Can not parse " + parameterName)
+                .message("Can not parse %s", parameterName)
                 .haltError();
         }
     }
@@ -72,7 +72,7 @@ public class ParametersExtractor {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
-                .message(parameterName + " can not be negative")
+                .message("%s can not be negative", parameterName)
                 .haltError();
         }
         return value;
@@ -83,7 +83,7 @@ public class ParametersExtractor {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
-                .message(parameterName + " can not be equal to zero")
+                .message("%s can not be equal to zero", parameterName)
                 .haltError();
         }
         return value;
diff --git a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/utils/ErrorResponderTest.java b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/utils/ErrorResponderTest.java
index 53dc91d..0f80843 100644
--- a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/utils/ErrorResponderTest.java
+++ b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/utils/ErrorResponderTest.java
@@ -25,26 +25,25 @@ import java.util.Objects;
 import java.util.Optional;
 
 import org.eclipse.jetty.http.HttpStatus;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import com.jayway.jsonpath.DocumentContext;
 import com.jayway.jsonpath.JsonPath;
 
 import spark.HaltException;
 
-public class ErrorResponderTest {
-
-    public static final Optional<String> NO_CAUSE = Optional.empty();
+class ErrorResponderTest {
+    static final Optional<String> NO_CAUSE = Optional.empty();
 
     @Test
-    public void haltErrorShouldThrowWhenNoStatusCode() throws Exception {
+    void haltErrorShouldThrowWhenNoStatusCode() {
         assertThatThrownBy(() -> ErrorResponder.builder()
             .haltError())
             .isInstanceOf(NullPointerException.class);
     }
 
     @Test
-    public void haltErrorShouldThrowWhenNoType() throws Exception {
+    void haltErrorShouldThrowWhenNoType() {
         assertThatThrownBy(() -> ErrorResponder.builder()
             .statusCode(HttpStatus.BAD_REQUEST_400)
             .haltError())
@@ -52,7 +51,7 @@ public class ErrorResponderTest {
     }
 
     @Test
-    public void haltErrorShouldThrowWhenNoMessage() throws Exception {
+    void haltErrorShouldThrowWhenNoMessage() {
         assertThatThrownBy(() -> ErrorResponder.builder()
             .statusCode(HttpStatus.BAD_REQUEST_400)
             .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
@@ -61,7 +60,7 @@ public class ErrorResponderTest {
     }
 
     @Test
-    public void haltErrorShouldReturnBodyWithStatusCodeWhenSetting() throws Exception {
+    void haltErrorShouldReturnBodyWithStatusCodeWhenSetting() {
         assertThatThrownBy(() -> ErrorResponder.builder()
                 .statusCode(HttpStatus.NOT_FOUND_404)
                 .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
@@ -73,7 +72,7 @@ public class ErrorResponderTest {
     }
 
     @Test
-    public void haltErrorShouldReturnBodyWithErrorTypeWhenSetting() throws Exception {
+    void haltErrorShouldReturnBodyWithErrorTypeWhenSetting() {
         assertThatThrownBy(() -> ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .type(ErrorResponder.ErrorType.WRONG_STATE)
@@ -85,7 +84,7 @@ public class ErrorResponderTest {
     }
 
     @Test
-    public void haltErrorShouldReturnBodyWithErrorMessageWhenSetting() throws Exception {
+    void haltErrorShouldReturnBodyWithErrorMessageWhenSetting() {
         assertThatThrownBy(() -> ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
@@ -97,7 +96,7 @@ public class ErrorResponderTest {
     }
 
     @Test
-    public void haltErrorShouldReturnBodyWithCauseTypeWhenSetting() throws Exception {
+    void haltErrorShouldReturnBodyWithCauseTypeWhenSetting() {
         assertThatThrownBy(() -> ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
@@ -110,7 +109,7 @@ public class ErrorResponderTest {
     }
 
     @Test
-    public void haltErrorShouldReturnBodyWithErrorDetail() throws Exception {
+    void haltErrorShouldReturnBodyWithErrorDetail() {
         assertThatThrownBy(() -> ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
@@ -122,6 +121,19 @@ public class ErrorResponderTest {
             .matches(e -> bodyHasErrorDetail(e, new ErrorResponder.ErrorDetail(HttpStatus.BAD_REQUEST_400, "InvalidArgument", "Error", Optional.of("The input data is invalid"))));
     }
 
+    @Test
+    void haltShouldFormatMessage() {
+        assertThatThrownBy(() -> ErrorResponder.builder()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
+                .message("Error %s", "bip")
+                .cause(new IllegalArgumentException("The input data is invalid"))
+            .haltError())
+            .isInstanceOf(HaltException.class)
+            .matches(e -> hasStatus(e, HttpStatus.BAD_REQUEST_400))
+            .matches(e -> bodyHasErrorDetail(e, new ErrorResponder.ErrorDetail(HttpStatus.BAD_REQUEST_400, "InvalidArgument", "Error bip", Optional.of("The input data is invalid"))));
+    }
+
     private boolean hasStatus(Throwable throwable, int status) {
         HaltException haltException = (HaltException) throwable;
         return Objects.equals(haltException.statusCode(), status);
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
index ac41c8e..bb8ef4c 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
@@ -252,7 +252,7 @@ public class DomainsRoutes implements Routes {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.NO_CONTENT_204)
                 .type(ErrorType.INVALID_ARGUMENT)
-                .message(domain.name() + " already exists")
+                .message("%s already exists", domain.name())
                 .cause(e)
                 .haltError();
         } catch (IllegalArgumentException e) {
@@ -260,7 +260,7 @@ public class DomainsRoutes implements Routes {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .type(ErrorType.INVALID_ARGUMENT)
-                .message("Invalid request for domain creation " + domain.name())
+                .message("Invalid request for domain creation %s", domain.name())
                 .cause(e)
                 .haltError();
         }
@@ -274,7 +274,7 @@ public class DomainsRoutes implements Routes {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .type(ErrorType.INVALID_ARGUMENT)
-                .message("Invalid request for domain creation " + urlDecodedDomainName)
+                .message("Invalid request for domain creation %s", urlDecodedDomainName)
                 .cause(e)
                 .haltError();
         }
@@ -287,7 +287,7 @@ public class DomainsRoutes implements Routes {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .type(ErrorType.INVALID_ARGUMENT)
-                .message("Invalid request for domain creation " + domainName + " unable to url decode some characters")
+                .message("Invalid request for domain creation %s unable to url decode some characters", domainName)
                 .cause(e)
                 .haltError();
         }
@@ -345,7 +345,7 @@ public class DomainsRoutes implements Routes {
         return ErrorResponder.builder()
             .statusCode(HttpStatus.NOT_FOUND_404)
             .type(ErrorType.INVALID_ARGUMENT)
-            .message("The domain list does not contain: " + domain.name())
+            .message("The domain list does not contain: %s", domain.name())
             .haltError();
     }
 
@@ -353,7 +353,7 @@ public class DomainsRoutes implements Routes {
         return ErrorResponder.builder()
             .statusCode(HttpStatus.NOT_FOUND_404)
             .type(ErrorType.INVALID_ARGUMENT)
-            .message("The following domain is not in the domain list and has no registered local aliases: " + domain.name())
+            .message("The following domain is not in the domain list and has no registered local aliases: %s", domain.name())
             .haltError();
     }
 
@@ -361,7 +361,7 @@ public class DomainsRoutes implements Routes {
         return ErrorResponder.builder()
             .statusCode(HttpStatus.BAD_REQUEST_400)
             .type(ErrorType.INVALID_ARGUMENT)
-            .message("Source domain and destination domain can not have same value(" + sameDomain.name() + ")")
+            .message("Source domain and destination domain can not have same value(%s)", sameDomain.name())
             .haltError();
     }
 }
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/MailAddressParser.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/MailAddressParser.java
index ff363a0..f138ebd 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/MailAddressParser.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/MailAddressParser.java
@@ -22,6 +22,7 @@ package org.apache.james.webadmin.routes;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 import java.nio.charset.StandardCharsets;
+
 import javax.mail.internet.AddressException;
 
 import org.apache.james.core.MailAddress;
@@ -43,7 +44,7 @@ class MailAddressParser {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
-                .message("The " + addressType + " is not an email address")
+                .message("The %s is not an email address", addressType)
                 .cause(e)
                 .haltError();
         } catch (UnsupportedEncodingException e) {
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
index fbbb40d..6009c7e 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
@@ -230,7 +230,7 @@ public class SieveQuotaRoutes implements Routes {
             throw ErrorResponder.builder()
                 .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
                 .statusCode(HttpStatus.BAD_REQUEST_400)
-                .message(String.format("unrecognized integer number '%s'", body))
+                .message("unrecognized integer number '%s'", body)
                 .haltError();
         }
     }
@@ -241,7 +241,7 @@ public class SieveQuotaRoutes implements Routes {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.NOT_FOUND_404)
                 .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
-                .message("User " + username + " does not exist")
+                .message("User %s does not exist", username)
                 .haltError();
         }
         return username;
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java
index e7c33a5..3a076b7 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java
@@ -240,7 +240,7 @@ public class DeletedMessagesVaultRoutes implements Routes {
                 throw ErrorResponder.builder()
                     .statusCode(HttpStatus.NOT_FOUND_404)
                     .type(ErrorResponder.ErrorType.NOT_FOUND)
-                    .message("User '" + username.asString() + "' does not exist in the system")
+                    .message("User '%s' does not exist in the system", username.asString())
                     .haltError();
             }
         } catch (UsersRepositoryException e) {
@@ -311,7 +311,7 @@ public class DeletedMessagesVaultRoutes implements Routes {
         } catch (Exception e) {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
-                .message("Can not deserialize the supplied messageId: " + messageIdAsString)
+                .message("Can not deserialize the supplied messageId: %s", messageIdAsString)
                 .cause(e)
                 .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
                 .haltError();
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/EventDeadLettersRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/EventDeadLettersRoutes.java
index 601db57..04ea5f9 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/EventDeadLettersRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/EventDeadLettersRoutes.java
@@ -303,7 +303,7 @@ public class EventDeadLettersRoutes implements Routes {
         } catch (Group.GroupDeserializationException e) {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
-                .message("Can not deserialize the supplied group: " + groupAsString)
+                .message("Can not deserialize the supplied group: %s", groupAsString)
                 .cause(e)
                 .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
                 .haltError();
@@ -317,7 +317,7 @@ public class EventDeadLettersRoutes implements Routes {
         } catch (Exception e) {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
-                .message("Can not deserialize the supplied insertionId: " + insertionIdAsString)
+                .message("Can not deserialize the supplied insertionId: %s", insertionIdAsString)
                 .cause(e)
                 .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
                 .haltError();
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/MailboxesRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/MailboxesRoutes.java
index a26450e..72ad721 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/MailboxesRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/MailboxesRoutes.java
@@ -121,7 +121,7 @@ public class MailboxesRoutes implements Routes {
                 throw ErrorResponder.builder()
                     .statusCode(HttpStatus.BAD_REQUEST_400)
                     .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
-                    .message("TaskId " + taskId.asString() + " does not exist")
+                    .message("TaskId %s does not exist", taskId.asString())
                     .cause(e)
                     .haltError();
             }
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java
index 335cd04..c2f6064 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java
@@ -166,7 +166,7 @@ public class MailQueueRoutes implements Routes {
         return mailQueueFactory.getQueue(mailQueueName).map(this::toDTO)
             .orElseThrow(
                 () -> ErrorResponder.builder()
-                    .message(String.format("%s can not be found", mailQueueName))
+                    .message("%s can not be found", mailQueueName)
                     .statusCode(HttpStatus.NOT_FOUND_404)
                     .type(ErrorResponder.ErrorType.NOT_FOUND)
                     .haltError());
@@ -179,7 +179,7 @@ public class MailQueueRoutes implements Routes {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .type(ErrorType.INVALID_ARGUMENT)
-                .message("Invalid request for getting the mail queue " + queue)
+                .message("Invalid request for getting the mail queue %s", queue)
                 .cause(e)
                 .haltError();
         }
@@ -226,7 +226,7 @@ public class MailQueueRoutes implements Routes {
                 .map(name -> listMails(name, isDelayed(request.queryParams(DELAYED_QUERY_PARAM)), ParametersExtractor.extractLimit(request)))
                 .orElseThrow(
                     () -> ErrorResponder.builder()
-                        .message(String.format("%s can not be found", mailQueueName))
+                        .message("%s can not be found", mailQueueName)
                         .statusCode(HttpStatus.NOT_FOUND_404)
                         .type(ErrorResponder.ErrorType.NOT_FOUND)
                         .haltError());
@@ -247,7 +247,7 @@ public class MailQueueRoutes implements Routes {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .type(ErrorType.INVALID_ARGUMENT)
-                .message("Invalid request for listing the mails from the mail queue " + queue)
+                .message("Invalid request for listing the mails from the mail queue %s", queue)
                 .cause(e)
                 .haltError();
         }
@@ -311,7 +311,7 @@ public class MailQueueRoutes implements Routes {
                     recipient(request.queryParams(RECIPIENT_QUERY_PARAM))))
             .orElseThrow(
                 () -> ErrorResponder.builder()
-                    .message(String.format("%s can not be found", mailQueueName))
+                    .message("%s can not be found", mailQueueName)
                     .statusCode(HttpStatus.NOT_FOUND_404)
                     .type(ErrorResponder.ErrorType.NOT_FOUND)
                     .haltError());
@@ -394,7 +394,7 @@ public class MailQueueRoutes implements Routes {
         String mailQueueName = request.params(MAIL_QUEUE_NAME);
         return mailQueueFactory.getQueue(mailQueueName)
             .orElseThrow(() -> ErrorResponder.builder()
-                .message(String.format("%s can not be found", mailQueueName))
+                .message("%s can not be found", mailQueueName)
                 .statusCode(HttpStatus.NOT_FOUND_404)
                 .type(ErrorType.NOT_FOUND)
                 .haltError());
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java
index f200a1d..6a070a8 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java
@@ -160,14 +160,14 @@ public class MailRepositoriesRoutes implements Routes {
                     .statusCode(HttpStatus.BAD_REQUEST_400)
                     .type(ErrorType.INVALID_ARGUMENT)
                     .cause(e)
-                    .message(String.format("'%s' is an unsupported protocol", protocol))
+                    .message("'%s' is an unsupported protocol", protocol)
                     .haltError();
             } catch (MailRepositoryStore.MailRepositoryStoreException e) {
                 throw ErrorResponder.builder()
                     .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500)
                     .type(ErrorResponder.ErrorType.SERVER_ERROR)
                     .cause(e)
-                    .message(String.format("Error while creating a mail repository with path '%s' and protocol '%s'", path.asString(), protocol))
+                    .message("Error while creating a mail repository with path '%s' and protocol '%s'", path.asString(), protocol)
                     .haltError();
             }
         }, jsonTransformer);
@@ -295,7 +295,7 @@ public class MailRepositoriesRoutes implements Routes {
             .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500)
             .type(ErrorType.SERVER_ERROR)
             .cause(e)
-            .message("The field '" + e.getField().getName() + "' requested in additionalFields parameter can't be accessed")
+            .message("The field '%s' requested in additionalFields parameter can't be accessed", e.getField().getName())
             .haltError();
     }
 
@@ -304,7 +304,7 @@ public class MailRepositoriesRoutes implements Routes {
             .statusCode(HttpStatus.BAD_REQUEST_400)
             .type(ErrorType.INVALID_ARGUMENT)
             .cause(e)
-            .message("The field '" + e.getMessage() + "' can't be requested in additionalFields parameter")
+            .message("The field '%s' can't be requested in additionalFields parameter", e.getMessage())
             .haltError();
     }
 
@@ -312,7 +312,7 @@ public class MailRepositoriesRoutes implements Routes {
         return () -> ErrorResponder.builder()
             .statusCode(HttpStatus.NOT_FOUND_404)
             .type(ErrorResponder.ErrorType.NOT_FOUND)
-            .message("Could not retrieve " + mailKey.asString())
+            .message("Could not retrieve %s", mailKey.asString())
             .haltError();
     }
 
@@ -320,7 +320,7 @@ public class MailRepositoriesRoutes implements Routes {
         return ErrorResponder.builder()
             .statusCode(HttpStatus.NOT_FOUND_404)
             .type(ErrorType.NOT_FOUND)
-            .message("The repository '" + encodedPath + "' (decoded value: '" + path.asString() + "') does not exist")
+            .message("The repository '%s' (decoded value: '%s') does not exist", encodedPath, path.asString())
             .haltError();
     }
 
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 987b443..b9fc716 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
@@ -112,7 +112,7 @@ public class MailRepositoryStoreService {
             ErrorResponder.builder()
                 .statusCode(HttpStatus.NOT_FOUND_404)
                 .type(ErrorResponder.ErrorType.NOT_FOUND)
-                .message(path.asString() + " does not exist")
+                .message("%s does not exist", path.asString())
                 .haltError();
         }
 


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


[james-project] 02/16: JAMES-2321 Clarify additional fields only work with "application/json"

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 e2bba58bdc96a65c78dcd52497836f10e7940d0b
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Fri Jan 3 15:12:33 2020 +0700

    JAMES-2321 Clarify additional fields only work with "application/json"
---
 src/site/markdown/server/manage-webadmin.md | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md
index 74a22f7..618ead5 100644
--- a/src/site/markdown/server/manage-webadmin.md
+++ b/src/site/markdown/server/manage-webadmin.md
@@ -2145,7 +2145,9 @@ If the Accept header in the request is "application/json", then the response loo
 ```
 If the Accept header in the request is "message/rfc822", then the response will be the _eml_ file itself.
 
-Additional query parameter `additionalFields` add the existing information to the response for the supported values:
+Additional query parameter `additionalFields` add the existing information 
+to the response for the supported values (only work with "application/json" Accept header):
+
  - attributes
  - headers
  - textBody


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


[james-project] 16/16: JAMES-3014 Use JUNIT 5 to run FastViewProjectionHealthCheckIntegrationTest

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 1ac5f3431cff6b75a9e52bd2e01634a383394c02
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Dec 19 18:10:05 2019 +0700

    JAMES-3014 Use JUNIT 5 to run FastViewProjectionHealthCheckIntegrationTest
---
 ...stViewProjectionHealthCheckIntegrationTest.java | 23 ++++--------
 ...stViewProjectionHealthCheckIntegrationTest.java | 27 +++++++-------
 ...wProjectionHealthCheckIntegrationContract.java} | 41 ++++++++--------------
 3 files changed, 35 insertions(+), 56 deletions(-)

diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java
index 8b603e0..643e25d 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java
@@ -19,22 +19,11 @@
 
 package org.apache.james.webadmin.integration.rabbitmq;
 
-import org.apache.james.CassandraRabbitMQAwsS3JmapTestRule;
-import org.apache.james.DockerCassandraRule;
-import org.apache.james.GuiceJamesServer;
-import org.apache.james.webadmin.integration.FastViewProjectionHealthCheckIntegrationTest;
-import org.junit.Rule;
+import org.apache.james.webadmin.integration.FastViewProjectionHealthCheckIntegrationContract;
+import org.apache.james.webadmin.integration.rabbitmq.RabbitMQJmapExtension.JamesLifeCyclePolicy;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class RabbitMQFastViewProjectionHealthCheckIntegrationTest extends FastViewProjectionHealthCheckIntegrationTest {
-
-    @Rule
-    public DockerCassandraRule cassandra = new DockerCassandraRule();
-
-    @Rule
-    public CassandraRabbitMQAwsS3JmapTestRule jamesTestRule = CassandraRabbitMQAwsS3JmapTestRule.defaultTestRule();
-
-    @Override
-    public GuiceJamesServer createJamesServer() throws Exception {
-        return jamesTestRule.jmapServer(cassandra.getModule());
-    }
+class RabbitMQFastViewProjectionHealthCheckIntegrationTest extends FastViewProjectionHealthCheckIntegrationContract {
+    @RegisterExtension
+    static RabbitMQJmapExtension rabbitMQJmapExtension = new RabbitMQJmapExtension(JamesLifeCyclePolicy.FOR_EACH_TEST);
 }
diff --git a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryFastViewProjectionHealthCheckIntegrationTest.java b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryFastViewProjectionHealthCheckIntegrationTest.java
index 19b5688..82f5d3b 100644
--- a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryFastViewProjectionHealthCheckIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryFastViewProjectionHealthCheckIntegrationTest.java
@@ -20,19 +20,22 @@
 package org.apache.james.webadmin.integration.memory;
 
 import org.apache.james.GuiceJamesServer;
-import org.apache.james.MemoryJmapTestRule;
+import org.apache.james.JamesServerBuilder;
+import org.apache.james.JamesServerExtension;
+import org.apache.james.MemoryJamesServerMain;
+import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.webadmin.WebAdminConfiguration;
-import org.apache.james.webadmin.integration.FastViewProjectionHealthCheckIntegrationTest;
-import org.junit.Rule;
+import org.apache.james.webadmin.integration.FastViewProjectionHealthCheckIntegrationContract;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class MemoryFastViewProjectionHealthCheckIntegrationTest extends FastViewProjectionHealthCheckIntegrationTest {
+class MemoryFastViewProjectionHealthCheckIntegrationTest extends FastViewProjectionHealthCheckIntegrationContract {
+    private static final int LIMIT_TO_10_MESSAGES = 10;
 
-    @Rule
-    public MemoryJmapTestRule memoryJmap = new MemoryJmapTestRule();
-
-    @Override
-    public GuiceJamesServer createJamesServer() throws Exception {
-        return memoryJmap.jmapServer(
-            binder -> binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION));
-    }
+    @RegisterExtension
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+        .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
+            .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
+            .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES))
+            .overrideWith(binder -> binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION)))
+        .build();
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/FastViewProjectionHealthCheckIntegrationTest.java b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/FastViewProjectionHealthCheckIntegrationContract.java
similarity index 87%
rename from server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/FastViewProjectionHealthCheckIntegrationTest.java
rename to server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/FastViewProjectionHealthCheckIntegrationContract.java
index 15465bf..47c17f8 100644
--- a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/FastViewProjectionHealthCheckIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/FastViewProjectionHealthCheckIntegrationContract.java
@@ -51,34 +51,28 @@ import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.WebAdminGuiceProbe;
 import org.apache.james.webadmin.WebAdminUtils;
 import org.eclipse.jetty.http.HttpStatus;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import io.restassured.RestAssured;
 import io.restassured.specification.RequestSpecification;
 
-public abstract class FastViewProjectionHealthCheckIntegrationTest {
-
+public abstract class FastViewProjectionHealthCheckIntegrationContract {
     private static final String MESSAGE_FAST_VIEW_PROJECTION = "MessageFastViewProjection";
 
-    private GuiceJamesServer guiceJamesServer;
     private RequestSpecification webAdminApi;
     private AccessToken bobAccessToken;
     private AccessToken aliceAccessToken;
 
-    @Before
-    public void setUp() throws Exception {
-        guiceJamesServer = createJamesServer();
-        guiceJamesServer.start();
-
-        DataProbe dataProbe = guiceJamesServer.getProbe(DataProbeImpl.class);
+    @BeforeEach
+    void setUp(GuiceJamesServer jamesServer) throws Exception {
+        DataProbe dataProbe = jamesServer.getProbe(DataProbeImpl.class);
         dataProbe.addDomain(DOMAIN);
         dataProbe.addUser(BOB.asString(), BOB_PASSWORD);
         dataProbe.addUser(ALICE.asString(), ALICE_PASSWORD);
         dataProbe.addUser(CEDRIC.asString(), CEDRIC_PASSWORD);
 
-        Port jmapPort = guiceJamesServer.getProbe(JmapGuiceProbe.class).getJmapPort();
+        Port jmapPort = jamesServer.getProbe(JmapGuiceProbe.class).getJmapPort();
         RestAssured.requestSpecification = jmapRequestSpecBuilder
             .setPort(jmapPort.getValue())
             .build();
@@ -86,18 +80,11 @@ public abstract class FastViewProjectionHealthCheckIntegrationTest {
         bobAccessToken = authenticateJamesUser(baseUri(jmapPort), BOB, BOB_PASSWORD);
         aliceAccessToken = authenticateJamesUser(baseUri(jmapPort), ALICE, ALICE_PASSWORD);
 
-        webAdminApi = WebAdminUtils.spec(guiceJamesServer.getProbe(WebAdminGuiceProbe.class).getWebAdminPort());
+        webAdminApi = WebAdminUtils.spec(jamesServer.getProbe(WebAdminGuiceProbe.class).getWebAdminPort());
     }
 
-    @After
-    public void tearDown() {
-        guiceJamesServer.stop();
-    }
-
-    protected abstract GuiceJamesServer createJamesServer() throws Exception;
-
     @Test
-    public void checkShouldReturnHealthyWhenNoMessage() {
+    void checkShouldReturnHealthyWhenNoMessage() {
         webAdminApi.when()
             .get("/healthcheck/checks/" + MESSAGE_FAST_VIEW_PROJECTION)
         .then()
@@ -108,7 +95,7 @@ public abstract class FastViewProjectionHealthCheckIntegrationTest {
     }
 
     @Test
-    public void checkShouldReturnHealthyAfterSendingAMessageWithReads() {
+    void checkShouldReturnHealthyAfterSendingAMessageWithReads() {
         bobSendAMessageToAlice();
 
         IntStream.rangeClosed(1, 20)
@@ -124,7 +111,7 @@ public abstract class FastViewProjectionHealthCheckIntegrationTest {
     }
 
     @Test
-    public void checkShouldReturnDegradedAfterFewReadsOnAMissedProjection() {
+    void checkShouldReturnDegradedAfterFewReadsOnAMissedProjection(GuiceJamesServer guiceJamesServer) {
         bobSendAMessageToAlice();
 
         guiceJamesServer.getProbe(JmapGuiceProbe.class)
@@ -143,11 +130,11 @@ public abstract class FastViewProjectionHealthCheckIntegrationTest {
     }
 
     @Test
-    public void checkShouldTurnFromDegradedToHealthyAfterMoreReadsOnAMissedProjection() {
+    void checkShouldTurnFromDegradedToHealthyAfterMoreReadsOnAMissedProjection(GuiceJamesServer guiceJamesServer) {
         bobSendAMessageToAlice();
         calmlyAwait.untilAsserted(() -> assertThat(listMessageIdsForAccount(aliceAccessToken))
             .hasSize(1));
-        makeHealthCheckDegraded();
+        makeHealthCheckDegraded(guiceJamesServer);
 
         IntStream.rangeClosed(1, 100)
             .forEach(counter -> aliceReadLastMessage());
@@ -161,7 +148,7 @@ public abstract class FastViewProjectionHealthCheckIntegrationTest {
             .body("status", equalTo(ResultStatus.HEALTHY.getValue()));
     }
 
-    private void makeHealthCheckDegraded() {
+    private void makeHealthCheckDegraded(GuiceJamesServer guiceJamesServer) {
         guiceJamesServer.getProbe(JmapGuiceProbe.class)
             .clearMessageFastViewProjection();
         aliceReadLastMessage();


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


[james-project] 10/16: JAMES-2993 Rename `Previews` to `FastView` under discrepancy naming

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 31281c559d4ca8ff540e86ff939dc27f9f6a8f20
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Mon Jan 6 10:11:49 2020 +0700

    JAMES-2993 Rename `Previews` to `FastView` under discrepancy naming
---
 .../java/org/apache/james/modules/TaskSerializationModule.java |  8 ++++----
 .../webadmin/data/jmap/MessageFastViewProjectionCorrector.java |  6 +++---
 .../data/jmap/RecomputeAllFastViewProjectionItemsTask.java     | 10 +++++-----
 ...a => RecomputeAllFastViewTaskAdditionalInformationDTO.java} | 10 +++++-----
 .../data/jmap/RecomputeUserFastViewProjectionItemsTask.java    | 10 +++++-----
 ... => RecomputeUserFastViewTaskAdditionalInformationDTO.java} | 10 +++++-----
 ...astViewProjectionItemsTaskAdditionalInformationDTOTest.java |  2 +-
 ...astViewProjectionItemsTaskAdditionalInformationDTOTest.java |  2 +-
 8 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java
index 2757813..46178f8 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java
@@ -54,9 +54,9 @@ import org.apache.james.vault.blob.BlobStoreVaultGarbageCollectionTaskAdditional
 import org.apache.james.vault.blob.BlobStoreVaultGarbageCollectionTaskDTO;
 import org.apache.james.webadmin.data.jmap.MessageFastViewProjectionCorrector;
 import org.apache.james.webadmin.data.jmap.RecomputeAllFastViewProjectionItemsTask;
-import org.apache.james.webadmin.data.jmap.RecomputeAllPreviewsTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.data.jmap.RecomputeAllFastViewTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.data.jmap.RecomputeUserFastViewProjectionItemsTask;
-import org.apache.james.webadmin.data.jmap.RecomputeUserPreviewsTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.data.jmap.RecomputeUserFastViewTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.CassandraMappingsSolveInconsistenciesTask;
 import org.apache.james.webadmin.service.ClearMailQueueTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.ClearMailQueueTaskDTO;
@@ -385,12 +385,12 @@ public class TaskSerializationModule extends AbstractModule {
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<?, ?> recomputeAllJmapPreviewsAdditionalInformation() {
-        return RecomputeAllPreviewsTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return RecomputeAllFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<?, ?> recomputeUserJmapPreviewsAdditionalInformation() {
-        return RecomputeUserPreviewsTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return RecomputeUserFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
     }
 
     @Named(EVENT_NESTED_TYPES_INJECTION_NAME)
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java
index 53a9c21..2ba423c 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java
@@ -120,12 +120,12 @@ public class MessageFastViewProjectionCorrector {
                 .concatMap(Throwing.function(messageManager -> correctMailboxProjectionItems(progress, messageManager, session)))
                 .doOnComplete(progress.processedUserCount::incrementAndGet)
                 .onErrorContinue((error, o) -> {
-                    LOGGER.error("JMAP preview re-computation aborted for {}", username, error);
+                    LOGGER.error("JMAP fastview re-computation aborted for {}", username, error);
                     progress.failedUserCount.incrementAndGet();
                 })
                 .then();
         } catch (MailboxException e) {
-            LOGGER.error("JMAP preview re-computation aborted for {} as we failed listing user mailboxes", username, e);
+            LOGGER.error("JMAP fastview re-computation aborted for {} as we failed listing user mailboxes", username, e);
             progress.failedUserCount.incrementAndGet();
             return Mono.empty();
         }
@@ -138,7 +138,7 @@ public class MessageFastViewProjectionCorrector {
             .concatMap(pair -> storeProjectionEntry(pair)
                 .doOnSuccess(any -> progress.processedMessageCount.incrementAndGet()))
             .onErrorContinue((error, triggeringValue) -> {
-                LOGGER.error("JMAP preview re-computation aborted for {} - {}", session.getUser(), triggeringValue, error);
+                LOGGER.error("JMAP fastview re-computation aborted for {} - {}", session.getUser(), triggeringValue, error);
                 progress.failedMessageCount.incrementAndGet();
             })
             .then();
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java
index 9d3db13..5a95d37 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java
@@ -83,10 +83,10 @@ public class RecomputeAllFastViewProjectionItemsTask implements Task {
         }
     }
 
-    public static class RecomputeAllPreviewsTaskDTO implements TaskDTO {
+    public static class RecomputeAllFastViewTaskDTO implements TaskDTO {
         private final String type;
 
-        public RecomputeAllPreviewsTaskDTO(@JsonProperty("type") String type) {
+        public RecomputeAllFastViewTaskDTO(@JsonProperty("type") String type) {
             this.type = type;
         }
 
@@ -96,12 +96,12 @@ public class RecomputeAllFastViewProjectionItemsTask implements Task {
         }
     }
 
-    public static TaskDTOModule<RecomputeAllFastViewProjectionItemsTask, RecomputeAllPreviewsTaskDTO> module(MessageFastViewProjectionCorrector corrector) {
+    public static TaskDTOModule<RecomputeAllFastViewProjectionItemsTask, RecomputeAllFastViewTaskDTO> module(MessageFastViewProjectionCorrector corrector) {
         return DTOModule
             .forDomainObject(RecomputeAllFastViewProjectionItemsTask.class)
-            .convertToDTO(RecomputeAllPreviewsTaskDTO.class)
+            .convertToDTO(RecomputeAllFastViewTaskDTO.class)
             .toDomainObjectConverter(dto -> new RecomputeAllFastViewProjectionItemsTask(corrector))
-            .toDTOConverter((task, type) -> new RecomputeAllPreviewsTaskDTO(type))
+            .toDTOConverter((task, type) -> new RecomputeAllFastViewTaskDTO(type))
             .typeName(TASK_TYPE.asString())
             .withFactory(TaskDTOModule::new);
     }
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewTaskAdditionalInformationDTO.java
similarity index 92%
rename from server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskAdditionalInformationDTO.java
rename to server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewTaskAdditionalInformationDTO.java
index 56478e6..3c405d1 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllPreviewsTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewTaskAdditionalInformationDTO.java
@@ -28,17 +28,17 @@ import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.annotations.VisibleForTesting;
 
-public class RecomputeAllPreviewsTaskAdditionalInformationDTO implements AdditionalInformationDTO {
-    public static final AdditionalInformationDTOModule<RecomputeAllFastViewProjectionItemsTask.AdditionalInformation, RecomputeAllPreviewsTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
+public class RecomputeAllFastViewTaskAdditionalInformationDTO implements AdditionalInformationDTO {
+    public static final AdditionalInformationDTOModule<RecomputeAllFastViewProjectionItemsTask.AdditionalInformation, RecomputeAllFastViewTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
         DTOModule.forDomainObject(RecomputeAllFastViewProjectionItemsTask.AdditionalInformation.class)
-            .convertToDTO(RecomputeAllPreviewsTaskAdditionalInformationDTO.class)
+            .convertToDTO(RecomputeAllFastViewTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new RecomputeAllFastViewProjectionItemsTask.AdditionalInformation(
                 dto.getProcessedUserCount(),
                 dto.getProcessedMessageCount(),
                 dto.getFailedUserCount(),
                 dto.getFailedMessageCount(),
                 dto.timestamp))
-            .toDTOConverter((details, type) -> new RecomputeAllPreviewsTaskAdditionalInformationDTO(
+            .toDTOConverter((details, type) -> new RecomputeAllFastViewTaskAdditionalInformationDTO(
                 type,
                 details.timestamp(),
                 details.getProcessedUserCount(),
@@ -56,7 +56,7 @@ public class RecomputeAllPreviewsTaskAdditionalInformationDTO implements Additio
     private final long failedMessageCount;
 
     @VisibleForTesting
-    RecomputeAllPreviewsTaskAdditionalInformationDTO(@JsonProperty("type") String type,
+    RecomputeAllFastViewTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                      @JsonProperty("timestamp") Instant timestamp,
                                                      @JsonProperty("processedUserCount") long processedUserCount,
                                                      @JsonProperty("processedMessageCount") long processedMessageCount,
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTask.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTask.java
index 4f30958..d29435a 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTask.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTask.java
@@ -76,11 +76,11 @@ public class RecomputeUserFastViewProjectionItemsTask implements Task {
         }
     }
 
-    public static class RecomputeUserPreviewsTaskDTO implements TaskDTO {
+    public static class RecomputeUserFastViewTaskDTO implements TaskDTO {
         private final String type;
         private final String username;
 
-        public RecomputeUserPreviewsTaskDTO(
+        public RecomputeUserFastViewTaskDTO(
             @JsonProperty("type") String type,
             @JsonProperty("username") String username) {
             this.type = type;
@@ -97,12 +97,12 @@ public class RecomputeUserFastViewProjectionItemsTask implements Task {
         }
     }
 
-    public static TaskDTOModule<RecomputeUserFastViewProjectionItemsTask, RecomputeUserPreviewsTaskDTO> module(MessageFastViewProjectionCorrector corrector) {
+    public static TaskDTOModule<RecomputeUserFastViewProjectionItemsTask, RecomputeUserFastViewTaskDTO> module(MessageFastViewProjectionCorrector corrector) {
         return DTOModule
             .forDomainObject(RecomputeUserFastViewProjectionItemsTask.class)
-            .convertToDTO(RecomputeUserPreviewsTaskDTO.class)
+            .convertToDTO(RecomputeUserFastViewTaskDTO.class)
             .toDomainObjectConverter(dto -> new RecomputeUserFastViewProjectionItemsTask(corrector, Username.of(dto.username)))
-            .toDTOConverter((task, type) -> new RecomputeUserPreviewsTaskDTO(type, task.username.asString()))
+            .toDTOConverter((task, type) -> new RecomputeUserFastViewTaskDTO(type, task.username.asString()))
             .typeName(TASK_TYPE.asString())
             .withFactory(TaskDTOModule::new);
     }
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserPreviewsTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewTaskAdditionalInformationDTO.java
similarity index 92%
rename from server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserPreviewsTaskAdditionalInformationDTO.java
rename to server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewTaskAdditionalInformationDTO.java
index 030c09c..f048a70 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserPreviewsTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewTaskAdditionalInformationDTO.java
@@ -28,16 +28,16 @@ import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class RecomputeUserPreviewsTaskAdditionalInformationDTO implements AdditionalInformationDTO {
-    public static final AdditionalInformationDTOModule<RecomputeUserFastViewProjectionItemsTask.AdditionalInformation, RecomputeUserPreviewsTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
+public class RecomputeUserFastViewTaskAdditionalInformationDTO implements AdditionalInformationDTO {
+    public static final AdditionalInformationDTOModule<RecomputeUserFastViewProjectionItemsTask.AdditionalInformation, RecomputeUserFastViewTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
         DTOModule.forDomainObject(RecomputeUserFastViewProjectionItemsTask.AdditionalInformation.class)
-            .convertToDTO(RecomputeUserPreviewsTaskAdditionalInformationDTO.class)
+            .convertToDTO(RecomputeUserFastViewTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new RecomputeUserFastViewProjectionItemsTask.AdditionalInformation(
                 Username.of(dto.username),
                 dto.getProcessedMessageCount(),
                 dto.getFailedMessageCount(),
                 dto.timestamp))
-            .toDTOConverter((details, type) -> new RecomputeUserPreviewsTaskAdditionalInformationDTO(
+            .toDTOConverter((details, type) -> new RecomputeUserFastViewTaskAdditionalInformationDTO(
                 type,
                 details.timestamp(),
                 details.getUsername(),
@@ -52,7 +52,7 @@ public class RecomputeUserPreviewsTaskAdditionalInformationDTO implements Additi
     private final long processedMessageCount;
     private final long failedMessageCount;
 
-    private RecomputeUserPreviewsTaskAdditionalInformationDTO(@JsonProperty("type") String type,
+    private RecomputeUserFastViewTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                               @JsonProperty("timestamp") Instant timestamp,
                                                               @JsonProperty("username") String username,
                                                               @JsonProperty("processedMessageCount") long processedMessageCount,
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
index d1111bb..ad53227 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
@@ -31,7 +31,7 @@ class RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest {
 
     @Test
     void shouldMatchJsonSerializationContract() throws Exception {
-        JsonSerializationVerifier.dtoModule(RecomputeAllPreviewsTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+        JsonSerializationVerifier.dtoModule(RecomputeAllFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
             .bean(DOMAIN_OBJECT)
             .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeAll.additionalInformation.json"))
             .verify();
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
index 394d2b0..569b071 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
@@ -33,7 +33,7 @@ class RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest {
 
     @Test
     void shouldMatchJsonSerializationContract() throws Exception {
-        JsonSerializationVerifier.dtoModule(RecomputeUserPreviewsTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+        JsonSerializationVerifier.dtoModule(RecomputeUserFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
             .bean(DOMAIN_OBJECT)
             .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeUser.additionalInformation.json"))
             .verify();


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


[james-project] 12/16: [Refactor] Rename misleading method name

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 b1bc7d6c8e0552425ff734dc460ff0a1f76f0ed1
Author: Raphael Ouazana <ra...@linagora.com>
AuthorDate: Fri Dec 20 16:08:33 2019 +0100

    [Refactor] Rename misleading method name
---
 .../main/java/org/apache/james/modules/protocols/SmtpGuiceProbe.java  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/server/container/guice/protocols/smtp/src/main/java/org/apache/james/modules/protocols/SmtpGuiceProbe.java b/server/container/guice/protocols/smtp/src/main/java/org/apache/james/modules/protocols/SmtpGuiceProbe.java
index 178c23e..cb2f44a 100644
--- a/server/container/guice/protocols/smtp/src/main/java/org/apache/james/modules/protocols/SmtpGuiceProbe.java
+++ b/server/container/guice/protocols/smtp/src/main/java/org/apache/james/modules/protocols/SmtpGuiceProbe.java
@@ -34,7 +34,7 @@ public class SmtpGuiceProbe implements GuiceProbe {
 
     public enum SmtpServerConnectedType {
         SMTP_GLOBAL_SERVER(SmtpGuiceProbe::getSmtpPort),
-        SMTP_START_TLS_SERVER(SmtpGuiceProbe::getSmtpsPort);
+        SMTP_START_TLS_SERVER(SmtpGuiceProbe::getSmtpStartTlsPort);
 
         private final Function<SmtpGuiceProbe, Port> portExtractor;
 
@@ -58,7 +58,7 @@ public class SmtpGuiceProbe implements GuiceProbe {
         return getPort(server -> true);
     }
 
-    public Port getSmtpsPort() {
+    public Port getSmtpStartTlsPort() {
         return getPort(AbstractConfigurableAsyncServer::getStartTLSSupported);
     }
 


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


[james-project] 11/16: JAMES-2993 Using elastic scheduler in recomputing all

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 8c7a64f1e779c4279383f9405c9b269b70184016
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Tue Dec 24 10:47:03 2019 +0700

    JAMES-2993 Using elastic scheduler in recomputing all
---
 .../webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java
index 5a95d37..4ef9365 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java
@@ -117,7 +117,7 @@ public class RecomputeAllFastViewProjectionItemsTask implements Task {
     @Override
     public Result run() {
         corrector.correctAllProjectionItems(progress)
-            .subscribeOn(Schedulers.boundedElastic())
+            .subscribeOn(Schedulers.elastic())
             .block();
 
         if (progress.failed()) {


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


[james-project] 07/16: JAMES-2993 Task generator for recompute user JMAP fastView projection

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 910fae272fc56d24b91d40c4a9dbc4bd2eb70039
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Fri Jan 3 10:40:37 2020 +0700

    JAMES-2993 Task generator for recompute user JMAP fastView projection
    
    And test
---
 ...teUserFastViewProjectionItemsRequestToTask.java |  55 +++
 ...erFastViewProjectionItemsRequestToTaskTest.java | 418 +++++++++++++++++++++
 2 files changed, 473 insertions(+)

diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTask.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTask.java
new file mode 100644
index 0000000..c3a9f44
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTask.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.webadmin.data.jmap;
+
+import javax.inject.Inject;
+
+import org.apache.james.core.Username;
+import org.apache.james.task.Task;
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.api.UsersRepositoryException;
+import org.apache.james.webadmin.tasks.TaskFromRequestRegistry;
+import org.apache.james.webadmin.utils.ErrorResponder;
+import org.eclipse.jetty.http.HttpStatus;
+
+import spark.Request;
+
+public class RecomputeUserFastViewProjectionItemsRequestToTask extends TaskFromRequestRegistry.TaskRegistration {
+    @Inject
+    RecomputeUserFastViewProjectionItemsRequestToTask(MessageFastViewProjectionCorrector corrector,
+                                                      UsersRepository usersRepository) {
+
+        super(Constants.TASK_REGISTRATION_KEY,
+            request -> toTask(corrector, usersRepository, request));
+    }
+
+    private static Task toTask(MessageFastViewProjectionCorrector corrector, UsersRepository usersRepository, Request request) throws UsersRepositoryException {
+        Username username = Username.of(request.params("username"));
+        if (usersRepository.contains(username)) {
+            return new RecomputeUserFastViewProjectionItemsTask(corrector, username);
+        }
+
+        throw ErrorResponder.builder()
+            .type(ErrorResponder.ErrorType.NOT_FOUND)
+            .statusCode(HttpStatus.NOT_FOUND_404)
+            .message("User '" + username.asString() + "' does not exists")
+            .haltError();
+    }
+}
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTaskTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTaskTest.java
new file mode 100644
index 0000000..807d799
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTaskTest.java
@@ -0,0 +1,418 @@
+/****************************************************************
+ * 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.webadmin.data.jmap;
+
+import static io.restassured.RestAssured.given;
+import static io.restassured.RestAssured.when;
+import static io.restassured.RestAssured.with;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+import java.util.Optional;
+import java.util.stream.IntStream;
+
+import org.apache.james.core.Username;
+import org.apache.james.domainlist.api.DomainList;
+import org.apache.james.jmap.api.model.Preview;
+import org.apache.james.jmap.api.projections.MessageFastViewPrecomputedProperties;
+import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor;
+import org.apache.james.jmap.memory.projections.MemoryMessageFastViewProjection;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
+import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
+import org.apache.james.mailbox.model.ComposedMessageId;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.metrics.tests.RecordingMetricFactory;
+import org.apache.james.task.Hostname;
+import org.apache.james.task.MemoryTaskManager;
+import org.apache.james.task.TaskManager;
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.memory.MemoryUsersRepository;
+import org.apache.james.util.html.HtmlTextExtractor;
+import org.apache.james.util.mime.MessageContentExtractor;
+import org.apache.james.webadmin.Routes;
+import org.apache.james.webadmin.WebAdminServer;
+import org.apache.james.webadmin.WebAdminUtils;
+import org.apache.james.webadmin.routes.TasksRoutes;
+import org.apache.james.webadmin.tasks.TaskFromRequestRegistry;
+import org.apache.james.webadmin.utils.ErrorResponder;
+import org.apache.james.webadmin.utils.JsonTransformer;
+import org.eclipse.jetty.http.HttpStatus;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import com.github.fge.lambdas.Throwing;
+
+import io.restassured.RestAssured;
+import io.restassured.filter.log.LogDetail;
+import spark.Service;
+
+class RecomputeUserFastViewProjectionItemsRequestToTaskTest {
+    private final class JMAPRoutes implements Routes {
+        private final MessageFastViewProjectionCorrector corrector;
+        private final TaskManager taskManager;
+        private final UsersRepository usersRepository;
+
+        private JMAPRoutes(MessageFastViewProjectionCorrector corrector, TaskManager taskManager, UsersRepository usersRepository) {
+            this.corrector = corrector;
+            this.taskManager = taskManager;
+            this.usersRepository = usersRepository;
+        }
+
+        @Override
+        public String getBasePath() {
+            return BASE_PATH;
+        }
+
+        @Override
+        public void define(Service service) {
+            service.post(BASE_PATH,
+                TaskFromRequestRegistry.builder()
+                    .registrations(new RecomputeUserFastViewProjectionItemsRequestToTask(corrector, usersRepository))
+                    .buildAsRoute(taskManager),
+                new JsonTransformer());
+        }
+    }
+
+    static final String BASE_PATH = "/:username/mailboxes";
+
+
+    static final MessageFastViewPrecomputedProperties PROJECTION_ITEM = MessageFastViewPrecomputedProperties.builder()
+        .preview(Preview.from("body"))
+        .hasAttachment(false)
+        .build();
+
+    static final DomainList NO_DOMAIN_LIST = null;
+    static final Username BOB = Username.of("bob");
+    static final Username CEDRIC = Username.of("cedric");
+
+    private WebAdminServer webAdminServer;
+    private MemoryTaskManager taskManager;
+    private MemoryMessageFastViewProjection messageFastViewProjection;
+    private InMemoryMailboxManager mailboxManager;
+    private MemoryUsersRepository usersRepository;
+    private MailboxId bobInboxboxId;
+    private MailboxSession bobSession;
+
+    @BeforeEach
+    void setUp() throws Exception {
+        JsonTransformer jsonTransformer = new JsonTransformer();
+        taskManager = new MemoryTaskManager(new Hostname("foo"));
+
+        messageFastViewProjection = new MemoryMessageFastViewProjection(new RecordingMetricFactory());
+        mailboxManager = InMemoryIntegrationResources.defaultResources().getMailboxManager();
+        usersRepository = MemoryUsersRepository.withoutVirtualHosting(NO_DOMAIN_LIST);
+        usersRepository.addUser(BOB, "pass");
+        bobSession = mailboxManager.createSystemSession(BOB);
+        bobInboxboxId = mailboxManager.createMailbox(MailboxPath.inbox(BOB), bobSession)
+            .get();
+
+        MessageContentExtractor messageContentExtractor = new MessageContentExtractor();
+        HtmlTextExtractor htmlTextExtractor = new JsoupHtmlTextExtractor();
+        Preview.Factory previewFactory = new Preview.Factory(messageContentExtractor, htmlTextExtractor);
+        MessageFastViewPrecomputedProperties.Factory projectionItemFactory = new MessageFastViewPrecomputedProperties.Factory(previewFactory);
+        webAdminServer = WebAdminUtils.createWebAdminServer(
+            new TasksRoutes(taskManager, jsonTransformer),
+            new JMAPRoutes(
+                new MessageFastViewProjectionCorrector(usersRepository, mailboxManager, messageFastViewProjection, projectionItemFactory),
+                taskManager, usersRepository))
+            .start();
+
+        RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer)
+            .setBasePath("/bob/mailboxes")
+            .log(LogDetail.URI)
+            .build();
+    }
+
+    @AfterEach
+    void afterEach() {
+        webAdminServer.destroy();
+        taskManager.stop();
+    }
+
+    @Test
+    void actionRequestParameterShouldBeCompulsory() {
+        when()
+            .post()
+        .then()
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .body("statusCode", is(400))
+            .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+            .body("message", is("Invalid arguments supplied in the user request"))
+            .body("details", is("'action' query parameter is compulsory. Supported values are [recomputeFastViewProjectionItems]"));
+    }
+
+    @Test
+    void postShouldFailUponEmptyAction() {
+        given()
+            .queryParam("action", "")
+            .post()
+        .then()
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .body("statusCode", is(400))
+            .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+            .body("message", is("Invalid arguments supplied in the user request"))
+            .body("details", is("'action' query parameter cannot be empty or blank. Supported values are [recomputeFastViewProjectionItems]"));
+    }
+
+    @Test
+    void postShouldFailUponInvalidAction() {
+        given()
+            .queryParam("action", "invalid")
+            .post()
+        .then()
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .body("statusCode", is(400))
+            .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+            .body("message", is("Invalid arguments supplied in the user request"))
+            .body("details", is("Invalid value supplied for query parameter 'action': invalid. Supported values are [recomputeFastViewProjectionItems]"));
+    }
+
+    @Test
+    void postShouldFailUponBadUsername() {
+        given()
+            .basePath("/bad@bad@bad/mailboxes")
+            .queryParam("action", "recomputeFastViewProjectionItems")
+            .post()
+        .then()
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .body("statusCode", is(400))
+            .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+            .body("message", is("Invalid arguments supplied in the user request"))
+            .body("details", is("The username should not contain multiple domain delimiter."));
+    }
+
+    @Test
+    void recomputeUserShouldFailUponUnknownUser() {
+        given()
+            .basePath("/notFound/mailboxes")
+            .queryParam("action", "recomputeFastViewProjectionItems")
+            .post()
+        .then()
+            .statusCode(HttpStatus.NOT_FOUND_404)
+            .body("statusCode", is(404))
+            .body("type", is(ErrorResponder.ErrorType.NOT_FOUND.getType()))
+            .body("message", is("User 'notfound' does not exists"));
+    }
+
+    @Test
+    void postShouldCreateANewTask() throws Exception {
+        given()
+            .queryParam("action", "recomputeFastViewProjectionItems")
+            .post()
+        .then()
+            .statusCode(HttpStatus.CREATED_201)
+            .body("taskId", notNullValue());
+    }
+
+    @Test
+    void recomputeUserShouldCompleteWhenUserWithNoMailbox() throws Exception {
+        String taskId = with()
+            .queryParam("action", "recomputeFastViewProjectionItems")
+            .post()
+            .jsonPath()
+            .get("taskId");
+
+        given()
+            .basePath(TasksRoutes.BASE)
+        .when()
+            .get(taskId + "/await")
+        .then()
+            .body("status", is("completed"))
+            .body("taskId", is(taskId))
+            .body("type", is("RecomputeUserFastViewProjectionItemsTask"))
+            .body("additionalInformation.username", is(BOB.asString()))
+            .body("additionalInformation.processedMessageCount", is(0))
+            .body("additionalInformation.failedMessageCount", is(0))
+            .body("startedDate", is(notNullValue()))
+            .body("submitDate", is(notNullValue()))
+            .body("completedDate", is(notNullValue()));
+    }
+
+    @Test
+    void recomputeUserShouldCompleteWhenUserWithNoMessage() throws Exception {
+        String taskId = with()
+            .queryParam("action", "recomputeFastViewProjectionItems")
+            .post()
+            .jsonPath()
+            .get("taskId");
+
+        given()
+            .basePath(TasksRoutes.BASE)
+        .when()
+            .get(taskId + "/await")
+        .then()
+            .body("status", is("completed"))
+            .body("taskId", is(taskId))
+            .body("type", is("RecomputeUserFastViewProjectionItemsTask"))
+            .body("additionalInformation.username", is(BOB.asString()))
+            .body("additionalInformation.processedMessageCount", is(0))
+            .body("additionalInformation.failedMessageCount", is(0))
+            .body("startedDate", is(notNullValue()))
+            .body("submitDate", is(notNullValue()))
+            .body("completedDate", is(notNullValue()));
+    }
+
+    @Test
+    void recomputeUserShouldCompleteWhenOneMessage() throws Exception {
+        mailboxManager.getMailbox(bobInboxboxId, bobSession).appendMessage(
+            MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"),
+            bobSession);
+
+        String taskId = with()
+            .queryParam("action", "recomputeFastViewProjectionItems")
+            .post()
+            .jsonPath()
+            .get("taskId");
+
+        given()
+            .basePath(TasksRoutes.BASE)
+        .when()
+            .get(taskId + "/await")
+        .then()
+            .body("status", is("completed"))
+            .body("taskId", is(taskId))
+            .body("type", is("RecomputeUserFastViewProjectionItemsTask"))
+            .body("additionalInformation.username", is(BOB.asString()))
+            .body("additionalInformation.processedMessageCount", is(1))
+            .body("additionalInformation.failedMessageCount", is(0))
+            .body("startedDate", is(notNullValue()))
+            .body("submitDate", is(notNullValue()))
+            .body("completedDate", is(notNullValue()));
+    }
+
+    @Test
+    void recomputeUserShouldCompleteWhenManyMessages() throws Exception {
+        int totalMessages = 5;
+        IntStream.rangeClosed(1, totalMessages)
+            .forEach(Throwing.intConsumer(ignored ->
+                mailboxManager.getMailbox(bobInboxboxId, bobSession).appendMessage(
+                    MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"),
+                    bobSession)));
+
+        String taskId = with()
+            .queryParam("action", "recomputeFastViewProjectionItems")
+            .post()
+            .jsonPath()
+            .get("taskId");
+
+        given()
+            .basePath(TasksRoutes.BASE)
+        .when()
+            .get(taskId + "/await")
+        .then()
+            .body("status", is("completed"))
+            .body("taskId", is(taskId))
+            .body("type", is("RecomputeUserFastViewProjectionItemsTask"))
+            .body("additionalInformation.username", is(BOB.asString()))
+            .body("additionalInformation.processedMessageCount", is(totalMessages))
+            .body("additionalInformation.failedMessageCount", is(0))
+            .body("startedDate", is(notNullValue()))
+            .body("submitDate", is(notNullValue()))
+            .body("completedDate", is(notNullValue()));
+    }
+
+    @Test
+    void recomputeUserShouldBeUserBound() throws Exception {
+        mailboxManager.getMailbox(bobInboxboxId, bobSession).appendMessage(
+            MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"),
+            bobSession);
+
+        usersRepository.addUser(CEDRIC, "pass");
+        MailboxSession cedricSession = mailboxManager.createSystemSession(CEDRIC);
+        Optional<MailboxId> mailboxIdCedric = mailboxManager.createMailbox(MailboxPath.inbox(CEDRIC), cedricSession);
+        mailboxManager.getMailbox(mailboxIdCedric.get(), cedricSession).appendMessage(
+            MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"),
+            cedricSession);
+
+        String taskId = with()
+            .queryParam("action", "recomputeFastViewProjectionItems")
+        .post()
+            .jsonPath()
+            .get("taskId");
+
+        given()
+            .basePath(TasksRoutes.BASE)
+        .when()
+            .get(taskId + "/await")
+        .then()
+            .body("status", is("completed"))
+            .body("taskId", is(taskId))
+            .body("type", is("RecomputeUserFastViewProjectionItemsTask"))
+            .body("additionalInformation.username", is(BOB.asString()))
+            .body("additionalInformation.processedMessageCount", is(1))
+            .body("additionalInformation.failedMessageCount", is(0))
+            .body("startedDate", is(notNullValue()))
+            .body("submitDate", is(notNullValue()))
+            .body("completedDate", is(notNullValue()));
+    }
+
+    @Test
+    void recomputeUserShouldUpdateProjection() throws Exception {
+        ComposedMessageId messageId = mailboxManager.getMailbox(bobInboxboxId, bobSession).appendMessage(
+            MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"),
+            bobSession);
+
+        String taskId = with()
+            .queryParam("action", "recomputeFastViewProjectionItems")
+            .post()
+            .jsonPath()
+            .get("taskId");
+
+        with()
+            .basePath(TasksRoutes.BASE)
+            .get(taskId + "/await");
+
+        assertThat(messageFastViewProjection.retrieve(messageId.getMessageId()).block())
+            .isEqualTo(PROJECTION_ITEM);
+    }
+
+    @Test
+    void recomputeUserShouldBeIdempotent() throws Exception {
+        ComposedMessageId messageId = mailboxManager.getMailbox(bobInboxboxId, bobSession).appendMessage(
+            MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"),
+            bobSession);
+
+        String taskId1 = with()
+            .queryParam("action", "recomputeFastViewProjectionItems")
+            .post()
+            .jsonPath()
+            .get("taskId");
+        with()
+            .basePath(TasksRoutes.BASE)
+            .get(taskId1 + "/await");
+
+        String taskId2 = with()
+            .queryParam("action", "recomputeFastViewProjectionItems")
+            .post()
+            .jsonPath()
+            .get("taskId");
+        with()
+            .basePath(TasksRoutes.BASE)
+            .get(taskId2 + "/await");
+
+        assertThat(messageFastViewProjection.retrieve(messageId.getMessageId()).block())
+            .isEqualTo(PROJECTION_ITEM);
+    }
+}
\ 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


[james-project] 08/16: JAMES-2993 Guice bindings for recompute user JMAP fastView projection

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 9dc53ad873cff0390aff57b7a049e749014d0e4b
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Fri Jan 3 10:44:09 2020 +0700

    JAMES-2993 Guice bindings for recompute user JMAP fastView projection
---
 .../org/apache/james/modules/TaskSerializationModule.java    | 12 ++++++++++++
 .../org/apache/james/modules/server/JmapTasksModule.java     |  6 ++++++
 2 files changed, 18 insertions(+)

diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java
index 6bf92c3..2757813 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java
@@ -55,6 +55,8 @@ import org.apache.james.vault.blob.BlobStoreVaultGarbageCollectionTaskDTO;
 import org.apache.james.webadmin.data.jmap.MessageFastViewProjectionCorrector;
 import org.apache.james.webadmin.data.jmap.RecomputeAllFastViewProjectionItemsTask;
 import org.apache.james.webadmin.data.jmap.RecomputeAllPreviewsTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.data.jmap.RecomputeUserFastViewProjectionItemsTask;
+import org.apache.james.webadmin.data.jmap.RecomputeUserPreviewsTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.CassandraMappingsSolveInconsistenciesTask;
 import org.apache.james.webadmin.service.ClearMailQueueTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.ClearMailQueueTaskDTO;
@@ -182,6 +184,11 @@ public class TaskSerializationModule extends AbstractModule {
     }
 
     @ProvidesIntoSet
+    public TaskDTOModule<?, ?> recomputeUserJmapPreviewsTask(MessageFastViewProjectionCorrector corrector) {
+        return RecomputeUserFastViewProjectionItemsTask.module(corrector);
+    }
+
+    @ProvidesIntoSet
     public TaskDTOModule<?, ?> clearMailRepositoryTask(ClearMailRepositoryTask.Factory factory) {
         return ClearMailRepositoryTaskDTO.module(factory);
     }
@@ -381,6 +388,11 @@ public class TaskSerializationModule extends AbstractModule {
         return RecomputeAllPreviewsTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
     }
 
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<?, ?> recomputeUserJmapPreviewsAdditionalInformation() {
+        return RecomputeUserPreviewsTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
+
     @Named(EVENT_NESTED_TYPES_INJECTION_NAME)
     @Provides
     public Set<DTOModule<?, ?>> eventNestedTypes(Set<AdditionalInformationDTOModule<?, ?>> additionalInformationDTOModules,
diff --git a/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTasksModule.java b/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTasksModule.java
index 9db7450..5b6931e 100644
--- a/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTasksModule.java
+++ b/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTasksModule.java
@@ -20,7 +20,9 @@
 package org.apache.james.modules.server;
 
 import org.apache.james.webadmin.data.jmap.RecomputeAllFastViewProjectionItemsRequestToTask;
+import org.apache.james.webadmin.data.jmap.RecomputeUserFastViewProjectionItemsRequestToTask;
 import org.apache.james.webadmin.routes.MailboxesRoutes;
+import org.apache.james.webadmin.routes.UserMailboxesRoutes;
 import org.apache.james.webadmin.tasks.TaskFromRequestRegistry;
 
 import com.google.inject.AbstractModule;
@@ -32,5 +34,9 @@ public class JmapTasksModule extends AbstractModule {
     protected void configure() {
         Multibinder.newSetBinder(binder(), TaskFromRequestRegistry.TaskRegistration.class, Names.named(MailboxesRoutes.ALL_MAILBOXES_TASKS))
             .addBinding().to(RecomputeAllFastViewProjectionItemsRequestToTask.class);
+
+        Multibinder.newSetBinder(binder(), TaskFromRequestRegistry.TaskRegistration.class, Names.named(UserMailboxesRoutes.USER_MAILBOXES_OPERATIONS_INJECTION_KEY))
+            .addBinding().to(RecomputeUserFastViewProjectionItemsRequestToTask.class);
+
     }
 }


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


[james-project] 05/16: JAMES-2993 Fixing typo

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 f59f30347277d24c8e752ced430aac982e455143
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Fri Jan 3 09:56:33 2020 +0700

    JAMES-2993 Fixing typo
---
 .../data/jmap/RecomputeAllFastViewProjectionItemsTask.java     | 10 +++++-----
 .../RecomputeAllFastViewProjectionItemsRequestToTaskTest.java  | 10 +++++-----
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java
index 88f4a64..9d3db13 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java
@@ -83,10 +83,10 @@ public class RecomputeAllFastViewProjectionItemsTask implements Task {
         }
     }
 
-    public static class RecomputeAllPreviousTaskDTO implements TaskDTO {
+    public static class RecomputeAllPreviewsTaskDTO implements TaskDTO {
         private final String type;
 
-        public RecomputeAllPreviousTaskDTO(@JsonProperty("type") String type) {
+        public RecomputeAllPreviewsTaskDTO(@JsonProperty("type") String type) {
             this.type = type;
         }
 
@@ -96,12 +96,12 @@ public class RecomputeAllFastViewProjectionItemsTask implements Task {
         }
     }
 
-    public static TaskDTOModule<RecomputeAllFastViewProjectionItemsTask, RecomputeAllPreviousTaskDTO> module(MessageFastViewProjectionCorrector corrector) {
+    public static TaskDTOModule<RecomputeAllFastViewProjectionItemsTask, RecomputeAllPreviewsTaskDTO> module(MessageFastViewProjectionCorrector corrector) {
         return DTOModule
             .forDomainObject(RecomputeAllFastViewProjectionItemsTask.class)
-            .convertToDTO(RecomputeAllPreviousTaskDTO.class)
+            .convertToDTO(RecomputeAllPreviewsTaskDTO.class)
             .toDomainObjectConverter(dto -> new RecomputeAllFastViewProjectionItemsTask(corrector))
-            .toDTOConverter((task, type) -> new RecomputeAllPreviousTaskDTO(type))
+            .toDTOConverter((task, type) -> new RecomputeAllPreviewsTaskDTO(type))
             .typeName(TASK_TYPE.asString())
             .withFactory(TaskDTOModule::new);
     }
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java
index 1013e63..ef1e5e6 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java
@@ -211,7 +211,7 @@ class RecomputeAllFastViewProjectionItemsRequestToTaskTest {
     }
 
     @Test
-    void recomputeAllShouldCompleteWhenUserWithNoMailbox()throws Exception {
+    void recomputeAllShouldCompleteWhenUserWithNoMailbox() throws Exception {
         usersRepository.addUser(BOB, "pass");
 
         String taskId = with()
@@ -238,7 +238,7 @@ class RecomputeAllFastViewProjectionItemsRequestToTaskTest {
     }
 
     @Test
-    void recomputeAllShouldCompleteWhenUserWithNoMessage()throws Exception {
+    void recomputeAllShouldCompleteWhenUserWithNoMessage() throws Exception {
         usersRepository.addUser(BOB, "pass");
         mailboxManager.createMailbox(MailboxPath.inbox(BOB), mailboxManager.createSystemSession(BOB));
 
@@ -266,7 +266,7 @@ class RecomputeAllFastViewProjectionItemsRequestToTaskTest {
     }
 
     @Test
-    void recomputeAllShouldCompleteWhenOneMessage()throws Exception {
+    void recomputeAllShouldCompleteWhenOneMessage() throws Exception {
         usersRepository.addUser(BOB, "pass");
         MailboxSession session = mailboxManager.createSystemSession(BOB);
         Optional<MailboxId> mailboxId = mailboxManager.createMailbox(MailboxPath.inbox(BOB), session);
@@ -298,7 +298,7 @@ class RecomputeAllFastViewProjectionItemsRequestToTaskTest {
     }
 
     @Test
-    void recomputeAllShouldUpdateProjection()throws Exception {
+    void recomputeAllShouldUpdateProjection() throws Exception {
         usersRepository.addUser(BOB, "pass");
         MailboxSession session = mailboxManager.createSystemSession(BOB);
         Optional<MailboxId> mailboxId = mailboxManager.createMailbox(MailboxPath.inbox(BOB), session);
@@ -321,7 +321,7 @@ class RecomputeAllFastViewProjectionItemsRequestToTaskTest {
     }
 
     @Test
-    void recomputeAllShouldBeIdempotent()throws Exception {
+    void recomputeAllShouldBeIdempotent() throws Exception {
         usersRepository.addUser(BOB, "pass");
         MailboxSession session = mailboxManager.createSystemSession(BOB);
         Optional<MailboxId> mailboxId = mailboxManager.createMailbox(MailboxPath.inbox(BOB), session);


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


[james-project] 06/16: JAMES-2993 Task DTO & serialization test for user preview recomputation

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 a150fdb2d07e40cc177b6c4115a7c751238a2b16
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Fri Jan 3 10:16:10 2020 +0700

    JAMES-2993 Task DTO & serialization test for user preview recomputation
---
 .../jmap/MessageFastViewProjectionCorrector.java   |   2 +-
 .../RecomputeUserFastViewProjectionItemsTask.java  | 141 +++++++++++++++++++++
 ...teUserPreviewsTaskAdditionalInformationDTO.java |  88 +++++++++++++
 ...ctionItemsTaskAdditionalInformationDTOTest.java |  41 ++++++
 ...stViewProjectionItemsTaskSerializationTest.java |  45 +++++++
 .../json/recomputeUser.additionalInformation.json  |   7 +
 .../test/resources/json/recomputeUser.task.json    |   4 +
 7 files changed, 327 insertions(+), 1 deletion(-)

diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java
index 0eb7f08..53a9c21 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java
@@ -112,7 +112,7 @@ public class MessageFastViewProjectionCorrector {
         }
     }
 
-    private Mono<Void> correctUsersProjectionItems(Progress progress, Username username) {
+    Mono<Void> correctUsersProjectionItems(Progress progress, Username username) {
         try {
             MailboxSession session = mailboxManager.createSystemSession(username);
             return listUsersMailboxes(session)
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTask.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTask.java
new file mode 100644
index 0000000..4f30958
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTask.java
@@ -0,0 +1,141 @@
+/****************************************************************
+ * 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.webadmin.data.jmap;
+
+import java.time.Clock;
+import java.time.Instant;
+import java.util.Optional;
+
+import org.apache.james.core.Username;
+import org.apache.james.json.DTOModule;
+import org.apache.james.server.task.json.dto.TaskDTO;
+import org.apache.james.server.task.json.dto.TaskDTOModule;
+import org.apache.james.task.Task;
+import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.task.TaskType;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import reactor.core.scheduler.Schedulers;
+
+public class RecomputeUserFastViewProjectionItemsTask implements Task {
+    static final TaskType TASK_TYPE = TaskType.of("RecomputeUserFastViewProjectionItemsTask");
+
+    public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
+        private static AdditionalInformation from(MessageFastViewProjectionCorrector.Progress progress, Username username) {
+            return new AdditionalInformation(username,
+                progress.getProcessedMessageCount(),
+                progress.getFailedMessageCount(),
+                Clock.systemUTC().instant());
+        }
+
+        private final Username username;
+        private final long processedMessageCount;
+        private final long failedMessageCount;
+        private final Instant timestamp;
+
+        public AdditionalInformation(Username username, long processedMessageCount, long failedMessageCount, Instant timestamp) {
+            this.username = username;
+            this.processedMessageCount = processedMessageCount;
+            this.failedMessageCount = failedMessageCount;
+            this.timestamp = timestamp;
+        }
+
+        public long getProcessedMessageCount() {
+            return processedMessageCount;
+        }
+
+        public long getFailedMessageCount() {
+            return failedMessageCount;
+        }
+
+        public String getUsername() {
+            return username.asString();
+        }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
+    }
+
+    public static class RecomputeUserPreviewsTaskDTO implements TaskDTO {
+        private final String type;
+        private final String username;
+
+        public RecomputeUserPreviewsTaskDTO(
+            @JsonProperty("type") String type,
+            @JsonProperty("username") String username) {
+            this.type = type;
+            this.username = username;
+        }
+
+        @Override
+        public String getType() {
+            return type;
+        }
+
+        public String getUsername() {
+            return username;
+        }
+    }
+
+    public static TaskDTOModule<RecomputeUserFastViewProjectionItemsTask, RecomputeUserPreviewsTaskDTO> module(MessageFastViewProjectionCorrector corrector) {
+        return DTOModule
+            .forDomainObject(RecomputeUserFastViewProjectionItemsTask.class)
+            .convertToDTO(RecomputeUserPreviewsTaskDTO.class)
+            .toDomainObjectConverter(dto -> new RecomputeUserFastViewProjectionItemsTask(corrector, Username.of(dto.username)))
+            .toDTOConverter((task, type) -> new RecomputeUserPreviewsTaskDTO(type, task.username.asString()))
+            .typeName(TASK_TYPE.asString())
+            .withFactory(TaskDTOModule::new);
+    }
+
+    private final MessageFastViewProjectionCorrector corrector;
+    private final MessageFastViewProjectionCorrector.Progress progress;
+    private final Username username;
+
+    RecomputeUserFastViewProjectionItemsTask(MessageFastViewProjectionCorrector corrector, Username username) {
+        this.corrector = corrector;
+        this.username = username;
+        this.progress = new MessageFastViewProjectionCorrector.Progress();
+    }
+
+    @Override
+    public Result run() {
+        corrector.correctUsersProjectionItems(progress, username)
+            .subscribeOn(Schedulers.elastic())
+            .block();
+
+        if (progress.failed()) {
+            return Result.PARTIAL;
+        }
+        return Result.COMPLETED;
+    }
+
+    @Override
+    public TaskType type() {
+        return TASK_TYPE;
+    }
+
+    @Override
+    public Optional<TaskExecutionDetails.AdditionalInformation> details() {
+        return Optional.of(AdditionalInformation.from(progress, username));
+    }
+}
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserPreviewsTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserPreviewsTaskAdditionalInformationDTO.java
new file mode 100644
index 0000000..030c09c
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserPreviewsTaskAdditionalInformationDTO.java
@@ -0,0 +1,88 @@
+/****************************************************************
+ * 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.webadmin.data.jmap;
+
+import java.time.Instant;
+
+import org.apache.james.core.Username;
+import org.apache.james.json.DTOModule;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class RecomputeUserPreviewsTaskAdditionalInformationDTO implements AdditionalInformationDTO {
+    public static final AdditionalInformationDTOModule<RecomputeUserFastViewProjectionItemsTask.AdditionalInformation, RecomputeUserPreviewsTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
+        DTOModule.forDomainObject(RecomputeUserFastViewProjectionItemsTask.AdditionalInformation.class)
+            .convertToDTO(RecomputeUserPreviewsTaskAdditionalInformationDTO.class)
+            .toDomainObjectConverter(dto -> new RecomputeUserFastViewProjectionItemsTask.AdditionalInformation(
+                Username.of(dto.username),
+                dto.getProcessedMessageCount(),
+                dto.getFailedMessageCount(),
+                dto.timestamp))
+            .toDTOConverter((details, type) -> new RecomputeUserPreviewsTaskAdditionalInformationDTO(
+                type,
+                details.timestamp(),
+                details.getUsername(),
+                details.getProcessedMessageCount(),
+                details.getFailedMessageCount()))
+            .typeName(RecomputeUserFastViewProjectionItemsTask.TASK_TYPE.asString())
+            .withFactory(AdditionalInformationDTOModule::new);
+
+    private final String type;
+    private final Instant timestamp;
+    private final String username;
+    private final long processedMessageCount;
+    private final long failedMessageCount;
+
+    private RecomputeUserPreviewsTaskAdditionalInformationDTO(@JsonProperty("type") String type,
+                                                              @JsonProperty("timestamp") Instant timestamp,
+                                                              @JsonProperty("username") String username,
+                                                              @JsonProperty("processedMessageCount") long processedMessageCount,
+                                                              @JsonProperty("failedMessageCount") long failedMessageCount) {
+        this.type = type;
+        this.timestamp = timestamp;
+        this.username = username;
+        this.processedMessageCount = processedMessageCount;
+        this.failedMessageCount = failedMessageCount;
+    }
+
+    @Override
+    public String getType() {
+        return type;
+    }
+
+    @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    public long getProcessedMessageCount() {
+        return processedMessageCount;
+    }
+
+    public long getFailedMessageCount() {
+        return failedMessageCount;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+}
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
new file mode 100644
index 0000000..394d2b0
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
@@ -0,0 +1,41 @@
+/****************************************************************
+ * 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.webadmin.data.jmap;
+
+import java.time.Instant;
+
+import org.apache.james.JsonSerializationVerifier;
+import org.apache.james.core.Username;
+import org.apache.james.util.ClassLoaderUtils;
+import org.junit.jupiter.api.Test;
+
+class RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest {
+    private static final Instant INSTANT = Instant.parse("2007-12-03T10:15:30.00Z");
+    private static final RecomputeUserFastViewProjectionItemsTask.AdditionalInformation DOMAIN_OBJECT = new RecomputeUserFastViewProjectionItemsTask.AdditionalInformation(
+        Username.of("bob"), 2, 3, INSTANT);
+
+    @Test
+    void shouldMatchJsonSerializationContract() throws Exception {
+        JsonSerializationVerifier.dtoModule(RecomputeUserPreviewsTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+            .bean(DOMAIN_OBJECT)
+            .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeUser.additionalInformation.json"))
+            .verify();
+    }
+}
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskSerializationTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskSerializationTest.java
new file mode 100644
index 0000000..2d7d75d
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskSerializationTest.java
@@ -0,0 +1,45 @@
+/****************************************************************
+ * 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.webadmin.data.jmap;
+
+import static org.mockito.Mockito.mock;
+
+import org.apache.james.JsonSerializationVerifier;
+import org.apache.james.core.Username;
+import org.apache.james.util.ClassLoaderUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+class RecomputeUserFastViewProjectionItemsTaskSerializationTest {
+    MessageFastViewProjectionCorrector corrector;
+
+    @BeforeEach
+    void setUp() {
+        corrector = mock(MessageFastViewProjectionCorrector.class);
+    }
+
+    @Test
+    void shouldMatchJsonSerializationContract() throws Exception {
+        JsonSerializationVerifier.dtoModule(RecomputeUserFastViewProjectionItemsTask.module(corrector))
+            .bean(new RecomputeUserFastViewProjectionItemsTask(corrector, Username.of("bob")))
+            .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeUser.task.json"))
+            .verify();
+    }
+}
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.additionalInformation.json b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.additionalInformation.json
new file mode 100644
index 0000000..7e24f49
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.additionalInformation.json
@@ -0,0 +1,7 @@
+{
+  "type":"RecomputeUserFastViewProjectionItemsTask",
+  "timestamp":"2007-12-03T10:15:30Z",
+  "username": "bob",
+  "processedMessageCount":2,
+  "failedMessageCount":3
+}
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.task.json b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.task.json
new file mode 100644
index 0000000..fcd7712
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.task.json
@@ -0,0 +1,4 @@
+{
+  "type":"RecomputeUserFastViewProjectionItemsTask",
+  "username": "bob"
+}
\ 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


[james-project] 15/16: JAMES-3014 Integration test with distributed James

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 d3db62d5bb9a2d3719ae3b298722a9bc2dc55dca
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Wed Dec 18 17:02:52 2019 +0700

    JAMES-3014 Integration test with distributed James
---
 ...stViewProjectionHealthCheckIntegrationTest.java | 40 ++++++++++++++++++++++
 ...stViewProjectionHealthCheckIntegrationTest.java | 36 +++++--------------
 2 files changed, 48 insertions(+), 28 deletions(-)

diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java
new file mode 100644
index 0000000..8b603e0
--- /dev/null
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java
@@ -0,0 +1,40 @@
+/****************************************************************
+ * 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.webadmin.integration.rabbitmq;
+
+import org.apache.james.CassandraRabbitMQAwsS3JmapTestRule;
+import org.apache.james.DockerCassandraRule;
+import org.apache.james.GuiceJamesServer;
+import org.apache.james.webadmin.integration.FastViewProjectionHealthCheckIntegrationTest;
+import org.junit.Rule;
+
+public class RabbitMQFastViewProjectionHealthCheckIntegrationTest extends FastViewProjectionHealthCheckIntegrationTest {
+
+    @Rule
+    public DockerCassandraRule cassandra = new DockerCassandraRule();
+
+    @Rule
+    public CassandraRabbitMQAwsS3JmapTestRule jamesTestRule = CassandraRabbitMQAwsS3JmapTestRule.defaultTestRule();
+
+    @Override
+    public GuiceJamesServer createJamesServer() throws Exception {
+        return jamesTestRule.jmapServer(cassandra.getModule());
+    }
+}
diff --git a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/FastViewProjectionHealthCheckIntegrationTest.java b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/FastViewProjectionHealthCheckIntegrationTest.java
index da228bf..15465bf 100644
--- a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/FastViewProjectionHealthCheckIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/FastViewProjectionHealthCheckIntegrationTest.java
@@ -108,27 +108,10 @@ public abstract class FastViewProjectionHealthCheckIntegrationTest {
     }
 
     @Test
-    public void checkShouldReturnHealthyAfterSendingMessagesWithoutReading() {
-        IntStream.rangeClosed(1, 5)
-            .forEach(counter -> bobSendAMessageToAlice());
-        calmlyAwait.until(() -> listMessageIdsForAccount(aliceAccessToken).size() == 5);
-
-        webAdminApi.when()
-            .get("/healthcheck/checks/" + MESSAGE_FAST_VIEW_PROJECTION)
-        .then()
-            .statusCode(HttpStatus.OK_200)
-            .body("componentName", equalTo(MESSAGE_FAST_VIEW_PROJECTION))
-            .body("escapedComponentName", equalTo(MESSAGE_FAST_VIEW_PROJECTION))
-            .body("status", equalTo(ResultStatus.HEALTHY.getValue()));
-    }
-
-    @Test
     public void checkShouldReturnHealthyAfterSendingAMessageWithReads() {
         bobSendAMessageToAlice();
-        calmlyAwait.untilAsserted(() -> assertThat(listMessageIdsForAccount(aliceAccessToken))
-            .hasSize(1));
 
-        IntStream.rangeClosed(1, 5)
+        IntStream.rangeClosed(1, 20)
             .forEach(counter -> aliceReadLastMessage());
 
         webAdminApi.when()
@@ -143,8 +126,7 @@ public abstract class FastViewProjectionHealthCheckIntegrationTest {
     @Test
     public void checkShouldReturnDegradedAfterFewReadsOnAMissedProjection() {
         bobSendAMessageToAlice();
-        calmlyAwait.untilAsserted(() -> assertThat(listMessageIdsForAccount(aliceAccessToken))
-            .hasSize(1));
+
         guiceJamesServer.getProbe(JmapGuiceProbe.class)
             .clearMessageFastViewProjection();
 
@@ -157,8 +139,7 @@ public abstract class FastViewProjectionHealthCheckIntegrationTest {
             .statusCode(HttpStatus.OK_200)
             .body("componentName", equalTo(MESSAGE_FAST_VIEW_PROJECTION))
             .body("escapedComponentName", equalTo(MESSAGE_FAST_VIEW_PROJECTION))
-            .body("status", equalTo(ResultStatus.DEGRADED.getValue()))
-            .body("cause", equalTo("retrieveMissCount percentage 25.0% (1/4) is higher than the threshold 10.0%"));
+            .body("status", equalTo(ResultStatus.DEGRADED.getValue()));
     }
 
     @Test
@@ -168,7 +149,7 @@ public abstract class FastViewProjectionHealthCheckIntegrationTest {
             .hasSize(1));
         makeHealthCheckDegraded();
 
-        IntStream.rangeClosed(1, 10)
+        IntStream.rangeClosed(1, 100)
             .forEach(counter -> aliceReadLastMessage());
 
         webAdminApi.when()
@@ -184,11 +165,6 @@ public abstract class FastViewProjectionHealthCheckIntegrationTest {
         guiceJamesServer.getProbe(JmapGuiceProbe.class)
             .clearMessageFastViewProjection();
         aliceReadLastMessage();
-
-        webAdminApi.when()
-            .get("/healthcheck/checks/" + MESSAGE_FAST_VIEW_PROJECTION)
-        .then()
-            .body("status", equalTo(ResultStatus.DEGRADED.getValue()));
     }
 
     private void bobSendAMessageToAlice() {
@@ -218,6 +194,10 @@ public abstract class FastViewProjectionHealthCheckIntegrationTest {
             .extract()
             .body()
             .path(ARGUMENTS + ".created." + messageCreationId + ".id");
+
+
+        calmlyAwait.untilAsserted(() -> assertThat(listMessageIdsForAccount(aliceAccessToken))
+            .hasSize(1));
     }
 
     private void aliceReadLastMessage() {


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


[james-project] 13/16: JAMES-3014 Give a probe for clearing MessageFastViewProjection

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 970355457d2cd6cea900a7feda802cec80dd98f8
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Dec 17 16:34:42 2019 +0700

    JAMES-3014 Give a probe for clearing MessageFastViewProjection
---
 .../apache/james/jmap/draft/JmapGuiceProbe.java    | 11 ++-
 .../CassandraMessageFastViewProjection.java        | 16 +++--
 .../api/projections/MessageFastViewProjection.java |  2 +
 .../MemoryMessageFastViewProjection.java           | 15 ++--
 .../MessageFastViewProjectionContract.java         | 80 +++++++++++++---------
 5 files changed, 83 insertions(+), 41 deletions(-)

diff --git a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JmapGuiceProbe.java b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JmapGuiceProbe.java
index 38ca47c..0f2504b 100644
--- a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JmapGuiceProbe.java
+++ b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JmapGuiceProbe.java
@@ -24,6 +24,7 @@ import java.util.Arrays;
 import javax.inject.Inject;
 
 import org.apache.james.core.Username;
+import org.apache.james.jmap.api.projections.MessageFastViewProjection;
 import org.apache.james.jmap.api.vacation.AccountId;
 import org.apache.james.jmap.api.vacation.Vacation;
 import org.apache.james.jmap.api.vacation.VacationPatch;
@@ -39,6 +40,8 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.util.Port;
 import org.apache.james.utils.GuiceProbe;
 
+import reactor.core.publisher.Mono;
+
 public class JmapGuiceProbe implements GuiceProbe {
 
     private final VacationRepository vacationRepository;
@@ -46,14 +49,16 @@ public class JmapGuiceProbe implements GuiceProbe {
     private final MessageIdManager messageIdManager;
     private final MailboxManager mailboxManager;
     private final EventBus eventBus;
+    private final MessageFastViewProjection messageFastViewProjection;
 
     @Inject
-    private JmapGuiceProbe(VacationRepository vacationRepository, JMAPServer jmapServer, MessageIdManager messageIdManager, MailboxManager mailboxManager, EventBus eventBus) {
+    private JmapGuiceProbe(VacationRepository vacationRepository, JMAPServer jmapServer, MessageIdManager messageIdManager, MailboxManager mailboxManager, EventBus eventBus, MessageFastViewProjection messageFastViewProjection) {
         this.vacationRepository = vacationRepository;
         this.jmapServer = jmapServer;
         this.messageIdManager = messageIdManager;
         this.mailboxManager = mailboxManager;
         this.eventBus = eventBus;
+        this.messageFastViewProjection = messageFastViewProjection;
     }
 
     public Port getJmapPort() {
@@ -76,4 +81,8 @@ public class JmapGuiceProbe implements GuiceProbe {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(username);
         messageIdManager.setInMailboxes(messageId, Arrays.asList(mailboxIds), mailboxSession);
     }
+
+    public void clearMessageFastViewProjection() {
+        Mono.from(messageFastViewProjection.clear()).block();
+    }
 }
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java
index 9b0ac29..628a3b6 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java
@@ -23,6 +23,7 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.truncate;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.HAS_ATTACHMENT;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.MESSAGE_ID;
 import static org.apache.james.jmap.cassandra.projections.table.CassandraMessageFastViewProjectionTable.PREVIEW;
@@ -38,7 +39,6 @@ import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.metrics.api.Metric;
 import org.apache.james.metrics.api.MetricFactory;
-import org.reactivestreams.Publisher;
 
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Row;
@@ -58,6 +58,7 @@ public class CassandraMessageFastViewProjection implements MessageFastViewProjec
     private final PreparedStatement storeStatement;
     private final PreparedStatement retrieveStatement;
     private final PreparedStatement deleteStatement;
+    private final PreparedStatement truncateStatement;
 
     @Inject
     CassandraMessageFastViewProjection(MetricFactory metricFactory, Session session) {
@@ -76,12 +77,14 @@ public class CassandraMessageFastViewProjection implements MessageFastViewProjec
             .from(TABLE_NAME)
             .where(eq(MESSAGE_ID, bindMarker(MESSAGE_ID))));
 
+        this.truncateStatement = session.prepare(truncate(TABLE_NAME));
+
         this.metricRetrieveHitCount = metricFactory.generate(METRIC_RETRIEVE_HIT_COUNT);
         this.metricRetrieveMissCount = metricFactory.generate(METRIC_RETRIEVE_MISS_COUNT);
     }
 
     @Override
-    public Publisher<Void> store(MessageId messageId, MessageFastViewPrecomputedProperties precomputedProperties) {
+    public Mono<Void> store(MessageId messageId, MessageFastViewPrecomputedProperties precomputedProperties) {
         checkMessage(messageId);
 
         return cassandraAsyncExecutor.executeVoid(storeStatement.bind()
@@ -91,7 +94,7 @@ public class CassandraMessageFastViewProjection implements MessageFastViewProjec
     }
 
     @Override
-    public Publisher<MessageFastViewPrecomputedProperties> retrieve(MessageId messageId) {
+    public Mono<MessageFastViewPrecomputedProperties> retrieve(MessageId messageId) {
         checkMessage(messageId);
 
         return cassandraAsyncExecutor.executeSingleRow(retrieveStatement.bind()
@@ -102,13 +105,18 @@ public class CassandraMessageFastViewProjection implements MessageFastViewProjec
     }
 
     @Override
-    public Publisher<Void> delete(MessageId messageId) {
+    public Mono<Void> delete(MessageId messageId) {
         checkMessage(messageId);
 
         return cassandraAsyncExecutor.executeVoid(deleteStatement.bind()
             .setUUID(MESSAGE_ID, ((CassandraMessageId) messageId).get()));
     }
 
+    @Override
+    public Mono<Void> clear() {
+        return cassandraAsyncExecutor.executeVoid(truncateStatement.bind());
+    }
+
     private void checkMessage(MessageId messageId) {
         Preconditions.checkNotNull(messageId);
         Preconditions.checkArgument(messageId instanceof CassandraMessageId,
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java
index 6589318..afc3e15 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java
@@ -44,6 +44,8 @@ public interface MessageFastViewProjection {
 
     Publisher<Void> delete(MessageId messageId);
 
+    Publisher<Void> clear();
+
     default Publisher<Map<MessageId, MessageFastViewPrecomputedProperties>> retrieve(Collection<MessageId> messageIds) {
         Preconditions.checkNotNull(messageIds);
 
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjection.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjection.java
index e39fcbe..928bc5b 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjection.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjection.java
@@ -35,13 +35,13 @@ import reactor.core.publisher.Mono;
 
 public class MemoryMessageFastViewProjection implements MessageFastViewProjection {
 
-    private final ConcurrentHashMap<MessageId, MessageFastViewPrecomputedProperties> previews;
+    private final ConcurrentHashMap<MessageId, MessageFastViewPrecomputedProperties> projectionItems;
     private final Metric metricRetrieveHitCount;
     private final Metric metricRetrieveMissCount;
 
     @Inject
     public MemoryMessageFastViewProjection(MetricFactory metricFactory) {
-        this.previews = new ConcurrentHashMap<>();
+        this.projectionItems = new ConcurrentHashMap<>();
         this.metricRetrieveHitCount = metricFactory.generate(METRIC_RETRIEVE_HIT_COUNT);
         this.metricRetrieveMissCount = metricFactory.generate(METRIC_RETRIEVE_MISS_COUNT);
     }
@@ -51,14 +51,14 @@ public class MemoryMessageFastViewProjection implements MessageFastViewProjectio
         Preconditions.checkNotNull(messageId);
         Preconditions.checkNotNull(precomputedProperties);
 
-        return Mono.fromRunnable(() -> previews.put(messageId, precomputedProperties));
+        return Mono.fromRunnable(() -> projectionItems.put(messageId, precomputedProperties));
     }
 
     @Override
     public Mono<MessageFastViewPrecomputedProperties> retrieve(MessageId messageId) {
         Preconditions.checkNotNull(messageId);
 
-        return Mono.fromSupplier(() -> previews.get(messageId))
+        return Mono.fromSupplier(() -> projectionItems.get(messageId))
             .doOnNext(preview -> metricRetrieveHitCount.increment())
             .switchIfEmpty(Mono.fromRunnable(metricRetrieveMissCount::increment));
     }
@@ -67,6 +67,11 @@ public class MemoryMessageFastViewProjection implements MessageFastViewProjectio
     public Mono<Void> delete(MessageId messageId) {
         Preconditions.checkNotNull(messageId);
 
-        return Mono.fromRunnable(() -> previews.remove(messageId));
+        return Mono.fromRunnable(() -> projectionItems.remove(messageId));
+    }
+
+    @Override
+    public Mono<Void> clear() {
+        return Mono.fromRunnable(projectionItems::clear);
     }
 }
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionContract.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionContract.java
index f57ff23..5a6c3e5 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionContract.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionContract.java
@@ -173,34 +173,34 @@ public interface MessageFastViewProjectionContract {
 
     @Test
     default void storeShouldThrowWhenNullPreview() {
-        MessageId messageId1 = newMessageId();
-        assertThatThrownBy(() -> Mono.from(testee().store(messageId1, null)).block())
+        MessageId messageId = newMessageId();
+        assertThatThrownBy(() -> Mono.from(testee().store(messageId, null)).block())
             .isInstanceOf(NullPointerException.class);
     }
 
     @Test
     default void storeShouldOverrideOldRecord() {
-        MessageId messageId1 = newMessageId();
-        Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1))
+        MessageId messageId = newMessageId();
+        Mono.from(testee().store(messageId, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1))
             .block();
 
-        Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_2))
+        Mono.from(testee().store(messageId, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_2))
             .block();
 
-        assertThat(Mono.from(testee().retrieve(messageId1)).block())
+        assertThat(Mono.from(testee().retrieve(messageId)).block())
             .isEqualTo(MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_2);
     }
 
     @Test
     default void storeShouldBeIdempotent() {
-        MessageId messageId1 = newMessageId();
-        Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1))
+        MessageId messageId = newMessageId();
+        Mono.from(testee().store(messageId, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1))
             .block();
 
-        Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1))
+        Mono.from(testee().store(messageId, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1))
             .block();
 
-        assertThat(Mono.from(testee().retrieve(messageId1)).block())
+        assertThat(Mono.from(testee().retrieve(messageId)).block())
             .isEqualTo(MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1);
     }
 
@@ -264,21 +264,21 @@ public interface MessageFastViewProjectionContract {
 
     @Test
     default void deleteShouldNotThrowWhenMessageIdNotFound() {
-        MessageId messageId1 = newMessageId();
-        assertThatCode(() -> Mono.from(testee().delete(messageId1)).block())
+        MessageId messageId = newMessageId();
+        assertThatCode(() -> Mono.from(testee().delete(messageId)).block())
             .doesNotThrowAnyException();
     }
 
     @Test
     default void deleteShouldDeleteStoredRecord() {
-        MessageId messageId1 = newMessageId();
-        Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1))
+        MessageId messageId = newMessageId();
+        Mono.from(testee().store(messageId, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1))
             .block();
 
-        Mono.from(testee().delete(messageId1))
+        Mono.from(testee().delete(messageId))
             .block();
 
-        assertThat(Mono.from(testee().retrieve(messageId1)).blockOptional())
+        assertThat(Mono.from(testee().retrieve(messageId)).blockOptional())
             .isEmpty();
     }
 
@@ -300,26 +300,26 @@ public interface MessageFastViewProjectionContract {
 
     @Test
     default void deleteShouldBeIdempotent() {
-        MessageId messageId1 = newMessageId();
-        Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1))
+        MessageId messageId = newMessageId();
+        Mono.from(testee().store(messageId, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1))
             .block();
 
-        Mono.from(testee().delete(messageId1))
+        Mono.from(testee().delete(messageId))
             .block();
-        Mono.from(testee().delete(messageId1))
+        Mono.from(testee().delete(messageId))
             .block();
 
-        assertThat(Mono.from(testee().retrieve(messageId1)).blockOptional())
+        assertThat(Mono.from(testee().retrieve(messageId)).blockOptional())
             .isEmpty();
     }
 
     @Test
     default void retrieveShouldIncrementMetricHitCountWhenPreviewIsFound() {
-        MessageId messageId1 = newMessageId();
-        Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1))
+        MessageId messageId = newMessageId();
+        Mono.from(testee().store(messageId, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1))
             .block();
 
-        Mono.from(testee().retrieve(messageId1))
+        Mono.from(testee().retrieve(messageId))
             .block();
 
         assertThat(metricFactory().countFor(METRIC_RETRIEVE_HIT_COUNT))
@@ -328,11 +328,11 @@ public interface MessageFastViewProjectionContract {
 
     @Test
     default void retrieveShouldNotIncrementMetricMissCountWhenPreviewIsFound() {
-        MessageId messageId1 = newMessageId();
-        Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1))
+        MessageId messageId = newMessageId();
+        Mono.from(testee().store(messageId, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1))
             .block();
 
-        Mono.from(testee().retrieve(messageId1))
+        Mono.from(testee().retrieve(messageId))
             .block();
 
         assertThat(metricFactory().countFor(METRIC_RETRIEVE_MISS_COUNT))
@@ -341,8 +341,8 @@ public interface MessageFastViewProjectionContract {
 
     @Test
     default void retrieveShouldIncrementMetricMissCountWhenPreviewIsNotFound() {
-        MessageId messageId1 = newMessageId();
-        Mono.from(testee().retrieve(messageId1))
+        MessageId messageId = newMessageId();
+        Mono.from(testee().retrieve(messageId))
             .block();
 
         assertThat(metricFactory().countFor(METRIC_RETRIEVE_MISS_COUNT))
@@ -351,11 +351,29 @@ public interface MessageFastViewProjectionContract {
 
     @Test
     default void retrieveShouldNotIncrementMetricHitCountWhenPreviewIsNotFound() {
-        MessageId messageId1 = newMessageId();
-        Mono.from(testee().retrieve(messageId1))
+        MessageId messageId = newMessageId();
+        Mono.from(testee().retrieve(messageId))
             .block();
 
         assertThat(metricFactory().countFor(METRIC_RETRIEVE_HIT_COUNT))
             .isEqualTo(0);
     }
+
+    @Test
+    default void clearShouldNotThrowWhenNoData() {
+        assertThatCode(() -> Mono.from(testee().clear()).block())
+            .doesNotThrowAnyException();
+    }
+
+    @Test
+    default void clearShouldRemoveStoredData() {
+        MessageId messageId = newMessageId();
+        Mono.from(testee().store(messageId, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1))
+            .block();
+
+        Mono.from(testee().clear()).block();
+
+        assertThat(Mono.from(testee().retrieve(messageId)).blockOptional())
+            .isEmpty();
+    }
 }
\ 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