You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2023/05/12 01:55:46 UTC

[james-project] branch master updated: [REFACTORING] Make PropertiesProvider singleton & avoid load multi times from FileSystem (#1554)

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 eff08aed53 [REFACTORING] Make PropertiesProvider singleton & avoid load multi times from FileSystem (#1554)
eff08aed53 is described below

commit eff08aed533af2cb79035a05d81e5d698de48979
Author: vttran <vt...@linagora.com>
AuthorDate: Fri May 12 08:55:39 2023 +0700

    [REFACTORING] Make PropertiesProvider singleton & avoid load multi times from FileSystem (#1554)
---
 .../james/CassandraJamesServerConfiguration.java   |  6 +++---
 .../james/CassandraRabbitMQJamesConfiguration.java | 10 ++++------
 .../james/DistributedPOP3JamesConfiguration.java   | 10 ++++------
 .../apache/james/modules/CommonServicesModule.java |  8 +++++++-
 .../org/apache/james/utils/PropertiesProvider.java | 22 +++++++++++++++++++---
 5 files changed, 37 insertions(+), 19 deletions(-)

diff --git a/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerConfiguration.java b/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerConfiguration.java
index 66cdafdf52..cad9040715 100644
--- a/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerConfiguration.java
+++ b/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerConfiguration.java
@@ -116,12 +116,12 @@ public class CassandraJamesServerConfiguration implements Configuration {
                 .orElseThrow(() -> new MissingArgumentException("Server needs a working.directory env entry")));
 
             FileSystemImpl fileSystem = new FileSystemImpl(directories);
+            PropertiesProvider propertiesProvider = new PropertiesProvider(fileSystem, configurationPath);
             SearchConfiguration searchConfiguration = this.searchConfiguration.orElseGet(Throwing.supplier(
-                () -> SearchConfiguration.parse(new PropertiesProvider(fileSystem, configurationPath))));
+                () -> SearchConfiguration.parse(propertiesProvider)));
 
             BlobStoreConfiguration blobStoreConfiguration = this.blobStoreConfiguration.orElseGet(Throwing.supplier(
-                () -> BlobStoreConfiguration.parse(
-                    new PropertiesProvider(fileSystem, configurationPath))));
+                () -> BlobStoreConfiguration.parse(propertiesProvider)));
 
             FileConfigurationProvider configurationProvider = new FileConfigurationProvider(fileSystem, Basic.builder()
                 .configurationPath(configurationPath)
diff --git a/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java b/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
index dbce0a3cc6..3c5ccac9f4 100644
--- a/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
+++ b/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
@@ -117,13 +117,12 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
                 .orElseThrow(() -> new MissingArgumentException("Server needs a working.directory env entry")));
 
             FileSystemImpl fileSystem = new FileSystemImpl(directories);
