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 2019/03/12 03:19:38 UTC

[james-project] branch master updated (e81028f -> 7b4e8d2)

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 e81028f  JAMES-2669 Standardize methods name for reading the object storage configuration
     new 643fe1c  JAMES-2665 Clock should be injected as a common service
     new a9bc662  JAMES-2665 Default vault path was incompatible with file repositories
     new 5b3c855  JAMES-2665 Injects for DeletedMessagesVaultHook
     new e10f312  JAMES-2665 Add MemoryMailRepository as a valid configuration choice for Guice memory
     new e7675be  JAMES-2665 Basic first integration test for memory and the vault
     new 1d4ae5c  JAMES-2665 Basic first integration test for Cassandra and the vault
     new 7fc5ee2  JAMES-2665 Basic first integration test for RabbitMQ and the vault
     new 5b6c3e9  JAMES-2665 Add more tests for the vault feature
     new 45af710  JAMES-2665 Add a test upon mailbox deletion
     new 88102e5  JAMES-2665 Moved messages should not end up in the vault
     new 0ca0bec  JAMES-2665 DeletedMessageVault integration tests and sharing
     new daa40dc  JAMES-2665 Introduce await in Vault integration tests
     new 8ccfd9c  JAMES-2663 Adding action parameter to restoring API path
     new 2fcc843  JAMES-2666 solve group deserialization issue with event dead letters routes
     new 7b4e8d2  JAMES-2666 add unit test for each group deserialization

The 15 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:
 .../apache/james/mailbox/util/EventCollector.java  |   2 +-
 mailbox/caching/pom.xml                            |   9 +-
 .../caching/CacheInvalidatingMailboxListener.java  |   2 +-
 .../CacheInvalidatingMailboxListenerTest.java}     |  14 +-
 .../cassandra/MailboxOperationLoggingListener.java |   2 +-
 .../MailboxOperationLoggingListenerTest.java}      |  14 +-
 .../ElasticSearchListeningMessageSearchIndex.java  |   2 +-
 ...asticSearchListeningMessageSearchIndexTest.java |   8 +
 .../james/mailbox/events/RabbitMQEventBusTest.java |   7 +
 .../james/vault/DeletedMessageVaultHook.java       |   3 +
 .../listeners/QuotaThresholdCrossingListener.java  |   2 +-
 .../QuotaThresholdCrossingListenerTest.java}       |  14 +-
 .../events/ElasticSearchQuotaMailboxListener.java  |   2 +-
 .../ElasticSearchQuotaMailboxListenerTest.java     |   7 +
 .../mailbox/spamassassin/SpamAssassinListener.java |   2 +-
 .../spamassassin/SpamAssassinListenerTest.java     |   7 +
 .../store/event/MailboxAnnotationListener.java     |   2 +-
 .../store/quota/ListeningCurrentQuotaUpdater.java  |   2 +-
 .../store/search/LazyMessageSearchIndex.java       |   2 +-
 .../store/event/MailboxAnnotationListenerTest.java |   8 +
 .../quota/ListeningCurrentQuotaUpdaterTest.java    |   8 +
 .../store/search/LazyMessageSearchIndexTest.java}  |  14 +-
 .../{MimeMessageModule.java => ClockModule.java}   |   8 +-
 .../apache/james/modules/CommonServicesModule.java |   1 +
 .../modules/vault/DeletedMessageVaultModule.java   |   2 +-
 .../mailbox/PreDeletionHookConfiguration.java      |   5 +
 .../mailbox/PreDeletionHooksConfiguration.java     |   4 +
 .../mailbox/MailboxListenersLoaderImplTest.java    |   6 +
 .../james/modules/mailbox/NoopMailboxListener.java |   2 +-
 server/container/guice/memory-guice/pom.xml        |   4 +
 .../james/modules/data/MemoryDataModule.java       |   5 +
 .../james/modules/rabbitmq/RabbitMQModule.java     |   2 -
 ....java => CassandraDeletedMessageVaultTest.java} |  35 +-
 .../integration/DeletedMessagesVaultTest.java      | 448 +++++++++++++++++++++
 ...st.java => MemoryDeletedMessagesVaultTest.java} |  33 +-
 .../src/test/resources/mailrepositorystore.xml     |   7 +
 ....java => RabbitMQDeletedMessagesVaultTest.java} |  36 +-
 .../jmap/event/PropagateLookupRightListener.java   |   2 +-
 .../event/PropagateLookupRightListenerTest.java    |   7 +
 .../vault/routes/DeletedMessagesVaultRoutes.java   |  92 ++++-
 .../routes/DeletedMessagesVaultRoutesTest.java     |  78 +++-
 .../org/apache/james/utils/IMAPMessageReader.java  |   5 +
 src/site/markdown/server/manage-webadmin.md        |  13 +-
 43 files changed, 840 insertions(+), 88 deletions(-)
 copy mailbox/{backup/src/test/java/org/apache/james/mailbox/backup/DirectoryTest.java => caching/src/test/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListenerTest.java} (73%)
 copy mailbox/{backup/src/test/java/org/apache/james/mailbox/backup/DirectoryTest.java => cassandra/src/test/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListenerTest.java} (73%)
 copy mailbox/{backup/src/test/java/org/apache/james/mailbox/backup/DirectoryTest.java => plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListenerTest.java} (73%)
 copy mailbox/{backup/src/test/java/org/apache/james/mailbox/backup/DirectoryTest.java => store/src/test/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndexTest.java} (76%)
 copy server/container/guice/guice-common/src/main/java/org/apache/james/modules/{MimeMessageModule.java => ClockModule.java} (89%)
 copy server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/{CassandraForwardIntegrationTest.java => CassandraDeletedMessageVaultTest.java} (54%)
 create mode 100644 server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
 copy server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/{MemoryGetMessageListMethodTest.java => MemoryDeletedMessagesVaultTest.java} (51%)
 copy server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/{RabbitMQForwardIntegrationTest.java => RabbitMQDeletedMessagesVaultTest.java} (54%)


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


[james-project] 04/15: JAMES-2665 Add MemoryMailRepository as a valid configuration choice for Guice memory

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 e10f312614e9a405e62b76dea634c315454717e8
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Mar 5 14:49:11 2019 +0700

    JAMES-2665 Add MemoryMailRepository as a valid configuration choice for Guice memory
---
 server/container/guice/memory-guice/pom.xml                          | 4 ++++
 .../main/java/org/apache/james/modules/data/MemoryDataModule.java    | 5 +++++
 2 files changed, 9 insertions(+)

diff --git a/server/container/guice/memory-guice/pom.xml b/server/container/guice/memory-guice/pom.xml
index ea765db..e785511 100644
--- a/server/container/guice/memory-guice/pom.xml
+++ b/server/container/guice/memory-guice/pom.xml
@@ -153,6 +153,10 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-mailrepository-memory</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-queue-memory</artifactId>
         </dependency>
         <dependency>
diff --git a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/data/MemoryDataModule.java b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/data/MemoryDataModule.java
index 96f89c4..a4eec3e 100644
--- a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/data/MemoryDataModule.java
+++ b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/data/MemoryDataModule.java
@@ -29,10 +29,12 @@ import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.lib.DomainListConfiguration;
 import org.apache.james.domainlist.memory.MemoryDomainList;
 import org.apache.james.lifecycle.api.Startable;
+import org.apache.james.mailrepository.api.MailRepositoryProvider;
 import org.apache.james.mailrepository.api.MailRepositoryUrlStore;
 import org.apache.james.mailrepository.api.Protocol;
 import org.apache.james.mailrepository.file.FileMailRepository;
 import org.apache.james.mailrepository.memory.MailRepositoryStoreConfiguration;
+import org.apache.james.mailrepository.memory.MemoryMailRepositoryProvider;
 import org.apache.james.mailrepository.memory.MemoryMailRepositoryUrlStore;
 import org.apache.james.modules.server.MailStoreRepositoryModule;
 import org.apache.james.rrt.api.RecipientRewriteTable;
@@ -81,6 +83,9 @@ public class MemoryDataModule extends AbstractModule {
         Multibinder.newSetBinder(binder(), ConfigurationPerformer.class).addBinding().to(MemoryDataConfigurationPerformer.class);
 
         bind(MailStoreRepositoryModule.DefaultItemSupplier.class).toInstance(() -> FILE_MAILREPOSITORY_DEFAULT_DECLARATION);
+
+        Multibinder<MailRepositoryProvider> multibinder = Multibinder.newSetBinder(binder(), MailRepositoryProvider.class);
+        multibinder.addBinding().to(MemoryMailRepositoryProvider.class);
     }
 
     @Provides


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


[james-project] 05/15: JAMES-2665 Basic first integration test for memory and the vault

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 e7675be78f43dfaaba9e250ff8306f7422b3a61e
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Mar 5 11:39:06 2019 +0700

    JAMES-2665 Basic first integration test for memory and the vault
    
    Exercise it on the various type of mail repositories
---
 .../mailbox/PreDeletionHookConfiguration.java      |   5 +
 .../mailbox/PreDeletionHooksConfiguration.java     |   4 +
 .../integration/DeletedMessagesVaultTest.java      | 191 +++++++++++++++++++++
 .../memory/MemoryDeletedMessagesVaultTest.java     |  50 ++++++
 ...moryFileRepositoryDeletedMessagesVaultTest.java |  50 ++++++
 .../src/test/resources/mailrepositorystore.xml     |   7 +
 6 files changed, 307 insertions(+)

diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/PreDeletionHookConfiguration.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/PreDeletionHookConfiguration.java
index 9e36255..e0a22f1 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/PreDeletionHookConfiguration.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/PreDeletionHookConfiguration.java
@@ -22,6 +22,7 @@ import java.util.Objects;
 
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.mailbox.extension.PreDeletionHook;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
@@ -40,6 +41,10 @@ public class PreDeletionHookConfiguration {
         }
     }
 
+    public static PreDeletionHookConfiguration forClass(Class<? extends PreDeletionHook> clazz) {
+        return forClass(clazz.getName());
+    }
+
     public static PreDeletionHookConfiguration forClass(String clazz) {
         return new PreDeletionHookConfiguration(clazz);
     }
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/PreDeletionHooksConfiguration.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/PreDeletionHooksConfiguration.java
index 14df7cb..eab2fcc 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/PreDeletionHooksConfiguration.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/PreDeletionHooksConfiguration.java
@@ -40,6 +40,10 @@ public class PreDeletionHooksConfiguration {
                     .collect(Guavate.toImmutableList()));
     }
 
