This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit f5fc8a95c6acd7dc1021086ce1f41153df62b41c
Author: Benoit Tellier <[email protected]>
AuthorDate: Wed Aug 4 17:26:57 2021 +0700

    JAMES-3544 UploadBucketNameGenerator wraps bucket temporal logic
---
 .../jmap/cassandra/upload/BucketNameGenerator.java | 51 ++++++++++++++++
 .../cassandra/upload/BucketNameGeneratorTest.java  | 67 ++++++++++++++++++++++
 2 files changed, 118 insertions(+)

diff --git 
a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/BucketNameGenerator.java
 
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/BucketNameGenerator.java
new file mode 100644
index 0000000..98ce4c5
--- /dev/null
+++ 
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/BucketNameGenerator.java
@@ -0,0 +1,51 @@
+/****************************************************************
+ * 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.jmap.cassandra.upload;
+
+import java.time.Clock;
+import java.time.LocalDate;
+import java.time.ZoneOffset;
+import java.time.temporal.ChronoUnit;
+import java.util.function.Predicate;
+
+public class BucketNameGenerator {
+    private final Clock clock;
+
+    public BucketNameGenerator(Clock clock) {
+        this.clock = clock;
+    }
+
+    public UploadBucketName current() {
+        int weekCount = currentWeekCount();
+        return new UploadBucketName(weekCount);
+    }
+
+    public Predicate<UploadBucketName> evictionPredicate() {
+        final int currentWeekCount = currentWeekCount();
+
+        return uploadBucketName -> uploadBucketName.getWeekNumber() < 
currentWeekCount - 1;
+    }
+
+    private int currentWeekCount() {
+        return Math.toIntExact(ChronoUnit.WEEKS.between(
+            LocalDate.ofEpochDay(0),
+            LocalDate.ofInstant(clock.instant(), ZoneOffset.UTC)));
+    }
+}
diff --git 
a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/BucketNameGeneratorTest.java
 
b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/BucketNameGeneratorTest.java
new file mode 100644
index 0000000..ee3d638
--- /dev/null
+++ 
b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/BucketNameGeneratorTest.java
@@ -0,0 +1,67 @@
+/****************************************************************
+ * 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.jmap.cassandra.upload;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.time.Clock;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+
+import org.junit.jupiter.api.Test;
+
+class BucketNameGeneratorTest {
+    ZonedDateTime NOW = ZonedDateTime.parse("2015-10-30T14:12:00Z");
+
+    @Test
+    void currentShouldReturnCorrectValue() {
+        BucketNameGenerator generator = new 
BucketNameGenerator(Clock.fixed(NOW.toInstant(), ZoneOffset.UTC));
+
+        assertThat(generator.current()).isEqualTo(new UploadBucketName(2391));
+    }
+
+    @Test
+    void evictionPredicateShouldKeepPresentBucket() {
+        BucketNameGenerator generator = new 
BucketNameGenerator(Clock.fixed(NOW.toInstant(), ZoneOffset.UTC));
+
+        assertThat(generator.evictionPredicate().test(new 
UploadBucketName(2391))).isFalse();
+    }
+
+    @Test
+    void evictionPredicateShouldKeepFutureBuckets() {
+        BucketNameGenerator generator = new 
BucketNameGenerator(Clock.fixed(NOW.toInstant(), ZoneOffset.UTC));
+
+        assertThat(generator.evictionPredicate().test(new 
UploadBucketName(2392))).isFalse();
+    }
+
+    @Test
+    void evictionPredicateShouldKeepRecentBuckets() {
+        BucketNameGenerator generator = new 
BucketNameGenerator(Clock.fixed(NOW.toInstant(), ZoneOffset.UTC));
+
+        assertThat(generator.evictionPredicate().test(new 
UploadBucketName(2390))).isFalse();
+    }
+
+    @Test
+    void evictionPredicateShouldMatchOldBuckets() {
+        BucketNameGenerator generator = new 
BucketNameGenerator(Clock.fixed(NOW.toInstant(), ZoneOffset.UTC));
+
+        assertThat(generator.evictionPredicate().test(new 
UploadBucketName(2389))).isTrue();
+    }
+}
\ No newline at end of file

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to