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 bt...@apache.org on 2020/05/08 08:03:01 UTC

[james-project] branch master updated: JAMES-3140 Parse Cassandra Cache configuration

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

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


The following commit(s) were added to refs/heads/master by this push:
     new e437b0b  JAMES-3140 Parse Cassandra Cache configuration
e437b0b is described below

commit e437b0b215b09b74033ffdd70d61a0eacca6e4a9
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 7 15:43:08 2020 +0700

    JAMES-3140 Parse Cassandra Cache configuration
---
 .../cache/CassandraCacheConfiguration.java         | 62 +++++++++++++++++++++-
 .../cache/CassandraCacheConfigurationTest.java     | 35 +++++++++++-
 2 files changed, 94 insertions(+), 3 deletions(-)

diff --git a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CassandraCacheConfiguration.java b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CassandraCacheConfiguration.java
index 85be6ad..04ed434 100644
--- a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CassandraCacheConfiguration.java
+++ b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CassandraCacheConfiguration.java
@@ -20,8 +20,14 @@
 package org.apache.james.blob.cassandra.cache;
 
 import java.time.Duration;
+import java.time.temporal.ChronoUnit;
+import java.util.Objects;
 import java.util.Optional;
 
+import org.apache.commons.configuration2.Configuration;
+import org.apache.james.util.DurationParser;
+import org.apache.james.util.SizeFormat;
+
 import com.google.common.base.Preconditions;
 
 public class CassandraCacheConfiguration {
@@ -38,7 +44,7 @@ public class CassandraCacheConfiguration {
 
         public Builder timeOut(Duration timeout) {
             Preconditions.checkNotNull(timeout, "'Read timeout' must not to be null");
-            Preconditions.checkArgument(timeout.getSeconds() > 0, "'Read timeout' needs to be positive");
+            Preconditions.checkArgument(timeout.toMillis() > 0, "'Read timeout' needs to be positive");
             Preconditions.checkArgument(timeout.getSeconds() <= MAX_READ_TIMEOUT.getSeconds(),
                 "'Read timeout' needs to be less than %s sec", MAX_READ_TIMEOUT.getSeconds());
 
@@ -63,6 +69,21 @@ public class CassandraCacheConfiguration {
             return this;
         }
 
+        public Builder ttl(Optional<Duration> ttl) {
+            ttl.ifPresent(this::ttl);
+            return this;
+        }
+
+        public Builder timeOut(Optional<Duration> timeOut) {
+            timeOut.ifPresent(this::timeOut);
+            return this;
+        }
+
+        public Builder sizeThresholdInBytes(Optional<Integer> sizeThresholdInBytes) {
+            sizeThresholdInBytes.ifPresent(this::sizeThresholdInBytes);
+            return this;
+        }
+
         public CassandraCacheConfiguration build() {
             return new CassandraCacheConfiguration(
                 readTimeout.orElse(DEFAULT_READ_TIMEOUT),
@@ -71,6 +92,28 @@ public class CassandraCacheConfiguration {
         }
     }
 
+    public static final CassandraCacheConfiguration DEFAULT = builder().build();
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    public static CassandraCacheConfiguration from(Configuration configuration) {
+        Optional<Duration> ttl = Optional.ofNullable(configuration.getString("cache.cassandra.ttl", null))
+            .map(value -> DurationParser.parse(value, ChronoUnit.SECONDS));
+        Optional<Duration> timeOut = Optional.ofNullable(configuration.getString("cache.cassandra.timeout", null))
+            .map(value -> DurationParser.parse(value, ChronoUnit.SECONDS));
+        Optional<Integer> sizeThreshold = Optional.ofNullable(configuration.getString("cache.sizeThresholdInBytes", null))
+            .map(SizeFormat::parseAsByteCount)
+            .map(Math::toIntExact);
+
+        return builder()
+            .ttl(ttl)
+            .timeOut(timeOut)
+            .sizeThresholdInBytes(sizeThreshold)
+            .build();
+    }
+
     private final Duration readTimeOut;
     private final int sizeThresholdInBytes;
     private final Duration ttl;
@@ -92,4 +135,21 @@ public class CassandraCacheConfiguration {
     public int getSizeThresholdInBytes() {
         return sizeThresholdInBytes;
     }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof CassandraCacheConfiguration) {
+            CassandraCacheConfiguration that = (CassandraCacheConfiguration) o;
+
+            return Objects.equals(this.sizeThresholdInBytes, that.sizeThresholdInBytes)
+                && Objects.equals(this.readTimeOut, that.readTimeOut)
+                && Objects.equals(this.ttl, that.ttl);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(readTimeOut, sizeThresholdInBytes, ttl);
+    }
 }
diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CassandraCacheConfigurationTest.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CassandraCacheConfigurationTest.java
index 2353298..99f6ea6 100644
--- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CassandraCacheConfigurationTest.java
+++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CassandraCacheConfigurationTest.java
@@ -19,12 +19,13 @@
 package org.apache.james.blob.cassandra.cache;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.nio.charset.StandardCharsets;
 import java.time.Duration;
-import java.time.temporal.ChronoUnit;
 
+import org.apache.commons.configuration2.PropertiesConfiguration;
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.Test;
 
@@ -82,7 +83,7 @@ public class CassandraCacheConfigurationTest {
     void shouldThrowWhenConfiguredNullTimeout() {
         assertThatThrownBy(() -> new CassandraCacheConfiguration.Builder()
             .sizeThresholdInBytes(DEFAULT_THRESHOLD_SIZE_IN_BYTES)
-            .timeOut(null)
+            .timeOut((Duration) null)
             .ttl(_1_SEC_TTL)
             .build())
             .isInstanceOf(NullPointerException.class);
@@ -127,4 +128,34 @@ public class CassandraCacheConfigurationTest {
             .build())
             .isInstanceOf(IllegalArgumentException.class);
     }
+
+    @Test
+    void timeOutShouldNotThrowWhenMilliSeconds() {
+        assertThatCode(() -> CassandraCacheConfiguration.builder().timeOut(Duration.ofMillis(50)))
+            .doesNotThrowAnyException();
+    }
+
+    @Test
+    void fromShouldReturnDefaultConfigurationWhenEmpty() {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+
+        assertThat(CassandraCacheConfiguration.from(configuration))
+            .isEqualTo(CassandraCacheConfiguration.builder().build());
+    }
+
+    @Test
+    void fromShouldReturnSuppliedConfiguration() {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("cache.cassandra.ttl", "3 days");
+        configuration.addProperty("cache.cassandra.timeout", "50 ms");
+        configuration.addProperty("cache.sizeThresholdInBytes", "4 KiB");
+
+        assertThat(CassandraCacheConfiguration.from(configuration))
+            .isEqualTo(CassandraCacheConfiguration.builder()
+                .ttl(Duration.ofDays(3))
+                .timeOut(Duration.ofMillis(50))
+                .sizeThresholdInBytes(4096)
+                .build());
+    }
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org