diff --git a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/path/YamlNavigable.java b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/path/YamlNavigable.java index 32d631786..c1c8359fd 100644 --- a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/path/YamlNavigable.java +++ b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/path/YamlNavigable.java @@ -28,6 +28,7 @@ public interface YamlNavigable { /** * Traversal which silently ignores ambiguity by picking the first valid target * returned by traverseAmbiguously. + * */ default T traverse(YamlPathSegment s) throws Exception { return traverseAmbiguously(s).findFirst().orElse(null); diff --git a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/path/YamlPath.java b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/path/YamlPath.java index 7567fb342..b4a7acd50 100644 --- a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/path/YamlPath.java +++ b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/path/YamlPath.java @@ -129,7 +129,9 @@ public class YamlPath { if (startNode!=null) { Stream result = Stream.of(startNode); for (YamlPathSegment s : segments) { - result = result.flatMap((node) -> node.traverseAmbiguously(s)); + result = result.flatMap((node) -> { + return node.traverseAmbiguously(s); + }); } return result; } diff --git a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/structure/YamlStructureParser.java b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/structure/YamlStructureParser.java index f050ba8a6..2c267ef58 100644 --- a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/structure/YamlStructureParser.java +++ b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/structure/YamlStructureParser.java @@ -21,6 +21,7 @@ import org.springframework.ide.vscode.commons.yaml.path.YamlNavigable; import org.springframework.ide.vscode.commons.yaml.path.YamlPath; import org.springframework.ide.vscode.commons.yaml.path.YamlPathSegment; import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureParser.SKeyNode; +import org.springframework.ide.vscode.commons.yaml.util.Streams; import org.springframework.ide.vscode.commons.yaml.util.YamlIndentUtil; import com.google.common.collect.ImmutableList; @@ -264,8 +265,17 @@ public class YamlStructureParser { * Default implementation, doesn't support any type of traversal operation. * Subclasses must override and implement where appropriate. */ - public SNode traverse(YamlPathSegment s) throws Exception { - return null; + public Stream traverseAmbiguously(YamlPathSegment s) { + return Stream.empty(); + } + + /** + * Default implementation, actusllu the same as the default impl provided by + * the interface. This is only here to prevent subclasses from implementing + * this. They should implement traverseAmbiguously instead. + */ + public SNode traverse(YamlPathSegment s) { + return traverseAmbiguously(s).findFirst().orElse(null); } protected abstract void dump(Writer out, int indent) throws Exception; @@ -350,15 +360,15 @@ public class YamlStructureParser { } @Override - public SNode traverse(YamlPathSegment s) throws Exception { + public Stream traverseAmbiguously(YamlPathSegment s) { Integer index = s.toIndex(); if (index!=null) { List cs = getChildren(); if (index>=0 && index=0) { List children = getChildren(); diff --git a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/util/Streams.java b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/util/Streams.java new file mode 100644 index 000000000..5aa23e032 --- /dev/null +++ b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/util/Streams.java @@ -0,0 +1,14 @@ +package org.springframework.ide.vscode.commons.yaml.util; + +import java.util.stream.Stream; + +public class Streams { + + /** + * Like Stream.of but returns Stream.empty of the element is null + */ + public static Stream of(T e) { + return e==null ? Stream.empty() : Stream.of(e); + } + +}