+            PropertiesProvider propertiesProvider = new PropertiesProvider(fileSystem, configurationPath);
             BlobStoreConfiguration blobStoreConfiguration = this.blobStoreConfiguration.orElseGet(Throwing.supplier(
-                () -> BlobStoreConfiguration.parse(
-                    new PropertiesProvider(fileSystem, configurationPath))));
+                () -> BlobStoreConfiguration.parse(propertiesProvider)));
 
             SearchConfiguration searchConfiguration = this.searchConfiguration.orElseGet(Throwing.supplier(
-                () -> SearchConfiguration.parse(
-                    new PropertiesProvider(fileSystem, configurationPath))));
+                () -> SearchConfiguration.parse(propertiesProvider)));
 
             FileConfigurationProvider configurationProvider = new FileConfigurationProvider(fileSystem, Basic.builder()
                 .configurationPath(configurationPath)
@@ -133,8 +132,7 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
                 () -> UsersRepositoryModuleChooser.Implementation.parse(configurationProvider));
 
             MailQueueViewChoice mailQueueViewChoice = this.mailQueueViewChoice.orElseGet(Throwing.supplier(
-                () -> MailQueueViewChoice.parse(
-                    new PropertiesProvider(fileSystem, configurationPath))));
+                () -> MailQueueViewChoice.parse(propertiesProvider)));
 
             VaultConfiguration vaultConfiguration = this.vaultConfiguration.orElseGet(() -> {
                 try {
diff --git a/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesConfiguration.java b/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesConfiguration.java
index f8c706cc59..138aa4c135 100644
--- a/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesConfiguration.java
+++ b/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesConfiguration.java
@@ -113,13 +113,12 @@ public class DistributedPOP3JamesConfiguration implements Configuration {
                 .orElseThrow(() -> new MissingArgumentException("Server needs a working.directory env entry")));
 
             FileSystemImpl fileSystem = new FileSystemImpl(directories);
+            PropertiesProvider propertiesProvider = new PropertiesProvider(fileSystem, configurationPath);
             BlobStoreConfiguration blobStoreConfiguration = this.blobStoreConfiguration.orElseGet(Throwing.supplier(
-                () -> BlobStoreConfiguration.parse(
-                    new PropertiesProvider(fileSystem, configurationPath))));
+                () -> BlobStoreConfiguration.parse(propertiesProvider)));
 
             SearchConfiguration searchConfiguration = this.searchConfiguration.orElseGet(Throwing.supplier(
-                () -> SearchConfiguration.parse(
-                    new PropertiesProvider(fileSystem, configurationPath))));
+                () -> SearchConfiguration.parse(propertiesProvider)));
 
             FileConfigurationProvider configurationProvider = new FileConfigurationProvider(fileSystem, Basic.builder()
                 .configurationPath(configurationPath)
@@ -129,8 +128,7 @@ public class DistributedPOP3JamesConfiguration implements Configuration {
                 () -> UsersRepositoryModuleChooser.Implementation.parse(configurationProvider));
 
             MailQueueViewChoice mailQueueViewChoice = this.mailQueueViewChoice.orElseGet(Throwing.supplier(
-                () -> MailQueueViewChoice.parse(
-                    new PropertiesProvider(fileSystem, configurationPath))));
+                () -> MailQueueViewChoice.parse(propertiesProvider)));
 
 
             VaultConfiguration vaultConfiguration = this.vaultConfiguration.orElseGet(() -> {
diff --git a/server/container/guice/common/src/main/java/org/apache/james/modules/CommonServicesModule.java b/server/container/guice/common/src/main/java/org/apache/james/modules/CommonServicesModule.java
index 3b8dcad8e7..5d2b7b1606 100644
--- a/server/container/guice/common/src/main/java/org/apache/james/modules/CommonServicesModule.java
+++ b/server/container/guice/common/src/main/java/org/apache/james/modules/CommonServicesModule.java
@@ -33,6 +33,7 @@ import org.apache.james.server.core.filesystem.FileSystemImpl;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.ExtensionModule;
 import org.apache.james.utils.GuiceProbe;
+import org.apache.james.utils.PropertiesProvider;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Provides;
@@ -83,5 +84,10 @@ public class CommonServicesModule extends AbstractModule {
     public JamesDirectoriesProvider directories() {
         return configuration.directories();
     }
-    
+
+    @Provides
+    @Singleton
+    public PropertiesProvider providePropertiesProvider(FileSystem fileSystem, Configuration.ConfigurationPath configurationPrefix) {
+        return new PropertiesProvider(fileSystem, configurationPrefix);
+    }
 }
diff --git a/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java b/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java
index 1797510328..35e1d2c054 100644
--- a/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java
+++ b/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java
@@ -21,11 +21,10 @@ package org.apache.james.utils;
 
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.time.Duration;
 import java.util.Arrays;
 import java.util.Optional;
 
-import javax.inject.Inject;
-
 import org.apache.commons.configuration2.Configuration;
 import org.apache.commons.configuration2.FileBasedConfiguration;
 import org.apache.commons.configuration2.PropertiesConfiguration;
@@ -39,10 +38,14 @@ import org.apache.james.server.core.filesystem.FileSystemImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.fge.lambdas.Throwing;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
 
 public class PropertiesProvider {
     public static class MissingConfigurationFile extends RuntimeException {
@@ -71,11 +74,20 @@ public class PropertiesProvider {
 
     private final FileSystem fileSystem;
     private final ConfigurationPath configurationPrefix;
+    private final LoadingCache<String, Optional<File>> fileCacheLoader;
 
-    @Inject
     public PropertiesProvider(FileSystem fileSystem, ConfigurationPath configurationPrefix) {
         this.fileSystem = fileSystem;
         this.configurationPrefix = configurationPrefix;
+
+        this.fileCacheLoader = CacheBuilder.newBuilder()
+            .expireAfterWrite(Duration.ofMinutes(10))
+            .build(new CacheLoader<>() {
+                @Override
+                public Optional<File> load(final String fileName) {
+                    return getConfigurationFileFromFileSystem(fileName);
+                }
+            });
     }
 
     public Configuration getConfigurations(String... filenames) throws FileNotFoundException, ConfigurationException {
@@ -115,6 +127,10 @@ public class PropertiesProvider {
     }
 
     private Optional<File> getConfigurationFile(String fileName) {
+        return Throwing.supplier(() -> fileCacheLoader.get(fileName)).get();
+    }
+
+    private Optional<File> getConfigurationFileFromFileSystem(String fileName) {
         try {
             File file = fileSystem.getFile(configurationPrefix.asString() + fileName + ".properties");
             LOGGER.info("Load configuration file {}", file.getAbsolutePath());


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