From 59b374e6237eaea8420a140f50460dbc2369cb14 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 11 May 2021 16:07:46 +0300 Subject: [PATCH] refactoring: Config YAML -> HOCON --- libs.gradle | 2 +- logic.gradle | 3 + server-new/build.gradle | 35 +++++++++ server-new/gradle.properties | 2 + .../java/mc/server/di/ConfigComponent.java | 13 ++++ .../main/java/mc/server/di/ConfigModule.java | 25 +++++++ .../java/mc/server/di/ConfigModuleTest.java | 59 +++++++++++++++ server-new/src/test/resources/config-1.conf | 12 ++++ server-new/src/test/resources/config-2.conf | 1 + .../main/java/mc/server/config/Config.java | 55 -------------- .../main/java/mc/server/di/ConfigModule.java | 72 ------------------- server/src/main/resources/config-sample.yml | 23 ------ settings.gradle | 1 + 13 files changed, 152 insertions(+), 151 deletions(-) create mode 100644 server-new/build.gradle create mode 100644 server-new/gradle.properties create mode 100644 server-new/src/main/java/mc/server/di/ConfigComponent.java create mode 100644 server-new/src/main/java/mc/server/di/ConfigModule.java create mode 100644 server-new/src/test/java/mc/server/di/ConfigModuleTest.java create mode 100644 server-new/src/test/resources/config-1.conf create mode 100644 server-new/src/test/resources/config-2.conf delete mode 100644 server/src/main/java/mc/server/config/Config.java delete mode 100644 server/src/main/java/mc/server/di/ConfigModule.java delete mode 100644 server/src/main/resources/config-sample.yml diff --git a/libs.gradle b/libs.gradle index 63c4dfe..0caf54e 100644 --- a/libs.gradle +++ b/libs.gradle @@ -14,7 +14,7 @@ ext { annotations: 'com.google.code.findbugs:jsr305:3.0.2', lang3 : 'org.apache.commons:commons-lang3:3.11', reactor : 'io.projectreactor:reactor-core:3.4.5', - yaml : 'org.yaml:snakeyaml:1.28', + hocon : 'com.typesafe:config:1.4.1', json : 'com.eclipsesource.minimal-json:minimal-json:0.9.5', ioutils : 'commons-io:commons-io:2.6', jopt : 'net.sf.jopt-simple:jopt-simple:6.0-alpha-3', diff --git a/logic.gradle b/logic.gradle index a3eb9c6..16f5e97 100644 --- a/logic.gradle +++ b/logic.gradle @@ -32,6 +32,9 @@ dependencies { implementation libs.dagger2.implementation annotationProcessor libs.dagger2.annotationProcessor + testAnnotationProcessor libs.lombok + testCompileOnly libs.lombok + testImplementation libs.test.junit5.api testImplementation libs.test.junit5.params testRuntimeOnly libs.test.junit5.engine diff --git a/server-new/build.gradle b/server-new/build.gradle new file mode 100644 index 0000000..7c1af0e --- /dev/null +++ b/server-new/build.gradle @@ -0,0 +1,35 @@ +/* +Запуск + gradle :server:run --args="--config=config.yml --logconfig==logback.xml" + +Сборка + gradle :server:shadowJar + */ + +//file:noinspection GrUnresolvedAccess +plugins { + id 'com.github.johnrengelman.shadow' version '7.0.0' +} + +apply from: rootDir.toPath().resolve('logic.gradle').toFile() +apply plugin: 'application' + +application { + mainClassName = 'mc.server.Main' + + if (project.hasProperty('jvmArgs')) { + applicationDefaultJvmArgs = List.of((project.jvmArgs as String).split('\\s+')) + } +} + +dependencies { + implementation project(':protocol-new') + + implementation libs.hocon +} + +shadowJar { + archiveBaseName.set(jar.archiveBaseName.get()) + archiveVersion.set(project.version as String) + archiveClassifier.set('') +} \ No newline at end of file diff --git a/server-new/gradle.properties b/server-new/gradle.properties new file mode 100644 index 0000000..998fe1e --- /dev/null +++ b/server-new/gradle.properties @@ -0,0 +1,2 @@ +# suppress inspection "UnusedProperty" for whole file +module.name=server \ No newline at end of file diff --git a/server-new/src/main/java/mc/server/di/ConfigComponent.java b/server-new/src/main/java/mc/server/di/ConfigComponent.java new file mode 100644 index 0000000..6e356dd --- /dev/null +++ b/server-new/src/main/java/mc/server/di/ConfigComponent.java @@ -0,0 +1,13 @@ +package mc.server.di; + +import com.typesafe.config.Config; +import dagger.Component; + +import javax.inject.Singleton; + +@Component(modules = ConfigModule.class) +@Singleton +public interface ConfigComponent { + + Config getConfig(); +} diff --git a/server-new/src/main/java/mc/server/di/ConfigModule.java b/server-new/src/main/java/mc/server/di/ConfigModule.java new file mode 100644 index 0000000..5253d52 --- /dev/null +++ b/server-new/src/main/java/mc/server/di/ConfigModule.java @@ -0,0 +1,25 @@ +package mc.server.di; + +import com.typesafe.config.Config; +import com.typesafe.config.ConfigFactory; +import dagger.Module; +import dagger.Provides; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import javax.inject.Singleton; +import java.nio.file.Path; + +@Module +@RequiredArgsConstructor +@Slf4j +public class ConfigModule { + + private final Path configPath; + + @Provides + @Singleton + Config provideConfig() { + return ConfigFactory.parseFile(configPath.toFile()).resolve(); + } +} diff --git a/server-new/src/test/java/mc/server/di/ConfigModuleTest.java b/server-new/src/test/java/mc/server/di/ConfigModuleTest.java new file mode 100644 index 0000000..485eba4 --- /dev/null +++ b/server-new/src/test/java/mc/server/di/ConfigModuleTest.java @@ -0,0 +1,59 @@ +package mc.server.di; + +import com.typesafe.config.Config; +import lombok.SneakyThrows; +import org.junit.jupiter.api.Test; + +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; + +import static org.junit.jupiter.api.Assertions.*; + +class ConfigModuleTest { + + @Test + void singleton() { + ConfigComponent component = DaggerConfigComponent.builder() + .configModule(new ConfigModule(pathResource("/config-1.conf"))).build(); + Config config1 = component.getConfig(); + Config config2 = component.getConfig(); + + assertEquals(config1, config2); + assertSame(config1, config2); + } + + @Test + void loadConfig() { + ConfigComponent component = DaggerConfigComponent.builder() + .configModule(new ConfigModule(pathResource("/config-1.conf"))).build(); + + Config config = component.getConfig(); + assertEquals("value1", config.getString("key1")); + assertEquals("value2", config.getString("key2.subkey1")); + assertEquals("value3", config.getString("key3.subkey1")); + assertEquals("value4", config.getString("\"key4.somename\"")); + assertEquals("value5", config.getString("key5")); + } + + @Test + void includeTest() { + ConfigComponent component = DaggerConfigComponent.builder() + .configModule(new ConfigModule(pathResource("/config-2.conf"))).build(); + + Config config = component.getConfig(); + assertEquals("value1", config.getString("key1")); + assertEquals("value2", config.getString("key2.subkey1")); + assertEquals("value3", config.getString("key3.subkey1")); + assertEquals("value4", config.getString("\"key4.somename\"")); + assertEquals("value5", config.getString("key5")); + } + + @SneakyThrows + private static Path pathResource(String resource) { + URL url = ConfigModuleTest.class.getResource(resource); + assertNotNull(url); + + return Paths.get(url.toURI()); + } +} \ No newline at end of file diff --git a/server-new/src/test/resources/config-1.conf b/server-new/src/test/resources/config-1.conf new file mode 100644 index 0000000..af008fc --- /dev/null +++ b/server-new/src/test/resources/config-1.conf @@ -0,0 +1,12 @@ +key1: value1 + +key2.subkey1: value2 + +key3 { + subkey1: value3 +} + +"key4.somename": value4 + +variable: value5 +key5: ${variable} \ No newline at end of file diff --git a/server-new/src/test/resources/config-2.conf b/server-new/src/test/resources/config-2.conf new file mode 100644 index 0000000..7761319 --- /dev/null +++ b/server-new/src/test/resources/config-2.conf @@ -0,0 +1 @@ +include "config-1.conf" \ No newline at end of file diff --git a/server/src/main/java/mc/server/config/Config.java b/server/src/main/java/mc/server/config/Config.java deleted file mode 100644 index 3c5f3d2..0000000 --- a/server/src/main/java/mc/server/config/Config.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.server.config; - -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; -import lombok.experimental.Accessors; - -import java.nio.file.Path; - -@Accessors(fluent = true) -@Getter -@Setter -@ToString -public class Config { - - private final Server server = new Server(); - private final Players players = new Players(); - private final World world = new World(); - - private String motd; - private String disconnectReason; - private Path iconPath; - - @Getter - @Setter - @ToString - public static class Server { - private String host; - private int port; - } - - @Getter - @Setter - @ToString - public static class Players { - private final FakeOnline fakeOnline = new FakeOnline(); - - private int maxOnlile; - } - - @Getter - @Setter - @ToString - public static class FakeOnline { - private boolean enable; - private int value; - } - - @Getter - @Setter - @ToString - public static class World { - private int viewDistance; - } -} diff --git a/server/src/main/java/mc/server/di/ConfigModule.java b/server/src/main/java/mc/server/di/ConfigModule.java deleted file mode 100644 index 76635e8..0000000 --- a/server/src/main/java/mc/server/di/ConfigModule.java +++ /dev/null @@ -1,72 +0,0 @@ -package mc.server.di; - -import dagger.Module; -import dagger.Provides; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import mc.server.config.Config; -import org.yaml.snakeyaml.Yaml; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Map; - -@Slf4j -@Module -@RequiredArgsConstructor -public class ConfigModule { - - private final Path configPath; - - @Provides - Config provideConfig() { - Config config = new Config(); - Map map = new Yaml().load(readConfigAsString()); - - config.server().host(fromYamlPath("server/host", map, "127.0.0.1")); - config.server().port(fromYamlPath("server/port", map, 25565)); - - config.motd(fromYamlPath("motd", map, "")); - config.disconnectReason(fromYamlPath("disconnect-reason", map, "")); - - config.players().maxOnlile(fromYamlPath("players/max-online", map, 0)); - config.players().fakeOnline().enable(fromYamlPath("players/fake-online/enable", map, false)); - config.players().fakeOnline().value(fromYamlPath("players/fake-online/value", map, 0)); - - config.world().viewDistance(fromYamlPath("world/view-distance", map, 0)); - - if (Boolean.TRUE.equals(fromYamlPath("icon/enable", map, false))) { - config.iconPath(Paths.get(fromYamlPath("icon/path", map, "favicon.png"))); - } - - map.clear(); - return config; - } - - private String readConfigAsString() { - try { - return Files.readString(configPath); - } catch (IOException e) { - log.error("Can't load config from '{}'", configPath.toAbsolutePath(), e); - return ""; - } - } - - @SuppressWarnings("unchecked") - private static T fromYamlPath(String mapPath, Map map, T defaultValue) { - String[] keys = mapPath.split("/", 2); - - if (map.containsKey(keys[0])) { - Object object = map.get(keys[0]); - if (keys.length > 1) { - return fromYamlPath(keys[1], (Map) object, defaultValue); - } else { - return (T) object; - } - } else { - return defaultValue; - } - } -} diff --git a/server/src/main/resources/config-sample.yml b/server/src/main/resources/config-sample.yml deleted file mode 100644 index 169067b..0000000 --- a/server/src/main/resources/config-sample.yml +++ /dev/null @@ -1,23 +0,0 @@ -server: - host: 127.0.0.1 - port: 25565 - -motd: | - &bmc-project &8:: &4ZERO - &8develop by &7DmitriyMX - -disconnect-reason: '&4Server is not available.' - -players: - max-online: 0 - fake-online: - enable: false - value: 0 - -# Размер значка: 64x64 px -icon: - enable: false - path: favicon.png - -world: - view-distance: 1 \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 20fd988..d109887 100644 --- a/settings.gradle +++ b/settings.gradle @@ -12,5 +12,6 @@ rootProject.name = map.get('project.name') include('utils') include('protocol-new') +include('server-new') //include('protocol') //include('server') \ No newline at end of file