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 ro...@apache.org on 2019/05/02 12:43:03 UTC

[james-project] 05/06: JAMES-2694 shoud not restore in non empty account

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

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

commit 57ce846b5be7a84dc0333339f2d76e51e328ed37
Author: RĂ©mi Kowalski <rk...@linagora.com>
AuthorDate: Tue Apr 9 11:46:14 2019 +0200

    JAMES-2694 shoud not restore in non empty account
---
 .../james/mailbox/backup/DefaultMailboxBackup.java | 27 ++++++++++++---
 .../apache/james/mailbox/backup/MailboxBackup.java | 10 ++++--
 .../mailbox/backup/DefaultMailboxBackupTest.java   | 38 +++++++++++++++-------
 3 files changed, 58 insertions(+), 17 deletions(-)

diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/DefaultMailboxBackup.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/DefaultMailboxBackup.java
index 0496b40..355ec7e 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/DefaultMailboxBackup.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/DefaultMailboxBackup.java
@@ -28,6 +28,7 @@ import org.apache.james.core.User;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.exception.BadCredentialsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.FetchGroupImpl;
 import org.apache.james.mailbox.model.Mailbox;
@@ -93,13 +94,31 @@ public class DefaultMailboxBackup implements MailboxBackup {
         archive(mailboxes, messages, destination);
     }
 
+    private boolean isAccountNonEmpty(User user) throws BadCredentialsException, MailboxException, IOException {
+        MailboxSession session = mailboxManager.createSystemSession(user.asString());
+        return getAccountContentForUser(session)
+            .stream()
+            .findFirst()
+            .isPresent();
+    }
+
     @Override
