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/03/13 16:12:43 UTC
[james-project] branch master updated (c4f44dd -> 1a607e7)
This is an automated email from the ASF dual-hosted git repository.
rouazana pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git.
from c4f44dd Merge remote-tracking branch 'blackheaven/MAILBOX-374-updateFlags-modSeq'
new 8a8ca67 JAMES-2676 refactor build zip file in ZipAssertTest
new d3238e1 JAMES-2676 add mailbox annotations in backup zip
new 1a607e7 JAMES-2676 refactor zip header string id to little endian short
The 3 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:
.../james/mailbox/model/MailboxAnnotationKey.java | 2 +-
.../org/apache/james/mailbox/backup/Backup.java | 7 +-
.../james/mailbox/backup/FlagsExtraField.java | 4 +-
.../mailbox/backup/InternalDateExtraField.java | 4 +-
.../james/mailbox/backup/MailboxIdExtraField.java | 4 +-
.../mailbox/backup/MailboxWithAnnotations.java} | 51 +++----
.../james/mailbox/backup/MessageIdExtraField.java | 4 +-
.../james/mailbox/backup/SizeExtraField.java | 5 +-
.../apache/james/mailbox/backup/UidExtraField.java | 4 +-
.../mailbox/backup/UidValidityExtraField.java | 5 +-
.../backup/{Directory.java => WithZipHeader.java} | 15 +-
.../org/apache/james/mailbox/backup/Zipper.java | 59 +++++--
.../mailbox/backup/MailboxMessageFixture.java | 22 ++-
.../{DirectoryTest.java => WithZipHeaderTest.java} | 13 +-
.../apache/james/mailbox/backup/ZipAssertTest.java | 170 +++++----------------
.../apache/james/mailbox/backup/ZipperTest.java | 86 ++++++++++-
16 files changed, 241 insertions(+), 214 deletions(-)
copy mailbox/{elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/FieldImpl.java => backup/src/main/java/org/apache/james/mailbox/backup/MailboxWithAnnotations.java} (62%)
copy mailbox/backup/src/main/java/org/apache/james/mailbox/backup/{Directory.java => WithZipHeader.java} (77%)
copy mailbox/backup/src/test/java/org/apache/james/mailbox/backup/{DirectoryTest.java => WithZipHeaderTest.java} (75%)
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 01/03: JAMES-2676 refactor build zip file in
ZipAssertTest
Posted by ro...@apache.org.
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 8a8ca6759e8fc080cd84ba5832d874466bcd4781
Author: Rémi Kowalski <rk...@linagora.com>
AuthorDate: Tue Mar 5 11:20:35 2019 +0100
JAMES-2676 refactor build zip file in ZipAssertTest
---
.../apache/james/mailbox/backup/ZipAssertTest.java | 170 +++++----------------
1 file changed, 37 insertions(+), 133 deletions(-)
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipAssertTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipAssertTest.java
index c726da8..1cc03a8 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipAssertTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipAssertTest.java
@@ -27,6 +27,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.nio.charset.StandardCharsets;
+import java.util.AbstractMap.SimpleImmutableEntry;
import org.apache.commons.compress.archivers.zip.ExtraFieldUtils;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
@@ -40,16 +41,17 @@ import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(TemporaryFolderExtension.class)
public class ZipAssertTest {
- public static final String ENTRY_NAME = "entryName";
- public static final String ENTRY_NAME_2 = "entryName2";
- public static final String DIRECTORY_NAME = "folder/";
- public static final String STRING_ENTRY_CONTENT = "abcdefghijkl";
- public static final String STRING_ENTRY_CONTENT_2 = "mnopqrstuvwxyz";
- public static final byte[] ENTRY_CONTENT = STRING_ENTRY_CONTENT.getBytes(StandardCharsets.UTF_8);
- public static final byte[] ENTRY_CONTENT_2 = STRING_ENTRY_CONTENT_2.getBytes(StandardCharsets.UTF_8);
- public static final SizeExtraField EXTRA_FIELD = new SizeExtraField(42);
-
-
+ private static final String ENTRY_NAME = "entryName";
+ private static final String ENTRY_NAME_2 = "entryName2";
+ private static final String DIRECTORY_NAME = "folder/";
+ private static final String STRING_ENTRY_CONTENT = "abcdefghijkl";
+ private static final String STRING_ENTRY_CONTENT_2 = "mnopqrstuvwxyz";
+ private static final byte[] ENTRY_CONTENT = STRING_ENTRY_CONTENT.getBytes(StandardCharsets.UTF_8);
+ private static final byte[] ENTRY_CONTENT_2 = STRING_ENTRY_CONTENT_2.getBytes(StandardCharsets.UTF_8);
+ private static final SizeExtraField EXTRA_FIELD = new SizeExtraField(42);
+
+ private static final SimpleImmutableEntry<String, byte[]> ENTRY = new SimpleImmutableEntry<>(ENTRY_NAME, ENTRY_CONTENT);
+ private static final SimpleImmutableEntry<String, byte[]> ENTRY_2 = new SimpleImmutableEntry<>(ENTRY_NAME_2, ENTRY_CONTENT_2);
private File destination;
@BeforeEach
@@ -59,30 +61,32 @@ public class ZipAssertTest {
ExtraFieldUtils.register(SizeExtraField.class);
}
- @Test
- public void hasNoEntryShouldNotThrowWhenEmpty() throws Exception {
+ private void buildZipFile(SimpleImmutableEntry<String, byte[]>... entries) throws Exception {
try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
+ for (SimpleImmutableEntry<String, byte[]> entry : entries) {
+ ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), entry.getKey());
+ archiveOutputStream.putArchiveEntry(archiveEntry);
+ IOUtils.copy(new ByteArrayInputStream(entry.getValue()), archiveOutputStream);
+ archiveOutputStream.closeArchiveEntry();
+ }
archiveOutputStream.finish();
}
+ }
+
+ @Test
+ public void hasNoEntryShouldNotThrowWhenEmpty() throws Exception {
+ buildZipFile();
try (ZipFile zipFile = new ZipFile(destination)) {
assertThatCode(() -> assertThatZip(zipFile)
- .hasNoEntry())
+ .hasNoEntry())
.doesNotThrowAnyException();
}
}
@Test
public void hasNoEntryShouldThrowWhenNotEmpty() throws Exception {
- try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
-
- ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME);
- archiveOutputStream.putArchiveEntry(archiveEntry);
- IOUtils.copy(new ByteArrayInputStream(ENTRY_CONTENT), archiveOutputStream);
- archiveOutputStream.closeArchiveEntry();
-
- archiveOutputStream.finish();
- }
+ buildZipFile(ENTRY);
try (ZipFile zipFile = new ZipFile(destination)) {
assertThatThrownBy(() -> assertThatZip(zipFile)
@@ -93,9 +97,7 @@ public class ZipAssertTest {
@Test
public void containsExactlyEntriesMatchingShouldNotThrowWhenBothEmpty() throws Exception {
- try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
- archiveOutputStream.finish();
- }
+ buildZipFile();
try (ZipFile zipFile = new ZipFile(destination)) {
assertThatCode(() -> assertThatZip(zipFile)
@@ -106,20 +108,7 @@ public class ZipAssertTest {
@Test
public void containsExactlyEntriesMatchingShouldNotThrowWhenRightOrder() throws Exception {
- try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
-
- ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME);
- archiveOutputStream.putArchiveEntry(archiveEntry);
- IOUtils.copy(new ByteArrayInputStream(ENTRY_CONTENT), archiveOutputStream);
- archiveOutputStream.closeArchiveEntry();
-
- ZipArchiveEntry archiveEntry2 = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME_2);
- archiveOutputStream.putArchiveEntry(archiveEntry2);
- IOUtils.copy(new ByteArrayInputStream(ENTRY_CONTENT_2), archiveOutputStream);
- archiveOutputStream.closeArchiveEntry();
-
- archiveOutputStream.finish();
- }
+ buildZipFile(ENTRY, ENTRY_2);
try (ZipFile zipFile = new ZipFile(destination)) {
assertThatCode(() -> assertThatZip(zipFile)
@@ -132,14 +121,7 @@ public class ZipAssertTest {
@Test
public void hasNameShouldThrowWhenWrongName() throws Exception {
- try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
-
- ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME);
- archiveOutputStream.putArchiveEntry(archiveEntry);
- IOUtils.copy(new ByteArrayInputStream(ENTRY_CONTENT), archiveOutputStream);
- archiveOutputStream.closeArchiveEntry();
- archiveOutputStream.finish();
- }
+ buildZipFile(ENTRY);
try (ZipFile zipFile = new ZipFile(destination)) {
assertThatThrownBy(() -> assertThatZip(zipFile)
@@ -151,14 +133,7 @@ public class ZipAssertTest {
@Test
public void isDirectoryShouldThrowWhenNotADirectory() throws Exception {
- try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
-
- ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME);
- archiveOutputStream.putArchiveEntry(archiveEntry);
- IOUtils.copy(new ByteArrayInputStream(ENTRY_CONTENT), archiveOutputStream);
- archiveOutputStream.closeArchiveEntry();
- archiveOutputStream.finish();
- }
+ buildZipFile(ENTRY);
try (ZipFile zipFile = new ZipFile(destination)) {
assertThatThrownBy(() -> assertThatZip(zipFile)
@@ -190,20 +165,7 @@ public class ZipAssertTest {
@Test
public void containsExactlyEntriesMatchingShouldNotThrowWhenWrongOrder() throws Exception {
- try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
-
- ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME);
- archiveOutputStream.putArchiveEntry(archiveEntry);
- IOUtils.copy(new ByteArrayInputStream(ENTRY_CONTENT), archiveOutputStream);
- archiveOutputStream.closeArchiveEntry();
-
- ZipArchiveEntry archiveEntry2 = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME_2);
- archiveOutputStream.putArchiveEntry(archiveEntry2);
- IOUtils.copy(new ByteArrayInputStream(ENTRY_CONTENT_2), archiveOutputStream);
- archiveOutputStream.closeArchiveEntry();
-
- archiveOutputStream.finish();
- }
+ buildZipFile(ENTRY, ENTRY_2);
try (ZipFile zipFile = new ZipFile(destination)) {
assertThatCode(() -> assertThatZip(zipFile)
@@ -216,20 +178,7 @@ public class ZipAssertTest {
@Test
public void containsExactlyEntriesMatchingShouldThrowWhenExpectingMoreEntries() throws Exception {
- try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
-
- ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME);
- archiveOutputStream.putArchiveEntry(archiveEntry);
- IOUtils.copy(new ByteArrayInputStream(ENTRY_CONTENT), archiveOutputStream);
- archiveOutputStream.closeArchiveEntry();
-
- ZipArchiveEntry archiveEntry2 = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME_2);
- archiveOutputStream.putArchiveEntry(archiveEntry2);
- IOUtils.copy(new ByteArrayInputStream(ENTRY_CONTENT_2), archiveOutputStream);
- archiveOutputStream.closeArchiveEntry();
-
- archiveOutputStream.finish();
- }
+ buildZipFile(ENTRY, ENTRY_2);
try (ZipFile zipFile = new ZipFile(destination)) {
assertThatThrownBy(() -> assertThatZip(zipFile)
@@ -243,20 +192,7 @@ public class ZipAssertTest {
@Test
public void containsExactlyEntriesMatchingShouldThrowWhenExpectingLessEntries() throws Exception {
- try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
-
- ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME);
- archiveOutputStream.putArchiveEntry(archiveEntry);
- IOUtils.copy(new ByteArrayInputStream(ENTRY_CONTENT), archiveOutputStream);
- archiveOutputStream.closeArchiveEntry();
-
- ZipArchiveEntry archiveEntry2 = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME_2);
- archiveOutputStream.putArchiveEntry(archiveEntry2);
- IOUtils.copy(new ByteArrayInputStream(ENTRY_CONTENT_2), archiveOutputStream);
- archiveOutputStream.closeArchiveEntry();
-
- archiveOutputStream.finish();
- }
+ buildZipFile(ENTRY, ENTRY_2);
try (ZipFile zipFile = new ZipFile(destination)) {
assertThatThrownBy(() -> assertThatZip(zipFile)
@@ -268,15 +204,7 @@ public class ZipAssertTest {
@Test
public void hasStringContentShouldNotThrowWhenIdentical() throws Exception {
- try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
-
- ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME);
- archiveOutputStream.putArchiveEntry(archiveEntry);
- IOUtils.copy(new ByteArrayInputStream(ENTRY_CONTENT), archiveOutputStream);
- archiveOutputStream.closeArchiveEntry();
-
- archiveOutputStream.finish();
- }
+ buildZipFile(ENTRY);
try (ZipFile zipFile = new ZipFile(destination)) {
assertThatCode(() -> assertThatZip(zipFile)
@@ -289,15 +217,7 @@ public class ZipAssertTest {
@Test
public void hasStringContentShouldThrowWhenDifferent() throws Exception {
- try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
-
- ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME);
- archiveOutputStream.putArchiveEntry(archiveEntry);
- IOUtils.copy(new ByteArrayInputStream(ENTRY_CONTENT), archiveOutputStream);
- archiveOutputStream.closeArchiveEntry();
-
- archiveOutputStream.finish();
- }
+ buildZipFile(ENTRY);
try (ZipFile zipFile = new ZipFile(destination)) {
assertThatThrownBy(() -> assertThatZip(zipFile)
@@ -310,15 +230,7 @@ public class ZipAssertTest {
@Test
public void containsExactlyExtraFieldsShouldNotThrowWhenBothEmpty() throws Exception {
- try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
-
- ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME);
- archiveOutputStream.putArchiveEntry(archiveEntry);
- IOUtils.copy(new ByteArrayInputStream(ENTRY_CONTENT), archiveOutputStream);
- archiveOutputStream.closeArchiveEntry();
-
- archiveOutputStream.finish();
- }
+ buildZipFile(ENTRY);
try (ZipFile zipFile = new ZipFile(destination)) {
assertThatCode(() -> assertThatZip(zipFile)
@@ -331,15 +243,7 @@ public class ZipAssertTest {
@Test
public void containsExactlyExtraFieldsShouldThrowWhenMissingExpectedField() throws Exception {
- try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
-
- ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME);
- archiveOutputStream.putArchiveEntry(archiveEntry);
- IOUtils.copy(new ByteArrayInputStream(ENTRY_CONTENT), archiveOutputStream);
- archiveOutputStream.closeArchiveEntry();
-
- archiveOutputStream.finish();
- }
+ buildZipFile(ENTRY);
try (ZipFile zipFile = new ZipFile(destination)) {
assertThatThrownBy(() -> assertThatZip(zipFile)
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 02/03: JAMES-2676 add mailbox annotations in backup
zip
Posted by ro...@apache.org.
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 d3238e1d6d8eff96045ae82ab4dafc4a9df3a5ad
Author: Rémi Kowalski <rk...@linagora.com>
AuthorDate: Tue Mar 5 14:26:22 2019 +0100
JAMES-2676 add mailbox annotations in backup zip
---
.../james/mailbox/model/MailboxAnnotationKey.java | 2 +-
.../org/apache/james/mailbox/backup/Backup.java | 7 +-
.../{Backup.java => MailboxWithAnnotations.java} | 35 ++++++---
.../org/apache/james/mailbox/backup/Zipper.java | 59 ++++++++++++---
.../mailbox/backup/MailboxMessageFixture.java | 22 +++++-
.../apache/james/mailbox/backup/ZipperTest.java | 86 ++++++++++++++++++++--
6 files changed, 177 insertions(+), 34 deletions(-)
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxAnnotationKey.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxAnnotationKey.java
index 1e7349d..a4ac543 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxAnnotationKey.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxAnnotationKey.java
@@ -46,7 +46,7 @@ public class MailboxAnnotationKey {
public MailboxAnnotationKey(String key) {
this.key = key;
Preconditions.checkArgument(isValid(),
- "Key must start with '/' and not end with '/' and does not contain charater with hex from '\u0000' to '\u00019' or {'*', '%', two consecutive '/'} ");
+ "Key must start with '/' and not end with '/' and does not contain character with hex from '\u0000' to '\u00019' or {'*', '%', two consecutive '/'} ");
}
private boolean isValid() {
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/Backup.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/Backup.java
index 81ebddb..e77871e 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/Backup.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/Backup.java
@@ -23,15 +23,14 @@ import java.io.OutputStream;
import java.util.List;
import java.util.stream.Stream;
-import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.apache.james.mailbox.store.mail.model.MailboxMessage;
public interface Backup {
/**
- * @param mailboxes list of mailboxes to be stored in the archive
- * @param messages a stream of MailboxMessages that will be consumed
+ * @param mailboxes list of mailboxes and their annotations to be stored in the archive
+ * @param messages a stream of MailboxMessages that will be consumed
* @param destination an OutputStream in which the zip will be written
*/
- void archive(List<Mailbox> mailboxes, Stream<MailboxMessage> messages, OutputStream destination) throws IOException;
+ void archive(List<MailboxWithAnnotations> mailboxes, Stream<MailboxMessage> messages, OutputStream destination) throws IOException;
}
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/Backup.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxWithAnnotations.java
similarity index 62%
copy from mailbox/backup/src/main/java/org/apache/james/mailbox/backup/Backup.java
copy to mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxWithAnnotations.java
index 81ebddb..c460685 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/Backup.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxWithAnnotations.java
@@ -18,20 +18,33 @@
****************************************************************/
package org.apache.james.mailbox.backup;
-import java.io.IOException;
-import java.io.OutputStream;
import java.util.List;
-import java.util.stream.Stream;
+import java.util.Objects;
+import org.apache.james.mailbox.model.MailboxAnnotation;
import org.apache.james.mailbox.store.mail.model.Mailbox;
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-public interface Backup {
+public class MailboxWithAnnotations {
+ public final Mailbox mailbox;
+ public final List<MailboxAnnotation> annotations;
- /**
- * @param mailboxes list of mailboxes to be stored in the archive
- * @param messages a stream of MailboxMessages that will be consumed
- * @param destination an OutputStream in which the zip will be written
- */
- void archive(List<Mailbox> mailboxes, Stream<MailboxMessage> messages, OutputStream destination) throws IOException;
+ public MailboxWithAnnotations(Mailbox mailbox, List<MailboxAnnotation> annotations) {
+ this.mailbox = mailbox;
+ this.annotations = annotations;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof MailboxAnnotation) {
+ MailboxWithAnnotations that = (MailboxWithAnnotations) o;
+ return Objects.equals(mailbox, that.mailbox) &&
+ Objects.equals(annotations, that.annotations);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mailbox, annotations);
+ }
}
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/Zipper.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/Zipper.java
index 4d1de4f..7f87a69 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/Zipper.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/Zipper.java
@@ -21,6 +21,8 @@ package org.apache.james.mailbox.backup;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
import java.util.List;
import java.util.stream.Stream;
@@ -28,12 +30,18 @@ import org.apache.commons.compress.archivers.zip.ExtraFieldUtils;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.io.IOUtils;
+import org.apache.james.mailbox.model.MailboxAnnotation;
import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.apache.james.mailbox.store.mail.model.MailboxMessage;
import com.github.fge.lambdas.Throwing;
+import com.google.common.base.Charsets;
public class Zipper implements Backup {
+
+ private static final String ANNOTATION_DIRECTORY = "annotations";
+ private static final boolean AUTO_FLUSH = true;
+
public Zipper() {
ExtraFieldUtils.register(SizeExtraField.class);
ExtraFieldUtils.register(UidExtraField.class);
@@ -45,7 +53,7 @@ public class Zipper implements Backup {
}
@Override
- public void archive(List<Mailbox> mailboxes, Stream<MailboxMessage> messages, OutputStream destination) throws IOException {
+ public void archive(List<MailboxWithAnnotations> mailboxes, Stream<MailboxMessage> messages, OutputStream destination) throws IOException {
try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
storeMailboxes(mailboxes, archiveOutputStream);
storeMessages(messages, archiveOutputStream);
@@ -53,19 +61,22 @@ public class Zipper implements Backup {
}
}
- private void storeMailboxes(List<Mailbox> mailboxes, ZipArchiveOutputStream archiveOutputStream) throws IOException {
- for (Mailbox mailbox: mailboxes) {
- storeInArchive(mailbox, archiveOutputStream);
- }
+ private void storeMailboxes(List<MailboxWithAnnotations> mailboxes, ZipArchiveOutputStream archiveOutputStream) throws IOException {
+ mailboxes.forEach(Throwing.<MailboxWithAnnotations>consumer(mailbox ->
+ storeInArchive(mailbox, archiveOutputStream)
+ ).sneakyThrow());
}
- private void storeMessages(Stream<MailboxMessage> messages, ZipArchiveOutputStream archiveOutputStream) {
- messages.forEach(Throwing.<MailboxMessage>consumer(message -> {
- storeInArchive(message, archiveOutputStream);
- }).sneakyThrow());
+ private void storeMessages(Stream<MailboxMessage> messages, ZipArchiveOutputStream archiveOutputStream) throws IOException {
+ messages.forEach(Throwing.<MailboxMessage>consumer(message ->
+ storeInArchive(message, archiveOutputStream)
+ ).sneakyThrow());
}
- private void storeInArchive(Mailbox mailbox, ZipArchiveOutputStream archiveOutputStream) throws IOException {
+ private void storeInArchive(MailboxWithAnnotations mailboxWithAnnotations, ZipArchiveOutputStream archiveOutputStream) throws IOException {
+ Mailbox mailbox = mailboxWithAnnotations.mailbox;
+ List<MailboxAnnotation> annotations = mailboxWithAnnotations.annotations;
+
String name = mailbox.getName();
ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new Directory(name), name);
@@ -74,6 +85,34 @@ public class Zipper implements Backup {
archiveOutputStream.putArchiveEntry(archiveEntry);
archiveOutputStream.closeArchiveEntry();
+
+ storeAllAnnotationsInArchive(archiveOutputStream, annotations, name);
+ }
+
+ private void storeAllAnnotationsInArchive(ZipArchiveOutputStream archiveOutputStream, List<MailboxAnnotation> annotations, String name) throws IOException {
+ if (!annotations.isEmpty()) {
+ String annotationsDirectoryPath = name + "/" + ANNOTATION_DIRECTORY;
+ ZipArchiveEntry annotationDirectory = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(
+ new Directory(annotationsDirectoryPath), annotationsDirectoryPath);
+ archiveOutputStream.putArchiveEntry(annotationDirectory);
+ archiveOutputStream.closeArchiveEntry();
+ annotations.forEach(Throwing.consumer(annotation ->
+ storeInArchive(annotation, annotationsDirectoryPath, archiveOutputStream)));
+ }
+ }
+
+ private void storeInArchive(MailboxAnnotation annotation, String directory, ZipArchiveOutputStream archiveOutputStream) throws IOException {
+ String entryId = directory + "/" + annotation.getKey().asString();
+ ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File(entryId), entryId);
+ archiveOutputStream.putArchiveEntry(archiveEntry);
+
+ annotation.getValue().ifPresent(value -> {
+ try (PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(archiveOutputStream, Charsets.UTF_8), AUTO_FLUSH)) {
+ printWriter.print(value);
+ }
+ });
+
+ archiveOutputStream.closeArchiveEntry();
}
private void storeInArchive(MailboxMessage message, ZipArchiveOutputStream archiveOutputStream) throws IOException {
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 098a858..c4a368a 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
@@ -23,6 +23,7 @@ import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.time.ZonedDateTime;
import java.util.Date;
+import java.util.List;
import javax.mail.Flags;
import javax.mail.util.SharedByteArrayInputStream;
@@ -30,6 +31,8 @@ import javax.mail.util.SharedByteArrayInputStream;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MailboxSessionUtil;
import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.model.MailboxAnnotation;
+import org.apache.james.mailbox.model.MailboxAnnotationKey;
import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.model.MessageId;
@@ -40,6 +43,8 @@ import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
+import com.google.common.collect.ImmutableList;
+
public interface MailboxMessageFixture {
String DATE_STRING_1 = "2018-02-15T15:54:02Z";
@@ -70,6 +75,22 @@ public interface MailboxMessageFixture {
Mailbox MAILBOX_1_SUB_1 = new SimpleMailbox(MailboxPath.forUser("user", "mailbox1" + MAILBOX_SESSION.getPathDelimiter() + "sub1"), 420, TestId.of(11L));
Mailbox MAILBOX_2 = new SimpleMailbox(MailboxPath.forUser("user", "mailbox2"), 43, TestId.of(2L));
+ List<MailboxAnnotation> NO_ANNOTATION = ImmutableList.of();
+
+ MailboxAnnotationKey ANNOTATION_1_KEY = new MailboxAnnotationKey("/annotation1/test");
+ MailboxAnnotationKey ANNOTATION_2_KEY = new MailboxAnnotationKey("/annotation2/void");
+
+ String ANNOTATION_1_CONTENT = "annotation1 content";
+ String ANNOTATION_1_BIS_CONTENT = "annotation1 bis content";
+ String ANNOTATION_2_CONTENT = "annotation2 content";
+
+ MailboxAnnotation ANNOTATION_1 = MailboxAnnotation.newInstance(ANNOTATION_1_KEY, ANNOTATION_1_CONTENT);
+ MailboxAnnotation ANNOTATION_1_BIS = MailboxAnnotation.newInstance(ANNOTATION_1_KEY, ANNOTATION_1_BIS_CONTENT);
+ List<MailboxAnnotation> WITH_ANNOTATION_1 = ImmutableList.of(ANNOTATION_1);
+
+ MailboxAnnotation ANNOTATION_2 = MailboxAnnotation.newInstance(ANNOTATION_2_KEY, ANNOTATION_2_CONTENT);
+ List<MailboxAnnotation> WITH_ANNOTATION_1_AND_2 = ImmutableList.of(ANNOTATION_1, ANNOTATION_2);
+
SimpleMailboxMessage MESSAGE_1 = SimpleMailboxMessage.builder()
.messageId(MESSAGE_ID_1)
.uid(MESSAGE_UID_1)
@@ -92,5 +113,4 @@ public interface MailboxMessageFixture {
.propertyBuilder(new PropertyBuilder())
.mailboxId(MAILBOX_ID_1)
.build();
-
}
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipperTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipperTest.java
index 103d72d..e6da066 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipperTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipperTest.java
@@ -18,6 +18,12 @@
****************************************************************/
package org.apache.james.mailbox.backup;
+import static org.apache.james.mailbox.backup.MailboxMessageFixture.ANNOTATION_1;
+import static org.apache.james.mailbox.backup.MailboxMessageFixture.ANNOTATION_1_BIS;
+import static org.apache.james.mailbox.backup.MailboxMessageFixture.ANNOTATION_1_BIS_CONTENT;
+import static org.apache.james.mailbox.backup.MailboxMessageFixture.ANNOTATION_1_CONTENT;
+import static org.apache.james.mailbox.backup.MailboxMessageFixture.ANNOTATION_2;
+import static org.apache.james.mailbox.backup.MailboxMessageFixture.ANNOTATION_2_CONTENT;
import static org.apache.james.mailbox.backup.MailboxMessageFixture.MAILBOX_1;
import static org.apache.james.mailbox.backup.MailboxMessageFixture.MAILBOX_1_SUB_1;
import static org.apache.james.mailbox.backup.MailboxMessageFixture.MAILBOX_2;
@@ -29,7 +35,10 @@ import static org.apache.james.mailbox.backup.MailboxMessageFixture.MESSAGE_CONT
import static org.apache.james.mailbox.backup.MailboxMessageFixture.MESSAGE_ID_1;
import static org.apache.james.mailbox.backup.MailboxMessageFixture.MESSAGE_ID_2;
import static org.apache.james.mailbox.backup.MailboxMessageFixture.MESSAGE_UID_1_VALUE;
+import static org.apache.james.mailbox.backup.MailboxMessageFixture.NO_ANNOTATION;
import static org.apache.james.mailbox.backup.MailboxMessageFixture.SIZE_1;
+import static org.apache.james.mailbox.backup.MailboxMessageFixture.WITH_ANNOTATION_1;
+import static org.apache.james.mailbox.backup.MailboxMessageFixture.WITH_ANNOTATION_1_AND_2;
import static org.apache.james.mailbox.backup.ZipAssert.EntryChecks.hasName;
import static org.apache.james.mailbox.backup.ZipAssert.assertThatZip;
@@ -39,14 +48,17 @@ import java.util.stream.Stream;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
-import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.google.common.collect.ImmutableList;
class ZipperTest {
- private static final List<Mailbox> NO_MAILBOXES = ImmutableList.of();
+ private static final List<MailboxWithAnnotations> NO_MAILBOXES = ImmutableList.of();
+ private static final MailboxWithAnnotations MAILBOX_1_WITHOUT_ANNOTATION = new MailboxWithAnnotations(MAILBOX_1, NO_ANNOTATION);
+ private static final MailboxWithAnnotations MAILBOX_1_SUB_1_WITHOUT_ANNOTATION = new MailboxWithAnnotations(MAILBOX_1_SUB_1, NO_ANNOTATION);
+ private static final MailboxWithAnnotations MAILBOX_2_WITHOUT_ANNOTATION = new MailboxWithAnnotations(MAILBOX_2, NO_ANNOTATION);
+
private Zipper testee;
private ByteArrayOutputStream output;
@@ -109,7 +121,7 @@ class ZipperTest {
@Test
void archiveShouldWriteOneMailboxWhenPresent() throws Exception {
- testee.archive(ImmutableList.of(MAILBOX_1), Stream.of(), output);
+ testee.archive(ImmutableList.of(MAILBOX_1_WITHOUT_ANNOTATION), Stream.of(), output);
try (ZipFile zipFile = new ZipFile(toSeekableByteChannel(output))) {
assertThatZip(zipFile)
@@ -121,7 +133,7 @@ class ZipperTest {
@Test
void archiveShouldWriteMailboxesWhenPresent() throws Exception {
- testee.archive(ImmutableList.of(MAILBOX_1, MAILBOX_2), Stream.of(), output);
+ testee.archive(ImmutableList.of(MAILBOX_1_WITHOUT_ANNOTATION, MAILBOX_2_WITHOUT_ANNOTATION), Stream.of(), output);
try (ZipFile zipFile = new ZipFile(toSeekableByteChannel(output))) {
assertThatZip(zipFile)
@@ -135,7 +147,7 @@ class ZipperTest {
@Test
void archiveShouldWriteMailboxHierarchyWhenPresent() throws Exception {
- testee.archive(ImmutableList.of(MAILBOX_1, MAILBOX_1_SUB_1, MAILBOX_2), Stream.of(), output);
+ testee.archive(ImmutableList.of(MAILBOX_1_WITHOUT_ANNOTATION, MAILBOX_1_SUB_1_WITHOUT_ANNOTATION, MAILBOX_2_WITHOUT_ANNOTATION), Stream.of(), output);
try (ZipFile zipFile = new ZipFile(toSeekableByteChannel(output))) {
assertThatZip(zipFile)
@@ -151,7 +163,7 @@ class ZipperTest {
@Test
void archiveShouldWriteMailboxHierarchyWhenMissingParent() throws Exception {
- testee.archive(ImmutableList.of(MAILBOX_1_SUB_1, MAILBOX_2), Stream.of(), output);
+ testee.archive(ImmutableList.of(MAILBOX_1_SUB_1_WITHOUT_ANNOTATION, MAILBOX_2_WITHOUT_ANNOTATION), Stream.of(), output);
try (ZipFile zipFile = new ZipFile(toSeekableByteChannel(output))) {
assertThatZip(zipFile)
@@ -165,7 +177,7 @@ class ZipperTest {
@Test
void archiveShouldWriteMailboxMetadataWhenPresent() throws Exception {
- testee.archive(ImmutableList.of(MAILBOX_1), Stream.of(), output);
+ testee.archive(ImmutableList.of(MAILBOX_1_WITHOUT_ANNOTATION), Stream.of(), output);
try (ZipFile zipFile = new ZipFile(toSeekableByteChannel(output))) {
assertThatZip(zipFile)
@@ -177,6 +189,66 @@ class ZipperTest {
}
}
+ @Test
+ void archiveShouldWriteMailBoxWithoutAnAnnotationSubDirWhenEmpty() throws Exception {
+ testee.archive(ImmutableList.of(MAILBOX_1_WITHOUT_ANNOTATION), Stream.of(), output);
+
+ try (ZipFile zipFile = new ZipFile(toSeekableByteChannel(output))) {
+ assertThatZip(zipFile)
+ .containsOnlyEntriesMatching(
+ hasName(MAILBOX_1.getName() + "/")
+ );
+ }
+ }
+
+ @Test
+ void archiveShouldWriteMailboxAnnotationsInASubDirWhenPresent() throws Exception {
+ testee.archive(ImmutableList.of(new MailboxWithAnnotations(MAILBOX_1, WITH_ANNOTATION_1)), Stream.of(), output);
+
+ try (ZipFile zipFile = new ZipFile(toSeekableByteChannel(output))) {
+ assertThatZip(zipFile)
+ .containsOnlyEntriesMatching(
+ hasName(MAILBOX_1.getName() + "/"),
+ hasName(MAILBOX_1.getName() + "/annotations/").isDirectory(),
+ hasName(MAILBOX_1.getName() + "/annotations/" + ANNOTATION_1.getKey().asString())
+ );
+ }
+ }
+
+ @Test
+ void archiveShouldWriteMailboxAnnotationsInASubDirWhenTwoPresent() throws Exception {
+ testee.archive(ImmutableList.of(new MailboxWithAnnotations(MAILBOX_1, WITH_ANNOTATION_1_AND_2)), Stream.of(), output);
+
+ try (ZipFile zipFile = new ZipFile(toSeekableByteChannel(output))) {
+ assertThatZip(zipFile)
+ .containsOnlyEntriesMatching(
+ hasName(MAILBOX_1.getName() + "/"),
+ hasName(MAILBOX_1.getName() + "/annotations/").isDirectory(),
+ hasName(MAILBOX_1.getName() + "/annotations/" + ANNOTATION_1.getKey().asString())
+ .hasStringContent(ANNOTATION_1_CONTENT),
+ hasName(MAILBOX_1.getName() + "/annotations/" + ANNOTATION_2.getKey().asString())
+ .hasStringContent(ANNOTATION_2_CONTENT)
+ );
+ }
+ }
+
+ @Test
+ void archiveShouldWriteMailboxAnnotationsInASubDirWhenTwoPresentWithTheSameName() throws Exception {
+ testee.archive(ImmutableList.of(new MailboxWithAnnotations(MAILBOX_1, ImmutableList.of(ANNOTATION_1, ANNOTATION_1_BIS))), Stream.of(), output);
+
+ try (ZipFile zipFile = new ZipFile(toSeekableByteChannel(output))) {
+ assertThatZip(zipFile)
+ .containsOnlyEntriesMatching(
+ hasName(MAILBOX_1.getName() + "/"),
+ hasName(MAILBOX_1.getName() + "/annotations/").isDirectory(),
+ hasName(MAILBOX_1.getName() + "/annotations/" + ANNOTATION_1.getKey().asString())
+ .hasStringContent(ANNOTATION_1_CONTENT),
+ hasName(MAILBOX_1.getName() + "/annotations/" + ANNOTATION_1.getKey().asString())
+ .hasStringContent(ANNOTATION_1_BIS_CONTENT)
+ );
+ }
+ }
+
private SeekableInMemoryByteChannel toSeekableByteChannel(ByteArrayOutputStream output) {
return new SeekableInMemoryByteChannel(output.toByteArray());
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 03/03: JAMES-2676 refactor zip header string id to
little endian short
Posted by ro...@apache.org.
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 1a607e7e6833fedd4c0c8f7f05f59cfea1ab4bba
Author: Rémi Kowalski <rk...@linagora.com>
AuthorDate: Wed Mar 6 15:55:26 2019 +0100
JAMES-2676 refactor zip header string id to little endian short
---
.../james/mailbox/backup/FlagsExtraField.java | 4 ++--
.../mailbox/backup/InternalDateExtraField.java | 4 ++--
.../james/mailbox/backup/MailboxIdExtraField.java | 4 ++--
.../james/mailbox/backup/MessageIdExtraField.java | 4 ++--
.../james/mailbox/backup/SizeExtraField.java | 5 ++--
.../apache/james/mailbox/backup/UidExtraField.java | 4 ++--
.../mailbox/backup/UidValidityExtraField.java | 5 ++--
.../{UidExtraField.java => WithZipHeader.java} | 28 ++++++----------------
.../james/mailbox/backup/WithZipHeaderTest.java} | 28 +++++++++-------------
9 files changed, 34 insertions(+), 52 deletions(-)
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/FlagsExtraField.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/FlagsExtraField.java
index d290472..3d7f7b3 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/FlagsExtraField.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/FlagsExtraField.java
@@ -28,9 +28,9 @@ import javax.mail.Flags;
import org.apache.commons.compress.archivers.zip.ZipShort;
import org.apache.james.util.StreamUtils;
-public class FlagsExtraField extends StringExtraField {
+public class FlagsExtraField extends StringExtraField implements WithZipHeader {
- public static final ZipShort ID_AP = new ZipShort(0x7061); // "ap" in little-endian
+ public static final ZipShort ID_AP = new ZipShort(WithZipHeader.toLittleEndian('a', 'p'));
private static String serializeFlags(Flags flags) {
return Stream.concat(
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/InternalDateExtraField.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/InternalDateExtraField.java
index 8d57370..0774647 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/InternalDateExtraField.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/InternalDateExtraField.java
@@ -24,9 +24,9 @@ import java.util.Optional;
import org.apache.commons.compress.archivers.zip.ZipShort;
-public class InternalDateExtraField extends LongExtraField {
+public class InternalDateExtraField extends LongExtraField implements WithZipHeader {
- public static final ZipShort ID_AO = new ZipShort(0x6F61); // "ao" in little-endian
+ public static final ZipShort ID_AO = new ZipShort(WithZipHeader.toLittleEndian('a', 'o'));
public InternalDateExtraField() {
super();
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxIdExtraField.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxIdExtraField.java
index c5bbaf1..5ca19db 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxIdExtraField.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxIdExtraField.java
@@ -24,9 +24,9 @@ import java.util.Optional;
import org.apache.commons.compress.archivers.zip.ZipShort;
import org.apache.james.mailbox.model.MailboxId;
-public class MailboxIdExtraField extends StringExtraField {
+public class MailboxIdExtraField extends StringExtraField implements WithZipHeader {
- public static final ZipShort ID_AM = new ZipShort(0x6D61); // "am" in little-endian
+ public static final ZipShort ID_AM = new ZipShort(WithZipHeader.toLittleEndian('a', 'm'));
public MailboxIdExtraField() {
super();
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MessageIdExtraField.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MessageIdExtraField.java
index 1cbb1e2..46a971b 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MessageIdExtraField.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MessageIdExtraField.java
@@ -24,9 +24,9 @@ import java.util.Optional;
import org.apache.commons.compress.archivers.zip.ZipShort;
import org.apache.james.mailbox.model.MessageId;
-public class MessageIdExtraField extends StringExtraField {
+public class MessageIdExtraField extends StringExtraField implements WithZipHeader {
- public static final ZipShort ID_AL = new ZipShort(0x6C61); // "al" in little-endian
+ public static final ZipShort ID_AL = new ZipShort(WithZipHeader.toLittleEndian('a', 'l'));
public MessageIdExtraField() {
super();
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SizeExtraField.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SizeExtraField.java
index f932879..4ff486b 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SizeExtraField.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SizeExtraField.java
@@ -22,8 +22,9 @@ import java.util.Optional;
import org.apache.commons.compress.archivers.zip.ZipShort;
-public class SizeExtraField extends LongExtraField {
- public static final ZipShort ID_AJ = new ZipShort(0x6A61); // "aj" in little-endian
+public class SizeExtraField extends LongExtraField implements WithZipHeader {
+
+ public static final ZipShort ID_AJ = new ZipShort(WithZipHeader.toLittleEndian('a', 'j'));
public SizeExtraField() {
super();
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/UidExtraField.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/UidExtraField.java
index f70585c..6d2ad35 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/UidExtraField.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/UidExtraField.java
@@ -23,9 +23,9 @@ import java.util.Optional;
import org.apache.commons.compress.archivers.zip.ZipShort;
-public class UidExtraField extends LongExtraField {
+public class UidExtraField extends LongExtraField implements WithZipHeader {
- public static final ZipShort ID_AK = new ZipShort(0x6B61); // "ak" in little-endian
+ public static final ZipShort ID_AK = new ZipShort(WithZipHeader.toLittleEndian('a', 'k'));
public UidExtraField() {
super();
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/UidValidityExtraField.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/UidValidityExtraField.java
index 28b4730..0fb9d23 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/UidValidityExtraField.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/UidValidityExtraField.java
@@ -22,8 +22,9 @@ import java.util.Optional;
import org.apache.commons.compress.archivers.zip.ZipShort;
-public class UidValidityExtraField extends LongExtraField {
- public static final ZipShort ID_AN = new ZipShort(0x6E61); // "an" in little-endian
+public class UidValidityExtraField extends LongExtraField implements WithZipHeader {
+
+ public static final ZipShort ID_AN = new ZipShort(WithZipHeader.toLittleEndian('a', 'n'));
public UidValidityExtraField() {
super();
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/UidExtraField.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/WithZipHeader.java
similarity index 71%
copy from mailbox/backup/src/main/java/org/apache/james/mailbox/backup/UidExtraField.java
copy to mailbox/backup/src/main/java/org/apache/james/mailbox/backup/WithZipHeader.java
index f70585c..873142f 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/UidExtraField.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/WithZipHeader.java
@@ -16,31 +16,17 @@
* specific language governing permissions and limitations *
* under the License. *
****************************************************************/
-
package org.apache.james.mailbox.backup;
-import java.util.Optional;
-
-import org.apache.commons.compress.archivers.zip.ZipShort;
-
-public class UidExtraField extends LongExtraField {
-
- public static final ZipShort ID_AK = new ZipShort(0x6B61); // "ak" in little-endian
+import java.nio.ByteOrder;
+import java.nio.CharBuffer;
- public UidExtraField() {
- super();
- }
-
- public UidExtraField(long value) {
- super(value);
- }
+import org.apache.james.mime4j.Charsets;
- public UidExtraField(Optional<Long> value) {
- super(value);
- }
+public interface WithZipHeader {
- @Override
- public ZipShort getHeaderId() {
- return ID_AK;
+ static int toLittleEndian(char lowByte, char highByte) {
+ char[] chars = new char[]{lowByte, highByte};
+ return Charsets.US_ASCII.encode(CharBuffer.wrap(chars)).order(ByteOrder.LITTLE_ENDIAN).getShort();
}
}
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SizeExtraField.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/WithZipHeaderTest.java
similarity index 70%
copy from mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SizeExtraField.java
copy to mailbox/backup/src/test/java/org/apache/james/mailbox/backup/WithZipHeaderTest.java
index f932879..9a9552c 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SizeExtraField.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/WithZipHeaderTest.java
@@ -18,27 +18,21 @@
****************************************************************/
package org.apache.james.mailbox.backup;
-import java.util.Optional;
+import static org.assertj.core.api.Assertions.assertThat;
-import org.apache.commons.compress.archivers.zip.ZipShort;
+import org.junit.jupiter.api.Test;
-public class SizeExtraField extends LongExtraField {
- public static final ZipShort ID_AJ = new ZipShort(0x6A61); // "aj" in little-endian
+class WithZipHeaderTest {
+ private static final short al = 0x6C61;
+ private static final short aq = 0x7161;
- public SizeExtraField() {
- super();
+ @Test
+ void toLittleEndianShouldReturnLittleEndianRepresentationOfStringAl() {
+ assertThat(WithZipHeader.toLittleEndian('a', 'l')).isEqualTo(al);
}
- public SizeExtraField(long value) {
- super(value);
- }
-
- public SizeExtraField(Optional<Long> value) {
- super(value);
- }
-
- @Override
- public ZipShort getHeaderId() {
- return ID_AJ;
+ @Test
+ void toLittleEndianShouldReturnLittleEndianRepresentationOfStringAq() {
+ assertThat(WithZipHeader.toLittleEndian('a', 'q')).isEqualTo(aq);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org