+    public static PreDeletionHooksConfiguration forHooks(PreDeletionHookConfiguration... hooks) {
+        return new PreDeletionHooksConfiguration(ImmutableList.copyOf(hooks));
+    }
+
     public static PreDeletionHooksConfiguration none() {
         return new PreDeletionHooksConfiguration(ImmutableList.of());
     }
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
new file mode 100644
index 0000000..ba529c7
--- /dev/null
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
@@ -0,0 +1,191 @@
+/****************************************************************
+ * 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.jmap.methods.integration;
+
+import static io.restassured.RestAssured.given;
+import static io.restassured.RestAssured.with;
+import static org.apache.james.jmap.HttpJmapAuthentication.authenticateJamesUser;
+import static org.apache.james.jmap.JmapCommonRequests.getOutboxId;
+import static org.apache.james.jmap.JmapCommonRequests.listMessageIdsForAccount;
+import static org.apache.james.jmap.JmapURIBuilder.baseUri;
+import static org.apache.james.jmap.TestingConstants.ARGUMENTS;
+import static org.apache.james.jmap.TestingConstants.DOMAIN;
+import static org.apache.james.jmap.TestingConstants.calmlyAwait;
+import static org.apache.james.jmap.TestingConstants.jmapRequestSpecBuilder;
+import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.Matchers.is;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.james.GuiceJamesServer;
+import org.apache.james.jmap.api.access.AccessToken;
+import org.apache.james.jmap.categories.BasicFeature;
+import org.apache.james.mailbox.DefaultMailboxes;
+import org.apache.james.mailbox.probe.MailboxProbe;
+import org.apache.james.modules.MailboxProbeImpl;
+import org.apache.james.probe.DataProbe;
+import org.apache.james.utils.DataProbeImpl;
+import org.apache.james.utils.JmapGuiceProbe;
+import org.apache.james.utils.WebAdminGuiceProbe;
+import org.apache.james.webadmin.WebAdminUtils;
+import org.apache.james.webadmin.routes.TasksRoutes;
+import org.awaitility.Duration;
+import org.awaitility.core.ConditionFactory;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import com.google.common.base.Strings;
+
+import io.restassured.RestAssured;
+import io.restassured.parsing.Parser;
+import io.restassured.specification.RequestSpecification;
+
+public abstract class DeletedMessagesVaultTest {
+    private static final String HOMER = "homer@" + DOMAIN;
+    private static final String BART = "bart@" + DOMAIN;
+    private static final String PASSWORD = "password";
+    private static final String BOB_PASSWORD = "bobPassword";
+    private static final ConditionFactory WAIT_TWO_MINUTES = calmlyAwait.atMost(Duration.TWO_MINUTES);
+    private static final String SUBJECT = "This mail will be restored from the vault!!";
+
+    protected abstract GuiceJamesServer createJmapServer() throws IOException;
+
+    private AccessToken homerAccessToken;
+    private AccessToken bartAccessToken;
+    private GuiceJamesServer jmapServer;
+    private RequestSpecification webAdminApi;
+
+    @Before
+    public void setup() throws Throwable {
+        jmapServer = createJmapServer();
+        jmapServer.start();
+        MailboxProbe mailboxProbe = jmapServer.getProbe(MailboxProbeImpl.class);
+        DataProbe dataProbe = jmapServer.getProbe(DataProbeImpl.class);
+
+        RestAssured.requestSpecification = jmapRequestSpecBuilder
+            .setPort(jmapServer.getProbe(JmapGuiceProbe.class).getJmapPort())
+            .build();
+        RestAssured.defaultParser = Parser.JSON;
+
+        dataProbe.addDomain(DOMAIN);
+        dataProbe.addUser(HOMER, PASSWORD);
+        dataProbe.addUser(BART, BOB_PASSWORD);
+        mailboxProbe.createMailbox("#private", HOMER, DefaultMailboxes.INBOX);
+        homerAccessToken = authenticateJamesUser(baseUri(jmapServer), HOMER, PASSWORD);
+        bartAccessToken = authenticateJamesUser(baseUri(jmapServer), BART, BOB_PASSWORD);
+
+        WebAdminGuiceProbe webAdminGuiceProbe = jmapServer.getProbe(WebAdminGuiceProbe.class);
+        webAdminGuiceProbe.await();
+        webAdminApi = given()
+            .spec(WebAdminUtils
+                .buildRequestSpecification(webAdminGuiceProbe.getWebAdminPort())
+                .build());
+    }
+
+    @After
+    public void tearDown() {
+        jmapServer.stop();
+    }
+
+    @Category(BasicFeature.class)
+    @Test
+    public void shouldSendANoticeWhenThresholdExceeded() {
+        bartSendMessageToHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+        homerDeletesMessages(listMessageIdsForAccount(homerAccessToken));
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 0);
+
+        restoreAllMessagesOfHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+        String messageId = listMessageIdsForAccount(homerAccessToken).get(0);
+        given()
+            .header("Authorization", homerAccessToken.serialize())
+            .body("[[\"getMessages\", {\"ids\": [\"" + messageId + "\"]}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .log().ifValidationFails()
+            .body(ARGUMENTS + ".list.subject", hasItem(SUBJECT));
+    }
+
+    private void bartSendMessageToHomer() {
+        String messageCreationId = "creationId";
+        String outboxId = getOutboxId(bartAccessToken);
+        String bigEnoughBody = Strings.repeat("123456789\n", 12 * 100);
+        String requestBody = "[" +
+            "  [" +
+            "    \"setMessages\"," +
+            "    {" +
+            "      \"create\": { \"" + messageCreationId  + "\" : {" +
+            "        \"headers\":{\"Disposition-Notification-To\":\"" + BART + "\"}," +
+            "        \"from\": { \"name\": \"Bob\", \"email\": \"" + BART + "\"}," +
+            "        \"to\": [{ \"name\": \"User\", \"email\": \"" + HOMER + "\"}]," +
+            "        \"subject\": \"" + SUBJECT + "\"," +
+            "        \"textBody\": \"" + bigEnoughBody + "\"," +
+            "        \"htmlBody\": \"Test <b>body</b>, HTML version\"," +
+            "        \"mailboxIds\": [\"" + outboxId + "\"] " +
+            "      }}" +
+            "    }," +
+            "    \"#0\"" +
+            "  ]" +
+            "]";
+
+        with()
+            .header("Authorization", bartAccessToken.serialize())
+            .body(requestBody)
+            .post("/jmap")
+        .then()
+            .extract()
+            .body()
+            .path(ARGUMENTS + ".created." + messageCreationId + ".id");
+    }
+
+    private void homerDeletesMessages(List<String> idsToDestroy) {
+        String idString = idsToDestroy.stream()
+            .map(id -> "\"" + id + "\"")
+            .collect(Collectors.joining(","));
+
+        with()
+            .header("Authorization", homerAccessToken.serialize())
+            .body("[[\"setMessages\", {\"destroy\": [" + idString + "]}, \"#0\"]]")
+            .post("/jmap");
+    }
+
+    private void restoreAllMessagesOfHomer() {
+        String taskId = webAdminApi.with()
+            .post("/deletedMessages/user/" + HOMER + "?action=restore")
+            .jsonPath()
+            .get("taskId");
+
+        webAdminApi.given()
+            .basePath(TasksRoutes.BASE)
+        .when()
+            .get(taskId + "/await")
+            .then()
+            .body("status", is("completed"));
+    }
+}
diff --git a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java
new file mode 100644
index 0000000..5f45e97
--- /dev/null
+++ b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java
@@ -0,0 +1,50 @@
+/****************************************************************
+ * 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.jmap.memory;
+
+import java.io.IOException;
+
+import org.apache.james.GuiceJamesServer;
+import org.apache.james.MemoryJmapTestRule;
+import org.apache.james.jmap.methods.integration.DeletedMessagesVaultTest;
+import org.apache.james.mailrepository.api.MailRepositoryUrl;
+import org.apache.james.modules.mailbox.PreDeletionHookConfiguration;
+import org.apache.james.modules.mailbox.PreDeletionHooksConfiguration;
+import org.apache.james.vault.DeletedMessageVaultHook;
+import org.apache.james.vault.MailRepositoryDeletedMessageVault;
+import org.apache.james.webadmin.WebAdminConfiguration;
+import org.junit.Rule;
+
+public class MemoryDeletedMessagesVaultTest extends DeletedMessagesVaultTest {
+
+    @Rule
+    public MemoryJmapTestRule memoryJmap = new MemoryJmapTestRule();
+
+    @Override
+    protected GuiceJamesServer createJmapServer() throws IOException {
+        return memoryJmap.jmapServer(
+            binder -> binder.bind(PreDeletionHooksConfiguration.class)
+                .toInstance(PreDeletionHooksConfiguration.forHooks(
+                    PreDeletionHookConfiguration.forClass(DeletedMessageVaultHook.class))),
+            binder -> binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION),
+            binder -> binder.bind(MailRepositoryDeletedMessageVault.Configuration.class)
+                .toInstance(new MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("memory://var/deletedMessages/user"))));
+    }
+}
diff --git a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryFileRepositoryDeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryFileRepositoryDeletedMessagesVaultTest.java
new file mode 100644
index 0000000..11f8373
--- /dev/null
+++ b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryFileRepositoryDeletedMessagesVaultTest.java
@@ -0,0 +1,50 @@
+/****************************************************************
+ * 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.jmap.memory;
+
+import java.io.IOException;
+
+import org.apache.james.GuiceJamesServer;
+import org.apache.james.MemoryJmapTestRule;
+import org.apache.james.jmap.methods.integration.DeletedMessagesVaultTest;
+import org.apache.james.mailrepository.api.MailRepositoryUrl;
+import org.apache.james.modules.mailbox.PreDeletionHookConfiguration;
+import org.apache.james.modules.mailbox.PreDeletionHooksConfiguration;
+import org.apache.james.vault.DeletedMessageVaultHook;
+import org.apache.james.vault.MailRepositoryDeletedMessageVault;
+import org.apache.james.webadmin.WebAdminConfiguration;
+import org.junit.Rule;
+
+public class MemoryFileRepositoryDeletedMessagesVaultTest extends DeletedMessagesVaultTest {
+
+    @Rule
+    public MemoryJmapTestRule memoryJmap = new MemoryJmapTestRule();
+
+    @Override
+    protected GuiceJamesServer createJmapServer() throws IOException {
+        return memoryJmap.jmapServer(
+            binder -> binder.bind(PreDeletionHooksConfiguration.class)
+                .toInstance(PreDeletionHooksConfiguration.forHooks(
+                    PreDeletionHookConfiguration.forClass(DeletedMessageVaultHook.class))),
+            binder -> binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION),
+            binder -> binder.bind(MailRepositoryDeletedMessageVault.Configuration.class)
+                .toInstance(new MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("file://var/deletedMessages/user"))));
+    }
+}
diff --git a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/mailrepositorystore.xml b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/mailrepositorystore.xml
index 3ca4a1d..9dcd6bb 100644
--- a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/mailrepositorystore.xml
+++ b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/mailrepositorystore.xml
@@ -28,4 +28,11 @@
             <config FIFO="false" CACHEKEYS="true"/>
         </mailrepository>
     </mailrepositories>
+    <mailrepositories>
+        <mailrepository class="org.apache.james.mailrepository.memory.MemoryMailRepository">
+            <protocols>
+                <protocol>memory</protocol>
+            </protocols>
+        </mailrepository>
+    </mailrepositories>
 </mailrepositorystore>


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


[james-project] 11/15: JAMES-2665 DeletedMessageVault integration tests and sharing

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 0ca0becbcc86be8b144968647fc9e85dfcfa06d3
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Mar 6 11:10:01 2019 +0700

    JAMES-2665 DeletedMessageVault integration tests and sharing
---
 .../CassandraDeletedMessageVaultTest.java          |  2 +-
 .../integration/DeletedMessagesVaultTest.java      | 84 ++++++++++++++++++++--
 .../memory/MemoryDeletedMessagesVaultTest.java     |  2 +-
 .../rabbitmq/RabbitMQDeletedMessagesVaultTest.java |  2 +-
 4 files changed, 82 insertions(+), 8 deletions(-)

diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java
index 9381f3c..8c10c51 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java
@@ -61,7 +61,7 @@ public class CassandraDeletedMessageVaultTest extends DeletedMessagesVaultTest {
     @Category(BasicFeature.class)
     @Override
     @Test
-    public void postShouldRestoreImapDeletedMailbox() {
+    public void vaultEndpointShouldRestoreImapDeletedMailbox() {
 
     }
 }
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
index e986f8c..bfbba3f 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
@@ -60,6 +60,7 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.junit.jupiter.api.Disabled;
+import org.testcontainers.shaded.com.google.common.collect.ImmutableList;
 
 import com.google.common.base.Strings;
 
@@ -122,7 +123,7 @@ public abstract class DeletedMessagesVaultTest {
 
     @Category(BasicFeature.class)
     @Test
-    public void postShouldRestoreJmapDeletedEmail() {
+    public void vaultEndpointShouldRestoreJmapDeletedEmail() {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
 
@@ -146,7 +147,7 @@ public abstract class DeletedMessagesVaultTest {
 
     @Category(BasicFeature.class)
     @Test
-    public void postShouldRestoreImapDeletedEmail() throws Exception {
+    public void vaultEndpointShouldRestoreImapDeletedEmail() throws Exception {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
 
@@ -176,7 +177,7 @@ public abstract class DeletedMessagesVaultTest {
     @Disabled("MAILBOX-379 PreDeletionHook are not yet triggered upon mailbox deletion")
     @Category(BasicFeature.class)
     @Test
-    public void postShouldRestoreImapDeletedMailbox() throws Exception {
+    public void vaultEndpointShouldRestoreImapDeletedMailbox() throws Exception {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
 
@@ -276,7 +277,7 @@ public abstract class DeletedMessagesVaultTest {
     }
 
     @Test
-    public void postShouldNotRestoreItemsWhenTheVaultIsEmpty() throws Exception {
+    public void vaultEndpointShouldNotRestoreItemsWhenTheVaultIsEmpty() {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
 
@@ -288,6 +289,75 @@ public abstract class DeletedMessagesVaultTest {
             .isEqualTo(1);
     }
 
+    @Test
+    public void vaultEndpointShouldNotRestoreMessageForSharee() {
+        bartSendMessageToHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(bartAccessToken).size() == 1);
+
+        String messageId = listMessageIdsForAccount(homerAccessToken).get(0);
+        homerMovesTheMailInAnotherMailbox(messageId);
+
+        homerSharesHisMailboxWithBart();
+
+        bartDeletesMessages(ImmutableList.of(messageId));
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 0);
+
+        restoreMessagesFor(BART);
+
+        Thread.sleep(Duration.FIVE_SECONDS.getValueInMS());
+
+        // No additional had been restored for Bart as the vault is empty
+        assertThat(listMessageIdsForAccount(bartAccessToken).size())
+            .isEqualTo(1);
+    }
+
+    @Test
+    public void vaultEndpointShouldRestoreMessageForSharer() {
+        bartSendMessageToHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+        String messageId = listMessageIdsForAccount(homerAccessToken).get(0);
+        homerMovesTheMailInAnotherMailbox(messageId);
+
+        homerSharesHisMailboxWithBart();
+
+        bartDeletesMessages(ImmutableList.of(messageId));
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 0);
+
+        restoreAllMessagesOfHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+        String newMessageId = listMessageIdsForAccount(homerAccessToken).get(0);
+        given()
+            .header("Authorization", homerAccessToken.serialize())
+            .body("[[\"getMessages\", {\"ids\": [\"" + newMessageId + "\"]}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+            .then()
+            .statusCode(200)
+            .log().ifValidationFails()
+            .body(ARGUMENTS + ".list.subject", hasItem(SUBJECT));
+    }
+
+    private void homerSharesHisMailboxWithBart() {
+        with()
+            .header("Authorization", homerAccessToken.serialize())
+            .body("[" +
+                "  [ \"setMailboxes\"," +
+                "    {" +
+                "      \"update\": {" +
+                "        \"" + otherMailboxId.serialize() + "\" : {" +
+                "          \"sharedWith\" : {\"" + BART + "\": [\"a\", \"w\", \"r\"]}" +
+                "        }" +
+                "      }" +
+                "    }," +
+                "    \"#0\"" +
+                "  ]" +
+                "]")
+            .post("/jmap");
+    }
+
     private void bartSendMessageToHomer() {
         String messageCreationId = "creationId";
         String outboxId = getOutboxId(bartAccessToken);
@@ -340,8 +410,12 @@ public abstract class DeletedMessagesVaultTest {
     }
 
     private void restoreAllMessagesOfHomer() {
+        restoreMessagesFor(HOMER);
+    }
+
+    private void restoreMessagesFor(String user) {
         String taskId = webAdminApi.with()
-            .post("/deletedMessages/user/" + HOMER + "?action=restore")
+            .post("/deletedMessages/user/" + user + "?action=restore")
             .jsonPath()
             .get("taskId");
 
diff --git a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java
index df88db8..956d362 100644
--- a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java
+++ b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java
@@ -56,7 +56,7 @@ public class MemoryDeletedMessagesVaultTest extends DeletedMessagesVaultTest {
     @Category(BasicFeature.class)
     @Override
     @Test
-    public void postShouldRestoreImapDeletedMailbox() {
+    public void vaultEndpointShouldRestoreImapDeletedMailbox() {
 
     }
 }
diff --git a/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
index 0527b86..f60b8d9 100644
--- a/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
+++ b/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
@@ -61,7 +61,7 @@ public class RabbitMQDeletedMessagesVaultTest extends DeletedMessagesVaultTest {
     @Category(BasicFeature.class)
     @Override
     @Test
-    public void postShouldRestoreImapDeletedMailbox() {
+    public void vaultEndpointShouldRestoreImapDeletedMailbox() {
 
     }
     


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


[james-project] 10/15: JAMES-2665 Moved messages should not end up in the vault

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 88102e590dc31b573983ddbb8f5b0117e660d796
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Mar 6 10:43:24 2019 +0700

    JAMES-2665 Moved messages should not end up in the vault
---
 .../integration/DeletedMessagesVaultTest.java      | 61 +++++++++++++++++++++-
 1 file changed, 60 insertions(+), 1 deletion(-)

diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
index 3620607..e986f8c 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
@@ -42,6 +42,7 @@ import org.apache.james.GuiceJamesServer;
 import org.apache.james.jmap.api.access.AccessToken;
 import org.apache.james.jmap.categories.BasicFeature;
 import org.apache.james.mailbox.DefaultMailboxes;
+import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.probe.MailboxProbe;
 import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.modules.protocols.ImapGuiceProbe;
@@ -74,6 +75,7 @@ public abstract class DeletedMessagesVaultTest {
     private static final ConditionFactory WAIT_TWO_MINUTES = calmlyAwait.atMost(Duration.TWO_MINUTES);
     private static final String SUBJECT = "This mail will be restored from the vault!!";
     private static final String MAILBOX_NAME = "toBeDeleted";
+    private MailboxId otherMailboxId;
 
     protected abstract GuiceJamesServer createJmapServer() throws IOException;
 
@@ -101,7 +103,7 @@ public abstract class DeletedMessagesVaultTest {
         dataProbe.addUser(HOMER, PASSWORD);
         dataProbe.addUser(BART, BOB_PASSWORD);
         mailboxProbe.createMailbox("#private", HOMER, DefaultMailboxes.INBOX);
-        mailboxProbe.createMailbox("#private", HOMER, MAILBOX_NAME);
+        otherMailboxId = mailboxProbe.createMailbox("#private", HOMER, MAILBOX_NAME);
         homerAccessToken = authenticateJamesUser(baseUri(jmapServer), HOMER, PASSWORD);
         bartAccessToken = authenticateJamesUser(baseUri(jmapServer), BART, BOB_PASSWORD);
 
@@ -204,6 +206,43 @@ public abstract class DeletedMessagesVaultTest {
     }
 
     @Test
+    public void imapMovedMessageShouldNotEndUpInTheVault() throws Exception {
+        bartSendMessageToHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+        imapMessageReader.connect(LOCALHOST_IP, jmapServer.getProbe(ImapGuiceProbe.class).getImapPort())
+            .login(HOMER, PASSWORD)
+            .select(IMAPMessageReader.INBOX);
+
+        imapMessageReader.moveFirstMessage(MAILBOX_NAME);
+
+        //Moved messages should not be moved to the vault
+        restoreAllMessagesOfHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+
+        // No messages restored for bart
+        assertThat(listMessageIdsForAccount(bartAccessToken).size()).isEqualTo(1);
+    }
+
+    @Test
+    public void jmapMovedMessageShouldNotEndUpInTheVault() {
+        bartSendMessageToHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+        String messageId = listMessageIdsForAccount(homerAccessToken).get(0);
+
+        homerMovesTheMailInAnotherMailbox(messageId);
+
+        //Moved messages should not be moved to the vault
+        restoreAllMessagesOfHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+
+        // No messages restored for bart
+        assertThat(listMessageIdsForAccount(bartAccessToken).size()).isEqualTo(1);
+    }
+
+    @Test
     public void restoreShouldNotImpactOtherUsers() {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
@@ -311,4 +350,24 @@ public abstract class DeletedMessagesVaultTest {
             .then()
             .body("status", is("completed"));
     }
+
+    private void homerMovesTheMailInAnotherMailbox(String messageId) {
+        String updateRequestBody = "[" +
+            "  [" +
+            "    \"setMessages\"," +
+            "    {" +
+            "      \"update\": { \"" + messageId  + "\" : {" +
+            "        \"mailboxIds\": [\"" + otherMailboxId.serialize() + "\"]" +
+            "      }}" +
+            "    }," +
+            "    \"#0\"" +
+            "  ]" +
+            "]";
+
+        given()
+            .header("Authorization", bartAccessToken.serialize())
+            .body(updateRequestBody)
+            .when()
+            .post("/jmap");
+    }
 }


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


[james-project] 07/15: JAMES-2665 Basic first integration test for RabbitMQ and the vault

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 7fc5ee200b6fe62b3f2e9769a19f9cfcd8dcfc48
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Mar 5 15:04:24 2019 +0700

    JAMES-2665 Basic first integration test for RabbitMQ and the vault
    
    Exercise it on Cassandra mail repositories
---
 .../methods/integration/DeletedMessagesVaultTest.java  |  2 +-
 .../rabbitmq/RabbitMQDeletedMessagesVaultTest.java}    | 18 ++++++++++++------
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
index ba529c7..9e035ab 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
@@ -110,7 +110,7 @@ public abstract class DeletedMessagesVaultTest {
 
     @Category(BasicFeature.class)
     @Test
-    public void shouldSendANoticeWhenThresholdExceeded() {
+    public void postShouldRestoreJmapDeletedEmail() {
         bartSendMessageToHomer();
         WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
 
diff --git a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryFileRepositoryDeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
similarity index 79%
rename from server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryFileRepositoryDeletedMessagesVaultTest.java
rename to server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
index 11f8373..6382811 100644
--- a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryFileRepositoryDeletedMessagesVaultTest.java
+++ b/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
@@ -17,12 +17,13 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jmap.memory;
+package org.apache.james.jmap.rabbitmq;
 
 import java.io.IOException;
 
+import org.apache.james.CassandraRabbitMQSwiftJmapTestRule;
+import org.apache.james.DockerCassandraRule;
 import org.apache.james.GuiceJamesServer;
-import org.apache.james.MemoryJmapTestRule;
 import org.apache.james.jmap.methods.integration.DeletedMessagesVaultTest;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.modules.mailbox.PreDeletionHookConfiguration;
@@ -30,21 +31,26 @@ import org.apache.james.modules.mailbox.PreDeletionHooksConfiguration;
 import org.apache.james.vault.DeletedMessageVaultHook;
 import org.apache.james.vault.MailRepositoryDeletedMessageVault;
 import org.apache.james.webadmin.WebAdminConfiguration;
+import org.junit.ClassRule;
 import org.junit.Rule;
 
-public class MemoryFileRepositoryDeletedMessagesVaultTest extends DeletedMessagesVaultTest {
+public class RabbitMQDeletedMessagesVaultTest extends DeletedMessagesVaultTest {
+
+    @ClassRule
+    public static DockerCassandraRule cassandra = new DockerCassandraRule();
 
     @Rule
-    public MemoryJmapTestRule memoryJmap = new MemoryJmapTestRule();
+    public CassandraRabbitMQSwiftJmapTestRule rule = CassandraRabbitMQSwiftJmapTestRule.defaultTestRule();
 
     @Override
     protected GuiceJamesServer createJmapServer() throws IOException {
-        return memoryJmap.jmapServer(
+        return rule.jmapServer(cassandra.getModule(),
             binder -> binder.bind(PreDeletionHooksConfiguration.class)
                 .toInstance(PreDeletionHooksConfiguration.forHooks(
                     PreDeletionHookConfiguration.forClass(DeletedMessageVaultHook.class))),
             binder -> binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION),
             binder -> binder.bind(MailRepositoryDeletedMessageVault.Configuration.class)
-                .toInstance(new MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("file://var/deletedMessages/user"))));
+                .toInstance(new MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("cassandra://var/deletedMessages/user"))));
     }
+    
 }


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


[james-project] 14/15: JAMES-2666 solve group deserialization issue with event dead letters routes

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 2fcc843e29f182d0a0977addb61939b80504f811
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Mar 8 17:58:03 2019 +0700

    JAMES-2666 solve group deserialization issue with event dead letters routes
---
 .../api/src/test/java/org/apache/james/mailbox/util/EventCollector.java | 2 +-
 .../apache/james/mailbox/caching/CacheInvalidatingMailboxListener.java  | 2 +-
 .../apache/james/mailbox/cassandra/MailboxOperationLoggingListener.java | 2 +-
 .../elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java  | 2 +-
 .../mailbox/quota/mailing/listeners/QuotaThresholdCrossingListener.java | 2 +-
 .../search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java  | 2 +-
 .../org/apache/james/mailbox/spamassassin/SpamAssassinListener.java     | 2 +-
 .../org/apache/james/mailbox/store/event/MailboxAnnotationListener.java | 2 +-
 .../apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java  | 2 +-
 .../org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java   | 2 +-
 .../test/java/org/apache/james/modules/mailbox/NoopMailboxListener.java | 2 +-
 .../java/org/apache/james/jmap/event/PropagateLookupRightListener.java  | 2 +-
 12 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/util/EventCollector.java b/mailbox/api/src/test/java/org/apache/james/mailbox/util/EventCollector.java
index 392cc95..58908c4 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/util/EventCollector.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/util/EventCollector.java
@@ -27,7 +27,7 @@ import org.apache.james.mailbox.events.Group;
 import org.apache.james.mailbox.events.MailboxListener;
 
 public class EventCollector implements MailboxListener.GroupMailboxListener {
-    private static class EventCollectorGroup extends Group {}
+    public static class EventCollectorGroup extends Group {}
 
     private static final Group GROUP = new EventCollectorGroup();
 
diff --git a/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListener.java b/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListener.java
index 7e39cc0..d911604 100644
--- a/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListener.java
+++ b/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListener.java
@@ -13,7 +13,7 @@ import org.slf4j.LoggerFactory;
  *
  */
 public class CacheInvalidatingMailboxListener implements MailboxListener.GroupMailboxListener {
-    private static class CacheInvalidatingMailboxListenerGroup extends Group {}
+    public static class CacheInvalidatingMailboxListenerGroup extends Group {}
 
     private static final Logger LOGGER = LoggerFactory.getLogger(CacheInvalidatingMailboxListener.class);
     private static final Group GROUP = new CacheInvalidatingMailboxListenerGroup();
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListener.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListener.java
index 26537a3..7e98f07 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListener.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListener.java
@@ -33,7 +33,7 @@ import org.apache.james.mailbox.events.MailboxListener;
  * This class logs mailboxes writes in order to give context to analyse ghost mailbox bug.
  */
 public class MailboxOperationLoggingListener implements MailboxListener.GroupMailboxListener {
-    private static class MailboxOperationLoggingListenerGroup extends Group {}
+    public static class MailboxOperationLoggingListenerGroup extends Group {}
 
     public static final String ADDED = "Added";
     public static final String REMOVED = "Removed";
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
index f0df750..9b7e29d 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
@@ -60,7 +60,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 
 public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSearchIndex {
-    private static class ElasticSearchListeningMessageSearchIndexGroup extends Group {}
+    public static class ElasticSearchListeningMessageSearchIndexGroup extends Group {}
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchListeningMessageSearchIndex.class);
     private static final String ID_SEPARATOR = ":";
diff --git a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListener.java b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListener.java
index c19e834..aa8adc6 100644
--- a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListener.java
+++ b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListener.java
@@ -41,7 +41,7 @@ import org.apache.mailet.MailetContext;
 import com.google.common.collect.ImmutableSet;
 
 public class QuotaThresholdCrossingListener implements MailboxListener.GroupMailboxListener {
-    private static class QuotaThresholdCrossingListenerGroup extends Group {}
+    public static class QuotaThresholdCrossingListenerGroup extends Group {}
 
     private static final Group GROUP = new QuotaThresholdCrossingListenerGroup();
 
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java
index 0f167a3..d58ca2e 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java
@@ -32,7 +32,7 @@ import org.apache.james.quota.search.elasticsearch.json.QuotaRatioToElasticSearc
 import com.fasterxml.jackson.core.JsonProcessingException;
 
 public class ElasticSearchQuotaMailboxListener implements MailboxListener.GroupMailboxListener {
-    private static class ElasticSearchQuotaMailboxListenerGroup extends Group {}
+    public static class ElasticSearchQuotaMailboxListenerGroup extends Group {}
 
     private static final Group GROUP = new ElasticSearchQuotaMailboxListenerGroup();
 
diff --git a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java
index b50ecba..78bddc9 100644
--- a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java
+++ b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java
@@ -50,7 +50,7 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
 
 public class SpamAssassinListener implements SpamEventListener {
-    private static class SpamAssassinListenerGroup extends Group {}
+    public static class SpamAssassinListenerGroup extends Group {}
 
     private static final Logger LOGGER = LoggerFactory.getLogger(SpamAssassinListener.class);
     private static final int LIMIT = 1;
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
index 1b38e37..4fa8696 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
@@ -34,7 +34,7 @@ import org.apache.james.mailbox.store.SessionProvider;
 import org.apache.james.mailbox.store.mail.AnnotationMapper;
 
 public class MailboxAnnotationListener implements MailboxListener.GroupMailboxListener {
-    private static final class MailboxAnnotationListenerGroup extends Group {}
+    public static final class MailboxAnnotationListenerGroup extends Group {}
 
     private static final Group GROUP = new MailboxAnnotationListenerGroup();
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
index 79bb030..8196958 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
@@ -36,7 +36,7 @@ import org.apache.james.mailbox.store.event.EventFactory;
 import com.google.common.collect.ImmutableSet;
 
 public class ListeningCurrentQuotaUpdater implements MailboxListener.GroupMailboxListener, QuotaUpdater {
-    private static class ListeningCurrentQuotaUpdaterGroup extends Group {}
+    public static class ListeningCurrentQuotaUpdaterGroup extends Group {}
 
     public static final Group GROUP = new ListeningCurrentQuotaUpdaterGroup();
     private static final ImmutableSet<RegistrationKey> NO_REGISTRATION_KEYS = ImmutableSet.of();
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
index 8ab47bf..0567fb9 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
@@ -56,7 +56,7 @@ import com.google.common.base.Preconditions;
  *
  */
 public class LazyMessageSearchIndex extends ListeningMessageSearchIndex {
-    private static class LazyMessageSearchIndexGroup extends Group {}
+    public static class LazyMessageSearchIndexGroup extends Group {}
 
     private static final Logger LOGGER = LoggerFactory.getLogger(LazyMessageSearchIndex.class);
     private static final Group GROUP = new LazyMessageSearchIndexGroup();
diff --git a/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/NoopMailboxListener.java b/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/NoopMailboxListener.java
index 0fea4d6..7c97c37 100644
--- a/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/NoopMailboxListener.java
+++ b/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/NoopMailboxListener.java
@@ -23,7 +23,7 @@ import org.apache.james.mailbox.events.Group;
 import org.apache.james.mailbox.events.MailboxListener;
 
 public class NoopMailboxListener implements MailboxListener.GroupMailboxListener {
-    private static class NoopMailboxListenerGroup extends Group {}
+    public static class NoopMailboxListenerGroup extends Group {}
 
     static final Group GROUP = new NoopMailboxListenerGroup();
 
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
index 64a906c..96ee12d 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
@@ -39,7 +39,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class PropagateLookupRightListener implements MailboxListener.GroupMailboxListener {
-    private static class PropagateLookupRightListenerGroup extends Group {}
+    public static class PropagateLookupRightListenerGroup extends Group {}
 
     private static final Logger LOGGER = LoggerFactory.getLogger(PropagateLookupRightListener.class);
     private static final Group GROUP = new PropagateLookupRightListenerGroup();


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


[james-project] 09/15: JAMES-2665 Add a test upon mailbox deletion

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 45af710d90d1a56d6a506c5f7740041c9507b261
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Mar 6 10:33:44 2019 +0700

    JAMES-2665 Add a test upon mailbox deletion
---
 .../CassandraDeletedMessageVaultTest.java          | 12 ++++
 .../integration/DeletedMessagesVaultTest.java      | 71 ++++++++++++++++++++++
 .../memory/MemoryDeletedMessagesVaultTest.java     | 12 ++++
 .../rabbitmq/RabbitMQDeletedMessagesVaultTest.java | 12 ++++
 .../org/apache/james/utils/IMAPMessageReader.java  |  5 ++
 5 files changed, 112 insertions(+)

diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java
index e6f1cf5..9381f3c 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 import org.apache.james.CassandraJmapTestRule;
 import org.apache.james.DockerCassandraRule;
 import org.apache.james.GuiceJamesServer;
+import org.apache.james.jmap.categories.BasicFeature;
 import org.apache.james.jmap.methods.integration.DeletedMessagesVaultTest;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.modules.mailbox.PreDeletionHookConfiguration;
@@ -33,6 +34,9 @@ import org.apache.james.vault.MailRepositoryDeletedMessageVault;
 import org.apache.james.webadmin.WebAdminConfiguration;
 import org.junit.ClassRule;
 import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Disabled;
 
 public class CassandraDeletedMessageVaultTest extends DeletedMessagesVaultTest {
 
@@ -52,4 +56,12 @@ public class CassandraDeletedMessageVaultTest extends DeletedMessagesVaultTest {
             binder -> binder.bind(MailRepositoryDeletedMessageVault.Configuration.class)
                 .toInstance(new MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("cassandra://var/deletedMessages/user"))));
     }
+
+    @Disabled("MAILBOX-379 PreDeletionHook are not yet triggered upon mailbox deletion")
+    @Category(BasicFeature.class)
+    @Override
+    @Test
+    public void postShouldRestoreImapDeletedMailbox() {
+
+    }
 }
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
index f44247a..3620607 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
@@ -27,6 +27,7 @@ import static org.apache.james.jmap.JmapCommonRequests.listMessageIdsForAccount;
 import static org.apache.james.jmap.JmapURIBuilder.baseUri;
 import static org.apache.james.jmap.TestingConstants.ARGUMENTS;
 import static org.apache.james.jmap.TestingConstants.DOMAIN;
+import static org.apache.james.jmap.TestingConstants.LOCALHOST_IP;
 import static org.apache.james.jmap.TestingConstants.calmlyAwait;
 import static org.apache.james.jmap.TestingConstants.jmapRequestSpecBuilder;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -43,8 +44,10 @@ import org.apache.james.jmap.categories.BasicFeature;
 import org.apache.james.mailbox.DefaultMailboxes;
 import org.apache.james.mailbox.probe.MailboxProbe;
 import org.apache.james.modules.MailboxProbeImpl;
+import org.apache.james.modules.protocols.ImapGuiceProbe;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.utils.DataProbeImpl;
+import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.JmapGuiceProbe;
 import org.apache.james.utils.WebAdminGuiceProbe;
 import org.apache.james.webadmin.WebAdminUtils;
@@ -52,8 +55,10 @@ import org.awaitility.Duration;
 import org.awaitility.core.ConditionFactory;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Disabled;
 
 import com.google.common.base.Strings;
 
@@ -68,9 +73,13 @@ public abstract class DeletedMessagesVaultTest {
     private static final String BOB_PASSWORD = "bobPassword";
     private static final ConditionFactory WAIT_TWO_MINUTES = calmlyAwait.atMost(Duration.TWO_MINUTES);
     private static final String SUBJECT = "This mail will be restored from the vault!!";
+    private static final String MAILBOX_NAME = "toBeDeleted";
 
     protected abstract GuiceJamesServer createJmapServer() throws IOException;
 
+    @Rule
+    public IMAPMessageReader imapMessageReader = new IMAPMessageReader();
+
     private AccessToken homerAccessToken;
     private AccessToken bartAccessToken;
     private GuiceJamesServer jmapServer;
@@ -92,6 +101,7 @@ public abstract class DeletedMessagesVaultTest {
         dataProbe.addUser(HOMER, PASSWORD);
         dataProbe.addUser(BART, BOB_PASSWORD);
         mailboxProbe.createMailbox("#private", HOMER, DefaultMailboxes.INBOX);
+        mailboxProbe.createMailbox("#private", HOMER, MAILBOX_NAME);
         homerAccessToken = authenticateJamesUser(baseUri(jmapServer), HOMER, PASSWORD);
         bartAccessToken = authenticateJamesUser(baseUri(jmapServer), BART, BOB_PASSWORD);
 
@@ -132,6 +142,67 @@ public abstract class DeletedMessagesVaultTest {
             .body(ARGUMENTS + ".list.subject", hasItem(SUBJECT));
     }
 
+    @Category(BasicFeature.class)
+    @Test
+    public void postShouldRestoreImapDeletedEmail() throws Exception {
+        bartSendMessageToHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+        imapMessageReader.connect(LOCALHOST_IP, jmapServer.getProbe(ImapGuiceProbe.class).getImapPort())
+            .login(HOMER, PASSWORD)
+            .select(IMAPMessageReader.INBOX)
+            .setFlagsForAllMessagesInMailbox("\\Deleted");
+        imapMessageReader.expunge();
+
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 0);
+
+        restoreAllMessagesOfHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+        String messageId = listMessageIdsForAccount(homerAccessToken).get(0);
+        given()
+            .header("Authorization", homerAccessToken.serialize())
+            .body("[[\"getMessages\", {\"ids\": [\"" + messageId + "\"]}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .log().ifValidationFails()
+            .body(ARGUMENTS + ".list.subject", hasItem(SUBJECT));
+    }
+
+    @Disabled("MAILBOX-379 PreDeletionHook are not yet triggered upon mailbox deletion")
+    @Category(BasicFeature.class)
+    @Test
+    public void postShouldRestoreImapDeletedMailbox() throws Exception {
+        bartSendMessageToHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+        imapMessageReader.connect(LOCALHOST_IP, jmapServer.getProbe(ImapGuiceProbe.class).getImapPort())
+            .login(HOMER, PASSWORD)
+            .select(IMAPMessageReader.INBOX);
+
+        imapMessageReader.moveFirstMessage(MAILBOX_NAME);
+
+        imapMessageReader.delete(MAILBOX_NAME);
+
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 0);
+
+        restoreAllMessagesOfHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+        String messageId = listMessageIdsForAccount(homerAccessToken).get(0);
+        given()
+            .header("Authorization", homerAccessToken.serialize())
+            .body("[[\"getMessages\", {\"ids\": [\"" + messageId + "\"]}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .log().ifValidationFails()
+            .body(ARGUMENTS + ".list.subject", hasItem(SUBJECT));
+    }
+
     @Test
     public void restoreShouldNotImpactOtherUsers() {
         bartSendMessageToHomer();
diff --git a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java
index 5f45e97..df88db8 100644
--- a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java
+++ b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java
@@ -23,6 +23,7 @@ import java.io.IOException;
 
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.MemoryJmapTestRule;
+import org.apache.james.jmap.categories.BasicFeature;
 import org.apache.james.jmap.methods.integration.DeletedMessagesVaultTest;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.modules.mailbox.PreDeletionHookConfiguration;
@@ -31,6 +32,9 @@ import org.apache.james.vault.DeletedMessageVaultHook;
 import org.apache.james.vault.MailRepositoryDeletedMessageVault;
 import org.apache.james.webadmin.WebAdminConfiguration;
 import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Disabled;
 
 public class MemoryDeletedMessagesVaultTest extends DeletedMessagesVaultTest {
 
@@ -47,4 +51,12 @@ public class MemoryDeletedMessagesVaultTest extends DeletedMessagesVaultTest {
             binder -> binder.bind(MailRepositoryDeletedMessageVault.Configuration.class)
                 .toInstance(new MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("memory://var/deletedMessages/user"))));
     }
+
+    @Disabled("MAILBOX-379 PreDeletionHook are not yet triggered upon mailbox deletion")
+    @Category(BasicFeature.class)
+    @Override
+    @Test
+    public void postShouldRestoreImapDeletedMailbox() {
+
+    }
 }
diff --git a/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
index 6382811..0527b86 100644
--- a/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
+++ b/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 import org.apache.james.CassandraRabbitMQSwiftJmapTestRule;
 import org.apache.james.DockerCassandraRule;
 import org.apache.james.GuiceJamesServer;
+import org.apache.james.jmap.categories.BasicFeature;
 import org.apache.james.jmap.methods.integration.DeletedMessagesVaultTest;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.modules.mailbox.PreDeletionHookConfiguration;
@@ -33,6 +34,9 @@ import org.apache.james.vault.MailRepositoryDeletedMessageVault;
 import org.apache.james.webadmin.WebAdminConfiguration;
 import org.junit.ClassRule;
 import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Disabled;
 
 public class RabbitMQDeletedMessagesVaultTest extends DeletedMessagesVaultTest {
 
@@ -52,5 +56,13 @@ public class RabbitMQDeletedMessagesVaultTest extends DeletedMessagesVaultTest {
             binder -> binder.bind(MailRepositoryDeletedMessageVault.Configuration.class)
                 .toInstance(new MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("cassandra://var/deletedMessages/user"))));
     }
+
+    @Disabled("MAILBOX-379 PreDeletionHook are not yet triggered upon mailbox deletion")
+    @Category(BasicFeature.class)
+    @Override
+    @Test
+    public void postShouldRestoreImapDeletedMailbox() {
+
+    }
     
 }
diff --git a/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java b/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java
index 80d2786..0c9826f 100644
--- a/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java
+++ b/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java
@@ -67,6 +67,11 @@ public class IMAPMessageReader extends ExternalResource implements Closeable, Af
         return this;
     }
 
+    public IMAPMessageReader delete(String mailbox) throws IOException {
+        imapClient.delete(mailbox);
+        return this;
+    }
+
     public boolean hasAMessage() throws IOException {
         imapClient.fetch("1:1", "ALL");
         return imapClient.getReplyString()


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


[james-project] 15/15: JAMES-2666 add unit test for each group deserialization

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 7b4e8d2b6a54d7bf0814f62d193f10e1e58a6223
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Mon Mar 11 11:17:17 2019 +0700

    JAMES-2666 add unit test for each group deserialization
---
 mailbox/caching/pom.xml                            |  9 ++++--
 .../CacheInvalidatingMailboxListenerTest.java      | 33 ++++++++++++++++++++++
 .../MailboxOperationLoggingListenerTest.java       | 33 ++++++++++++++++++++++
 ...asticSearchListeningMessageSearchIndexTest.java |  8 ++++++
 .../james/mailbox/events/RabbitMQEventBusTest.java |  7 +++++
 .../QuotaThresholdCrossingListenerTest.java        | 33 ++++++++++++++++++++++
 .../ElasticSearchQuotaMailboxListenerTest.java     |  7 +++++
 .../spamassassin/SpamAssassinListenerTest.java     |  7 +++++
 .../store/event/MailboxAnnotationListenerTest.java |  8 ++++++
 .../quota/ListeningCurrentQuotaUpdaterTest.java    |  8 ++++++
 .../store/search/LazyMessageSearchIndexTest.java   | 33 ++++++++++++++++++++++
 .../mailbox/MailboxListenersLoaderImplTest.java    |  6 ++++
 .../event/PropagateLookupRightListenerTest.java    |  7 +++++
 13 files changed, 197 insertions(+), 2 deletions(-)

diff --git a/mailbox/caching/pom.xml b/mailbox/caching/pom.xml
index 486cfd0..dc39f84 100644
--- a/mailbox/caching/pom.xml
+++ b/mailbox/caching/pom.xml
@@ -50,8 +50,13 @@
             <artifactId>guava</artifactId>
         </dependency>
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
diff --git a/mailbox/caching/src/test/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListenerTest.java b/mailbox/caching/src/test/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListenerTest.java
new file mode 100644
index 0000000..db725b1
--- /dev/null
+++ b/mailbox/caching/src/test/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListenerTest.java
@@ -0,0 +1,33 @@
+/****************************************************************
+ * 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.mailbox.caching;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.mailbox.events.Group;
+import org.junit.jupiter.api.Test;
+
+class CacheInvalidatingMailboxListenerTest {
+    @Test
+    void deserializeCacheInvalidatingMailboxListenerGroup() throws Exception {
+        assertThat(Group.deserialize("org.apache.james.mailbox.caching.CacheInvalidatingMailboxListener$CacheInvalidatingMailboxListenerGroup"))
+            .isEqualTo(new CacheInvalidatingMailboxListener.CacheInvalidatingMailboxListenerGroup());
+    }
+}
\ No newline at end of file
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListenerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListenerTest.java
new file mode 100644
index 0000000..45adb03
--- /dev/null
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListenerTest.java
@@ -0,0 +1,33 @@
+/****************************************************************
+ * 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.mailbox.cassandra;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.mailbox.events.Group;
+import org.junit.jupiter.api.Test;
+
+class MailboxOperationLoggingListenerTest {
+    @Test
+    void deserializeMailboxOperationLoggingListenerGroup() throws Exception {
+        assertThat(Group.deserialize("org.apache.james.mailbox.cassandra.MailboxOperationLoggingListener$MailboxOperationLoggingListenerGroup"))
+            .isEqualTo(new MailboxOperationLoggingListener.MailboxOperationLoggingListenerGroup());
+    }
+}
\ No newline at end of file
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java
index 0dc602f..e6510eb 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.mailbox.elasticsearch.events;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyLong;
@@ -41,6 +42,7 @@ import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.elasticsearch.json.MessageToElasticSearchJson;
 import org.apache.james.mailbox.elasticsearch.search.ElasticSearchSearcher;
+import org.apache.james.mailbox.events.Group;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
@@ -92,6 +94,12 @@ public class ElasticSearchListeningMessageSearchIndexTest {
         mailbox = mock(Mailbox.class);
         when(mailbox.getMailboxId()).thenReturn(MAILBOX_ID);
     }
+
+    @Test
+    public void deserializeElasticSearchListeningMessageSearchIndexGroup() throws Exception {
+        assertThat(Group.deserialize("org.apache.james.mailbox.elasticsearch.events.ElasticSearchListeningMessageSearchIndex$ElasticSearchListeningMessageSearchIndexGroup"))
+            .isEqualTo(new ElasticSearchListeningMessageSearchIndex.ElasticSearchListeningMessageSearchIndexGroup());
+    }
     
     @Test
     public void addShouldIndex() throws Exception {
diff --git a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
index f9d922d..7d70ea5 100644
--- a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
+++ b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
@@ -59,6 +59,7 @@ import org.apache.james.mailbox.events.EventBusTestFixture.GroupA;
 import org.apache.james.mailbox.events.EventBusTestFixture.MailboxListenerCountingSuccessfulExecution;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.TestMessageId;
+import org.apache.james.mailbox.util.EventCollector;
 import org.apache.james.metrics.api.NoopMetricFactory;
 import org.apache.james.util.concurrency.ConcurrentTestRunner;
 import org.junit.jupiter.api.AfterEach;
@@ -157,6 +158,12 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
     }
 
     @Test
+    void deserializeEventCollectorGroup() throws Exception {
+        assertThat(Group.deserialize("org.apache.james.mailbox.util.EventCollector$EventCollectorGroup"))
+            .isEqualTo(new EventCollector.EventCollectorGroup());
+    }
+
+    @Test
     void registerGroupShouldCreateRetryExchange() throws Exception {
         MailboxListener listener = newListener();
         EventBusTestFixture.GroupA registeredGroup = new EventBusTestFixture.GroupA();
diff --git a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListenerTest.java b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListenerTest.java
new file mode 100644
index 0000000..6b76fd5
--- /dev/null
+++ b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListenerTest.java
@@ -0,0 +1,33 @@
+/****************************************************************
+ * 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.mailbox.quota.mailing.listeners;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.mailbox.events.Group;
+import org.junit.jupiter.api.Test;
+
+class QuotaThresholdCrossingListenerTest {
+    @Test
+    void deserializeQuotaThresholdCrossingListenerGroup() throws Exception {
+        assertThat(Group.deserialize("org.apache.james.mailbox.quota.mailing.listeners.QuotaThresholdCrossingListener$QuotaThresholdCrossingListenerGroup"))
+            .isEqualTo(new QuotaThresholdCrossingListener.QuotaThresholdCrossingListenerGroup());
+    }
+}
\ No newline at end of file
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java
index a037668..bd01ab8 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java
@@ -34,6 +34,7 @@ import org.apache.james.backends.es.ElasticSearchIndexer;
 import org.apache.james.backends.es.EmbeddedElasticSearch;
 import org.apache.james.backends.es.utils.TestingClientProvider;
 import org.apache.james.mailbox.events.Event;
+import org.apache.james.mailbox.events.Group;
 import org.apache.james.mailbox.quota.QuotaFixture.Counts;
 import org.apache.james.mailbox.quota.QuotaFixture.Sizes;
 import org.apache.james.mailbox.store.event.EventFactory;
@@ -79,6 +80,12 @@ public class ElasticSearchQuotaMailboxListenerTest {
     }
 
     @Test
+    public void deserializeElasticSearchQuotaMailboxListenerGroup() throws Exception {
+        assertThat(Group.deserialize("org.apache.james.quota.search.elasticsearch.events.ElasticSearchQuotaMailboxListener$ElasticSearchQuotaMailboxListenerGroup"))
+            .isEqualTo(new ElasticSearchQuotaMailboxListener.ElasticSearchQuotaMailboxListenerGroup());
+    }
+
+    @Test
     public void eventShouldDoNothingWhenNoQuotaEvent() throws Exception {
         quotaMailboxListener.event(DUMB_EVENT);
 
diff --git a/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
index f269a43..8bcbf3c 100644
--- a/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
+++ b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.DefaultMailboxes;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
+import org.apache.james.mailbox.events.Group;
 import org.apache.james.mailbox.events.MailboxListener;
 import org.apache.james.mailbox.events.MessageMoveEvent;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -99,6 +100,12 @@ public class SpamAssassinListenerTest {
     }
 
     @Test
+    public void deserializeSpamAssassinListenerGroup() throws Exception {
+        assertThat(Group.deserialize("org.apache.james.mailbox.spamassassin.SpamAssassinListener$SpamAssassinListenerGroup"))
+            .isEqualTo(new SpamAssassinListener.SpamAssassinListenerGroup());
+    }
+
+    @Test
     public void isEventOnSpamMailboxShouldReturnFalseWhenMessageIsMovedToANonSpamMailbox() {
         MessageMoveEvent messageMoveEvent = MessageMoveEvent.builder()
             .session(MAILBOX_SESSION)
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java
index 22160cd..c189ff5 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.mailbox.store.event;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
@@ -34,6 +35,7 @@ import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.events.Event;
+import org.apache.james.mailbox.events.Group;
 import org.apache.james.mailbox.events.MailboxListener;
 import org.apache.james.mailbox.model.MailboxAnnotation;
 import org.apache.james.mailbox.model.MailboxAnnotationKey;
@@ -95,6 +97,12 @@ public class MailboxAnnotationListenerTest {
     }
 
     @Test
+    public void deserializeMailboxAnnotationListenerGroup() throws Exception {
+        assertThat(Group.deserialize("org.apache.james.mailbox.store.event.MailboxAnnotationListener$MailboxAnnotationListenerGroup"))
+            .isEqualTo(new MailboxAnnotationListener.MailboxAnnotationListenerGroup());
+    }
+
+    @Test
     public void eventShouldDoNothingIfDoNotHaveMailboxDeletionEvent() throws Exception {
         MailboxListener.MailboxEvent event = new MailboxListener.MailboxAdded(null, null, MAILBOX_PATH, MAILBOX_ID, Event.EventId.random());
         listener.event(event);
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
index 5367381..1ab9ee1 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.store.quota;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anySet;
 import static org.mockito.ArgumentMatchers.eq;
@@ -39,6 +40,7 @@ import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.events.Event;
 import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.events.Group;
 import org.apache.james.mailbox.events.MailboxListener;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageMetaData;
@@ -77,6 +79,12 @@ public class ListeningCurrentQuotaUpdaterTest {
     }
 
     @Test
+    public void deserializeListeningCurrentQuotaUpdaterGroup() throws Exception {
+        assertThat(Group.deserialize("org.apache.james.mailbox.store.quota.ListeningCurrentQuotaUpdater$ListeningCurrentQuotaUpdaterGroup"))
+            .isEqualTo(new ListeningCurrentQuotaUpdater.ListeningCurrentQuotaUpdaterGroup());
+    }
+
+    @Test
     public void addedEventShouldIncreaseCurrentQuotaValues() throws Exception {
         MailboxListener.Added added = mock(MailboxListener.Added.class);
         when(added.getMailboxId()).thenReturn(MAILBOX_ID);
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndexTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndexTest.java
new file mode 100644
index 0000000..21f7d09
--- /dev/null
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndexTest.java
@@ -0,0 +1,33 @@
+/****************************************************************
+ * 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.mailbox.store.search;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.mailbox.events.Group;
+import org.junit.jupiter.api.Test;
+
+class LazyMessageSearchIndexTest {
+    @Test
+    void deserializeLazyMessageSearchIndexGroup() throws Exception {
+        assertThat(Group.deserialize("org.apache.james.mailbox.store.search.LazyMessageSearchIndex$LazyMessageSearchIndexGroup"))
+            .isEqualTo(new LazyMessageSearchIndex.LazyMessageSearchIndexGroup());
+    }
+}
\ No newline at end of file
diff --git a/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImplTest.java b/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImplTest.java
index 722b603..9ca87b4 100644
--- a/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImplTest.java
+++ b/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImplTest.java
@@ -62,6 +62,12 @@ class MailboxListenersLoaderImplTest {
     }
 
     @Test
+    void deserializeNoopMailboxListenerGroup() throws Exception {
+        assertThat(Group.deserialize("org.apache.james.modules.mailbox.NoopMailboxListener$NoopMailboxListenerGroup"))
+            .isEqualTo(new NoopMailboxListener.NoopMailboxListenerGroup());
+    }
+
+    @Test
     void createListenerShouldThrowWhenClassCantBeLoaded() {
         ListenerConfiguration configuration = ListenerConfiguration.forClass("MyUnknownClass");
 
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
index 8edb7d9..d38b37d 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
@@ -26,6 +26,7 @@ import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.acl.GroupMembershipResolver;
 import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
+import org.apache.james.mailbox.events.Group;
 import org.apache.james.mailbox.events.MailboxListener;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.MailboxACL;
@@ -93,6 +94,12 @@ public class PropagateLookupRightListenerTest {
     }
 
     @Test
+    public void deserializePropagateLookupRightListenerGroup() throws Exception {
+        assertThat(Group.deserialize("org.apache.james.jmap.event.PropagateLookupRightListener$PropagateLookupRightListenerGroup"))
+            .isEqualTo(new PropagateLookupRightListener.PropagateLookupRightListenerGroup());
+    }
+
+    @Test
     public void getExecutionModeShouldReturnAsynchronous() throws Exception {
         assertThat(testee.getExecutionMode()).isEqualTo(MailboxListener.ExecutionMode.SYNCHRONOUS);
     }


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


[james-project] 01/15: JAMES-2665 Clock should be injected as a common service

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 643fe1c316a08b48baa9201f5810551552bc0e63
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Mar 5 10:55:19 2019 +0700

    JAMES-2665 Clock should be injected as a common service
    
    No particular reasons to only inject it for RabbitMQ.
    
    It is furthermore needed by PreDeletionHook injections for DeletedMessagesVaultHook + memory.
---
 .../java/org/apache/james/modules/ClockModule.java | 31 ++++++++++++++++++++++
 .../apache/james/modules/CommonServicesModule.java |  1 +
 .../james/modules/rabbitmq/RabbitMQModule.java     |  2 --
 3 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/ClockModule.java b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/ClockModule.java
new file mode 100644
index 0000000..3d1924b
--- /dev/null
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/ClockModule.java
@@ -0,0 +1,31 @@
+/****************************************************************
+ * 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.modules;
+
+import java.time.Clock;
+
+import com.google.inject.AbstractModule;
+
+public class ClockModule extends AbstractModule {
+    @Override
+    protected void configure() {
+        bind(Clock.class).toInstance(Clock.systemUTC());
+    }
+}
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java
index 2a43447..075d905 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java
@@ -62,6 +62,7 @@ public class CommonServicesModule extends AbstractModule {
         install(new TaskManagerModule());
         install(new CleanupTaskModule());
         install(new MimeMessageModule());
+        install(new ClockModule());
 
         bind(FileSystem.class).toInstance(fileSystem);
         bind(Configuration.class).toInstance(configuration);
diff --git a/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java b/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java
index 5d42930..ec74bf4 100644
--- a/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java
+++ b/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java
@@ -19,7 +19,6 @@
 package org.apache.james.modules.rabbitmq;
 
 import java.io.FileNotFoundException;
-import java.time.Clock;
 import java.util.concurrent.ThreadLocalRandom;
 
 import javax.inject.Named;
@@ -63,7 +62,6 @@ public class RabbitMQModule extends AbstractModule {
 
     @Override
     protected void configure() {
-        bind(Clock.class).toInstance(Clock.systemUTC());
         bind(ThreadLocalRandom.class).toInstance(ThreadLocalRandom.current());
 
         bind(EnqueuedMailsDAO.class).in(Scopes.SINGLETON);


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


[james-project] 08/15: JAMES-2665 Add more tests for the vault feature

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 5b6c3e91e816533b4ab7dc574a4e701796ddedec
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Mar 6 10:16:18 2019 +0700

    JAMES-2665 Add more tests for the vault feature
---
 .../integration/DeletedMessagesVaultTest.java      | 62 ++++++++++++++++++++--
 1 file changed, 57 insertions(+), 5 deletions(-)

diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
index 9e035ab..f44247a 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
@@ -29,6 +29,7 @@ import static org.apache.james.jmap.TestingConstants.ARGUMENTS;
 import static org.apache.james.jmap.TestingConstants.DOMAIN;
 import static org.apache.james.jmap.TestingConstants.calmlyAwait;
 import static org.apache.james.jmap.TestingConstants.jmapRequestSpecBuilder;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.hamcrest.Matchers.hasItem;
 import static org.hamcrest.Matchers.is;
 
@@ -47,7 +48,6 @@ import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.JmapGuiceProbe;
 import org.apache.james.utils.WebAdminGuiceProbe;
 import org.apache.james.webadmin.WebAdminUtils;
-import org.apache.james.webadmin.routes.TasksRoutes;
 import org.awaitility.Duration;
 import org.awaitility.core.ConditionFactory;
 import org.junit.After;
@@ -132,6 +132,52 @@ public abstract class DeletedMessagesVaultTest {
             .body(ARGUMENTS + ".list.subject", hasItem(SUBJECT));
     }
 
+    @Test
+    public void restoreShouldNotImpactOtherUsers() {
+        bartSendMessageToHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+        homerDeletesMessages(listMessageIdsForAccount(homerAccessToken));
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 0);
+
+        bartDeletesMessages(listMessageIdsForAccount(bartAccessToken));
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(bartAccessToken).size() == 0);
+
+        restoreAllMessagesOfHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+        // No messages restored for bart
+        assertThat(listMessageIdsForAccount(bartAccessToken).size()).isEqualTo(0);
+    }
+
+    @Test
+    public void restoredMessagesShouldNotBeRemovedFromTheVault() {
+        bartSendMessageToHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+        homerDeletesMessages(listMessageIdsForAccount(homerAccessToken));
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 0);
+
+        restoreAllMessagesOfHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+        restoreAllMessagesOfHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 2);
+    }
+
+    @Test
+    public void postShouldNotRestoreItemsWhenTheVaultIsEmpty() throws Exception {
+        bartSendMessageToHomer();
+        WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+        restoreAllMessagesOfHomer();
+        Thread.sleep(Duration.FIVE_SECONDS.getValueInMS());
+
+        // No additional had been restored as the vault is empty
+        assertThat(listMessageIdsForAccount(homerAccessToken).size())
+            .isEqualTo(1);
+    }
+
     private void bartSendMessageToHomer() {
         String messageCreationId = "creationId";
         String outboxId = getOutboxId(bartAccessToken);
@@ -165,12 +211,20 @@ public abstract class DeletedMessagesVaultTest {
     }
 
     private void homerDeletesMessages(List<String> idsToDestroy) {
+        deleteMessages(homerAccessToken, idsToDestroy);
+    }
+
+    private void bartDeletesMessages(List<String> idsToDestroy) {
+        deleteMessages(bartAccessToken, idsToDestroy);
+    }
+
+    private void deleteMessages(AccessToken accessToken, List<String> idsToDestroy) {
         String idString = idsToDestroy.stream()
             .map(id -> "\"" + id + "\"")
             .collect(Collectors.joining(","));
 
         with()
-            .header("Authorization", homerAccessToken.serialize())
+            .header("Authorization", accessToken.serialize())
             .body("[[\"setMessages\", {\"destroy\": [" + idString + "]}, \"#0\"]]")
             .post("/jmap");
     }
@@ -182,9 +236,7 @@ public abstract class DeletedMessagesVaultTest {
             .get("taskId");
 
         webAdminApi.given()
-            .basePath(TasksRoutes.BASE)
-        .when()
-            .get(taskId + "/await")
+            .get("/tasks/" + taskId + "/await")
             .then()
             .body("status", is("completed"));
     }


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


[james-project] 12/15: JAMES-2665 Introduce await in Vault integration tests

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 daa40dc4ede28fd89dad13dcd6515b872ea9a9e2
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Mar 6 18:13:40 2019 +0700

    JAMES-2665 Introduce await in Vault integration tests
---
 .../james/jmap/cassandra/CassandraDeletedMessageVaultTest.java     | 5 +++++
 .../james/jmap/methods/integration/DeletedMessagesVaultTest.java   | 7 ++++---
 .../apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java   | 5 +++++
 .../james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java      | 5 +++++
 4 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java
index 8c10c51..38d20d6 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java
@@ -57,6 +57,11 @@ public class CassandraDeletedMessageVaultTest extends DeletedMessagesVaultTest {
                 .toInstance(new MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("cassandra://var/deletedMessages/user"))));
     }
 
+    @Override
+    protected void awaitSearchUpToDate() {
+        rule.await();
+    }
+
     @Disabled("MAILBOX-379 PreDeletionHook are not yet triggered upon mailbox deletion")
     @Category(BasicFeature.class)
     @Override
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
index bfbba3f..55476f0 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
@@ -80,6 +80,8 @@ public abstract class DeletedMessagesVaultTest {
 
     protected abstract GuiceJamesServer createJmapServer() throws IOException;
 
+    protected abstract void awaitSearchUpToDate();
+
     @Rule
     public IMAPMessageReader imapMessageReader = new IMAPMessageReader();
 
@@ -282,7 +284,7 @@ public abstract class DeletedMessagesVaultTest {
         WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1);
 
         restoreAllMessagesOfHomer();
-        Thread.sleep(Duration.FIVE_SECONDS.getValueInMS());
+        awaitSearchUpToDate();
 
         // No additional had been restored as the vault is empty
         assertThat(listMessageIdsForAccount(homerAccessToken).size())
@@ -304,8 +306,7 @@ public abstract class DeletedMessagesVaultTest {
         WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 0);
 
         restoreMessagesFor(BART);
-
-        Thread.sleep(Duration.FIVE_SECONDS.getValueInMS());
+        awaitSearchUpToDate();
 
         // No additional had been restored for Bart as the vault is empty
         assertThat(listMessageIdsForAccount(bartAccessToken).size())
diff --git a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java
index 956d362..c3c2516 100644
--- a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java
+++ b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java
@@ -52,6 +52,11 @@ public class MemoryDeletedMessagesVaultTest extends DeletedMessagesVaultTest {
                 .toInstance(new MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("memory://var/deletedMessages/user"))));
     }
 
+    @Override
+    protected void awaitSearchUpToDate() {
+
+    }
+
     @Disabled("MAILBOX-379 PreDeletionHook are not yet triggered upon mailbox deletion")
     @Category(BasicFeature.class)
     @Override
diff --git a/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
index f60b8d9..9e5d706 100644
--- a/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
+++ b/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
@@ -57,6 +57,11 @@ public class RabbitMQDeletedMessagesVaultTest extends DeletedMessagesVaultTest {
                 .toInstance(new MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("cassandra://var/deletedMessages/user"))));
     }
 
+    @Override
+    protected void awaitSearchUpToDate() {
+        rule.await();
+    }
+
     @Disabled("MAILBOX-379 PreDeletionHook are not yet triggered upon mailbox deletion")
     @Category(BasicFeature.class)
     @Override


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


[james-project] 13/15: JAMES-2663 Adding action parameter to restoring API path

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 8ccfd9c1f0c8bb839785d2885d1586d8f5d4377f
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Tue Mar 5 15:15:03 2019 +0700

    JAMES-2663 Adding action parameter to restoring API path
---
 .../vault/routes/DeletedMessagesVaultRoutes.java   | 92 ++++++++++++++++++----
 .../routes/DeletedMessagesVaultRoutesTest.java     | 78 +++++++++++++++++-
 src/site/markdown/server/manage-webadmin.md        | 13 ++-
 3 files changed, 160 insertions(+), 23 deletions(-)

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 3fc748a..edca31a 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
@@ -21,22 +21,31 @@ package org.apache.james.webadmin.vault.routes;
 
 import static org.apache.james.webadmin.Constants.SEPARATOR;
 
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Stream;
+
 import javax.inject.Inject;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
+import org.apache.commons.lang3.NotImplementedException;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.james.core.User;
+import org.apache.james.task.Task;
 import org.apache.james.task.TaskId;
 import org.apache.james.task.TaskManager;
 import org.apache.james.webadmin.Constants;
 import org.apache.james.webadmin.Routes;
 import org.apache.james.webadmin.dto.TaskIdDto;
-import org.apache.james.webadmin.utils.ErrorResponder;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.eclipse.jetty.http.HttpStatus;
 
+import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Joiner;
+import com.google.common.base.Preconditions;
 
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -53,9 +62,39 @@ import spark.Service;
 @Produces(Constants.JSON_CONTENT_TYPE)
 public class DeletedMessagesVaultRoutes implements Routes {
 
+    enum UserVaultAction {
+        RESTORE("restore");
+
+        static Optional<UserVaultAction> getAction(String value) {
+            Preconditions.checkNotNull(value, "action cannot be null");
+            Preconditions.checkArgument(StringUtils.isNotBlank(value), "action cannot be empty or blank");
+
+            return Stream.of(values())
+                .filter(action -> action.value.equals(value))
+                .findFirst();
+        }
+
+        private static List<String> plainValues() {
+            return Stream.of(values())
+                .map(UserVaultAction::getValue)
+                .collect(Guavate.toImmutableList());
+        }
+
+        private final String value;
+
+        UserVaultAction(String value) {
+            this.value = value;
+        }
+
+        public String getValue() {
+            return value;
+        }
+    }
+
     public static final String ROOT_PATH = "deletedMessages/user";
     private static final String USER_PATH_PARAM = "user";
     private static final String RESTORE_PATH = ROOT_PATH + SEPARATOR + ":" + USER_PATH_PARAM;
+    private static final String ACTION_QUERY_PARAM = "action";
 
     private final RestoreService vaultRestore;
     private final JsonTransformer jsonTransformer;
@@ -77,7 +116,7 @@ public class DeletedMessagesVaultRoutes implements Routes {
 
     @Override
     public void define(Service service) {
-        service.post(RESTORE_PATH, this::restore, jsonTransformer);
+        service.post(RESTORE_PATH, this::userActions, jsonTransformer);
     }
 
     @POST
@@ -91,28 +130,51 @@ public class DeletedMessagesVaultRoutes implements Routes {
             dataType = "String",
             defaultValue = "none",
             example = "user@james.org",
-            value = "Compulsory. Needs to be a valid username represent for an user had requested to restore deleted emails")
+            value = "Compulsory. Needs to be a valid username represent for an user had requested to restore deleted emails"),
+        @ApiImplicitParam(
+            required = true,
+            dataType = "String",
+            name = "action",
+            paramType = "query",
+            example = "?action=restore",
+            value = "Compulsory. Needs to be a valid action represent for an operation to perform on the Deleted Message Vault, " +
+                "valid action should be in the list (restore)")
     })
     @ApiResponses(value = {
         @ApiResponse(code = HttpStatus.CREATED_201, message = "Task is created", response = TaskIdDto.class),
         @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "Bad request - user param is invalid"),
         @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "Internal server error - Something went bad on the server side.")
     })
-    private TaskIdDto restore(Request request, Response response) {
-        User userToRestore = extractUser(request);
-        TaskId taskId = taskManager.submit(new DeletedMessagesVaultRestoreTask(userToRestore, vaultRestore));
+    private TaskIdDto userActions(Request request, Response response) {
+        UserVaultAction requestedAction = extractUserVaultAction(request);
+
+        Task requestedTask = generateTask(requestedAction, request);
+        TaskId taskId = taskManager.submit(requestedTask);
         return TaskIdDto.respond(response, taskId);
     }
 
-    private User extractUser(Request request) {
-        try {
-            return User.fromUsername(request.params(USER_PATH_PARAM));
-        } catch (IllegalArgumentException e) {
-            throw ErrorResponder.builder()
-                .statusCode(HttpStatus.BAD_REQUEST_400)
-                .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
-                .message(e.getMessage())
-                .haltError();
+    private Task generateTask(UserVaultAction requestedAction, Request request) {
+        User userToRestore = User.fromUsername(request.params(USER_PATH_PARAM));
+
+        switch (requestedAction) {
+            case RESTORE:
+                return new DeletedMessagesVaultRestoreTask(userToRestore, vaultRestore);
+            default:
+                throw new NotImplementedException(requestedAction + " is not yet handled.");
         }
     }
+
+    private UserVaultAction extractUserVaultAction(Request request) {
+        String actionParam = request.queryParams(ACTION_QUERY_PARAM);
+        return Optional.ofNullable(actionParam)
+            .map(this::getUserVaultAction)
+            .orElseThrow(() -> new IllegalArgumentException("action parameter is missing"));
+    }
+
+    private UserVaultAction getUserVaultAction(String actionString) {
+        return UserVaultAction.getAction(actionString)
+            .orElseThrow(() -> new IllegalArgumentException(String.format("'%s' is not a valid action. Supported values are: (%s)",
+                actionString,
+                Joiner.on(",").join(UserVaultAction.plainValues()))));
+    }
 }
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
index 7349d5a..460e3c2 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
@@ -116,19 +116,78 @@ class DeletedMessagesVaultRoutesTest {
     class ValidationTest {
 
         @Test
-        void restoreShouldReturnInvalidWhenUserIsInvalid() {
+        void restoreShouldReturnInvalidWhenActionIsMissing() {
             when()
+                .post(USER.asString())
+            .then()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .body("statusCode", is(400))
+                .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                .body("message", is(notNullValue()))
+                .body("details", is(notNullValue()));
+        }
+
+        @Test
+        void restoreShouldReturnInvalidWhenPassingEmptyAction() {
+            given()
+                .queryParam("action", "")
+            .when()
+                .post(USER.asString())
+            .then()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .body("statusCode", is(400))
+                .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                .body("message", is(notNullValue()))
+                .body("details", is(notNullValue()));
+        }
+
+        @Test
+        void restoreShouldReturnInvalidWhenActionIsInValid() {
+            given()
+                .queryParam("action", "invalid action")
+            .when()
+                .post(USER.asString())
+            .then()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .body("statusCode", is(400))
+                .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                .body("message", is(notNullValue()))
+                .body("details", is(notNullValue()));
+        }
+
+        @Test
+        void restoreShouldReturnInvalidWhenPassingCaseInsensitiveAction() {
+            given()
+                .queryParam("action", "RESTORE")
+            .when()
+                .post(USER.asString())
+            .then()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .body("statusCode", is(400))
+                .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                .body("message", is(notNullValue()))
+                .body("details", is(notNullValue()));
+        }
+
+        @Test
+        void restoreShouldReturnInvalidWhenUserIsInvalid() {
+            given()
+                .queryParam("action", "restore")
+            .when()
                 .post("not@valid@user.com")
             .then()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .body("statusCode", is(400))
                 .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
-                .body("message", is("The username should not contain multiple domain delimiter."));
+                .body("message", is(notNullValue()))
+                .body("details", is(notNullValue()));
         }
 
         @Test
         void postShouldReturnNotFoundWhenNoUserPathParameter() {
-            when()
+            given()
+                .queryParam("action", "restore")
+            .when()
                 .post()
             .then()
                 .statusCode(HttpStatus.NOT_FOUND_404)
@@ -151,11 +210,13 @@ class DeletedMessagesVaultRoutesTest {
                 .search(any(), any());
 
             String taskId = with()
+                .queryParam("action", "restore")
                 .post(USER.asString())
                 .jsonPath()
                 .get("taskId");
 
             given()
+                .queryParam("action", "restore")
                 .basePath(TasksRoutes.BASE)
             .when()
                 .get(taskId + "/await")
@@ -185,6 +246,7 @@ class DeletedMessagesVaultRoutesTest {
                 .appendMessage(any(), any());
 
             String taskId = with()
+                .queryParam("action", "restore")
                 .post(USER.asString())
                 .jsonPath()
                 .get("taskId");
@@ -214,6 +276,7 @@ class DeletedMessagesVaultRoutesTest {
                 .createMailbox(any(MailboxPath.class), any(MailboxSession.class));
 
             String taskId = with()
+                .queryParam("action", "restore")
                 .post(USER.asString())
                 .jsonPath()
                 .get("taskId");
@@ -236,7 +299,9 @@ class DeletedMessagesVaultRoutesTest {
 
     @Test
     void restoreShouldReturnATaskCreated() {
-        when()
+        given()
+            .queryParam("action", "restore")
+        .when()
             .post(USER.asString())
         .then()
             .statusCode(HttpStatus.CREATED_201)
@@ -249,6 +314,7 @@ class DeletedMessagesVaultRoutesTest {
         vault.append(USER, DELETED_MESSAGE_2, new ByteArrayInputStream(CONTENT)).block();
 
         String taskId = with()
+            .queryParam("action", "restore")
             .post(USER.asString())
             .jsonPath()
             .get("taskId");
@@ -275,6 +341,7 @@ class DeletedMessagesVaultRoutesTest {
         vault.append(USER, DELETED_MESSAGE_2, new ByteArrayInputStream(CONTENT)).block();
 
         String taskId = with()
+            .queryParam("action", "restore")
             .post(USER.asString())
             .jsonPath()
             .get("taskId");
@@ -304,6 +371,7 @@ class DeletedMessagesVaultRoutesTest {
         vault.append(USER, DELETED_MESSAGE_2, new ByteArrayInputStream(CONTENT)).block();
 
         String taskId = with()
+            .queryParam("action", "restore")
             .post(USER.asString())
             .jsonPath()
             .get("taskId");
@@ -325,6 +393,7 @@ class DeletedMessagesVaultRoutesTest {
         vault.append(USER, DELETED_MESSAGE_2, new ByteArrayInputStream(CONTENT)).block();
 
         String taskId = with()
+            .queryParam("action", "restore")
             .post(USER.asString())
             .jsonPath()
             .get("taskId");
@@ -348,6 +417,7 @@ class DeletedMessagesVaultRoutesTest {
         vault.append(USER, DELETED_MESSAGE_2, new ByteArrayInputStream(CONTENT)).block();
 
         String taskId = with()
+            .queryParam("action", "restore")
             .post(USER.asString())
             .jsonPath()
             .get("taskId");
diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md
index b00a62f..a660766 100644
--- a/src/site/markdown/server/manage-webadmin.md
+++ b/src/site/markdown/server/manage-webadmin.md
@@ -2560,17 +2560,22 @@ Here are the following actions available on the 'Deleted Messages Vault'
 Deleted messages of a specific user can be restored by calling the following endpoint:
 
 ```
-curl -XPOST http://ip:port/deletedMessages/user/userToRestore@domain.ext
+curl -XPOST http://ip:port/deletedMessages/user/userToRestore@domain.ext?action=restore
 ```
 
 **All** messages in the Deleted Messages Vault of an specified user will be appended to his 'Restored-Messages' mailbox, which will be created if needed.
 
-**Note**: Restoring matched messages by queries is not supported yet 
-
+**Note**: 
+ - Restoring matched messages by queries is not supported yet 
+ - Query parameter `action` is required and should have value `restore` to represent for restoring feature. Otherwise, a bad request response will be returned
+ - Query parameter `action` is case sensitive
 Response code:
 
  - 201: Task for restoring deleted has been created
- - 400: Bad request, user parameter is invalid
+ - 400: Bad request: 
+   - action query param is not present
+   - action query param is not a valid action
+   - user parameter is invalid
 
 The scheduled task will have the following type `deletedMessages/restore` and the following `additionalInformation`:
 


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


[james-project] 06/15: JAMES-2665 Basic first integration test for Cassandra and the vault

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 1d4ae5cc8bbd0283fa7e12f10bcacd8240788729
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Mar 5 14:56:37 2019 +0700

    JAMES-2665 Basic first integration test for Cassandra and the vault
    
    Exercise it on Cassandra mail repositories
---
 .../CassandraDeletedMessageVaultTest.java          | 55 ++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java
new file mode 100644
index 0000000..e6f1cf5
--- /dev/null
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.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.jmap.cassandra;
+
+import java.io.IOException;
+
+import org.apache.james.CassandraJmapTestRule;
+import org.apache.james.DockerCassandraRule;
+import org.apache.james.GuiceJamesServer;
+import org.apache.james.jmap.methods.integration.DeletedMessagesVaultTest;
+import org.apache.james.mailrepository.api.MailRepositoryUrl;
+import org.apache.james.modules.mailbox.PreDeletionHookConfiguration;
+import org.apache.james.modules.mailbox.PreDeletionHooksConfiguration;
+import org.apache.james.vault.DeletedMessageVaultHook;
+import org.apache.james.vault.MailRepositoryDeletedMessageVault;
+import org.apache.james.webadmin.WebAdminConfiguration;
+import org.junit.ClassRule;
+import org.junit.Rule;
+
+public class CassandraDeletedMessageVaultTest extends DeletedMessagesVaultTest {
+
+    @ClassRule
+    public static DockerCassandraRule cassandra = new DockerCassandraRule();
+
+    @Rule
+    public CassandraJmapTestRule rule = CassandraJmapTestRule.defaultTestRule();
+    
+    @Override
+    protected GuiceJamesServer createJmapServer() throws IOException {
+        return rule.jmapServer(cassandra.getModule(),
+            binder -> binder.bind(PreDeletionHooksConfiguration.class)
+                .toInstance(PreDeletionHooksConfiguration.forHooks(
+                    PreDeletionHookConfiguration.forClass(DeletedMessageVaultHook.class))),
+            binder -> binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION),
+            binder -> binder.bind(MailRepositoryDeletedMessageVault.Configuration.class)
+                .toInstance(new MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("cassandra://var/deletedMessages/user"))));
+    }
+}


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


[james-project] 03/15: JAMES-2665 Injects for DeletedMessagesVaultHook

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 5b3c855660ff0deaa145e9291abc88f228c440fe
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Mar 5 11:51:22 2019 +0700

    JAMES-2665 Injects for DeletedMessagesVaultHook
---
 .../src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java  | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java
index 539da4d..69042e5 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java
@@ -26,6 +26,8 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 
+import javax.inject.Inject;
+
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.core.User;
 import org.apache.james.mailbox.MailboxSession;
@@ -109,6 +111,7 @@ public class DeletedMessageVaultHook implements PreDeletionHook {
     private final MailboxSessionMapperFactory mapperFactory;
     private final Clock clock;
 
+    @Inject
     DeletedMessageVaultHook(SessionProvider sessionProvider,
                             DeletedMessageVault deletedMessageVault,
                             DeletedMessageConverter deletedMessageConverter,


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


[james-project] 02/15: JAMES-2665 Default vault path was incompatible with file repositories

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 a9bc6625a5af1eff2b298d2198f1f0d015a4b98f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Mar 5 11:37:31 2019 +0700

    JAMES-2665 Default vault path was incompatible with file repositories
    
    Incriminated: the / prefix, trying to access the root of the file system
---
 .../java/org/apache/james/modules/vault/DeletedMessageVaultModule.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/DeletedMessageVaultModule.java b/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/DeletedMessageVaultModule.java
index dfdbd33..9c99fcd 100644
--- a/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/DeletedMessageVaultModule.java
+++ b/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/DeletedMessageVaultModule.java
@@ -36,7 +36,7 @@ import com.google.inject.Provides;
 
 public class DeletedMessageVaultModule extends AbstractModule {
     private static final Logger LOGGER = LoggerFactory.getLogger(DeletedMessageVaultModule.class);
-    private static final MailRepositoryPath DEFAULT_PATH = MailRepositoryPath.from("/var/deletedMessages/vault");
+    private static final MailRepositoryPath DEFAULT_PATH = MailRepositoryPath.from("var/deletedMessages/vault");
 
     @Override
     protected void configure() {


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