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 <vtt...@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-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org