From f18d564add24a6f743af4caae8e191358f5a4426 Mon Sep 17 00:00:00 2001 From: heinz Date: Thu, 4 Jun 2020 23:44:36 +0200 Subject: [PATCH 1/2] Add origin support for empty YAML list and map Update `OriginTrackedYamlLoader` to better deal with empty maps and collections. See gh-21704 --- .../boot/env/OriginTrackedYamlLoader.java | 4 ++++ .../boot/env/OriginTrackedYamlLoaderTests.java | 9 +++++++++ .../resources/org/springframework/boot/env/test-yaml.yml | 2 ++ 3 files changed, 15 insertions(+) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java index b2a87f87929..ffa6558dc76 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java @@ -30,6 +30,7 @@ import org.yaml.snakeyaml.constructor.BaseConstructor; import org.yaml.snakeyaml.constructor.Constructor; import org.yaml.snakeyaml.constructor.SafeConstructor; import org.yaml.snakeyaml.error.Mark; +import org.yaml.snakeyaml.nodes.CollectionNode; import org.yaml.snakeyaml.nodes.MappingNode; import org.yaml.snakeyaml.nodes.Node; import org.yaml.snakeyaml.nodes.NodeTuple; @@ -109,6 +110,9 @@ class OriginTrackedYamlLoader extends YamlProcessor { return constructTrackedObject(node, super.constructObject(node)); } } + else if (node instanceof CollectionNode && ((CollectionNode) node).getValue().isEmpty()) { + return constructTrackedObject(node, super.constructObject(node)); + } else if (node instanceof MappingNode) { replaceMappingNodeKeys((MappingNode) node); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java index 4252c1ad226..279d727fa5d 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java @@ -17,6 +17,7 @@ package org.springframework.boot.env; import java.nio.charset.StandardCharsets; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -120,6 +121,14 @@ class OriginTrackedYamlLoaderTests { assertThat(getLocation(nullValue)).isEqualTo("28:13"); } + @Test + void processEmptyListAndMap() { + OriginTrackedValue emptymap = getValue("emptymap"); + OriginTrackedValue emptylist = getValue("emptylist"); + assertThat(emptymap.getValue()).isEqualTo(Collections.EMPTY_MAP); + assertThat(emptylist.getValue()).isEqualTo(Collections.EMPTY_LIST); + } + @Test void unsupportedType() throws Exception { String yaml = "value: !!java.net.URL [!!java.lang.String [!!java.lang.StringBuilder [\"http://localhost:9000/\"]]]"; diff --git a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-yaml.yml b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-yaml.yml index 1def7c53c44..044c8aef442 100644 --- a/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-yaml.yml +++ b/spring-boot-project/spring-boot/src/test/resources/org/springframework/boot/env/test-yaml.yml @@ -26,6 +26,8 @@ example: - bar2: bling empty: "" null-value: null +emptylist: [] +emptymap: {} --- spring: From bd2a252101c63569e6d7704e743c37fa01dfd269 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Mon, 21 Sep 2020 16:42:59 -0700 Subject: [PATCH 2/2] Polish 'Add origin support for empty YAML list and map' See gh-21704 --- .../springframework/boot/env/OriginTrackedYamlLoader.java | 8 ++++---- .../boot/env/OriginTrackedYamlLoaderTests.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java index ffa6558dc76..16861bac0bb 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java @@ -105,15 +105,15 @@ class OriginTrackedYamlLoader extends YamlProcessor { @Override protected Object constructObject(Node node) { + if (node instanceof CollectionNode && ((CollectionNode) node).getValue().isEmpty()) { + return constructTrackedObject(node, super.constructObject(node)); + } if (node instanceof ScalarNode) { if (!(node instanceof KeyScalarNode)) { return constructTrackedObject(node, super.constructObject(node)); } } - else if (node instanceof CollectionNode && ((CollectionNode) node).getValue().isEmpty()) { - return constructTrackedObject(node, super.constructObject(node)); - } - else if (node instanceof MappingNode) { + if (node instanceof MappingNode) { replaceMappingNodeKeys((MappingNode) node); } return super.constructObject(node); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java index 279d727fa5d..1c41a623e19 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java @@ -125,8 +125,8 @@ class OriginTrackedYamlLoaderTests { void processEmptyListAndMap() { OriginTrackedValue emptymap = getValue("emptymap"); OriginTrackedValue emptylist = getValue("emptylist"); - assertThat(emptymap.getValue()).isEqualTo(Collections.EMPTY_MAP); - assertThat(emptylist.getValue()).isEqualTo(Collections.EMPTY_LIST); + assertThat(emptymap.getValue()).isEqualTo(Collections.emptyMap()); + assertThat(emptylist.getValue()).isEqualTo(Collections.emptyList()); } @Test