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 63f4c6a8635a529bd4bfd967c4dccd880ccb94af Author: Benoit Tellier <btell...@linagora.com> AuthorDate: Thu May 14 17:34:35 2020 +0700 JAMES-3140 Generify configuration We will be to add per-products fields to it. This will enable passing per-product configuration modules option as part of it. --- .../server/core/configuration/Configuration.java | 111 ++++++++++---------- .../core/configuration/BasicConfigurationTest.java | 113 +++++++++++++++++++++ .../jmap/rfc8621/memory/MemoryEchoMethodTest.java | 2 +- 3 files changed, 174 insertions(+), 52 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 233913c..050d210 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 @@ -27,75 +27,84 @@ import org.apache.james.filesystem.api.JamesDirectoriesProvider; import org.apache.james.server.core.JamesServerResourceLoader; import org.apache.james.server.core.MissingArgumentException; -public class Configuration { +public interface Configuration { - public static final String WORKING_DIRECTORY = "working.directory"; + String WORKING_DIRECTORY = "working.directory"; - public static Builder builder() { - return new Builder(); + static Basic.Builder builder() { + return new Basic.Builder(); } - public static class Builder { + class Basic implements Configuration { + public static class Builder { + private Optional<String> rootDirectory; + private Optional<String> configurationPath; - private Optional<String> rootDirectory; - private Optional<String> configurationPath; + private Builder() { + rootDirectory = Optional.empty(); + configurationPath = Optional.empty(); + } - private Builder() { - rootDirectory = Optional.empty(); - configurationPath = Optional.empty(); - } + public Builder workingDirectory(String path) { + rootDirectory = Optional.of(path); + return this; + } - 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 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 useWorkingDirectoryEnvProperty() { - rootDirectory = Optional - .ofNullable(System.getProperty(WORKING_DIRECTORY)); - if (!rootDirectory.isPresent()) { - throw new MissingArgumentException("Server needs a working.directory env entry"); + public Builder configurationPath(String path) { + configurationPath = Optional.of(path); + return this; } - 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 configurationFromClasspath() { - configurationPath = Optional.of(FileSystem.CLASSPATH_PROTOCOL); - return this; - } + public Configuration.Basic 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"))); - public Configuration build() { - return new Configuration( - rootDirectory - .orElseThrow(() -> new MissingArgumentException("Server needs a working.directory env entry")), - configurationPath.orElse(FileSystem.FILE_PROTOCOL_AND_CONF)); + return new Basic( + configurationPath, + directories); + } } - } - private final String configurationPath; - private final JamesDirectoriesProvider directoriesProvider; + private final String configurationPath; + private final JamesDirectoriesProvider directories; - private Configuration(String rootDirectory, String configurationPath) { - this.configurationPath = configurationPath; - this.directoriesProvider = new JamesServerResourceLoader(rootDirectory); - } + public Basic(String configurationPath, JamesDirectoriesProvider directories) { + this.configurationPath = configurationPath; + this.directories = directories; + } - public String configurationPath() { - return configurationPath; - } + @Override + public String configurationPath() { + return configurationPath; + } - public JamesDirectoriesProvider directories() { - return directoriesProvider; + @Override + public JamesDirectoriesProvider directories() { + return directories; + } } + String configurationPath(); + + JamesDirectoriesProvider directories(); } 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 new file mode 100644 index 0000000..d1c1105 --- /dev/null +++ b/server/container/core/src/test/java/org/apache/james/server/core/configuration/BasicConfigurationTest.java @@ -0,0 +1,113 @@ +/**************************************************************** + * 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.server.core.configuration; + +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.assertj.core.api.SoftAssertions; +import org.junit.jupiter.api.Test; + +class BasicConfigurationTest { + @Test + void buildShouldThrowWhenWorkingDirectoryMissing() { + assertThatThrownBy(() -> Configuration.builder().build()) + .isInstanceOf(MissingArgumentException.class) + .hasMessage("Server needs a working.directory env entry"); + } + + @Test + void useWorkingDirectoryEnvPropertyShouldThrowWhenEnvVariableIsUnspecified() { + assertThatThrownBy(() -> + Configuration.builder() + .useWorkingDirectoryEnvProperty()) + .isInstanceOf(MissingArgumentException.class) + .hasMessage("Server needs a working.directory env entry"); + } + + @Test + void buildShouldReturnConfigurationWithSuppliedValues() { + Configuration.Basic configuration = Configuration.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.Basic configuration = Configuration.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.Basic configuration = Configuration.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.Basic configuration = Configuration.builder() + .useWorkingDirectoryEnvProperty() + .build(); + + assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path"); + } finally { + System.clearProperty("working.directory"); + } + } + + @Test + void getConfDirectoryShouldReturnConfFolderOfRootDir() { + try { + System.setProperty("working.directory", "/path"); + + Configuration.Basic configuration = Configuration.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/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEchoMethodTest.java b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEchoMethodTest.java index f7aa3c7..7f21ab1 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEchoMethodTest.java +++ b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEchoMethodTest.java @@ -30,7 +30,7 @@ import org.junit.jupiter.api.extension.RegisterExtension; public class MemoryEchoMethodTest implements EchoMethodContract { @RegisterExtension - static JamesServerExtension testExtension = new JamesServerBuilder() + static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider()) .server(configuration -> GuiceJamesServer.forConfiguration(configuration) .combineWith(IN_MEMORY_SERVER_AGGREGATE_MODULE) .overrideWith(new TestJMAPServerModule())) --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org