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 0e94bc7e4c381e1bdd0ec9a20b3f5a9bd9938c86
Author: Benoit Tellier <btell...@linagora.com>
AuthorDate: Thu May 14 17:46:52 2020 +0700

    JAMES-3140 Configuration for distributed James
---
 .../james/CassandraRabbitMQJamesConfiguration.java | 121 +++++++++++++++++++++
 .../james/CassandraRabbitMQJamesServerMain.java    |   5 +-
 .../modules/blobstore/BlobStoreConfiguration.java  |   3 +-
 .../CassandraRabbitMQJamesConfigurationTest.java   | 114 +++++++++++++++++++
 .../org/apache/james/utils/PropertiesProvider.java |   4 +-
 .../PropertiesProviderFromEnvVariablesTest.java    |   2 +-
 .../apache/james/utils/PropertiesProviderTest.java |   4 +-
 .../org/apache/james/FakePropertiesProvider.java   |   4 +-
 .../james/utils/FailingPropertiesProvider.java     |   3 +-
 9 files changed, 247 insertions(+), 13 deletions(-)

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
new file mode 100644
index 0000000..55f9e6b
--- /dev/null
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
@@ -0,0 +1,121 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james;
+
+import java.io.File;
+import java.util.Optional;
+
+import org.apache.james.filesystem.api.FileSystem;
+import org.apache.james.filesystem.api.JamesDirectoriesProvider;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
+import org.apache.james.server.core.JamesServerResourceLoader;
+import org.apache.james.server.core.MissingArgumentException;
+import org.apache.james.server.core.configuration.Configuration;
+import org.apache.james.server.core.filesystem.FileSystemImpl;
+import org.apache.james.utils.PropertiesProvider;
+
+import com.github.fge.lambdas.Throwing;
+
+public class CassandraRabbitMQJamesConfiguration implements Configuration {
+    public static class Builder {
+        private Optional<BlobStoreConfiguration> blobStoreConfiguration;
+        private Optional<String> rootDirectory;
+        private Optional<String> configurationPath;
+
+        private Builder() {
+            rootDirectory = Optional.empty();
+            configurationPath = Optional.empty();
+        }
+
+        public Builder workingDirectory(String path) {
+            rootDirectory = Optional.of(path);
+            return this;
+        }
+
+        public Builder workingDirectory(File file) {
+            rootDirectory = Optional.of(file.getAbsolutePath());
+            return this;
+        }
+
+        public Builder useWorkingDirectoryEnvProperty() {
+            rootDirectory = 
Optional.ofNullable(System.getProperty(WORKING_DIRECTORY));
+            if (!rootDirectory.isPresent()) {
+                throw new MissingArgumentException("Server needs a 
working.directory env entry");
+            }
+            return this;
+        }
+
+        public Builder configurationPath(String path) {
+            configurationPath = Optional.of(path);
+            return this;
+        }
+
+        public Builder configurationFromClasspath() {
+            configurationPath = Optional.of(FileSystem.CLASSPATH_PROTOCOL);
+            return this;
+        }
+
+        public Builder blobStore(BlobStoreConfiguration 
blobStoreConfiguration) {
+            this.blobStoreConfiguration = Optional.of(blobStoreConfiguration);
+            return this;
+        }
+
+        public CassandraRabbitMQJamesConfiguration build() {
+            String configurationPath = 
this.configurationPath.orElse(FileSystem.FILE_PROTOCOL_AND_CONF);
+            JamesServerResourceLoader directories = new 
JamesServerResourceLoader(rootDirectory
+                .orElseThrow(() -> new MissingArgumentException("Server needs 
a working.directory env entry")));
+
+            return new CassandraRabbitMQJamesConfiguration(
+                configurationPath,
+                directories,
+                blobStoreConfiguration.orElseGet(Throwing.supplier(
+                    () -> BlobStoreConfiguration.parse(
+                        new PropertiesProvider(new 
FileSystemImpl(directories), configurationPath)))));
+        }
+    }
+
+    static CassandraRabbitMQJamesConfiguration.Builder builder() {
+        return new Builder();
+    }
+
+    private final String configurationPath;
+    private final JamesDirectoriesProvider directories;
+    private final BlobStoreConfiguration blobStoreConfiguration;
+
+    public CassandraRabbitMQJamesConfiguration(String configurationPath, 
JamesDirectoriesProvider directories, BlobStoreConfiguration 
blobStoreConfiguration) {
+        this.configurationPath = configurationPath;
+        this.directories = directories;
+        this.blobStoreConfiguration = blobStoreConfiguration;
+    }
+
+    @Override
+    public String configurationPath() {
+        return configurationPath;
+    }
+
+    @Override
+    public JamesDirectoriesProvider directories() {
+        return directories;
+    }
+
+    public BlobStoreConfiguration blobstoreconfiguration() {
+        return blobStoreConfiguration;
+    }
+}
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
index da6b40b..318f54b 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
@@ -28,7 +28,6 @@ import 
org.apache.james.modules.blobstore.BlobStoreModulesChooser;
 import org.apache.james.modules.event.RabbitMQEventBusModule;
 import org.apache.james.modules.rabbitmq.RabbitMQModule;
 import org.apache.james.modules.server.JMXServerModule;
-import org.apache.james.server.core.configuration.Configuration;
 
 import com.google.common.collect.ImmutableList;
 import com.google.inject.Module;
@@ -41,11 +40,11 @@ public class CassandraRabbitMQJamesServerMain implements 
JamesServerMain {
             .with(new RabbitMQModule(), new RabbitMQEventBusModule(), new 
TaskSerializationModule());
 
     public static void main(String[] args) throws Exception {
-        Configuration configuration = Configuration.builder()
+        CassandraRabbitMQJamesConfiguration configuration = 
CassandraRabbitMQJamesConfiguration.builder()
             .useWorkingDirectoryEnvProperty()
             .build();
 
-        BlobStoreConfiguration blobStoreConfiguration = 
BlobStoreConfiguration.parse(configuration);
+        BlobStoreConfiguration blobStoreConfiguration = 
configuration.blobstoreconfiguration();
 
         Module baseModule = modules(blobStoreConfiguration);
 
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreConfiguration.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreConfiguration.java
index c7f2325..bc210f6 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreConfiguration.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreConfiguration.java
@@ -72,7 +72,8 @@ public class BlobStoreConfiguration {
     static final String BLOBSTORE_IMPLEMENTATION_PROPERTY = "implementation";
 
     public static BlobStoreConfiguration 
parse(org.apache.james.server.core.configuration.Configuration configuration) 
throws ConfigurationException {
-        PropertiesProvider propertiesProvider = new PropertiesProvider(new 
FileSystemImpl(configuration.directories()), configuration);
+        PropertiesProvider propertiesProvider = new PropertiesProvider(new 
FileSystemImpl(configuration.directories()),
+            configuration.configurationPath());
 
         return parse(propertiesProvider);
     }
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
new file mode 100644
index 0000000..ab06912
--- /dev/null
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesConfigurationTest.java
@@ -0,0 +1,114 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james;
+
+import static org.assertj.core.api.Assertions.assertThat;
+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.assertj.core.api.SoftAssertions;
+import org.junit.jupiter.api.Test;
+
+class CassandraRabbitMQJamesConfigurationTest {
+    @Test
+    void buildShouldThrowWhenWorkingDirectoryMissing() {
+        assertThatThrownBy(() -> 
CassandraRabbitMQJamesConfiguration.builder().build())
+            .isInstanceOf(MissingArgumentException.class)
+            .hasMessage("Server needs a working.directory env entry");
+    }
+
+    @Test
+    void 
useWorkingDirectoryEnvPropertyShouldThrowWhenEnvVariableIsUnspecified() {
+        assertThatThrownBy(() ->
+            CassandraRabbitMQJamesConfiguration.builder()
+                .useWorkingDirectoryEnvProperty())
+            .isInstanceOf(MissingArgumentException.class)
+            .hasMessage("Server needs a working.directory env entry");
+    }
+
+    @Test
+    void buildShouldReturnConfigurationWithSuppliedValues() {
+        Configuration configuration = 
CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory("/path")
+            .configurationPath("file://myconf/")
+            .build();
+
+        SoftAssertions.assertSoftly(softly -> {
+            
softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
+            
softly.assertThat(configuration.configurationPath()).isEqualTo("file://myconf/");
+        });
+    }
+
+    @Test
+    void 
buildShouldReturnConfigurationWithClassPathConfigurationPathWhenSpecified() {
+        Configuration configuration = 
CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory("/path")
+            .configurationFromClasspath()
+            .build();
+
+        SoftAssertions.assertSoftly(softly -> {
+            
softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
+            
softly.assertThat(configuration.configurationPath()).isEqualTo("classpath:");
+        });
+    }
+
+    @Test
+    void configurationPathShouldDefaultToFileConf() {
+        Configuration configuration = 
CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory("/path")
+            .build();
+
+        SoftAssertions.assertSoftly(softly -> {
+            
softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
+            
softly.assertThat(configuration.configurationPath()).isEqualTo("file://conf/");
+        });
+    }
+
+    @Test
+    void useWorkingDirectoryEnvPropertyShouldReadSystemProperty() {
+        try {
+            System.setProperty("working.directory", "/path");
+
+            Configuration configuration = 
CassandraRabbitMQJamesConfiguration.builder()
+                .useWorkingDirectoryEnvProperty()
+                .build();
+
+            
assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
+        } finally {
+            System.clearProperty("working.directory");
+        }
+    }
+
+    @Test
+    void getConfDirectoryShouldReturnConfFolderOfRootDir() {
+        try {
+            System.setProperty("working.directory", "/path");
+
+            Configuration configuration = 
CassandraRabbitMQJamesConfiguration.builder()
+                .useWorkingDirectoryEnvProperty()
+                .build();
+
+            
assertThat(configuration.directories().getConfDirectory()).isEqualTo("/path/conf/");
+        } finally {
+            System.clearProperty("working.directory");
+        }
+    }
+}
\ No newline at end of file
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 cff883a..1091c55 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
@@ -48,9 +48,9 @@ public class PropertiesProvider {
     private final String configurationPrefix;
 
     @Inject
-    public PropertiesProvider(FileSystem fileSystem, 
org.apache.james.server.core.configuration.Configuration configuration) {
+    public PropertiesProvider(FileSystem fileSystem, String 
configurationPrefix) {
         this.fileSystem = fileSystem;
-        this.configurationPrefix = configuration.configurationPath();
+        this.configurationPrefix = configurationPrefix;
     }
 
     public Configuration getConfigurations(String... filenames) throws 
FileNotFoundException, ConfigurationException {
diff --git 
a/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderFromEnvVariablesTest.java
 
b/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderFromEnvVariablesTest.java
index 3aab2bc..3b608d2 100644
--- 
a/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderFromEnvVariablesTest.java
+++ 
b/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderFromEnvVariablesTest.java
@@ -42,7 +42,7 @@ public class PropertiesProviderFromEnvVariablesTest {
             .configurationFromClasspath()
             .build();
         FileSystemImpl fileSystem = new 
FileSystemImpl(configuration.directories());
-        testee = new PropertiesProvider(fileSystem, configuration);
+        testee = new PropertiesProvider(fileSystem, 
configuration.configurationPath());
     }
 
     @Test
diff --git 
a/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderTest.java
 
b/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderTest.java
index ab78db3..fcf96c7 100644
--- 
a/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderTest.java
+++ 
b/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderTest.java
@@ -24,8 +24,6 @@ import static 
org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.io.FileNotFoundException;
 
-import org.apache.commons.configuration2.PropertiesConfiguration;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.james.server.core.configuration.Configuration;
 import org.apache.james.server.core.filesystem.FileSystemImpl;
 import org.junit.jupiter.api.BeforeEach;
@@ -41,7 +39,7 @@ class PropertiesProviderTest {
             .configurationFromClasspath()
             .build();
         FileSystemImpl fileSystem = new 
FileSystemImpl(configuration.directories());
-        testee = new PropertiesProvider(fileSystem, configuration);
+        testee = new PropertiesProvider(fileSystem, 
configuration.configurationPath());
     }
 
     @Test
diff --git 
a/server/container/guice/guice-common/src/test/java/org/apache/james/FakePropertiesProvider.java
 
b/server/container/guice/guice-common/src/test/java/org/apache/james/FakePropertiesProvider.java
index 2af4dbe..c7882df 100644
--- 
a/server/container/guice/guice-common/src/test/java/org/apache/james/FakePropertiesProvider.java
+++ 
b/server/container/guice/guice-common/src/test/java/org/apache/james/FakePropertiesProvider.java
@@ -26,7 +26,6 @@ import java.util.Optional;
 import org.apache.commons.configuration2.Configuration;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.james.filesystem.api.FileSystem;
-import org.apache.james.util.OptionalUtils;
 import org.apache.james.utils.PropertiesProvider;
 
 import com.google.common.collect.ImmutableMap;
@@ -40,7 +39,8 @@ public class FakePropertiesProvider extends 
PropertiesProvider {
     public FakePropertiesProvider(ImmutableMap<String, Configuration> 
configurations) {
         super(NULL_FILE_SYSTEM, 
org.apache.james.server.core.configuration.Configuration.builder()
             .workingDirectory("fakePath")
-            .build());
+            .build()
+            .configurationPath());
         this.configurations = configurations;
     }
 
diff --git 
a/server/container/guice/guice-common/src/test/java/org/apache/james/utils/FailingPropertiesProvider.java
 
b/server/container/guice/guice-common/src/test/java/org/apache/james/utils/FailingPropertiesProvider.java
index f525a34..50eec0b 100644
--- 
a/server/container/guice/guice-common/src/test/java/org/apache/james/utils/FailingPropertiesProvider.java
+++ 
b/server/container/guice/guice-common/src/test/java/org/apache/james/utils/FailingPropertiesProvider.java
@@ -34,7 +34,8 @@ public class FailingPropertiesProvider extends 
PropertiesProvider {
     public FailingPropertiesProvider(FileSystem fileSystem) throws 
FileNotFoundException {
         super(fileSystem, Configuration.builder()
             .workingDirectory(fileSystem.getBasedir().getAbsolutePath())
-            .build());
+            .build()
+            .configurationPath());
     }
 
     @Override


---------------------------------------------------------------------
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