Browse Source

Do not convert key nodes to originTrackedValue

Fixes gh-8540
pull/8593/head
Madhura Bhave 9 years ago
parent
commit
a47c251c5c
  1. 31
      spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java
  2. 16
      spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java
  3. 7
      spring-boot/src/test/resources/org/springframework/boot/env/test-yaml.yml

31
spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java vendored

@ -21,13 +21,16 @@ import java.util.List; @@ -21,13 +21,16 @@ import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.BaseConstructor;
import org.yaml.snakeyaml.constructor.Constructor;
import org.yaml.snakeyaml.error.Mark;
import org.yaml.snakeyaml.nodes.MappingNode;
import org.yaml.snakeyaml.nodes.Node;
import org.yaml.snakeyaml.nodes.NodeTuple;
import org.yaml.snakeyaml.nodes.ScalarNode;
import org.yaml.snakeyaml.nodes.Tag;
import org.yaml.snakeyaml.representer.Representer;
@ -92,7 +95,15 @@ class OriginTrackedYamlLoader extends YamlProcessor { @@ -92,7 +95,15 @@ class OriginTrackedYamlLoader extends YamlProcessor {
@Override
protected Object constructObject(Node node) {
if (node instanceof ScalarNode) {
return constructTrackedObject(node, super.constructObject(node));
if (!(node instanceof KeyScalarNode)) {
return constructTrackedObject(node, super.constructObject(node));
}
}
else if (node instanceof MappingNode) {
List<NodeTuple> value = ((MappingNode) node).getValue();
List<NodeTuple> updatedValues = value.stream().map(nt -> new NodeTuple(KeyScalarNode.get(nt.getKeyNode()),
nt.getValueNode())).collect(Collectors.toList());
((MappingNode) node).setValue(updatedValues);
}
return super.constructObject(node);
}
@ -111,6 +122,24 @@ class OriginTrackedYamlLoader extends YamlProcessor { @@ -111,6 +122,24 @@ class OriginTrackedYamlLoader extends YamlProcessor {
}
/**
* {@link ScalarNode} that replaces the key node in a {@link NodeTuple}.
*/
private static class KeyScalarNode extends ScalarNode {
KeyScalarNode(ScalarNode node) {
super(node.getTag(), node.getValue(), node.getStartMark(), node.getEndMark(), node.getStyle());
}
private static Node get(Node node) {
if (node instanceof ScalarNode) {
return new KeyScalarNode((ScalarNode) node);
}
return node;
}
}
/**
* {@link Resolver} that limits {@link Tag#TIMESTAMP} tags.
*/

16
spring-boot/src/test/java/org/springframework/boot/env/OriginTrackedYamlLoaderTests.java vendored

@ -96,6 +96,22 @@ public class OriginTrackedYamlLoaderTests { @@ -96,6 +96,22 @@ public class OriginTrackedYamlLoaderTests {
assertThat(result.get("name").toString()).isEqualTo("Test Name");
}
@Test
public void processListOfMaps() throws Exception {
OriginTrackedValue name = getValue("example.foo[0].name");
OriginTrackedValue url = getValue("example.foo[0].url");
OriginTrackedValue bar1 = getValue("example.foo[0].bar[0].bar1");
OriginTrackedValue bar2 = getValue("example.foo[0].bar[1].bar2");
assertThat(name.toString()).isEqualTo("springboot");
assertThat(getLocation(name)).isEqualTo("22:15");
assertThat(url.toString()).isEqualTo("http://springboot.com");
assertThat(getLocation(url)).isEqualTo("23:14");
assertThat(bar1.toString()).isEqualTo("baz");
assertThat(getLocation(bar1)).isEqualTo("25:19");
assertThat(bar2.toString()).isEqualTo("bling");
assertThat(getLocation(bar2)).isEqualTo("26:19");
}
private OriginTrackedValue getValue(String name) {
if (this.result == null) {
this.result = this.loader.load();

7
spring-boot/src/test/resources/org/springframework/boot/env/test-yaml.yml vendored

@ -17,6 +17,13 @@ education: | @@ -17,6 +17,13 @@ education: |
4 GCSEs
3 A-Levels
BSc in the Internet of Things
example:
foo:
- name: springboot
url: http://springboot.com
bar:
- bar1: baz
- bar2: bling
---
spring:

Loading…
Cancel
Save