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