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