From 02ab8d4bb23ee4adb891b59721f2fc2b58cd1535 Mon Sep 17 00:00:00 2001 From: Christian Koop Date: Sun, 26 Jun 2022 01:36:54 +0200 Subject: [PATCH] Fix YamlConfiguration dumping null values and empty tree nodes --- .../configuration/yaml/YamlConfiguration.java | 21 +++++++++++++++++ .../yaml/YamlConfigurationTest.java | 23 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/Core/src/main/java/com/songoda/core/configuration/yaml/YamlConfiguration.java b/Core/src/main/java/com/songoda/core/configuration/yaml/YamlConfiguration.java index 17893a2c..6690003a 100644 --- a/Core/src/main/java/com/songoda/core/configuration/yaml/YamlConfiguration.java +++ b/Core/src/main/java/com/songoda/core/configuration/yaml/YamlConfiguration.java @@ -209,6 +209,8 @@ public class YamlConfiguration implements IConfiguration, HeaderCommentable, Nod String headerCommentLines = generateHeaderCommentLines(); writer.write(headerCommentLines); + cleanValuesMap(this.values); + if (this.values.size() > 0) { if (headerCommentLines.length() > 0) { writer.write(this.yamlDumperOptions.getLineBreak().getString()); @@ -343,4 +345,23 @@ public class YamlConfiguration implements IConfiguration, HeaderCommentable, Nod ++currentKeyIndex; } } + + /** + * This takes a map and removes all keys that have a value of null.
+ * Additionally, if the value is a {@link Map}, it will be recursively cleaned too.
+ * {@link Map}s that are or get empty, will be removed (recursively).
+ */ + protected void cleanValuesMap(Map map) { + for (Object key : map.keySet().toArray()) { + Object value = map.get(key); + + if (value instanceof Map) { + cleanValuesMap((Map) value); + } + + if (value == null || (value instanceof Map && ((Map) value).isEmpty())) { + map.remove(key); + } + } + } } diff --git a/Core/src/test/java/com/songoda/core/configuration/yaml/YamlConfigurationTest.java b/Core/src/test/java/com/songoda/core/configuration/yaml/YamlConfigurationTest.java index b3f76630..e1d5faf5 100644 --- a/Core/src/test/java/com/songoda/core/configuration/yaml/YamlConfigurationTest.java +++ b/Core/src/test/java/com/songoda/core/configuration/yaml/YamlConfigurationTest.java @@ -139,6 +139,19 @@ class YamlConfigurationTest { assertEquals(expectedOutYaml, cfg.toYamlString()); } + @Test + void testYamlWriterWithNullValue() throws IOException { + final YamlConfiguration cfg = new YamlConfiguration(); + final StringWriter stringWriter = new StringWriter(1); + + cfg.set("null-value", null); + cfg.set("nested.null-value", null); + cfg.save(stringWriter); + + assertEquals("", stringWriter.toString()); + assertEquals("", cfg.toYamlString()); + } + @Test void testYamlWriterWithNoData() throws IOException { final YamlConfiguration cfg = new YamlConfiguration(); @@ -239,6 +252,16 @@ class YamlConfigurationTest { assertEquals("value", cfg.get("primitives.map.key")); } + @Test + void testSetterWithNullValue() { + final YamlConfiguration cfg = new YamlConfiguration(); + + assertNull(cfg.set("foo.bar.null", "not-null-string")); + assertEquals("not-null-string", cfg.set("foo.bar.null", null)); + + assertNull(cfg.get("foo.bar.null")); + } + @Test void testGetNonExistingNestedKey() { final YamlConfiguration cfg = new YamlConfiguration();