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:02 UTC
[james-project] 04/06: JAMES-2694 restore mailbox
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 232688edb7f0d593457f3cc1557d53d9029f68ad
Author: RĂ©mi Kowalski <rk...@linagora.com>
AuthorDate: Mon Apr 8 12:02:30 2019 +0200
JAMES-2694 restore mailbox
---
.../james/mailbox/backup/DefaultMailboxBackup.java | 38 +++++--
...MailboxBackup.java => MailArchiveRestorer.java} | 10 +-
.../apache/james/mailbox/backup/MailboxBackup.java | 9 ++
.../james/mailbox/backup/SerializedMailboxId.java | 4 +-
.../james/mailbox/backup/SerializedMessageId.java | 4 +-
.../mailbox/backup/ZipMailArchiveRestorer.java | 101 +++++++++++++++++
.../mailbox/backup/zip/ExtraFieldExtractor.java | 3 +-
.../james/mailbox/backup/zip/ZipEntryIterator.java | 2 +-
.../backup/zip/ZippedMailAccountIterator.java | 1 -
.../mailbox/backup/DefaultMailboxBackupTest.java | 123 ++++++++++++++++-----
.../mailbox/backup/MailboxMessageFixture.java | 4 +-
.../mailbox/backup/ZipArchivesLoaderTest.java | 20 ++--
12 files changed, 257 insertions(+), 62 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 578c9ec..0496b40 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
@@ -19,6 +19,7 @@
package org.apache.james.mailbox.backup;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.stream.Stream;
@@ -37,16 +38,22 @@ import org.apache.james.mailbox.model.MessageRange;
import org.apache.james.mailbox.model.MessageResult;
import org.apache.james.mailbox.model.search.MailboxQuery;
import org.apache.james.util.streams.Iterators;
+import org.reactivestreams.Publisher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.github.fge.lambdas.Throwing;
import com.github.steveash.guavate.Guavate;
+import com.google.common.annotations.VisibleForTesting;
+import reactor.core.publisher.Mono;
+import reactor.core.scheduler.Schedulers;
public class DefaultMailboxBackup implements MailboxBackup {
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultMailboxBackup.class);
- private static class MailAccountContent {
+ @VisibleForTesting
+ static class MailAccountContent {
private final MailboxWithAnnotations mailboxWithAnnotations;
private final Stream<MessageResult> messages;
@@ -64,9 +71,14 @@ public class DefaultMailboxBackup implements MailboxBackup {
}
}
- public DefaultMailboxBackup(MailboxManager mailboxManager, ArchiveService archiveService) {
+ private final MailboxManager mailboxManager;
+ private final ArchiveService archiveService;
+ private final MailArchiveRestorer archiveRestorer;
+
+ public DefaultMailboxBackup(MailboxManager mailboxManager, ArchiveService archiveService, MailArchiveRestorer archiveRestorer) {
this.mailboxManager = mailboxManager;
this.archiveService = archiveService;
+ this.archiveRestorer = archiveRestorer;
}
@Override
@@ -81,12 +93,18 @@ public class DefaultMailboxBackup implements MailboxBackup {
archive(mailboxes, messages, destination);
}
- private final MailboxManager mailboxManager;
- private final ArchiveService archiveService;
+ @Override
+ public Publisher<Void> restore(User user, InputStream source) {
+ return Mono.fromRunnable(Throwing.runnable(() -> archiveRestorer.restore(user, source)))
+ .subscribeOn(Schedulers.elastic())
+ .doOnError(e -> LOGGER.error("Error during account restoration for user : " + user, e))
+ .doOnTerminate(Throwing.runnable(source::close))
+ .then();
+ }
private Stream<MailAccountContent> getMailboxWithAnnotationsFromPath(MailboxSession session, MailboxPath path) {
try {
- MessageManager messageManager = mailboxManager.getMailbox(path, session);
+ MessageManager messageManager = mailboxManager.getMailbox(path, session);
Mailbox mailbox = messageManager.getMailboxEntity();
List<MailboxAnnotation> annotations = mailboxManager.getAllAnnotations(path, session);
MailboxWithAnnotations mailboxWithAnnotations = new MailboxWithAnnotations(mailbox, annotations);
@@ -98,9 +116,13 @@ public class DefaultMailboxBackup implements MailboxBackup {
}
}
- private List<MailAccountContent> getAccountContentForUser(MailboxSession session) throws MailboxException {
- MailboxQuery queryUser = MailboxQuery.builder().username(session.getUser().asString()).build();
- Stream<MailboxPath> paths = mailboxManager.search(queryUser, session).stream()
+ @VisibleForTesting
+ List<MailAccountContent> getAccountContentForUser(MailboxSession session) throws MailboxException {
+ MailboxQuery queryUser = MailboxQuery.builder()
+ .user(session.getUser())
+ .build();
+ Stream<MailboxPath> paths = mailboxManager.search(queryUser, session)
+ .stream()
.map(MailboxMetaData::getPath);
List<MailAccountContent> mailboxes = paths
.flatMap(path -> getMailboxWithAnnotationsFromPath(session, 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/MailArchiveRestorer.java
similarity index 85%
copy from mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxBackup.java
copy to mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailArchiveRestorer.java
index 1b3151e..091a258 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/MailArchiveRestorer.java
@@ -19,16 +19,12 @@
package org.apache.james.mailbox.backup;
import java.io.IOException;
-import java.io.OutputStream;
+import java.io.InputStream;
import org.apache.james.core.User;
import org.apache.james.mailbox.exception.MailboxException;
-public interface MailboxBackup {
-
- /**
- * @param user the user account to export
- */
- void backupAccount(User user, OutputStream destination) throws IOException, MailboxException;
+public interface MailArchiveRestorer {
+ void restore(User user, InputStream source) throws MailboxException, IOException;
}
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 1b3151e..5f837b2 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
@@ -19,10 +19,12 @@
package org.apache.james.mailbox.backup;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
import org.apache.james.core.User;
import org.apache.james.mailbox.exception.MailboxException;
+import org.reactivestreams.Publisher;
public interface MailboxBackup {
@@ -31,4 +33,11 @@ public interface MailboxBackup {
*/
void backupAccount(User user, OutputStream destination) throws IOException, MailboxException;
+ /**
+ * @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;
+
}
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SerializedMailboxId.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SerializedMailboxId.java
index dc0fd6b..d50152a 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SerializedMailboxId.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SerializedMailboxId.java
@@ -29,8 +29,8 @@ public class SerializedMailboxId {
this.value = value;
}
- public SerializedMailboxId(MailboxId mailboxId) {
- this.value = mailboxId.serialize();
+ public static SerializedMailboxId from(MailboxId mailboxId) {
+ return new SerializedMailboxId(mailboxId.serialize());
}
public String getValue() {
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SerializedMessageId.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SerializedMessageId.java
index 76b4c6f..63f3b6b 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SerializedMessageId.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SerializedMessageId.java
@@ -29,8 +29,8 @@ public class SerializedMessageId {
this.value = value;
}
- public SerializedMessageId(MessageId messageId) {
- this.value = messageId.serialize();
+ public static SerializedMessageId from(MessageId messageId) {
+ return new SerializedMessageId(messageId.serialize());
}
public String getValue() {
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/ZipMailArchiveRestorer.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/ZipMailArchiveRestorer.java
new file mode 100644
index 0000000..90b96c5
--- /dev/null
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/ZipMailArchiveRestorer.java
@@ -0,0 +1,101 @@
+/****************************************************************
+ * 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.backup;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+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.MailboxException;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.util.OptionalUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.github.fge.lambdas.Throwing;
+import com.github.steveash.guavate.Guavate;
+import com.google.common.collect.ImmutableList;
+
+public class ZipMailArchiveRestorer implements MailArchiveRestorer {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ZipMailArchiveRestorer.class);
+
+ private final MailboxManager mailboxManager;
+ private final MailArchivesLoader archiveLoader;
+
+ public ZipMailArchiveRestorer(MailboxManager mailboxManager, MailArchivesLoader archiveLoader) {
+ this.mailboxManager = mailboxManager;
+ this.archiveLoader = archiveLoader;
+ }
+
+ public void restore(User user, InputStream source) throws MailboxException, IOException {
+ MailboxSession session = mailboxManager.createSystemSession(user.asString());
+ restoreEntries(source, session);
+ }
+
+ private void restoreEntries(InputStream source, MailboxSession session) throws IOException {
+ try (MailArchiveIterator archiveIterator = archiveLoader.load(source)) {
+ List<MailboxWithAnnotationsArchiveEntry> mailboxes = readMailboxes(archiveIterator);
+ restoreMailboxes(session, mailboxes);
+ }
+ }
+
+ private Map<SerializedMailboxId, MessageManager> restoreMailboxes(MailboxSession session, List<MailboxWithAnnotationsArchiveEntry> mailboxes) {
+ return mailboxes.stream()
+ .flatMap(Throwing.<MailboxWithAnnotationsArchiveEntry, Stream<ImmutablePair<SerializedMailboxId, MessageManager>>>function(
+ mailboxEntry ->
+ OptionalUtils.toStream(restoreMailboxEntry(session, mailboxEntry))).sneakyThrow())
+ .collect(Guavate.entriesToImmutableMap());
+ }
+
+ private List<MailboxWithAnnotationsArchiveEntry> readMailboxes(MailArchiveIterator iterator) {
+ ImmutableList.Builder<MailboxWithAnnotationsArchiveEntry> mailboxes = ImmutableList.builder();
+ while (iterator.hasNext()) {
+ MailArchiveEntry entry = iterator.next();
+ switch (entry.getType()) {
+ case MAILBOX:
+ mailboxes.add((MailboxWithAnnotationsArchiveEntry) entry);
+ break;
+ case UNKNOWN:
+ String entryName = ((UnknownArchiveEntry) entry).getEntryName();
+ LOGGER.warn("unknown entry found in zip :" + entryName);
+ break;
+ }
+ }
+ return mailboxes.build();
+ }
+
+ private Optional<ImmutablePair<SerializedMailboxId, MessageManager>> restoreMailboxEntry(MailboxSession session,
+ MailboxWithAnnotationsArchiveEntry mailboxWithAnnotationsArchiveEntry) throws MailboxException {
+ MailboxPath mailboxPath = MailboxPath.forUser(session.getUser().asString(), mailboxWithAnnotationsArchiveEntry.getMailboxName());
+ Optional<MailboxId> newMailboxId = mailboxManager.createMailbox(mailboxPath, session);
+ mailboxManager.updateAnnotations(mailboxPath, session, mailboxWithAnnotationsArchiveEntry.getAnnotations());
+ return newMailboxId.map(Throwing.<MailboxId, ImmutablePair<SerializedMailboxId, MessageManager>>function(newId ->
+ ImmutablePair.of(mailboxWithAnnotationsArchiveEntry.getMailboxId(), mailboxManager.getMailbox(newId, session))).sneakyThrow());
+ }
+}
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ExtraFieldExtractor.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ExtraFieldExtractor.java
index abc0c28..1c1155c 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ExtraFieldExtractor.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ExtraFieldExtractor.java
@@ -35,7 +35,8 @@ public class ExtraFieldExtractor {
ZipExtraField[] extraFields = ExtraFieldUtils.parse(entry.getExtra());
return Arrays.stream(extraFields)
.filter(field -> field.getHeaderId().equals(id))
- .map(extraField -> ((StringExtraField) extraField).getValue())
+ .map(StringExtraField.class::cast)
+ .map(StringExtraField::getValue)
.findFirst()
.flatMap(Function.identity());
}
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ZipEntryIterator.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ZipEntryIterator.java
index 160bf74..e834335 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ZipEntryIterator.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ZipEntryIterator.java
@@ -39,7 +39,7 @@ public class ZipEntryIterator implements Iterator<ZipEntry>, Closeable {
try {
next = Optional.ofNullable(zipInputStream.getNextEntry());
} catch (IOException e) {
- //EMPTY STREAM
+ LOGGER.error("Empty stream or error during reading first entry", e);
next = Optional.empty();
}
}
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ZippedMailAccountIterator.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ZippedMailAccountIterator.java
index 5b1d5c2..1b690f1 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ZippedMailAccountIterator.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ZippedMailAccountIterator.java
@@ -96,7 +96,6 @@ public class ZippedMailAccountIterator implements MailArchiveIterator {
private MailArchiveEntry fromMailboxEntry(ZipEntry current) throws ZipException {
return new MailboxWithAnnotationsArchiveEntry(getMailboxName(current), getMailBoxId(current).get(), NO_ANNOTATION);
-
}
private MailArchiveEntry from(ZipEntry current, ZipEntryType currentEntryType) throws ZipException {
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 81f5dc3..d1eff05 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
@@ -18,44 +18,55 @@
****************************************************************/
package org.apache.james.mailbox.backup;
+import static org.assertj.core.api.Assertions.assertThat;
+import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.util.Arrays;
-import java.util.HashSet;
+import java.util.List;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.backup.ZipAssert.EntryChecks;
+import org.apache.james.mailbox.backup.zip.ZipArchivesLoader;
import org.apache.james.mailbox.backup.zip.Zipper;
-import org.apache.james.mailbox.extension.PreDeletionHook;
-import org.apache.james.mailbox.inmemory.MemoryMailboxManagerProvider;
+import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
+import org.apache.james.mailbox.model.Mailbox;
import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.github.fge.lambdas.Throwing;
+import reactor.core.publisher.Mono;
class DefaultMailboxBackupTest implements MailboxMessageFixture {
-
- private static final HashSet<PreDeletionHook> PRE_DELETION_HOOKS = new HashSet<>();
-
private static final int BUFFER_SIZE = 4096;
+ public static final String EXPECTED_ANNOTATIONS_DIR = "annotations";
private final ArchiveService archiveService = new Zipper();
+ private final MailArchivesLoader archiveLoader = new ZipArchivesLoader();
+ private MailArchiveRestorer archiveRestorer;
private MailboxManager mailboxManager;
private DefaultMailboxBackup backup;
+ private MailboxSession sessionUser;
+ private MailboxSession sessionOtherUser;
+
@BeforeEach
- void beforeEach() {
- mailboxManager = MemoryMailboxManagerProvider.provideMailboxManager(PRE_DELETION_HOOKS);
- backup = new DefaultMailboxBackup(mailboxManager, archiveService);
+ void beforeEach() throws Exception {
+ mailboxManager = InMemoryIntegrationResources.defaultResources().getMailboxManager();
+ archiveRestorer = new ZipMailArchiveRestorer(mailboxManager, archiveLoader);
+ backup = new DefaultMailboxBackup(mailboxManager, archiveService, archiveRestorer);
+ sessionUser = mailboxManager.createSystemSession(USER);
+ sessionOtherUser = mailboxManager.createSystemSession(OTHER_USER);
}
- private void createMailBoxWithMessage(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)
@@ -63,6 +74,10 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
);
}
+ private void createMailbox(MailboxSession session, MailboxPath mailboxPath) throws Exception {
+ createMailBoxWithMessages(session, mailboxPath);
+ }
+
@Test
void doBackupWithoutMailboxShouldStoreEmptyBackup() throws Exception {
ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
@@ -75,8 +90,7 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
@Test
void doBackupWithoutMessageShouldStoreAnArchiveWithOnlyOneEntry() throws Exception {
ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
- MailboxSession session = mailboxManager.createSystemSession(USER);
- createMailBoxWithMessage(session, MAILBOX_PATH_USER1_MAILBOX1);
+ createMailbox(sessionUser, MAILBOX_PATH_USER1_MAILBOX1);
backup.backupAccount(USER1, destination);
try (ZipAssert zipAssert = ZipAssert.assertThatZip(destination)) {
@@ -87,15 +101,14 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
@Test
void doBackupMailboxWithAnnotationShouldStoreAnArchiveWithMailboxAndAnnotation() throws Exception {
ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
- MailboxSession session = mailboxManager.createSystemSession(USER);
- createMailBoxWithMessage(session, MAILBOX_PATH_USER1_MAILBOX1);
- mailboxManager.updateAnnotations(MAILBOX_PATH_USER1_MAILBOX1, session, WITH_ANNOTATION_1);
+ createMailbox(sessionUser, MAILBOX_PATH_USER1_MAILBOX1);
+ mailboxManager.updateAnnotations(MAILBOX_PATH_USER1_MAILBOX1, sessionUser, WITH_ANNOTATION_1);
backup.backupAccount(USER1, destination);
try (ZipAssert zipAssert = ZipAssert.assertThatZip(destination)) {
zipAssert.containsOnlyEntriesMatching(EntryChecks.hasName(MAILBOX_1_NAME + "/").isDirectory(),
- EntryChecks.hasName(MAILBOX_1_NAME + "/" + "annotations" + "/").isDirectory(),
- EntryChecks.hasName(MAILBOX_1_NAME + "/" + "annotations" + "/" + ANNOTATION_1_KEY.asString()).hasStringContent(ANNOTATION_1_CONTENT)
+ EntryChecks.hasName(MAILBOX_1_NAME + "/" + EXPECTED_ANNOTATIONS_DIR + "/").isDirectory(),
+ EntryChecks.hasName(MAILBOX_1_NAME + "/" + EXPECTED_ANNOTATIONS_DIR + "/" + ANNOTATION_1_KEY.asString()).hasStringContent(ANNOTATION_1_CONTENT)
);
}
}
@@ -103,8 +116,7 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
@Test
void doBackupWithOneMessageShouldStoreAnArchiveWithTwoEntries() throws Exception {
ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
- MailboxSession session = mailboxManager.createSystemSession(USER);
- createMailBoxWithMessage(session, MAILBOX_PATH_USER1_MAILBOX1, getMessage1AppendCommand());
+ createMailBoxWithMessages(sessionUser, MAILBOX_PATH_USER1_MAILBOX1, getMessage1AppendCommand());
backup.backupAccount(USER1, destination);
@@ -119,9 +131,8 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
@Test
void doBackupWithTwoMailboxesAndOneMessageShouldStoreAnArchiveWithThreeEntries() throws Exception {
ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
- MailboxSession session = mailboxManager.createSystemSession(USER);
- createMailBoxWithMessage(session, MAILBOX_PATH_USER1_MAILBOX1, getMessage1AppendCommand());
- createMailBoxWithMessage(session, MAILBOX_PATH_USER1_MAILBOX2);
+ createMailBoxWithMessages(sessionUser, MAILBOX_PATH_USER1_MAILBOX1, getMessage1AppendCommand());
+ createMailbox(sessionUser, MAILBOX_PATH_USER1_MAILBOX2);
backup.backupAccount(USER1, destination);
@@ -137,11 +148,9 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
@Test
void doBackupShouldOnlyArchiveTheMailboxOfTheUser() throws Exception {
ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
- MailboxSession session = mailboxManager.createSystemSession(USER);
- MailboxSession otherSession = mailboxManager.createSystemSession(OTHER_USER);
- createMailBoxWithMessage(session, MAILBOX_PATH_USER1_MAILBOX1, getMessage1AppendCommand());
- createMailBoxWithMessage(otherSession, 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)) {
@@ -152,10 +161,72 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
}
}
+ @Test
+ void backupEmptyAccountThenRestoringItInUser2AccountShouldCreateNoElements() throws Exception {
+ ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
+ backup.backupAccount(USER1, destination);
+
+ InputStream source = new ByteArrayInputStream(destination.toByteArray());
+ Mono.from(backup.restore(USER2, source)).block();
+
+ List<DefaultMailboxBackup.MailAccountContent> content = backup.getAccountContentForUser(sessionOtherUser);
+
+ assertThat(content).isEmpty();
+ }
+
+ @Test
+ void backupAccountWithOneMailboxThenRestoringItInUser2AccountShouldCreateOneMailbox() throws Exception {
+ createMailbox(sessionUser, MAILBOX_PATH_USER1_MAILBOX1);
+
+ ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
+ backup.backupAccount(USER1, destination);
+
+ InputStream source = new ByteArrayInputStream(destination.toByteArray());
+ Mono.from(backup.restore(USER2, source)).block();
+
+ List<DefaultMailboxBackup.MailAccountContent> content = backup.getAccountContentForUser(sessionOtherUser);
+
+ assertThat(content).hasSize(1);
+ DefaultMailboxBackup.MailAccountContent mailAccountContent = content.get(0);
+ Mailbox mailbox = mailAccountContent.getMailboxWithAnnotations().mailbox;
+ assertThat(mailbox.getName()).isEqualTo(MAILBOX_1_NAME);
+ assertThat(mailAccountContent.getMessages().count()).isEqualTo(0);
+ }
+
+ @Test
+ void backupAccountWithTwoMailboxesThenRestoringItInUser2AccountShouldCreateTwoMailboxes() throws Exception {
+ createMailbox(sessionUser, MAILBOX_PATH_USER1_MAILBOX1);
+ createMailbox(sessionUser, MAILBOX_PATH_USER1_MAILBOX2);
+
+ ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
+ backup.backupAccount(USER1, destination);
+
+ InputStream source = new ByteArrayInputStream(destination.toByteArray());
+ Mono.from(backup.restore(USER2, source)).block();
+
+ List<DefaultMailboxBackup.MailAccountContent> content = backup.getAccountContentForUser(sessionOtherUser);
+
+ assertThat(content).hasSize(2);
+ DefaultMailboxBackup.MailAccountContent contentMailbox1 = content.get(0);
+ Mailbox mailbox1 = contentMailbox1.getMailboxWithAnnotations().mailbox;
+ assertThat(mailbox1.getName()).isEqualTo(MAILBOX_1_NAME);
+ assertThat(contentMailbox1.getMessages().count()).isEqualTo(0);
+
+ DefaultMailboxBackup.MailAccountContent contentMailbox2 = content.get(1);
+ Mailbox mailbox2 = contentMailbox2.getMailboxWithAnnotations().mailbox;
+ assertThat(mailbox2.getName()).isEqualTo(MAILBOX_2_NAME);
+ assertThat(contentMailbox2.getMessages().count()).isEqualTo(0);
+
+ }
+
private MessageManager.AppendCommand getMessage1AppendCommand() throws IOException {
return MessageManager.AppendCommand.builder().withFlags(flags1).build(MESSAGE_1.getFullContent());
}
+ private MessageManager.AppendCommand getMessage2AppendCommand() throws IOException {
+ return MessageManager.AppendCommand.builder().withFlags(flags1).build(MESSAGE_2.getFullContent());
+ }
+
private MessageManager.AppendCommand getMessage1OtherUserAppendCommand() throws IOException {
return MessageManager.AppendCommand.builder().withFlags(flags1).build(MESSAGE_1_OTHER_USER.getFullContent());
}
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java
index 9be370a..23641da 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java
@@ -84,8 +84,8 @@ public interface MailboxMessageFixture {
MailboxId MAILBOX_ID_2 = TestId.of(2L);
MailboxId MAILBOX_ID_11 = TestId.of(11L);
- SerializedMailboxId SERIALIZED_MAILBOX_ID_1 = new SerializedMailboxId(MAILBOX_ID_1);
- SerializedMailboxId SERIALIZED_MAILBOX_ID_2 = new SerializedMailboxId(MAILBOX_ID_2);
+ SerializedMailboxId SERIALIZED_MAILBOX_ID_1 = SerializedMailboxId.from(MAILBOX_ID_1);
+ SerializedMailboxId SERIALIZED_MAILBOX_ID_2 = SerializedMailboxId.from(MAILBOX_ID_2);
Flags flags1 = new Flags("myFlags");
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipArchivesLoaderTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipArchivesLoaderTest.java
index a4054d3..67baac8 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipArchivesLoaderTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipArchivesLoaderTest.java
@@ -23,15 +23,10 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
-import java.io.IOException;
import java.io.InputStream;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.NoSuchElementException;
-import javax.mail.Flags;
-
-import org.apache.commons.io.IOUtils;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
@@ -52,16 +47,19 @@ public class ZipArchivesLoaderTest implements MailboxMessageFixture {
private final ArchiveService archiveService = new Zipper();
private final MailArchivesLoader archiveLoader = new ZipArchivesLoader();
+ private MailArchiveRestorer archiveRestorer;
private MailboxManager mailboxManager;
private DefaultMailboxBackup backup;
@BeforeEach
void beforeEach() {
mailboxManager = InMemoryIntegrationResources.defaultResources().getMailboxManager();
- backup = new DefaultMailboxBackup(mailboxManager, archiveService);
+ archiveRestorer = new ZipMailArchiveRestorer(mailboxManager, archiveLoader);
+ backup = new DefaultMailboxBackup(mailboxManager, archiveService, archiveRestorer);
}
- private void createMailBoxWithMessage(MailboxSession session, MailboxPath mailboxPath, MailboxMessage... messages) throws Exception {
+ private void createMailBoxWithMessage(MailboxPath mailboxPath, MailboxMessage... messages) throws Exception {
+ MailboxSession session = mailboxManager.createSystemSession(mailboxPath.getUser());
MailboxId mailboxId = mailboxManager.createMailbox(mailboxPath, session).get();
Arrays.stream(messages).forEach(Throwing.consumer(message ->
{
@@ -102,8 +100,7 @@ public class ZipArchivesLoaderTest implements MailboxMessageFixture {
@Test
void mailAccountIteratorFromArchiveWithOneMailboxShouldContainOneMailbox() throws Exception {
- MailboxSession session = mailboxManager.createSystemSession(USER);
- createMailBoxWithMessage(session, MAILBOX_PATH_USER1_MAILBOX1);
+ createMailBoxWithMessage(MAILBOX_PATH_USER1_MAILBOX1);
ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
backup.backupAccount(USER1, destination);
@@ -119,9 +116,8 @@ public class ZipArchivesLoaderTest implements MailboxMessageFixture {
@Test
void mailAccountIteratorFromArchiveWithTwoMailboxesShouldContainTwoMailboxes() throws Exception {
- MailboxSession session = mailboxManager.createSystemSession(USER);
- createMailBoxWithMessage(session, MAILBOX_PATH_USER1_MAILBOX1);
- createMailBoxWithMessage(session, MAILBOX_PATH_USER1_MAILBOX2);
+ createMailBoxWithMessage(MAILBOX_PATH_USER1_MAILBOX1);
+ createMailBoxWithMessage(MAILBOX_PATH_USER1_MAILBOX2);
ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
backup.backupAccount(USER1, destination);
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org