-    public Publisher<Void> restore(User user, InputStream source) {
-        return Mono.fromRunnable(Throwing.runnable(() -> archiveRestorer.restore(user, source)))
+    public Publisher<BackupStatus> restore(User user, InputStream source) {
+        try {
+            if (isAccountNonEmpty(user)) {
+                return Mono.just(BackupStatus.NON_EMPTY_RECEIVER_ACCOUNT);
+            }
+        } catch (Exception e) {
+            LOGGER.error("Error during account restoration for user : " + user, e);
+            return Mono.just(BackupStatus.FAILED);
+        }
+
+        return Mono.fromRunnable(Throwing.runnable(() -> archiveRestorer.restore(user, source)).sneakyThrow())
             .subscribeOn(Schedulers.elastic())
             .doOnError(e -> LOGGER.error("Error during account restoration for user : " + user, e))
-            .doOnTerminate(Throwing.runnable(source::close))
-            .then();
+            .doOnTerminate(Throwing.runnable(source::close).sneakyThrow())
+            .thenReturn(BackupStatus.DONE)
+            .onErrorReturn(BackupStatus.FAILED);
     }
 
     private Stream<MailAccountContent> getMailboxWithAnnotationsFromPath(MailboxSession session, MailboxPath path) {
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxBackup.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxBackup.java
index 5f837b2..4770eed 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxBackup.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxBackup.java
@@ -28,16 +28,22 @@ import org.reactivestreams.Publisher;
 
 public interface MailboxBackup {
 
+    enum BackupStatus {
+        NON_EMPTY_RECEIVER_ACCOUNT,
+        FAILED,
+        DONE
+    }
+
     /**
      * @param user the user account to export
      */
     void backupAccount(User user, OutputStream destination) throws IOException, MailboxException;
 
     /**
-     * @param user the user in which account the restored elements will be stored.
+     * @param user   the user in which account the restored elements will be stored.
      * @param source the input stream to the archive containing the account elements.
      * @return a Publisher indicating when the action is completed
      */
-    Publisher<Void> restore(User user, InputStream source) throws IOException, MailboxException;
+    Publisher<BackupStatus> restore(User user, InputStream source) throws IOException, MailboxException;
 
 }
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DefaultMailboxBackupTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DefaultMailboxBackupTest.java
index d1eff05..58f4958 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DefaultMailboxBackupTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DefaultMailboxBackupTest.java
@@ -66,7 +66,7 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
         sessionOtherUser = mailboxManager.createSystemSession(OTHER_USER);
     }
 
-    private void createMailBoxWithMessages(MailboxSession session, MailboxPath mailboxPath, MessageManager.AppendCommand... messages) throws Exception {
+    private void createMailboxWithMessages(MailboxSession session, MailboxPath mailboxPath, MessageManager.AppendCommand... messages) throws Exception {
         MailboxId mailboxId = mailboxManager.createMailbox(mailboxPath, session).get();
         Arrays.stream(messages).forEach(Throwing.consumer(message ->
                 mailboxManager.getMailbox(mailboxId, session).appendMessage(message, session)
@@ -75,7 +75,7 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
     }
 
     private void createMailbox(MailboxSession session, MailboxPath mailboxPath) throws Exception {
-        createMailBoxWithMessages(session, mailboxPath);
+        createMailboxWithMessages(session, mailboxPath);
     }
 
     @Test
@@ -116,7 +116,7 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
     @Test
     void doBackupWithOneMessageShouldStoreAnArchiveWithTwoEntries() throws Exception {
         ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
-        createMailBoxWithMessages(sessionUser, MAILBOX_PATH_USER1_MAILBOX1, getMessage1AppendCommand());
+        createMailboxWithMessages(sessionUser, MAILBOX_PATH_USER1_MAILBOX1, getMessage1AppendCommand());
 
         backup.backupAccount(USER1, destination);
 
@@ -131,7 +131,7 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
     @Test
     void doBackupWithTwoMailboxesAndOneMessageShouldStoreAnArchiveWithThreeEntries() throws Exception {
         ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
-        createMailBoxWithMessages(sessionUser, MAILBOX_PATH_USER1_MAILBOX1, getMessage1AppendCommand());
+        createMailboxWithMessages(sessionUser, MAILBOX_PATH_USER1_MAILBOX1, getMessage1AppendCommand());
         createMailbox(sessionUser, MAILBOX_PATH_USER1_MAILBOX2);
 
         backup.backupAccount(USER1, destination);
@@ -149,8 +149,8 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
     void doBackupShouldOnlyArchiveTheMailboxOfTheUser() throws Exception {
         ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
 
-        createMailBoxWithMessages(sessionUser, MAILBOX_PATH_USER1_MAILBOX1, getMessage1AppendCommand());
-        createMailBoxWithMessages(sessionOtherUser, MAILBOX_PATH_OTHER_USER_MAILBOX1, getMessage1OtherUserAppendCommand());
+        createMailboxWithMessages(sessionUser, MAILBOX_PATH_USER1_MAILBOX1, getMessage1AppendCommand());
+        createMailboxWithMessages(sessionOtherUser, MAILBOX_PATH_OTHER_USER_MAILBOX1, getMessage1OtherUserAppendCommand());
 
         backup.backupAccount(USER1, destination);
         try (ZipAssert zipAssert = ZipAssert.assertThatZip(destination)) {
@@ -167,8 +167,8 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
         backup.backupAccount(USER1, destination);
 
         InputStream source = new ByteArrayInputStream(destination.toByteArray());
-        Mono.from(backup.restore(USER2, source)).block();
-
+        MailboxBackup.BackupStatus backupStatus = Mono.from(backup.restore(USER2, source)).block();
+        assertThat(backupStatus).isEqualTo(MailboxBackup.BackupStatus.DONE);
         List<DefaultMailboxBackup.MailAccountContent> content = backup.getAccountContentForUser(sessionOtherUser);
 
         assertThat(content).isEmpty();
@@ -182,7 +182,8 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
         backup.backupAccount(USER1, destination);
 
         InputStream source = new ByteArrayInputStream(destination.toByteArray());
-        Mono.from(backup.restore(USER2, source)).block();
+        MailboxBackup.BackupStatus backupStatus = Mono.from(backup.restore(USER2, source)).block();
+        assertThat(backupStatus).isEqualTo(MailboxBackup.BackupStatus.DONE);
 
         List<DefaultMailboxBackup.MailAccountContent> content = backup.getAccountContentForUser(sessionOtherUser);
 
@@ -194,6 +195,20 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
     }
 
     @Test
+    void restoringAccountInNonEmptyAccountShouldNotBeDone() throws Exception {
+        createMailbox(sessionUser, MAILBOX_PATH_USER1_MAILBOX1);
+        createMailbox(sessionUser, MAILBOX_PATH_OTHER_USER_MAILBOX1);
+
+        ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
+        backup.backupAccount(USER1, destination);
+
+        InputStream source = new ByteArrayInputStream(destination.toByteArray());
+        MailboxBackup.BackupStatus backupStatus = Mono.from(backup.restore(USER2, source)).block();
+
+        assertThat(backupStatus).isEqualTo(MailboxBackup.BackupStatus.NON_EMPTY_RECEIVER_ACCOUNT);
+    }
+
+    @Test
     void backupAccountWithTwoMailboxesThenRestoringItInUser2AccountShouldCreateTwoMailboxes() throws Exception {
         createMailbox(sessionUser, MAILBOX_PATH_USER1_MAILBOX1);
         createMailbox(sessionUser, MAILBOX_PATH_USER1_MAILBOX2);
@@ -202,7 +217,9 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
         backup.backupAccount(USER1, destination);
 
         InputStream source = new ByteArrayInputStream(destination.toByteArray());
-        Mono.from(backup.restore(USER2, source)).block();
+        MailboxBackup.BackupStatus backupStatus = Mono.from(backup.restore(USER2, source)).block();
+
+        assertThat(backupStatus).isEqualTo(MailboxBackup.BackupStatus.DONE);
 
         List<DefaultMailboxBackup.MailAccountContent> content = backup.getAccountContentForUser(sessionOtherUser);
 
@@ -216,7 +233,6 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
         Mailbox mailbox2 = contentMailbox2.getMailboxWithAnnotations().mailbox;
         assertThat(mailbox2.getName()).isEqualTo(MAILBOX_2_NAME);
         assertThat(contentMailbox2.getMessages().count()).isEqualTo(0);
-
     }
 
     private MessageManager.AppendCommand getMessage1AppendCommand() throws IOException {


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