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 2018/06/27 14:44:35 UTC
[13/17] james-project git commit: JAMES-2436 Adding
InternalDateExtraField
JAMES-2436 Adding InternalDateExtraField
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/ca09a60e
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/ca09a60e
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/ca09a60e
Branch: refs/heads/master
Commit: ca09a60efc4dd6d1952f3fdeef70282045d9ad98
Parents: f384d25
Author: duc <dt...@linagora.com>
Authored: Thu Jun 21 12:52:13 2018 +0700
Committer: Raphael Ouazana <ra...@linagora.com>
Committed: Wed Jun 27 16:40:04 2018 +0200
----------------------------------------------------------------------
.../mailbox/backup/InternalDateExtraField.java | 55 ++++
.../org/apache/james/mailbox/backup/Zipper.java | 2 +
.../backup/InternalDateExtraFieldTest.java | 297 +++++++++++++++++++
.../apache/james/mailbox/backup/ZipperTest.java | 2 +-
4 files changed, 355 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/ca09a60e/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/InternalDateExtraField.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..ef7af13
--- /dev/null
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/InternalDateExtraField.java
@@ -0,0 +1,55 @@
+/****************************************************************
+ * 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.util.Date;
+import java.util.Optional;
+
+import org.apache.commons.compress.archivers.zip.ZipShort;
+
+public class InternalDateExtraField extends LongExtraField {
+
+ public static final ZipShort ID = new ZipShort(0x6F61); // "ao" in little-endian
+
+ public InternalDateExtraField() {
+ super();
+ }
+
+ public InternalDateExtraField(long time) {
+ super(time);
+ }
+
+ public InternalDateExtraField(Date date) {
+ super(date.getTime());
+ }
+
+ public InternalDateExtraField(Optional<Date> date) {
+ super(date.map(Date::getTime));
+ }
+
+ @Override
+ public ZipShort getHeaderId() {
+ return ID;
+ }
+
+ public Optional<Date> getDateValue() {
+ return getValue().map(Date::new);
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ca09a60e/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/Zipper.java
----------------------------------------------------------------------
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 a69ba24..8d09d7e 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
@@ -39,6 +39,7 @@ public class Zipper implements Backup {
ExtraFieldUtils.register(UidExtraField.class);
ExtraFieldUtils.register(MessageIdExtraField.class);
ExtraFieldUtils.register(MailboxIdExtraField.class);
+ ExtraFieldUtils.register(InternalDateExtraField.class);
}
@Override
@@ -72,6 +73,7 @@ public class Zipper implements Backup {
archiveEntry.addExtraField(new UidExtraField(message.getUid().asLong()));
archiveEntry.addExtraField(new MessageIdExtraField(message.getMessageId().serialize()));
archiveEntry.addExtraField(new MailboxIdExtraField(message.getMailboxId().serialize()));
+ archiveEntry.addExtraField(new InternalDateExtraField(message.getInternalDate()));
archiveOutputStream.putArchiveEntry(archiveEntry);
IOUtils.copy(message.getFullContent(), archiveOutputStream);
http://git-wip-us.apache.org/repos/asf/james-project/blob/ca09a60e/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/InternalDateExtraFieldTest.java
----------------------------------------------------------------------
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/InternalDateExtraFieldTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/InternalDateExtraFieldTest.java
new file mode 100644
index 0000000..c511df5
--- /dev/null
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/InternalDateExtraFieldTest.java
@@ -0,0 +1,297 @@
+/****************************************************************
+ * 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 static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Date;
+import java.util.zip.ZipException;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.testcontainers.shaded.org.bouncycastle.util.Arrays;
+
+import com.google.common.base.Charsets;
+
+public class InternalDateExtraFieldTest {
+ private static final byte[] ZERO_AS_BYTE_ARRAY = {0, 0, 0, 0, 0, 0, 0, 0};
+ private static final byte[] _123456789ABCDEF0_AS_LE_BYTE_ARRAY = new byte[] {(byte) 0xF0, (byte) 0xDE, (byte) 0xBC, (byte) 0x9A, 0x78, 0x56, 0x34, 0x12};
+ private static final byte[] FEDCBA9876543210_AS_LE_BYTE_ARRAY = new byte[] {0x10, 0x32, 0x54, 0x76, (byte) 0x98, (byte) 0xBA, (byte) 0xDC, (byte) 0xFE};
+ private static final byte[] UNUSED = new byte[] {(byte) 0xDE, (byte) 0xAD};
+
+ private static final byte[] DEFAULT_DATE_BYTE_ARRAY = {(byte) 0xdd, (byte) 0xf2, (byte) 0xdc, 0x20, 0x64, 0x01, 0x00, 0x00 };
+ private static final long DEFAULT_DATE_TIMESTAMP = 1529559708381L;
+ private static final Date DEFAULT_DATE = new Date(DEFAULT_DATE_TIMESTAMP);
+
+ @Nested
+ class GetHeaderId {
+
+ @Test
+ void getHeaderIdShouldReturnSpecificStringInLittleEndian() {
+ InternalDateExtraField testee = new InternalDateExtraField();
+
+ ByteBuffer byteBuffer = ByteBuffer.wrap(testee.getHeaderId().getBytes())
+ .order(ByteOrder.LITTLE_ENDIAN);
+ assertThat(Charsets.US_ASCII.decode(byteBuffer).toString())
+ .isEqualTo("ao");
+ }
+ }
+
+ @Nested
+ class GetLocalFileDataLength {
+ @Test
+ void getLocalFileDataLengthShouldReturnIntegerSize() {
+ InternalDateExtraField testee = new InternalDateExtraField();
+
+ assertThat(testee.getLocalFileDataLength().getValue())
+ .isEqualTo(Long.BYTES);
+ }
+ }
+
+ @Nested
+ class GetCentralDirectoryLength {
+
+ @Test
+ void getCentralDirectoryLengthShouldReturnIntegerSize() {
+ InternalDateExtraField testee = new InternalDateExtraField();
+
+ assertThat(testee.getCentralDirectoryLength().getValue())
+ .isEqualTo(Long.BYTES);
+ }
+
+
+ @Test
+ void getCentralDirectoryDataShouldThrowWhenNoValue() {
+ InternalDateExtraField testee = new InternalDateExtraField();
+
+ assertThatThrownBy(() -> testee.getCentralDirectoryData())
+ .isInstanceOf(RuntimeException.class);
+ }
+
+ @Test
+ void getCentralDirectoryDataShouldReturnZeroWhenZero() {
+ byte[] actual = new InternalDateExtraField(0).getCentralDirectoryData();
+ assertThat(actual).isEqualTo(ZERO_AS_BYTE_ARRAY);
+ }
+
+ @Test
+ void getCentralDirectoryDataShouldReturnValueInLittleIndianWhen123456789ABCDEF0() {
+ byte[] actual = new InternalDateExtraField(0x123456789ABCDEF0L).getCentralDirectoryData();
+ assertThat(actual).isEqualTo(_123456789ABCDEF0_AS_LE_BYTE_ARRAY);
+ }
+
+ @Test
+ void getCentralDirectoryDataShouldReturnValueInLittleIndianWhenFEDCBA9876543210() {
+ byte[] actual = new InternalDateExtraField(0xFEDCBA9876543210L).getCentralDirectoryData();
+ assertThat(actual).isEqualTo(FEDCBA9876543210_AS_LE_BYTE_ARRAY);
+ }
+ }
+
+ @Nested
+ class GetLocalFileDataData {
+
+ @Test
+ void getLocalFileDataDataShouldThrowWhenNoValue() {
+ InternalDateExtraField testee = new InternalDateExtraField();
+
+ assertThatThrownBy(() -> testee.getLocalFileDataData())
+ .isInstanceOf(RuntimeException.class);
+ }
+
+ @Test
+ void getLocalFileDataDataShouldReturnZeroWhenZero() {
+ byte[] actual = new InternalDateExtraField(0).getLocalFileDataData();
+ assertThat(actual).isEqualTo(ZERO_AS_BYTE_ARRAY);
+ }
+
+ @Test
+ void getLocalFileDataDataShouldReturnValueInLittleIndianWhen123456789ABCDEF0() {
+ byte[] actual = new InternalDateExtraField(0x123456789ABCDEF0L).getLocalFileDataData();
+ assertThat(actual).isEqualTo(_123456789ABCDEF0_AS_LE_BYTE_ARRAY);
+ }
+
+ @Test
+ void getLocalFileDataDataShouldReturnValueInLittleIndianWhenFEDCBA9876543210() {
+ byte[] actual = new InternalDateExtraField(0xFEDCBA9876543210L).getLocalFileDataData();
+ assertThat(actual).isEqualTo(FEDCBA9876543210_AS_LE_BYTE_ARRAY);
+ }
+ }
+
+ @Nested
+ class ParseFromLocalFileData {
+
+ @Test
+ void parseFromLocalFileDataShouldThrownWhenLengthIsSmallerThan8() {
+ InternalDateExtraField testee = new InternalDateExtraField();
+
+ byte[] input = new byte[] {0, 0, 0, 0, 0, 0, 0};
+ assertThatThrownBy(() -> testee.parseFromLocalFileData(input, 0, 7))
+ .isInstanceOf(ZipException.class);
+ }
+
+ @Test
+ void parseFromLocalFileDataShouldThrownWhenLengthIsBiggerThan8() {
+ InternalDateExtraField testee = new InternalDateExtraField();
+
+ byte[] input = new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0};
+ assertThatThrownBy(() -> testee.parseFromLocalFileData(input, 0, 9))
+ .isInstanceOf(ZipException.class);
+ }
+
+ @Test
+ void parseFromLocalFileDataShouldParseWhenZero() throws Exception {
+ InternalDateExtraField testee = new InternalDateExtraField();
+
+ testee.parseFromLocalFileData(ZERO_AS_BYTE_ARRAY, 0, 8);
+ assertThat(testee.getValue())
+ .contains(0L);
+ }
+
+ @Test
+ void parseFromLocalFileDataShouldParseWhen123456789ABCDEF0InLittleEndian() throws Exception {
+ InternalDateExtraField testee = new InternalDateExtraField();
+
+ testee.parseFromLocalFileData(_123456789ABCDEF0_AS_LE_BYTE_ARRAY, 0, 8);
+ assertThat(testee.getValue())
+ .contains(0x123456789ABCDEF0L);
+ }
+
+ @Test
+ void parseFromLocalFileDataShouldParseWhenFEDCBA9876543210InLittleEndian() throws Exception {
+ InternalDateExtraField testee = new InternalDateExtraField();
+
+ byte[] input = FEDCBA9876543210_AS_LE_BYTE_ARRAY;
+ testee.parseFromLocalFileData(input, 0, 8);
+ assertThat(testee.getValue())
+ .contains(0xFEDCBA9876543210L);
+ }
+
+ @Test
+ void parseFromLocalFileDataShouldHandleOffset() throws Exception {
+ InternalDateExtraField testee = new InternalDateExtraField();
+
+ byte[] input = Arrays.concatenate(UNUSED, _123456789ABCDEF0_AS_LE_BYTE_ARRAY);
+ testee.parseFromLocalFileData(input, 2, 8);
+ assertThat(testee.getValue())
+ .contains(0x123456789ABCDEF0L);
+ }
+
+ @Test
+ void parseFromLocalFileDataShouldReturnZeroDayWhenZero() throws Exception {
+ InternalDateExtraField testee = new InternalDateExtraField();
+
+ testee.parseFromLocalFileData(ZERO_AS_BYTE_ARRAY, 0, 8);
+
+ assertThat(testee.getDateValue())
+ .contains(new Date(0L));
+ }
+
+ @Test
+ void parseFromLocalFileDataShouldReturnDefaultDateWhenPassDefaultDateByteArray() throws Exception {
+ InternalDateExtraField testee = new InternalDateExtraField(new Date());
+ testee.parseFromLocalFileData(DEFAULT_DATE_BYTE_ARRAY, 0, 8);
+
+ assertThat(testee.getDateValue())
+ .contains(DEFAULT_DATE);
+ }
+ }
+
+ @Nested
+ class ParseFromCentralDirectoryData {
+
+ @Test
+ void parseFromCentralDirectoryDataShouldThrownWhenLengthIsSmallerThan8() {
+ InternalDateExtraField testee = new InternalDateExtraField();
+ byte[] input = new byte[7];
+
+ assertThatThrownBy(() -> testee.parseFromCentralDirectoryData(input, 0, 7))
+ .isInstanceOf(ZipException.class);
+ }
+
+ @Test
+ void parseFromCentralDirectoryDataShouldThrownWhenLengthIsBiggerThan8() {
+ InternalDateExtraField testee = new InternalDateExtraField();
+ byte[] input = new byte[9];
+
+ assertThatThrownBy(() -> testee.parseFromCentralDirectoryData(input, 0, 9))
+ .isInstanceOf(ZipException.class);
+ }
+
+ @Test
+ void parseFromCentralDirectoryDataShouldParseWhenZero() throws Exception {
+ InternalDateExtraField testee = new InternalDateExtraField();
+
+ testee.parseFromCentralDirectoryData(ZERO_AS_BYTE_ARRAY, 0, 8);
+ assertThat(testee.getValue())
+ .contains(0L);
+ }
+
+ @Test
+ void parseFromCentralDirectoryDataShouldParseWhen123456789ABCDEF0InLittleEndian() throws Exception {
+ InternalDateExtraField testee = new InternalDateExtraField();
+
+ testee.parseFromCentralDirectoryData(_123456789ABCDEF0_AS_LE_BYTE_ARRAY, 0, 8);
+ assertThat(testee.getValue())
+ .contains(0x123456789ABCDEF0L);
+ }
+
+ @Test
+ void parseFromCentralDirectoryDataShouldParseWhenFEDCBA9876543210InLittleEndian() throws Exception {
+ InternalDateExtraField testee = new InternalDateExtraField();
+ byte[] input = FEDCBA9876543210_AS_LE_BYTE_ARRAY;
+
+ testee.parseFromCentralDirectoryData(input, 0, 8);
+ assertThat(testee.getValue())
+ .contains(0xFEDCBA9876543210L);
+ }
+
+ @Test
+ void parseFromCentralDirectoryDataShouldHandleOffset() throws Exception {
+ InternalDateExtraField testee = new InternalDateExtraField();
+ byte[] input = Arrays.concatenate(UNUSED, _123456789ABCDEF0_AS_LE_BYTE_ARRAY);
+
+ testee.parseFromCentralDirectoryData(input, 2, 8);
+ assertThat(testee.getValue())
+ .contains(0x123456789ABCDEF0L);
+ }
+
+ @Test
+ void parseFromCentralDirectoryDataShouldReturnZeroDayWhenZero() throws Exception {
+ InternalDateExtraField testee = new InternalDateExtraField();
+
+ testee.parseFromCentralDirectoryData(ZERO_AS_BYTE_ARRAY, 0, 8);
+
+ assertThat(testee.getDateValue())
+ .contains(new Date(0L));
+ }
+
+ @Test
+ void parseFromCentralDirectoryDataShouldReturnDefaultDateWhenPassDefaultDateByteArray() throws Exception {
+ InternalDateExtraField testee = new InternalDateExtraField(new Date());
+ testee.parseFromCentralDirectoryData(DEFAULT_DATE_BYTE_ARRAY, 0, 8);
+
+ assertThat(testee.getDateValue())
+ .contains(DEFAULT_DATE);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ca09a60e/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipperTest.java
----------------------------------------------------------------------
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 ca60d43..975d53c 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
@@ -101,7 +101,7 @@ class ZipperTest {
.containsExtraFields(new SizeExtraField(SIZE_1))
.containsExtraFields(new UidExtraField(MESSAGE_UID_1_VALUE))
.containsExtraFields(new MessageIdExtraField(MESSAGE_ID_1.serialize()))
- .containsExtraFields(new MailboxIdExtraField(MAILBOX_ID_1.serialize())));
+ .containsExtraFields(new InternalDateExtraField(MESSAGE_1.getInternalDate())));
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org