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 <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
