diff --git a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/models/BoshCommandBasedModelProvider.java b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/models/BoshCommandBasedModelProvider.java index aa5db3140..ffb80ada8 100644 --- a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/models/BoshCommandBasedModelProvider.java +++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/models/BoshCommandBasedModelProvider.java @@ -56,7 +56,7 @@ public abstract class BoshCommandBasedModelProvider implements DynamicModelPr this.config = config; Representer representer = new Representer(); representer.getPropertyUtils().setSkipMissingProperties(true); - yamlParser = new YamlParser(new Yaml()); + yamlParser = new YamlParser(); } /** diff --git a/headless-services/commons/commons-language-server/.factorypath b/headless-services/commons/commons-language-server/.factorypath index d255d7a03..e911c6f53 100644 --- a/headless-services/commons/commons-language-server/.factorypath +++ b/headless-services/commons/commons-language-server/.factorypath @@ -1,11 +1,11 @@ - - - - - - - + + + + + + + @@ -22,9 +22,9 @@ - + - + diff --git a/headless-services/commons/commons-maven/.factorypath b/headless-services/commons/commons-maven/.factorypath index 2b62485e2..12ca87d9e 100644 --- a/headless-services/commons/commons-maven/.factorypath +++ b/headless-services/commons/commons-maven/.factorypath @@ -25,7 +25,7 @@ - + @@ -37,10 +37,10 @@ - + - + @@ -49,16 +49,16 @@ - - - - - - - + + + + + + + - + diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlAstCache.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlAstCache.java index 18162cca0..c60865e62 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlAstCache.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlAstCache.java @@ -12,7 +12,6 @@ package org.springframework.ide.vscode.commons.yaml.ast; import org.springframework.ide.vscode.commons.util.text.IDocument; import org.springframework.ide.vscode.commons.yaml.util.StaleFallbackCache; -import org.yaml.snakeyaml.Yaml; public class YamlAstCache { @@ -20,8 +19,7 @@ public class YamlAstCache { private final YamlParser parser; public YamlAstCache() { - Yaml yaml = new Yaml(); - this.parser = new YamlParser(yaml); + this.parser = new YamlParser(); } public YamlASTProvider getAstProvider(boolean allowStaleAsts) { diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlFileAST.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlFileAST.java index f8f29d910..27095e559 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlFileAST.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlFileAST.java @@ -16,6 +16,7 @@ import static org.springframework.ide.vscode.commons.yaml.ast.NodeUtil.contains; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import org.springframework.ide.vscode.commons.util.Collector; import org.springframework.ide.vscode.commons.util.IRequestor; @@ -27,6 +28,7 @@ import org.springframework.ide.vscode.commons.yaml.ast.NodeRef.TupleKeyRef; import org.springframework.ide.vscode.commons.yaml.ast.NodeRef.TupleValueRef; import org.yaml.snakeyaml.nodes.MappingNode; import org.yaml.snakeyaml.nodes.Node; +import org.yaml.snakeyaml.nodes.NodeTuple; import org.yaml.snakeyaml.nodes.SequenceNode; /** @@ -38,14 +40,13 @@ public class YamlFileAST { private static final List> NO_CHILDREN = Collections.emptyList(); private final List nodes; + private final Set anchoredNodes; private final IDocument doc; - public YamlFileAST(IDocument doc, Iterable iter) { + public YamlFileAST(IDocument doc, List nodes, Set anchoredNodes) { this.doc = doc; - nodes = new ArrayList(); - for (Node node : iter) { - nodes.add(node); - } + this.nodes = nodes; + this.anchoredNodes = anchoredNodes; } public List> findPath(int offset) { @@ -159,5 +160,21 @@ public class YamlFileAST { return doc; } - + /** + * Detects whether a given map key-value pair is anchored. I.e. corresponds to + * a bit of yaml like this example: + * + *
+	 * some-key: &some-anchor
+	 *   blah: blah
+	 *   more: blah
+	 * 
+ */ + public boolean isAnchored(NodeTuple entry) { + if (entry!=null) { + Node v = entry.getValueNode(); + return v!=null && anchoredNodes.contains(v); + } + return false; + } } diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlParser.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlParser.java index 13699d32c..1fec1ae7e 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlParser.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/ast/YamlParser.java @@ -11,24 +11,61 @@ package org.springframework.ide.vscode.commons.yaml.ast; +import java.io.Reader; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.function.BiConsumer; + import org.springframework.ide.vscode.commons.util.text.IDocument; -import org.yaml.snakeyaml.Yaml; +import org.springframework.ide.vscode.commons.yaml.util.AnchorTrackingComposer; +import org.yaml.snakeyaml.composer.Composer; +import org.yaml.snakeyaml.nodes.Node; +import org.yaml.snakeyaml.parser.ParserImpl; +import org.yaml.snakeyaml.reader.StreamReader; +import org.yaml.snakeyaml.resolver.Resolver; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import javolution.io.CharSequenceReader; public class YamlParser implements YamlASTProvider { - private Yaml yaml; - - public YamlParser(Yaml yaml) { - this.yaml = yaml; + public YamlParser() { } @Override public YamlFileAST getAST(IDocument doc) throws Exception { CharSequenceReader reader = new CharSequenceReader(); reader.setInput(doc.get()); - return new YamlFileAST(doc, yaml.composeAll(reader)); + ImmutableSet.Builder anchoredNodes = ImmutableSet.builder(); + ImmutableList nodes = composeAll(reader, (a, n) -> anchoredNodes.add(n)); + return new YamlFileAST(doc, nodes, anchoredNodes.build()); } + private ImmutableList composeAll(Reader yaml, BiConsumer anchorListener) { + Resolver resolver = new Resolver(); + AnchorTrackingComposer composer = new AnchorTrackingComposer(new ParserImpl(new StreamReader(yaml)), resolver, anchorListener); + ImmutableList.Builder nodes = ImmutableList.builder(); + while (composer.checkNode()) { + nodes.add(composer.getNode()); + } + return nodes.build(); + } + + private static class NodeIterable implements Iterable { + private Iterator iterator; + + public NodeIterable(Iterator iterator) { + this.iterator = iterator; + } + + @Override + public Iterator iterator() { + return iterator; + } + } + + } diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/SchemaBasedYamlASTReconciler.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/SchemaBasedYamlASTReconciler.java index 74e394681..06be98b6e 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/SchemaBasedYamlASTReconciler.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/SchemaBasedYamlASTReconciler.java @@ -56,6 +56,7 @@ import org.springframework.ide.vscode.commons.yaml.schema.YamlSchema; import org.springframework.ide.vscode.commons.yaml.schema.constraints.Constraint; import org.springframework.ide.vscode.commons.yaml.snippet.SchemaBasedSnippetGenerator; import org.springframework.ide.vscode.commons.yaml.snippet.Snippet; +import org.yaml.snakeyaml.DumperOptions.FlowStyle; import org.yaml.snakeyaml.nodes.MappingNode; import org.yaml.snakeyaml.nodes.Node; import org.yaml.snakeyaml.nodes.NodeId; @@ -170,7 +171,7 @@ public class SchemaBasedYamlASTReconciler implements YamlASTReconciler { } else { YTypedProperty prop = beanProperties.get(key); if (prop==null) { - if (!isAnchored(entry)) { + if (!ast.isAnchored(entry)) { unknownBeanProperty(keyNode, type, key); } } else { @@ -228,28 +229,6 @@ public class SchemaBasedYamlASTReconciler implements YamlASTReconciler { } } - /** - * Detects whether a given map key-value pair is anchored. I.e. corresponds to - * a bit of yaml like this example: - * - *
-	 * some-key: &some-anchor
-	 *   blah: blah
-	 *   more: blah
-	 * 
- * - * @param entry - * @return - */ - private boolean isAnchored(NodeTuple entry) { - if (entry!=null) { - Node v = entry.getValueNode(); - String a = v.getAnchor(); - return a!=null; - } - return false; - } - private void parse(YamlFileAST ast, Node node, YType type, ValueParser parser) { try { String value = NodeUtil.asScalar(node); @@ -396,7 +375,7 @@ public class SchemaBasedYamlASTReconciler implements YamlASTReconciler { private Node debrace(Node _node) { MappingNode node = NodeUtil.asMapping(_node); - if (node!=null && node.getFlowStyle() && node.getValue().size()==1) { + if (node!=null && node.getFlowStyle()==FlowStyle.FLOW && node.getValue().size()==1) { NodeTuple entry = node.getValue().get(0); if ("".equals(NodeUtil.asScalar(entry.getValueNode()))) { return entry.getKeyNode(); diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java index 17f8c5cb5..6af6af3bd 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java @@ -110,7 +110,7 @@ public class YamlSchemaProblems { } } } else if (parent instanceof SequenceNode) { - Boolean flowStyle = ((SequenceNode) parent).getFlowStyle(); + Boolean flowStyle = ((SequenceNode) parent).getFlowStyle().getStyleBoolean(); if (flowStyle!=null && !flowStyle) { Mark nodeStart = map.getStartMark(); underline = new DocumentRegion(doc, 0, nodeStart.getIndex()); diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/util/AnchorTrackingComposer.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/util/AnchorTrackingComposer.java new file mode 100644 index 000000000..87050518a --- /dev/null +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/util/AnchorTrackingComposer.java @@ -0,0 +1,233 @@ +package org.springframework.ide.vscode.commons.yaml.util; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiConsumer; + +import org.yaml.snakeyaml.events.AliasEvent; +import org.yaml.snakeyaml.events.Event; +import org.yaml.snakeyaml.events.MappingStartEvent; +import org.yaml.snakeyaml.events.NodeEvent; +import org.yaml.snakeyaml.events.ScalarEvent; +import org.yaml.snakeyaml.events.SequenceStartEvent; +import org.yaml.snakeyaml.nodes.MappingNode; +import org.yaml.snakeyaml.nodes.Node; +import org.yaml.snakeyaml.nodes.NodeId; +import org.yaml.snakeyaml.nodes.NodeTuple; +import org.yaml.snakeyaml.nodes.ScalarNode; +import org.yaml.snakeyaml.nodes.SequenceNode; +import org.yaml.snakeyaml.nodes.Tag; +import org.yaml.snakeyaml.parser.Parser; +import org.yaml.snakeyaml.resolver.Resolver; + +/** + * Creates a node graph from parser events. + *

+ * Corresponds to the 'Compose' step as described in chapter 3.1 of the + * YAML Specification. + *

+ */ +public class AnchorTrackingComposer { + protected final Parser parser; + private final Resolver resolver; + private final Map _anchors; + private final Set recursiveNodes; + private BiConsumer anchorListener; + + public AnchorTrackingComposer(Parser parser, Resolver resolver, BiConsumer anchorListener) { + this.parser = parser; + this.resolver = resolver; + this._anchors = new HashMap(); + this.recursiveNodes = new HashSet(); + this.anchorListener = anchorListener; + } + + /** + * Checks if further documents are available. + * + * @return true if there is at least one more document. + */ + public boolean checkNode() { + // Drop the STREAM-START event. + if (parser.checkEvent(Event.ID.StreamStart)) { + parser.getEvent(); + } + // If there are more documents available? + return !parser.checkEvent(Event.ID.StreamEnd); + } + + /** + * Reads and composes the next document. + * + * @return The root node of the document or null if no more + * documents are available. + */ + public Node getNode() { + // Drop the DOCUMENT-START event. + parser.getEvent(); + // Compose the root node. + Node node = composeNode(null); + // Drop the DOCUMENT-END event. + parser.getEvent(); + this._anchors.clear(); + recursiveNodes.clear(); + return node; + } + + /** + * Reads a document from a source that contains only one document. + *

+ * If the stream contains more than one document an exception is thrown. + *

+ * + * @return The root node of the document or null if no document + * is available. + */ + public Node getSingleNode() { + // Drop the STREAM-START event. + parser.getEvent(); + // Compose a document if the stream is not empty. + Node document = null; + if (!parser.checkEvent(Event.ID.StreamEnd)) { + document = getNode(); + } + // Ensure that the stream contains no more documents. + if (!parser.checkEvent(Event.ID.StreamEnd)) { + Event event = parser.getEvent(); + throw new ComposerException("expected a single document in the stream", + document.getStartMark(), "but found another document", event.getStartMark()); + } + // Drop the STREAM-END event. + parser.getEvent(); + return document; + } + + private Node composeNode(Node parent) { + if (parent != null) recursiveNodes.add(parent); + final Node node; + if (parser.checkEvent(Event.ID.Alias)) { + AliasEvent event = (AliasEvent) parser.getEvent(); + String anchor = event.getAnchor(); + if (!_anchors.containsKey(anchor)) { + throw new ComposerException(null, null, "found undefined alias " + anchor, + event.getStartMark()); + } + node = _anchors.get(anchor); + if (recursiveNodes.remove(node)) { + node.setTwoStepsConstruction(true); + } + } else { + NodeEvent event = (NodeEvent) parser.peekEvent(); + String anchor = event.getAnchor(); + // the check for duplicate anchors has been removed (issue 174) + if (parser.checkEvent(Event.ID.Scalar)) { + node = composeScalarNode(anchor); + } else if (parser.checkEvent(Event.ID.SequenceStart)) { + node = composeSequenceNode(anchor); + } else { + node = composeMappingNode(anchor); + } + } + recursiveNodes.remove(parent); + return node; + } + + protected Node composeScalarNode(String anchor) { + ScalarEvent ev = (ScalarEvent) parser.getEvent(); + String tag = ev.getTag(); + boolean resolved = false; + Tag nodeTag; + if (tag == null || tag.equals("!")) { + nodeTag = resolver.resolve(NodeId.scalar, ev.getValue(), + ev.getImplicit().canOmitTagInPlainScalar()); + resolved = true; + } else { + nodeTag = new Tag(tag); + } + Node node = new ScalarNode(nodeTag, resolved, ev.getValue(), ev.getStartMark(), + ev.getEndMark(), ev.getScalarStyle()); + if (anchor != null) { + anchors_put(anchor, node); + } + return node; + } + + protected void anchors_put(String anchor, Node node) { + _anchors.put(anchor, node); + if (anchorListener!=null) { + anchorListener.accept(anchor, node); + } + } + + protected Node composeSequenceNode(String anchor) { + SequenceStartEvent startEvent = (SequenceStartEvent) parser.getEvent(); + String tag = startEvent.getTag(); + Tag nodeTag; + boolean resolved = false; + if (tag == null || tag.equals("!")) { + nodeTag = resolver.resolve(NodeId.sequence, null, startEvent.getImplicit()); + resolved = true; + } else { + nodeTag = new Tag(tag); + } + final ArrayList children = new ArrayList(); + SequenceNode node = new SequenceNode(nodeTag, resolved, children, startEvent.getStartMark(), + null, startEvent.getFlowStyle()); + if (anchor != null) { + anchors_put(anchor, node); + } + while (!parser.checkEvent(Event.ID.SequenceEnd)) { + children.add(composeNode(node)); + } + Event endEvent = parser.getEvent(); + node.setEndMark(endEvent.getEndMark()); + return node; + } + + protected Node composeMappingNode(String anchor) { + MappingStartEvent startEvent = (MappingStartEvent) parser.getEvent(); + String tag = startEvent.getTag(); + Tag nodeTag; + boolean resolved = false; + if (tag == null || tag.equals("!")) { + nodeTag = resolver.resolve(NodeId.mapping, null, startEvent.getImplicit()); + resolved = true; + } else { + nodeTag = new Tag(tag); + } + + final List children = new ArrayList(); + MappingNode node = new MappingNode(nodeTag, resolved, children, startEvent.getStartMark(), + null, startEvent.getFlowStyle()); + if (anchor != null) { + anchors_put(anchor, node); + } + while (!parser.checkEvent(Event.ID.MappingEnd)) { + composeMappingChildren(children, node); + } + Event endEvent = parser.getEvent(); + node.setEndMark(endEvent.getEndMark()); + return node; + } + + protected void composeMappingChildren(List children, MappingNode node) { + Node itemKey = composeKeyNode(node); + if (itemKey.getTag().equals(Tag.MERGE)) { + node.setMerged(true); + } + Node itemValue = composeValueNode(node); + children.add(new NodeTuple(itemKey, itemValue)); + } + + protected Node composeKeyNode(MappingNode node) { + return composeNode(node); + } + + protected Node composeValueNode(MappingNode node) { + return composeNode(node); + } +} diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/util/ComposerException.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/util/ComposerException.java new file mode 100644 index 000000000..1e3fd9c50 --- /dev/null +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/util/ComposerException.java @@ -0,0 +1,11 @@ +package org.springframework.ide.vscode.commons.yaml.util; + +import org.yaml.snakeyaml.error.Mark; +import org.yaml.snakeyaml.error.MarkedYAMLException; + +public class ComposerException extends org.yaml.snakeyaml.composer.ComposerException { + + protected ComposerException(String context, Mark contextMark, String problem, Mark problemMark) { + super(context, contextMark, problem, problemMark); + } +} diff --git a/headless-services/commons/commons-yaml/src/test/java/org/springframework/ide/vscode/yaml/structure/MockYamlEditor.java b/headless-services/commons/commons-yaml/src/test/java/org/springframework/ide/vscode/yaml/structure/MockYamlEditor.java index bdef87d88..c19ec2396 100644 --- a/headless-services/commons/commons-yaml/src/test/java/org/springframework/ide/vscode/yaml/structure/MockYamlEditor.java +++ b/headless-services/commons/commons-yaml/src/test/java/org/springframework/ide/vscode/yaml/structure/MockYamlEditor.java @@ -32,15 +32,13 @@ import org.yaml.snakeyaml.nodes.Node; */ class MockYamlEditor { - private Yaml yaml; private YamlASTProvider parser; private String text; public MockYamlEditor(String string) throws Exception { this.text = string; - this.yaml = new Yaml(); - this.parser = new YamlParser(yaml); + this.parser = new YamlParser(); } @Override diff --git a/headless-services/commons/pom.xml b/headless-services/commons/pom.xml index 815f3d0d1..b7f360bc3 100644 --- a/headless-services/commons/pom.xml +++ b/headless-services/commons/pom.xml @@ -1,4 +1,5 @@ - 4.0.0 @@ -12,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.5.RELEASE + 2.2.0.BUILD-SNAPSHOT @@ -78,6 +79,17 @@ + + + spring-snapshots + https://repo.spring.io/snapshot + + + spring-milestones + https://repo.spring.io/milestone + + + UTF-8 4.12 @@ -91,7 +103,7 @@ 3.2.7 3.8.0.RELEASE - 3.1.5.RELEASE + 3.1.5.RELEASE 0.7.5.RELEASE 2.4 1.11 @@ -118,11 +130,8 @@ slf4j-api ${slf4j-version} - + junit junit diff --git a/headless-services/concourse-language-server/.factorypath b/headless-services/concourse-language-server/.factorypath index 932d1d0fb..2e54bffdf 100644 --- a/headless-services/concourse-language-server/.factorypath +++ b/headless-services/concourse-language-server/.factorypath @@ -1,26 +1,26 @@ - - - - - + + + + + - - + + - - - - - - - - - + + + + + + + + + - + @@ -29,26 +29,26 @@ - - + + - + - + - - + + - - - + + + diff --git a/headless-services/concourse-language-server/.settings/org.eclipse.jdt.core.prefs b/headless-services/concourse-language-server/.settings/org.eclipse.jdt.core.prefs index 21227d99a..0d1620121 100644 --- a/headless-services/concourse-language-server/.settings/org.eclipse.jdt.core.prefs +++ b/headless-services/concourse-language-server/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,5 @@ eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.methodParameters=generate org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning diff --git a/headless-services/manifest-yaml-language-server/.settings/org.eclipse.jdt.core.prefs b/headless-services/manifest-yaml-language-server/.settings/org.eclipse.jdt.core.prefs index 5592a0a1c..fd024d37f 100644 --- a/headless-services/manifest-yaml-language-server/.settings/org.eclipse.jdt.core.prefs +++ b/headless-services/manifest-yaml-language-server/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,5 @@ eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.methodParameters=generate org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning diff --git a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerInitializer.java b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerInitializer.java index 50c9635ce..361360246 100644 --- a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerInitializer.java +++ b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerInitializer.java @@ -52,7 +52,6 @@ import org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaBasedReco import org.springframework.ide.vscode.commons.yaml.schema.YValueHint; import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureProvider; import org.springframework.stereotype.Component; -import org.yaml.snakeyaml.Yaml; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -60,7 +59,6 @@ import com.google.common.collect.ImmutableSet; @Component public class ManifestYamlLanguageServerInitializer implements InitializingBean { - private Yaml yaml = new Yaml(); private CfJson cfJson = new CfJson(); private ManifestYmlSchema schema; private CFTargetCache cfTargetCache; @@ -79,7 +77,7 @@ public class ManifestYamlLanguageServerInitializer implements InitializingBean { SimpleTextDocumentService documents = server.getTextDocumentService(); SimpleWorkspaceService workspace = server.getWorkspaceService(); - YamlASTProvider parser = new YamlParser(yaml); + YamlASTProvider parser = new YamlParser(); schema = new ManifestYmlSchema(getHintProviders()); diff --git a/headless-services/spring-boot-language-server/.factorypath b/headless-services/spring-boot-language-server/.factorypath index 9df450552..6ca460b1c 100644 --- a/headless-services/spring-boot-language-server/.factorypath +++ b/headless-services/spring-boot-language-server/.factorypath @@ -1,14 +1,14 @@ - - - + + + - - + + - + @@ -42,7 +42,7 @@ - + @@ -52,22 +52,22 @@ - + - + - - - - - - + + + + + + - + @@ -93,8 +93,8 @@ - - + + diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguagServerBootApp.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguagServerBootApp.java index 69fb1385f..887953774 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguagServerBootApp.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguagServerBootApp.java @@ -143,11 +143,12 @@ public class BootLanguagServerBootApp { } @Bean Yaml yaml() { + //TODO: Yaml is not re-entrant. So its a bit fishy to create a 're-usable' bean for this! return new Yaml(); } - @Bean YamlASTProvider yamlAstProvider(Yaml yaml) { - return new YamlParser(yaml); + @Bean YamlASTProvider yamlAstProvider() { + return new YamlParser(); } @Bean YamlStructureProvider yamlStructureProvider() { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLsConfigProperties.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLsConfigProperties.java index 5a1011bbf..341d59205 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLsConfigProperties.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLsConfigProperties.java @@ -11,9 +11,7 @@ package org.springframework.ide.vscode.boot.app; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; -@Component @ConfigurationProperties("languageserver.boot") public class BootLsConfigProperties { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/value/ValuePropertyReferencesProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/value/ValuePropertyReferencesProvider.java index 3bba88629..f25be8d7c 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/value/ValuePropertyReferencesProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/value/ValuePropertyReferencesProvider.java @@ -167,8 +167,7 @@ public class ValuePropertyReferencesProvider implements ReferenceProvider { try { String fileContent = FileUtils.readFileToString(new File(filePath)); - Yaml yaml = new Yaml(); - YamlASTProvider parser = new YamlParser(yaml); + YamlASTProvider parser = new YamlParser(); URI docURI = Paths.get(filePath).toUri(); TextDocument doc = new TextDocument(docURI.toString(), null); diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/CompilationUnitCacheTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/CompilationUnitCacheTest.java index 2e86c5788..aae0d6010 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/CompilationUnitCacheTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/CompilationUnitCacheTest.java @@ -59,6 +59,7 @@ import org.springframework.test.context.junit4.SpringRunner; */ @RunWith(SpringRunner.class) @BootLanguageServerTest +@Import({AdHocPropertyHarnessTestConf.class, CompilationUnitCacheTest.TestConf.class}) public class CompilationUnitCacheTest { ProjectsHarness projects = ProjectsHarness.INSTANCE; @@ -72,7 +73,6 @@ public class CompilationUnitCacheTest { @Autowired private MockProjectObserver projectObserver; - @Import(AdHocPropertyHarnessTestConf.class) @Configuration static class TestConf { @Bean SymbolCache symbolCache() { diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java index bbd82f720..3db81d3de 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java @@ -63,6 +63,7 @@ import org.springframework.test.context.junit4.SpringRunner; */ @RunWith(SpringRunner.class) @BootLanguageServerTest +@Import({AdHocPropertyHarnessTestConf.class, ValueCompletionTest.TestConf.class}) public class ValueCompletionTest { @Autowired private BootLanguageServerHarness harness; @@ -75,7 +76,6 @@ public class ValueCompletionTest { @Autowired private AdHocPropertyHarness adHocProperties; @Configuration - @Import(AdHocPropertyHarnessTestConf.class) static class TestConf { //Somewhat strange test setup, test provides a specific test project. diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java index 6a4840e44..0c6d3dd9e 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java @@ -56,7 +56,7 @@ import com.google.common.io.Files; */ @RunWith(SpringRunner.class) @BootLanguageServerTest -@Import(PropertyEditorTestConf.class) +@Import({PropertyEditorTestConf.class,ApplicationPropertiesEditorTest.TestConf.class}) public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest { @Autowired DefinitionLinkAsserts definitionLinkAsserts; diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java index edc095020..b22b43d07 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java @@ -26,6 +26,7 @@ import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -53,13 +54,13 @@ import org.springframework.test.context.junit4.SpringRunner; */ @RunWith(SpringRunner.class) @BootLanguageServerTest -@Import(PropertyEditorTestConf.class) +@Import({PropertyEditorTestConf.class, ApplicationYamlEditorTest.TestConf.class}) public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { @Autowired private DefinitionLinkAsserts definitionLinkAsserts; - @Configuration static class TestConf { + @Configuration public static class TestConf { @Bean LanguageId defaultLanguageId() { return LanguageId.BOOT_PROPERTIES_YAML; }