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

commit 0d9953da9171e3b76db81d1e88c3985b0e888fb1
Author: Benoit Tellier <btell...@linagora.com>
AuthorDate: Tue May 19 11:07:30 2020 +0700

    JAMES-3140 Strong typing for ConfigurationPath
---
 .../server/core/configuration/Configuration.java   | 58 ++++++++++++++++++----
 .../configuration/FileConfigurationProvider.java   |  4 +-
 .../core/configuration/BasicConfigurationTest.java | 18 +++++--
 .../james/CassandraRabbitMQJamesConfiguration.java | 15 +++---
 .../CassandraRabbitMQJamesConfigurationTest.java   |  9 ++--
 .../org/apache/james/utils/PropertiesProvider.java |  7 +--
 .../apache/james/modules/CommonServicesModule.java |  7 +--
 7 files changed, 81 insertions(+), 37 deletions(-)

diff --git 
a/server/container/core/src/main/java/org/apache/james/server/core/configuration/Configuration.java
 
b/server/container/core/src/main/java/org/apache/james/server/core/configuration/Configuration.java
index 050d210..58baecb 100644
--- 
a/server/container/core/src/main/java/org/apache/james/server/core/configuration/Configuration.java
+++ 
b/server/container/core/src/main/java/org/apache/james/server/core/configuration/Configuration.java
@@ -20,6 +20,7 @@
 package org.apache.james.server.core.configuration;
 
 import java.io.File;
+import java.util.Objects;
 import java.util.Optional;
 
 import org.apache.james.filesystem.api.FileSystem;
@@ -27,18 +28,50 @@ import 
org.apache.james.filesystem.api.JamesDirectoriesProvider;
 import org.apache.james.server.core.JamesServerResourceLoader;
 import org.apache.james.server.core.MissingArgumentException;
 
