diff --git a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java index 1ed254951..3b4e4290f 100644 --- a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java +++ b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/YamlSchemaProblems.java @@ -76,8 +76,12 @@ public class YamlSchemaProblems { return new ReconcileProblemImpl(SCHEMA_PROBLEM, msg, node.getStart(), node.getLength()); } + public static ReconcileProblem deprecatedProperty(String msg, Node node) { + return problem(DEPRECATED_PROPERTY, msg, node); + } + public static ReconcileProblem deprecatedProperty(Node node, YType bean, YTypedProperty property) { - return problem(DEPRECATED_PROPERTY, "Property '"+property.getName()+"' of '"+bean+"' is Deprecated", node); + return deprecatedProperty("Property '"+property.getName()+"' of '"+bean+"' is Deprecated", node); } public static ReconcileProblem problem(ProblemType problemType, String msg, Node node) { @@ -85,4 +89,5 @@ public class YamlSchemaProblems { int end = node.getEndMark().getIndex(); return new ReconcileProblemImpl(problemType, msg, start, end-start); } + } diff --git a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/constraints/Constraints.java b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/constraints/Constraints.java index b8a227e12..b719fabce 100644 --- a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/constraints/Constraints.java +++ b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/constraints/Constraints.java @@ -17,14 +17,19 @@ import static org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaPr import java.util.Arrays; import java.util.List; import java.util.Set; +import java.util.function.Function; import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector; import org.springframework.ide.vscode.commons.util.Assert; import org.springframework.ide.vscode.commons.yaml.ast.NodeUtil; +import org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaProblems; import org.springframework.ide.vscode.commons.yaml.schema.YType; import org.yaml.snakeyaml.nodes.MappingNode; +import org.yaml.snakeyaml.nodes.Node; import org.yaml.snakeyaml.nodes.NodeTuple; +import com.google.common.collect.ImmutableSet; + /** * Various static methods for constructing/composing {@link Constraint}s. * @@ -78,4 +83,17 @@ public class Constraints { } } } + + public static Constraint deprecated(Function messageFormatter, String... _deprecatedNames) { + Set deprecatedNames = ImmutableSet.copyOf(_deprecatedNames); + return (MappingNode map, YType type, Set foundProps, IProblemCollector problems) -> { + for (NodeTuple prop : map.getValue()) { + Node keyNode = prop.getKeyNode(); + String name = NodeUtil.asScalar(keyNode); + if (deprecatedNames.contains(name)) { + problems.accept(YamlSchemaProblems.deprecatedProperty(messageFormatter.apply(name), keyNode)); + } + } + }; + } } \ No newline at end of file diff --git a/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java b/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java index 22ba0d9f8..59b6f1b1f 100644 --- a/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java +++ b/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java @@ -222,8 +222,11 @@ public class PipelineYmlSchema implements YamlSchema { if (parentImageDef==null) { return Constraints.requireOneOf("image_resource", "image"); } else { - // TODO: something like this: return Constraints.deprecated("image_resource", "image"); - return null; + return Constraints.deprecated((name) -> + "Deprecated: This attribute in the task config will be ignored! "+ + "The 'image' attribute on the task itself takes precedence.", + "image_resource", "image" + ); } } else { return Constraints.requireAtMostOneOf("image_resource", "image"); diff --git a/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java b/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java index aa0229f6c..f90b96bad 100644 --- a/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java +++ b/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java @@ -2565,6 +2565,38 @@ public class ConcourseEditorTest { editor.assertProblems(/*NONE*/); } + @Test public void resourceInEmbeddedTaskConfigDeprecated() throws Exception { + Editor editor = harness.newEditor( + "resources:\n" + + "- name: docker-image\n" + + " type: docker-image\n" + + " source:\n" + + " username: {{docker_hub_username}}\n" + + " password: {{docker_hub_password}}\n" + + " repository: kdvolder/sts3-build-env\n" + + "jobs:\n" + + "- name: build-commons-update-site\n" + + " plan:\n" + + " - task: hello-world\n" + + " image: docker-image\n" + + " config:\n" + + " image: blah\n" + + " image_resource:\n" + + " type: docker-image\n" + + " inputs:\n" + + " - name: commons-git\n" + + " platform: linux\n" + + " run:\n" + + " path: which\n" + + " args:\n" + + " - mvn" + ); + editor.assertProblems( + "image|Deprecated", + "image_resource|Deprecated" + ); + } + @Ignore @Test public void relaxedIndentContextMoreSpaces() throws Exception { Editor editor;