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