+import com.google.common.base.MoreObjects;
+
 public interface Configuration {
 
     String WORKING_DIRECTORY = "working.directory";
 
-    static Basic.Builder builder() {
-        return new Basic.Builder();
+    class ConfigurationPath {
+        private final String value;
+
+        public ConfigurationPath(String value) {
+            this.value = value;
+        }
+
+        public String asString() {
+            return value;
+        }
+
+        @Override
+        public final boolean equals(Object o) {
+            if (o instanceof ConfigurationPath) {
+                ConfigurationPath that = (ConfigurationPath) o;
+
+                return Objects.equals(this.value, that.value);
+            }
+            return false;
+        }
+
+        @Override
+        public final int hashCode() {
+            return Objects.hash(value);
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this)
+                .add("value", value)
+                .toString();
+        }
     }
 
     class Basic implements Configuration {
         public static class Builder {
             private Optional<String> rootDirectory;
-            private Optional<String> configurationPath;
+            private Optional<ConfigurationPath> configurationPath;
 
             private Builder() {
                 rootDirectory = Optional.empty();
@@ -63,19 +96,18 @@ public interface Configuration {
                 return this;
             }
 
-            public Builder configurationPath(String path) {
+            public Builder configurationPath(ConfigurationPath path) {
                 configurationPath = Optional.of(path);
                 return this;
             }
 
             public Builder configurationFromClasspath() {
-                configurationPath = Optional.of(FileSystem.CLASSPATH_PROTOCOL);
+                configurationPath = Optional.of(new 
ConfigurationPath(FileSystem.CLASSPATH_PROTOCOL));
                 return this;
             }
 
             public Configuration.Basic build() {
-
-                String configurationPath = 
this.configurationPath.orElse(FileSystem.FILE_PROTOCOL_AND_CONF);
+                ConfigurationPath configurationPath = 
this.configurationPath.orElse(new 
ConfigurationPath(FileSystem.FILE_PROTOCOL_AND_CONF));
                 JamesServerResourceLoader directories = new 
JamesServerResourceLoader(rootDirectory
                     .orElseThrow(() -> new MissingArgumentException("Server 
needs a working.directory env entry")));
 
@@ -85,16 +117,16 @@ public interface Configuration {
             }
         }
 
-        private final String configurationPath;
+        private final ConfigurationPath configurationPath;
         private final JamesDirectoriesProvider directories;
 
-        public Basic(String configurationPath, JamesDirectoriesProvider 
directories) {
+        public Basic(ConfigurationPath configurationPath, 
JamesDirectoriesProvider directories) {
             this.configurationPath = configurationPath;
             this.directories = directories;
         }
 
         @Override
-        public String configurationPath() {
+        public ConfigurationPath configurationPath() {
             return configurationPath;
         }
 
@@ -104,7 +136,11 @@ public interface Configuration {
         }
     }
 
-    String configurationPath();
+    static Basic.Builder builder() {
+        return new Basic.Builder();
+    }
+
+    ConfigurationPath configurationPath();
 
     JamesDirectoriesProvider directories();
 }
diff --git 
a/server/container/core/src/main/java/org/apache/james/server/core/configuration/FileConfigurationProvider.java
 
b/server/container/core/src/main/java/org/apache/james/server/core/configuration/FileConfigurationProvider.java
index 97036b2..48b965b 100644
--- 
a/server/container/core/src/main/java/org/apache/james/server/core/configuration/FileConfigurationProvider.java
+++ 
b/server/container/core/src/main/java/org/apache/james/server/core/configuration/FileConfigurationProvider.java
@@ -62,7 +62,7 @@ public class FileConfigurationProvider implements 
ConfigurationProvider {
     }
     
     private final FileSystem fileSystem;
-    private final String configurationPrefix;
+    private final Configuration.ConfigurationPath configurationPrefix;
 
     public FileConfigurationProvider(FileSystem fileSystem, Configuration 
configuration) {
         this.fileSystem = fileSystem;
@@ -91,7 +91,7 @@ public class FileConfigurationProvider implements 
ConfigurationProvider {
         
Preconditions.checkArgument(!Strings.isNullOrEmpty(configurationFileWithoutExtension),
 "The configuration file name should not be empty or null");
         try {
             return Optional.of(
-                fileSystem.getResource(configurationPrefix + 
configurationFileWithoutExtension + CONFIGURATION_FILE_SUFFIX));
+                fileSystem.getResource(configurationPrefix.asString() + 
configurationFileWithoutExtension + CONFIGURATION_FILE_SUFFIX));
         } catch (IOException e) {
             loggingLevelOnError.format(LOGGER, "Unable to locate configuration 
file {}" + CONFIGURATION_FILE_SUFFIX + ", assuming empty configuration", 
configurationFileWithoutExtension);
             return Optional.empty();
diff --git 
a/server/container/core/src/test/java/org/apache/james/server/core/configuration/BasicConfigurationTest.java
 
b/server/container/core/src/test/java/org/apache/james/server/core/configuration/BasicConfigurationTest.java
index d1c1105..e7ac0d0 100644
--- 
a/server/container/core/src/test/java/org/apache/james/server/core/configuration/BasicConfigurationTest.java
+++ 
b/server/container/core/src/test/java/org/apache/james/server/core/configuration/BasicConfigurationTest.java
@@ -26,9 +26,17 @@ import org.apache.james.server.core.MissingArgumentException;
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.Test;
 
+import nl.jqno.equalsverifier.EqualsVerifier;
+
 class BasicConfigurationTest {
     @Test
-    void buildShouldThrowWhenWorkingDirectoryMissing() {
+    void configurationPathShouldMatchBeanContract() {
+        EqualsVerifier.forClass(Configuration.ConfigurationPath.class)
+            .verify();
+    }
+
+    @Test
+    void buildShouldThrowWhenWorkingDirectoryIsMissing() {
         assertThatThrownBy(() -> Configuration.builder().build())
             .isInstanceOf(MissingArgumentException.class)
             .hasMessage("Server needs a working.directory env entry");
@@ -47,12 +55,12 @@ class BasicConfigurationTest {
     void buildShouldReturnConfigurationWithSuppliedValues() {
         Configuration.Basic configuration = Configuration.builder()
             .workingDirectory("/path")
-            .configurationPath("file://myconf/")
+            .configurationPath(new 
Configuration.ConfigurationPath("file://myconf/"))
             .build();
 
         SoftAssertions.assertSoftly(softly -> {
             
softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
-            
softly.assertThat(configuration.configurationPath()).isEqualTo("file://myconf/");
+            
softly.assertThat(configuration.configurationPath().asString()).isEqualTo("file://myconf/");
         });
     }
 
@@ -65,7 +73,7 @@ class BasicConfigurationTest {
 
         SoftAssertions.assertSoftly(softly -> {
             
softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
-            
softly.assertThat(configuration.configurationPath()).isEqualTo("classpath:");
+            
softly.assertThat(configuration.configurationPath().asString()).isEqualTo("classpath:");
         });
     }
 
@@ -77,7 +85,7 @@ class BasicConfigurationTest {
 
         SoftAssertions.assertSoftly(softly -> {
             
softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
-            
softly.assertThat(configuration.configurationPath()).isEqualTo("file://conf/");
+            
softly.assertThat(configuration.configurationPath().asString()).isEqualTo("file://conf/");
         });
     }
 
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
index afef000..50c3f59 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
@@ -37,11 +37,12 @@ public class CassandraRabbitMQJamesConfiguration implements 
Configuration {
     public static class Builder {
         private Optional<BlobStoreConfiguration> blobStoreConfiguration;
         private Optional<String> rootDirectory;
-        private Optional<String> configurationPath;
+        private Optional<ConfigurationPath> configurationPath;
 
         private Builder() {
             rootDirectory = Optional.empty();
             configurationPath = Optional.empty();
+            blobStoreConfiguration = Optional.empty();
         }
 
         public Builder workingDirectory(String path) {
@@ -62,13 +63,13 @@ public class CassandraRabbitMQJamesConfiguration implements 
Configuration {
             return this;
         }
 
-        public Builder configurationPath(String path) {
+        public Builder configurationPath(ConfigurationPath path) {
             configurationPath = Optional.of(path);
             return this;
         }
 
         public Builder configurationFromClasspath() {
-            configurationPath = Optional.of(FileSystem.CLASSPATH_PROTOCOL);
+            configurationPath = Optional.of(new 
ConfigurationPath(FileSystem.CLASSPATH_PROTOCOL));
             return this;
         }
 
@@ -78,7 +79,7 @@ public class CassandraRabbitMQJamesConfiguration implements 
Configuration {
         }
 
         public CassandraRabbitMQJamesConfiguration build() {
-            String configurationPath = 
this.configurationPath.orElse(FileSystem.FILE_PROTOCOL_AND_CONF);
+            ConfigurationPath configurationPath = 
this.configurationPath.orElse(new 
ConfigurationPath(FileSystem.FILE_PROTOCOL_AND_CONF));
             JamesServerResourceLoader directories = new 
JamesServerResourceLoader(rootDirectory
                 .orElseThrow(() -> new MissingArgumentException("Server needs 
a working.directory env entry")));
 
@@ -95,18 +96,18 @@ public class CassandraRabbitMQJamesConfiguration implements 
Configuration {
         return new Builder();
     }
 
-    private final String configurationPath;
+    private final ConfigurationPath configurationPath;
     private final JamesDirectoriesProvider directories;
     private final BlobStoreConfiguration blobStoreConfiguration;
 
-    public CassandraRabbitMQJamesConfiguration(String configurationPath, 
JamesDirectoriesProvider directories, BlobStoreConfiguration 
blobStoreConfiguration) {
+    public CassandraRabbitMQJamesConfiguration(ConfigurationPath 
configurationPath, JamesDirectoriesProvider directories, BlobStoreConfiguration 
blobStoreConfiguration) {
         this.configurationPath = configurationPath;
         this.directories = directories;
         this.blobStoreConfiguration = blobStoreConfiguration;
     }
 
     @Override
-    public String configurationPath() {
+    public ConfigurationPath configurationPath() {
         return configurationPath;
     }
 
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesConfigurationTest.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesConfigurationTest.java
index ab06912..0eb5004 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesConfigurationTest.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesConfigurationTest.java
@@ -24,6 +24,7 @@ import static 
org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.apache.james.server.core.MissingArgumentException;
 import org.apache.james.server.core.configuration.Configuration;
+import 
org.apache.james.server.core.configuration.Configuration.ConfigurationPath;
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.Test;
 
@@ -48,12 +49,12 @@ class CassandraRabbitMQJamesConfigurationTest {
     void buildShouldReturnConfigurationWithSuppliedValues() {
         Configuration configuration = 
CassandraRabbitMQJamesConfiguration.builder()
             .workingDirectory("/path")
-            .configurationPath("file://myconf/")
+            .configurationPath(new ConfigurationPath("file://myconf/"))
             .build();
 
         SoftAssertions.assertSoftly(softly -> {
             
softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
-            
softly.assertThat(configuration.configurationPath()).isEqualTo("file://myconf/");
+            
softly.assertThat(configuration.configurationPath().asString()).isEqualTo("file://myconf/");
         });
     }
 
@@ -66,7 +67,7 @@ class CassandraRabbitMQJamesConfigurationTest {
 
         SoftAssertions.assertSoftly(softly -> {
             
softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
-            
softly.assertThat(configuration.configurationPath()).isEqualTo("classpath:");
+            
softly.assertThat(configuration.configurationPath().asString()).isEqualTo("classpath:");
         });
     }
 
@@ -78,7 +79,7 @@ class CassandraRabbitMQJamesConfigurationTest {
 
         SoftAssertions.assertSoftly(softly -> {
             
softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
-            
softly.assertThat(configuration.configurationPath()).isEqualTo("file://conf/");
+            
softly.assertThat(configuration.configurationPath().asString()).isEqualTo("file://conf/");
         });
     }
 
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 1091c55..cefa9d4 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
@@ -34,6 +34,7 @@ import 
org.apache.commons.configuration2.builder.fluent.Parameters;
 import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.james.filesystem.api.FileSystem;
+import 
org.apache.james.server.core.configuration.Configuration.ConfigurationPath;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
@@ -45,10 +46,10 @@ public class PropertiesProvider {
     private static final String COMMA_STRING = ",";
 
     private final FileSystem fileSystem;
-    private final String configurationPrefix;
+    private final ConfigurationPath configurationPrefix;
 
     @Inject
-    public PropertiesProvider(FileSystem fileSystem, String 
configurationPrefix) {
+    public PropertiesProvider(FileSystem fileSystem, ConfigurationPath 
configurationPrefix) {
         this.fileSystem = fileSystem;
         this.configurationPrefix = configurationPrefix;
     }
@@ -84,7 +85,7 @@ public class PropertiesProvider {
 
     private Optional<File> getConfigurationFile(String fileName) {
         try {
-            return Optional.of(fileSystem.getFile(configurationPrefix + 
fileName + ".properties"))
+            return 
Optional.of(fileSystem.getFile(configurationPrefix.asString() + fileName + 
".properties"))
                 .filter(File::exists);
         } catch (FileNotFoundException e) {
             return Optional.empty();
diff --git 
a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java
 
b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java
index 2ad721c..f9cc271 100644
--- 
a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java
+++ 
b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java
@@ -19,7 +19,6 @@
 
 package org.apache.james.modules;
 
-import javax.inject.Named;
 import javax.inject.Singleton;
 
 import org.apache.james.filesystem.api.FileSystem;
@@ -40,8 +39,7 @@ import com.google.inject.Provides;
 import com.google.inject.multibindings.Multibinder;
 
 public class CommonServicesModule extends AbstractModule {
-    
-    public static final String CONFIGURATION_PATH = "configurationPath";
+
     private final Configuration configuration;
     private final FileSystemImpl fileSystem;
 
@@ -74,8 +72,7 @@ public class CommonServicesModule extends AbstractModule {
 
     @Provides
     @Singleton
-    @Named(CONFIGURATION_PATH)
-    public String configurationPath() {
+    public Configuration.ConfigurationPath configurationPath() {
         return configuration.configurationPath();
     }
 


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

Reply via email to