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

Reply via email to