Do not convert key nodes to originTrackedValue
Fixes gh-8540
This commit is contained in:
parent
703d403f7d
commit
a47c251c5c
|
|
@ -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 {
|
|||
@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 {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* {@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.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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…
Reference in New Issue