From 7438b194e0336fa2b2a1f1ea394b52520e209abc Mon Sep 17 00:00:00 2001 From: Mechite Date: Fri, 6 Sep 2024 23:49:48 +0100 Subject: [PATCH 1/4] Add avaje-config-toml Signed-off-by: Mechite --- avaje-config-toml/pom.xml | 82 +++++++++++++++++++ .../java/io/avaje/config/toml/TomlParser.java | 45 ++++++++++ .../src/main/java/module-info.java | 10 +++ .../io/avaje/config/toml/TomlParserTest.java | 51 ++++++++++++ pom.xml | 1 + 5 files changed, 189 insertions(+) create mode 100644 avaje-config-toml/pom.xml create mode 100644 avaje-config-toml/src/main/java/io/avaje/config/toml/TomlParser.java create mode 100644 avaje-config-toml/src/main/java/module-info.java create mode 100644 avaje-config-toml/src/test/java/io/avaje/config/toml/TomlParserTest.java diff --git a/avaje-config-toml/pom.xml b/avaje-config-toml/pom.xml new file mode 100644 index 00000000..3f80aecd --- /dev/null +++ b/avaje-config-toml/pom.xml @@ -0,0 +1,82 @@ + + + 4.0.0 + + org.avaje + java11-oss + 4.4 + + + + io.avaje + avaje-config-toml + 4.1-SNAPSHOT + + + scm:git:git@github.com:avaje/avaje-config.git + scm:git:git@github.com:avaje/avaje-config.git + HEAD + + + + 2.3 + true + false + + + + + io.avaje + avaje-config + ${project.version} + + + org.tomlj + tomlj + 1.1.1 + + + + io.avaje + junit + 1.5 + test + + + + ch.qos.logback + logback-classic + 1.5.7 + test + + + + io.avaje + avaje-applog-slf4j + 1.0 + test + + + + + + + org.apache.maven.plugins + maven-repository-plugin + 2.4 + + + + + + + + + + + + + + + + diff --git a/avaje-config-toml/src/main/java/io/avaje/config/toml/TomlParser.java b/avaje-config-toml/src/main/java/io/avaje/config/toml/TomlParser.java new file mode 100644 index 00000000..826d4533 --- /dev/null +++ b/avaje-config-toml/src/main/java/io/avaje/config/toml/TomlParser.java @@ -0,0 +1,45 @@ +package io.avaje.config.toml; + +import io.avaje.config.ConfigParser; +import org.jspecify.annotations.NullMarked; +import org.tomlj.Toml; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.io.UncheckedIOException; +import java.util.Map; +import java.util.stream.Collectors; + +@NullMarked +final class TomlParser implements ConfigParser { + + private static final String[] extensions = {"toml"}; + + @Override + public String[] supportedExtensions() { + return extensions; + } + + @Override + public Map load(Reader reader) { + try { + return Toml.parse(reader).dottedEntrySet() + .stream() + .collect(Collectors.toMap(Map.Entry::getKey, entry -> String.valueOf(entry.getValue()))); + } catch (IOException exception) { + throw new UncheckedIOException(exception); + } + } + + @Override + public Map load(InputStream is) { + try { + return Toml.parse(is).dottedEntrySet() + .stream() + .collect(Collectors.toMap(Map.Entry::getKey, entry -> String.valueOf(entry.getValue()))); + } catch (IOException exception) { + throw new UncheckedIOException(exception); + } + } +} diff --git a/avaje-config-toml/src/main/java/module-info.java b/avaje-config-toml/src/main/java/module-info.java new file mode 100644 index 00000000..e8516503 --- /dev/null +++ b/avaje-config-toml/src/main/java/module-info.java @@ -0,0 +1,10 @@ +module io.avaje.config.toml { + + requires io.avaje.config; + requires org.tomlj; + + exports io.avaje.config.toml; + + uses io.avaje.config.ConfigExtension; + +} diff --git a/avaje-config-toml/src/test/java/io/avaje/config/toml/TomlParserTest.java b/avaje-config-toml/src/test/java/io/avaje/config/toml/TomlParserTest.java new file mode 100644 index 00000000..81e07fee --- /dev/null +++ b/avaje-config-toml/src/test/java/io/avaje/config/toml/TomlParserTest.java @@ -0,0 +1,51 @@ +package io.avaje.config.toml; + +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; +import java.io.StringReader; +import java.nio.charset.StandardCharsets; +import java.util.Map; + +import static org.assertj.core.api.Assertions.*; + +public class TomlParserTest { + + @Test + void supportedExtensions() { + var parser = new TomlParser(); + assertThat(parser.supportedExtensions()).isEqualTo(new String[]{"toml"}); + } + + private static String input() { + return "key3 = \"c\"\n" + + "\n" + + "[one]\n" + + "key = \"a\"\n" + + "key2 = \"b\"\n"; + } + + @Test + void load_reader() { + var parser = new TomlParser(); + Map map = parser.load(new StringReader(input())); + + assertThat(map).hasSize(3); + assertThat(map).containsOnlyKeys("one.key", "one.key2", "key3"); + assertThat(map).containsEntry("one.key", "a"); + assertThat(map).containsEntry("one.key2", "b"); + assertThat(map).containsEntry("key3", "c"); + } + + @Test + void load_inputStream() { + var parser = new TomlParser(); + Map map = parser.load(new ByteArrayInputStream(input().getBytes(StandardCharsets.UTF_8))); + + assertThat(map).hasSize(3); + assertThat(map).containsOnlyKeys("one.key", "one.key2", "key3"); + assertThat(map).containsEntry("one.key", "a"); + assertThat(map).containsEntry("one.key2", "b"); + assertThat(map).containsEntry("key3", "c"); + } +} diff --git a/pom.xml b/pom.xml index 51cc3c02..dcfadc18 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ avaje-config + avaje-config-toml avaje-aws-appconfig avaje-dynamic-logback From 606225973b5767990c51f79461ed75c54da01e67 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Sun, 8 Sep 2024 21:38:56 +1200 Subject: [PATCH 2/4] Tidy up pom for avaje-config-toml --- avaje-config-toml/pom.xml | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/avaje-config-toml/pom.xml b/avaje-config-toml/pom.xml index 3f80aecd..83c80eab 100644 --- a/avaje-config-toml/pom.xml +++ b/avaje-config-toml/pom.xml @@ -19,8 +19,6 @@ - 2.3 - true false @@ -58,25 +56,4 @@ - - - - org.apache.maven.plugins - maven-repository-plugin - 2.4 - - - - - - - - - - - - - - - From d3a4d881f215cc64aea28072d499104c66bd927c Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Sun, 8 Sep 2024 21:42:03 +1200 Subject: [PATCH 3/4] Register TomlParser for service loading as a ConfigExtension --- .../src/main/java/io/avaje/config/toml/TomlParser.java | 2 +- avaje-config-toml/src/main/java/module-info.java | 4 +++- .../META-INF/services/io.avaje.config.ConfigExtension | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 avaje-config-toml/src/main/resources/META-INF/services/io.avaje.config.ConfigExtension diff --git a/avaje-config-toml/src/main/java/io/avaje/config/toml/TomlParser.java b/avaje-config-toml/src/main/java/io/avaje/config/toml/TomlParser.java index 826d4533..284fce66 100644 --- a/avaje-config-toml/src/main/java/io/avaje/config/toml/TomlParser.java +++ b/avaje-config-toml/src/main/java/io/avaje/config/toml/TomlParser.java @@ -12,7 +12,7 @@ import java.util.stream.Collectors; @NullMarked -final class TomlParser implements ConfigParser { +public final class TomlParser implements ConfigParser { private static final String[] extensions = {"toml"}; diff --git a/avaje-config-toml/src/main/java/module-info.java b/avaje-config-toml/src/main/java/module-info.java index e8516503..f796a147 100644 --- a/avaje-config-toml/src/main/java/module-info.java +++ b/avaje-config-toml/src/main/java/module-info.java @@ -1,3 +1,5 @@ +import io.avaje.config.toml.TomlParser; + module io.avaje.config.toml { requires io.avaje.config; @@ -5,6 +7,6 @@ exports io.avaje.config.toml; - uses io.avaje.config.ConfigExtension; + provides io.avaje.config.ConfigExtension with TomlParser; } diff --git a/avaje-config-toml/src/main/resources/META-INF/services/io.avaje.config.ConfigExtension b/avaje-config-toml/src/main/resources/META-INF/services/io.avaje.config.ConfigExtension new file mode 100644 index 00000000..8338f328 --- /dev/null +++ b/avaje-config-toml/src/main/resources/META-INF/services/io.avaje.config.ConfigExtension @@ -0,0 +1 @@ +io.avaje.config.toml.TomlParser From da92971eab271d8c7c7881fffa15202bc43d30eb Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Sun, 8 Sep 2024 21:43:26 +1200 Subject: [PATCH 4/4] TomlParserTest does not need to be public --- .../src/test/java/io/avaje/config/toml/TomlParserTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avaje-config-toml/src/test/java/io/avaje/config/toml/TomlParserTest.java b/avaje-config-toml/src/test/java/io/avaje/config/toml/TomlParserTest.java index 81e07fee..af65150d 100644 --- a/avaje-config-toml/src/test/java/io/avaje/config/toml/TomlParserTest.java +++ b/avaje-config-toml/src/test/java/io/avaje/config/toml/TomlParserTest.java @@ -9,7 +9,7 @@ import static org.assertj.core.api.Assertions.*; -public class TomlParserTest { +class TomlParserTest { @Test void supportedExtensions() {