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 59c865cf23 JAMES-3781 As a user I want to enforce explicit configuration 59c865cf23 is described below commit 59c865cf2319bbfe45b1cfbd51f65380a4572731 Author: Benoit Tellier <btell...@linagora.com> AuthorDate: Fri Jun 17 11:13:49 2022 +0700 JAMES-3781 As a user I want to enforce explicit configuration Adds james.fail.on.missing.configuration=true JVM option. --- .../sample-configuration/jvm.properties | 5 ++++- .../sample-configuration/jvm.properties | 5 ++++- .../sample-configuration/jvm.properties | 5 ++++- .../apps/jpa-app/sample-configuration/jvm.properties | 5 ++++- .../jpa-smtp-app/sample-configuration/jvm.properties | 5 ++++- .../memory-app/sample-configuration/jvm.properties | 5 ++++- .../apache/james/DefaultMemoryJamesServerTest.java | 16 +++++++++++++++- .../configuration/FileConfigurationProvider.java | 7 +++++++ .../org/apache/james/utils/PropertiesProvider.java | 20 ++++++++++++++++++-- 9 files changed, 64 insertions(+), 9 deletions(-) diff --git a/server/apps/cassandra-app/sample-configuration/jvm.properties b/server/apps/cassandra-app/sample-configuration/jvm.properties index ba36d04837..c87f7ee40f 100644 --- a/server/apps/cassandra-app/sample-configuration/jvm.properties +++ b/server/apps/cassandra-app/sample-configuration/jvm.properties @@ -38,4 +38,7 @@ config.file=conf/cassandra-driver.conf # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. -# james.exit.on.startup.error=true \ No newline at end of file +# james.exit.on.startup.error=true + +# Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. +# james.fail.on.missing.configuration=true diff --git a/server/apps/distributed-app/sample-configuration/jvm.properties b/server/apps/distributed-app/sample-configuration/jvm.properties index 816af67cf3..7041e12355 100644 --- a/server/apps/distributed-app/sample-configuration/jvm.properties +++ b/server/apps/distributed-app/sample-configuration/jvm.properties @@ -38,4 +38,7 @@ config.file=conf/cassandra-driver.conf # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. -# james.exit.on.startup.error=true \ No newline at end of file +# james.exit.on.startup.error=true + +# Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. +# james.fail.on.missing.configuration=true diff --git a/server/apps/distributed-pop3-app/sample-configuration/jvm.properties b/server/apps/distributed-pop3-app/sample-configuration/jvm.properties index ba36d04837..c87f7ee40f 100644 --- a/server/apps/distributed-pop3-app/sample-configuration/jvm.properties +++ b/server/apps/distributed-pop3-app/sample-configuration/jvm.properties @@ -38,4 +38,7 @@ config.file=conf/cassandra-driver.conf # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. -# james.exit.on.startup.error=true \ No newline at end of file +# james.exit.on.startup.error=true + +# Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. +# james.fail.on.missing.configuration=true diff --git a/server/apps/jpa-app/sample-configuration/jvm.properties b/server/apps/jpa-app/sample-configuration/jvm.properties index a0463cae71..c7404877b5 100644 --- a/server/apps/jpa-app/sample-configuration/jvm.properties +++ b/server/apps/jpa-app/sample-configuration/jvm.properties @@ -35,4 +35,7 @@ # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. -# james.exit.on.startup.error=true \ No newline at end of file +# james.exit.on.startup.error=true + +# Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. +# james.fail.on.missing.configuration=true diff --git a/server/apps/jpa-smtp-app/sample-configuration/jvm.properties b/server/apps/jpa-smtp-app/sample-configuration/jvm.properties index a0463cae71..c7404877b5 100644 --- a/server/apps/jpa-smtp-app/sample-configuration/jvm.properties +++ b/server/apps/jpa-smtp-app/sample-configuration/jvm.properties @@ -35,4 +35,7 @@ # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. -# james.exit.on.startup.error=true \ No newline at end of file +# james.exit.on.startup.error=true + +# Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. +# james.fail.on.missing.configuration=true diff --git a/server/apps/memory-app/sample-configuration/jvm.properties b/server/apps/memory-app/sample-configuration/jvm.properties index 399c195121..8d23fd39a2 100644 --- a/server/apps/memory-app/sample-configuration/jvm.properties +++ b/server/apps/memory-app/sample-configuration/jvm.properties @@ -35,4 +35,7 @@ # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. -# james.exit.on.startup.error=true \ No newline at end of file +# james.exit.on.startup.error=true + +# Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. +# james.fail.on.missing.configuration=true diff --git a/server/apps/memory-app/src/test/java/org/apache/james/DefaultMemoryJamesServerTest.java b/server/apps/memory-app/src/test/java/org/apache/james/DefaultMemoryJamesServerTest.java index 5198406ae4..19e08aa2c4 100644 --- a/server/apps/memory-app/src/test/java/org/apache/james/DefaultMemoryJamesServerTest.java +++ b/server/apps/memory-app/src/test/java/org/apache/james/DefaultMemoryJamesServerTest.java @@ -21,10 +21,12 @@ package org.apache.james; import static org.apache.james.data.UsersRepositoryModuleChooser.Implementation.DEFAULT; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import org.apache.commons.configuration2.BaseHierarchicalConfiguration; import org.apache.james.modules.TestJMAPServerModule; import org.apache.james.server.core.configuration.ConfigurationProvider; +import org.apache.james.utils.PropertiesProvider.MissingConfigurationFile; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -39,10 +41,22 @@ class DefaultMemoryJamesServerTest { .server(configuration -> MemoryJamesServerMain.createServer(configuration) .overrideWith(new TestJMAPServerModule()) .overrideWith(binder -> binder.bind(ConfigurationProvider.class).toInstance((s, l) -> new BaseHierarchicalConfiguration()))) + .disableAutoStart() .build(); @Test - void memoryJamesServerShouldStartWithNoConfigurationFile(GuiceJamesServer server) { + void memoryJamesServerShouldStartWithNoConfigurationFile(GuiceJamesServer server) throws Exception { + server.start(); assertThat(server.isStarted()).isTrue(); } + + @Test + void shouldFailOnMissingConfigurationFilesWhenRequested(GuiceJamesServer server) { + System.setProperty("james.fail.on.missing.configuration", "true"); + try { + assertThatThrownBy(server::start).hasCauseInstanceOf(MissingConfigurationFile.class); + } finally { + System.setProperty("james.fail.on.missing.configuration", "false"); + } + } } 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 02977747dd..0dc26268a0 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 @@ -49,6 +49,10 @@ public class FileConfigurationProvider implements ConfigurationProvider { public static final HierarchicalConfiguration<ImmutableNode> EMPTY_CONFIGURATION = new XMLConfiguration(); + private static boolean failOnMissingConfiguration() { + return Boolean.valueOf(System.getProperty("james.fail.on.missing.configuration", "false")); + } + public static XMLConfiguration getConfig(InputStream configStream) throws ConfigurationException { FileBasedConfigurationBuilder<XMLConfiguration> builder = new FileBasedConfigurationBuilder<>(XMLConfiguration.class) .configure(new Parameters() @@ -85,6 +89,9 @@ public class FileConfigurationProvider implements ConfigurationProvider { return selectConfigurationPart(configPathParts, getConfig(inputStream.get())); } + if (failOnMissingConfiguration()) { + throw new ConfigurationException("Missing configuration: " + component); + } return EMPTY_CONFIGURATION; } 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 d07476f09b..1797510328 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 @@ -45,10 +45,19 @@ import com.google.common.base.Preconditions; import com.google.common.base.Strings; public class PropertiesProvider { + public static class MissingConfigurationFile extends RuntimeException { + public MissingConfigurationFile(String message) { + super(message); + } + } private static final Logger LOGGER = LoggerFactory.getLogger("org.apache.james.CONFIGURATION"); private static final char COMMA = ','; + private static boolean failOnMissingConfiguration() { + return Boolean.valueOf(System.getProperty("james.fail.on.missing.configuration", "false")); + } + @VisibleForTesting public static PropertiesProvider forTesting() { org.apache.james.server.core.configuration.Configuration configuration = org.apache.james.server.core.configuration.Configuration.builder() @@ -74,7 +83,7 @@ public class PropertiesProvider { .map(this::getConfigurationFile) .flatMap(Optional::stream) .findFirst() - .orElseThrow(() -> new FileNotFoundException(Joiner.on(",").join(filenames) + " not found")); + .orElseThrow(() -> fail(Joiner.on(",").join(filenames) + " not found")); return getConfiguration(file); } @@ -83,11 +92,18 @@ public class PropertiesProvider { Preconditions.checkArgument(!Strings.isNullOrEmpty(fileName)); File file = getConfigurationFile(fileName) - .orElseThrow(() -> new FileNotFoundException(fileName)); + .orElseThrow(() -> fail(fileName)); return getConfiguration(file); } + public FileNotFoundException fail(String message) { + if (failOnMissingConfiguration()) { + throw new MissingConfigurationFile(message); + } + return new FileNotFoundException(message); + } + private Configuration getConfiguration(File propertiesFile) throws ConfigurationException { FileBasedConfigurationBuilder<FileBasedConfiguration> builder = new FileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class) .configure(new Parameters() --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org