This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new af34d38b8735 CAMEL-22931: camel-jbang - command for yaml dsl validator
af34d38b8735 is described below
commit af34d38b8735d26eef1b3b27bfbc65e53652c8b4
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Feb 11 15:48:39 2026 +0100
CAMEL-22931: camel-jbang - command for yaml dsl validator
---
.../modules/ROOT/pages/camel-jbang.adoc | 37 +++++++
.../camel/dsl/jbang/core/common/PluginType.java | 3 +-
.../jbang/core/commands/plugin/PluginGetTest.java | 8 +-
.../camel-jbang-plugin-route-parser/pom.xml | 2 +-
.../pom.xml | 15 +--
.../camel-jbang-plugin/camel-jbang-plugin-validate | 2 +
.../core/commands/validate/ValidateCommand.java | 37 +++++++
.../core/commands/validate/ValidatePlugin.java | 35 ++++++
.../commands/validate/YamlValidateCommand.java | 123 +++++++++++++++++++++
dsl/camel-jbang/pom.xml | 1 +
.../camel/dsl/yaml/validator/ValidateMojo.java | 15 +--
.../camel/dsl/yaml/validator/YamlValidator.java | 42 +++----
12 files changed, 272 insertions(+), 48 deletions(-)
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
index 7c2a0579bb4b..bfdf1e2fdb04 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
@@ -4348,6 +4348,43 @@ are downloaded to your local Maven repository `~/.m2`.
So if you find problems with running Camel JBang using what is seems like an
outdated JAR, then you can
try to delete these directories or parts of it.
+== Validate Plugin
+
+*Available as of Camel 4.18*
+
+You can add the *validate* plugin to camel-jbang which makes it easy to
quickly validate your Camel source code, such as YAML DSL
+files if they can be parsed and are valid according to the YAML DSL spec.
+
+First install the validate plugin
+
+[source,bash]
+----
+$ camel plugin add validate
+----
+
+Then you can use this plugin to validate source files such as:
+
+[source,bash]
+----
+$ camel validate yaml cheese.yaml bad.yaml
+Validation error detected (errors:1)
+
+ File: bad.yaml
+ /0/from: required property 'steps' not found
+----
+
+Here you can see we validated 2 files (cheese.yaml and bad.yaml) and there was
a validation error in bad.yaml as show above.
+
+If all files are valid then the command report success:
+
+
+[source,bash]
+----
+$ camel validate yaml cheese.yaml bad.yaml
+Validation success (files:2)
+----
+
+
== Infrastructure
Camel JBang `infra` command can be used to `list`, `run` and `stop` external
services that can be used for fast prototyping and testing.
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/PluginType.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/PluginType.java
index 5c952404d3b0..cde0536e1541 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/PluginType.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/PluginType.java
@@ -28,7 +28,8 @@ public enum PluginType {
GENERATE("generate", "generate", "Generate code such as DTOs", "4.8.0",
null),
EDIT("edit", "edit", "Edit Camel files with suggestions", "4.12.0", null),
TEST("test", "test", "Manage tests for Camel applications", "4.14.0",
null),
- ROUTE_PARSER("route-parser", "route-parser", "Parses Java route and dumps
route structure", "4.17.0", null);
+ ROUTE_PARSER("route-parser", "route-parser", "Parses Java route and dumps
route structure", "4.17.0", null),
+ VALIDATE("validate", "validate", "Validate Camel routes", "4.18.0", null);
private final String name;
private final String command;
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginGetTest.java
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginGetTest.java
index 887c0af4a879..0bc0f68be52c 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginGetTest.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginGetTest.java
@@ -70,7 +70,7 @@ class PluginGetTest extends CamelCommandBaseTestSupport {
command.doCall();
List<String> output = printer.getLines();
- Assertions.assertEquals(8, output.size());
+ Assertions.assertEquals(9, output.size());
Assertions.assertEquals("Supported plugins:", output.get(0));
Assertions.assertEquals("NAME COMMAND DEPENDENCY
DESCRIPTION",
output.get(2));
@@ -120,7 +120,7 @@ class PluginGetTest extends CamelCommandBaseTestSupport {
command.doCall();
List<String> output = printer.getLines();
- Assertions.assertEquals(11, output.size());
+ Assertions.assertEquals(12, output.size());
Assertions.assertEquals("NAME COMMAND DEPENDENCY
DESCRIPTION", output.get(0));
Assertions.assertEquals(
"foo-plugin foo org.apache.camel:foo-plugin:1.0.0
Plugin foo-plugin called with command foo",
@@ -149,6 +149,10 @@ class PluginGetTest extends CamelCommandBaseTestSupport {
"route-parser route-parser
org.apache.camel:camel-jbang-plugin-route-parser %s"
.formatted(PluginType.ROUTE_PARSER.getDescription()),
output.get(10));
+ Assertions.assertEquals(
+ "validate validate
org.apache.camel:camel-jbang-plugin-validate %s"
+ .formatted(PluginType.VALIDATE.getDescription()),
+ output.get(11));
}
}
diff --git a/dsl/camel-jbang/camel-jbang-plugin-route-parser/pom.xml
b/dsl/camel-jbang/camel-jbang-plugin-route-parser/pom.xml
index 29ebec91a61e..451dde9b96ea 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-route-parser/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-plugin-route-parser/pom.xml
@@ -31,7 +31,7 @@
<artifactId>camel-jbang-plugin-route-parser</artifactId>
<name>Camel :: JBang :: Plugin :: Route Parser</name>
- <description>Camel JBang Edit Route Parser</description>
+ <description>Camel JBang Route Parser</description>
<properties>
<firstVersion>4.17.0</firstVersion>
diff --git a/dsl/camel-jbang/camel-jbang-plugin-route-parser/pom.xml
b/dsl/camel-jbang/camel-jbang-plugin-validate/pom.xml
similarity index 78%
copy from dsl/camel-jbang/camel-jbang-plugin-route-parser/pom.xml
copy to dsl/camel-jbang/camel-jbang-plugin-validate/pom.xml
index 29ebec91a61e..4c31f5589cb1 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-route-parser/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-plugin-validate/pom.xml
@@ -28,13 +28,13 @@
<relativePath>../pom.xml</relativePath>
</parent>
- <artifactId>camel-jbang-plugin-route-parser</artifactId>
+ <artifactId>camel-jbang-plugin-validate</artifactId>
- <name>Camel :: JBang :: Plugin :: Route Parser</name>
- <description>Camel JBang Edit Route Parser</description>
+ <name>Camel :: JBang :: Plugin :: Validate</name>
+ <description>Camel JBang Route Validator</description>
<properties>
- <firstVersion>4.17.0</firstVersion>
+ <firstVersion>4.18.0</firstVersion>
<label>jbang</label>
<supportLevel>Preview</supportLevel>
<camel-prepare-component>false</camel-prepare-component>
@@ -47,12 +47,7 @@
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
- <artifactId>camel-route-parser</artifactId>
- </dependency>
- <dependency>
- <groupId>org.jboss.forge.roaster</groupId>
- <artifactId>roaster-jdt</artifactId>
- <version>${roaster-version}</version>
+ <artifactId>camel-yaml-dsl-validator</artifactId>
</dependency>
</dependencies>
</project>
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-validate/src/generated/resources/META-INF/services/org/apache/camel/camel-jbang-plugin/camel-jbang-plugin-validate
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/generated/resources/META-INF/services/org/apache/camel/camel-jbang-plugin/camel-jbang-plugin-validate
new file mode 100644
index 000000000000..e03314ead693
--- /dev/null
+++
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/generated/resources/META-INF/services/org/apache/camel/camel-jbang-plugin/camel-jbang-plugin-validate
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.dsl.jbang.core.commands.validate.ValidatePlugin
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/ValidateCommand.java
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/ValidateCommand.java
new file mode 100644
index 000000000000..045b4e2fc0d0
--- /dev/null
+++
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/ValidateCommand.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dsl.jbang.core.commands.validate;
+
+import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
+import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import picocli.CommandLine;
+
[email protected](name = "validate",
+ description = "Validate Camel source code (use validate
--help to see sub commands)")
+public class ValidateCommand extends CamelCommand {
+
+ public ValidateCommand(CamelJBangMain main) {
+ super(main);
+ }
+
+ @Override
+ public Integer doCall() throws Exception {
+ // defaults to printing the help message
+ new CommandLine(new CommandLine.HelpCommand()).execute();
+ return 0;
+ }
+}
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/ValidatePlugin.java
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/ValidatePlugin.java
new file mode 100644
index 000000000000..e8e1915b098c
--- /dev/null
+++
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/ValidatePlugin.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dsl.jbang.core.commands.validate;
+
+import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.dsl.jbang.core.common.CamelJBangPlugin;
+import org.apache.camel.dsl.jbang.core.common.Plugin;
+import picocli.CommandLine;
+
+@CamelJBangPlugin(name = "camel-jbang-plugin-validate", firstVersion =
"4.18.0")
+public class ValidatePlugin implements Plugin {
+
+ @Override
+ public void customize(CommandLine commandLine, CamelJBangMain main) {
+ var cmd = new CommandLine(new ValidateCommand(main))
+ .addSubcommand("yaml", new CommandLine(new
YamlValidateCommand(main)));
+
+ commandLine.addSubcommand("validate", cmd);
+ }
+
+}
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlValidateCommand.java
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlValidateCommand.java
new file mode 100644
index 000000000000..aff68433c32e
--- /dev/null
+++
b/dsl/camel-jbang/camel-jbang-plugin-validate/src/main/java/org/apache/camel/dsl/jbang/core/commands/validate/YamlValidateCommand.java
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dsl.jbang.core.commands.validate;
+
+import java.io.File;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Stack;
+
+import com.networknt.schema.ValidationMessage;
+import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
+import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.dsl.yaml.validator.YamlValidator;
+import org.apache.camel.util.FileUtil;
+import picocli.CommandLine;
+
[email protected](name = "yaml", description = "Parse and validate YAML
routes")
+public class YamlValidateCommand extends CamelCommand {
+
+ private static final String IGNORE_FILE = "application";
+
+ @CommandLine.Parameters(description = { "The Camel YAML source files to
parse." },
+ arity = "1..9",
+ paramLabel = "<files>",
+ parameterConsumer = FilesConsumer.class)
+ Path[] filePaths;
+ List<String> files = new ArrayList<>();
+
+ @CommandLine.Option(names = { "--json" },
+ description = "To dump validation report in JSon
format")
+ boolean json;
+
+ public YamlValidateCommand(CamelJBangMain main) {
+ super(main);
+ }
+
+ @Override
+ public Integer doCall() throws Exception {
+ YamlValidator validator = new YamlValidator();
+ validator.init();
+
+ Map<String, List<ValidationMessage>> reports = new LinkedHashMap<>();
+ for (String n : files) {
+ if (matchFile(n)) {
+ var report = validator.validate(new File(n));
+ reports.put(n, report);
+ }
+ }
+
+ int count = errorCounts(reports);
+ if (count > 0) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Validation error detected
(errors:").append(count).append(")\n\n");
+
+ for (var e : reports.entrySet()) {
+ String name = e.getKey();
+ var report = e.getValue();
+ if (!report.isEmpty()) {
+ sb.append("\tFile: ").append(name).append("\n");
+ for (var r : report) {
+ sb.append("\t\t").append(r.toString()).append("\n");
+ }
+ sb.append("\n");
+ }
+ }
+ printer().println(sb.toString());
+
+ return 1;
+ } else {
+ printer().println("Validation success (files:" + reports.size() +
")");
+ }
+
+ return 0;
+ }
+
+ private static boolean matchFile(String name) {
+ String no = FileUtil.onlyName(name).toLowerCase(Locale.ROOT);
+ if (IGNORE_FILE.equals(no)) {
+ return false;
+ }
+ String ext = FileUtil.onlyExt(name);
+ if (ext == null) {
+ return false;
+ }
+ ext = ext.toLowerCase(Locale.ROOT);
+ return "yml".equals(ext) || "yaml".equals(ext);
+ }
+
+ private static int errorCounts(Map<String, List<ValidationMessage>>
reports) {
+ int count = 0;
+ for (List<ValidationMessage> list : reports.values()) {
+ if (!list.isEmpty()) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ static class FilesConsumer extends
CamelCommand.ParameterConsumer<YamlValidateCommand> {
+ protected void doConsumeParameters(Stack<String> args,
YamlValidateCommand cmd) {
+ String arg = args.pop();
+ cmd.files.add(arg);
+ }
+ }
+}
diff --git a/dsl/camel-jbang/pom.xml b/dsl/camel-jbang/pom.xml
index 20b03bf31eef..bbe639d10a6d 100644
--- a/dsl/camel-jbang/pom.xml
+++ b/dsl/camel-jbang/pom.xml
@@ -43,6 +43,7 @@
<module>camel-jbang-plugin-kubernetes</module>
<module>camel-jbang-plugin-route-parser</module>
<module>camel-jbang-plugin-test</module>
+ <module>camel-jbang-plugin-validate</module>
<module>camel-jbang-it</module>
<module>camel-launcher</module>
</modules>
diff --git
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator-maven-plugin/src/main/java/org/apache/camel/dsl/yaml/validator/ValidateMojo.java
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator-maven-plugin/src/main/java/org/apache/camel/dsl/yaml/validator/ValidateMojo.java
index bea0fe93e0bb..56da16719c1e 100644
---
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator-maven-plugin/src/main/java/org/apache/camel/dsl/yaml/validator/ValidateMojo.java
+++
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator-maven-plugin/src/main/java/org/apache/camel/dsl/yaml/validator/ValidateMojo.java
@@ -150,21 +150,22 @@ public class ValidateMojo extends AbstractMojo {
private void validateResults(Map<File, List<ValidationMessage>> reports)
throws MojoExecutionException {
int count = errorCounts(reports);
if (count == 0) {
- getLog().info("Validation success");
+ getLog().info("Validation success (files:" + reports.size() + ")");
return;
}
StringBuilder sb = new StringBuilder();
- sb.append("Validation error detected in ").append(count).append("
files\n\n");
+ sb.append("Validation error detected
(errors:").append(count).append(")\n\n");
for (var e : reports.entrySet()) {
String name = e.getKey().getName();
var report = e.getValue();
-
- sb.append("\tFile: ").append(name).append("\n");
- for (var r : report) {
- sb.append("\t\t").append(r.toString()).append("\n");
+ if (!report.isEmpty()) {
+ sb.append("\tFile: ").append(name).append("\n");
+ for (var r : report) {
+ sb.append("\t\t").append(r.toString()).append("\n");
+ }
+ sb.append("\n");
}
- sb.append("\n");
}
getLog().warn("\n\n" + sb + "\n\n");
diff --git
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java
index c28edeef540b..39b3d7a13e33 100644
---
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java
+++
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java
@@ -17,13 +17,10 @@
package org.apache.camel.dsl.yaml.validator;
import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
-import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.networknt.schema.JsonMetaSchema;
@@ -34,45 +31,36 @@ import com.networknt.schema.SchemaValidatorsConfig;
import com.networknt.schema.SpecVersionDetector;
import com.networknt.schema.ValidationMessage;
+/**
+ * YAML DSL validator that tooling can use to validate Camel source files if
they can be parsed and are valid according
+ * to the Camel YAML DSL spec.
+ */
public class YamlValidator {
private static final String DRAFT =
"http://json-schema.org/draft-04/schema#";
+ private static final String LOCATION = "/schema/camelYamlDsl.json";
- // TODO: yaml-dsl-parser to see if its validate camel
-
- private ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
- private JsonNode model;
- private JsonSchemaFactory factory;
- private SchemaValidatorsConfig config;
+ private final ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
private JsonSchema schema;
- private String jsonSchema = "/schema/camelYamlDsl.json";
-
- public String getJsonSchema() {
- return jsonSchema;
- }
-
- /**
- * The schema to use for validating
- */
- public void setJsonSchema(String jsonSchema) {
- this.jsonSchema = jsonSchema;
- }
-
public List<ValidationMessage> validate(File file) throws Exception {
if (schema == null) {
init();
}
- try (InputStream is = new FileInputStream(file)) {
- var target = mapper.readTree(is);
+ try {
+ var target = mapper.readTree(file);
return new ArrayList<>(schema.validate(target));
+ } catch (Exception e) {
+ ValidationMessage vm = ValidationMessage.builder().type("parser")
+ .messageSupplier(() -> e.getClass().getName() + ": " +
e.getMessage()).build();
+ return List.of(vm);
}
}
public void init() throws Exception {
- model =
mapper.readTree(YamlValidator.class.getResourceAsStream(jsonSchema));
- factory =
JsonSchemaFactory.getInstance(SpecVersionDetector.detect(model));
- config =
SchemaValidatorsConfig.builder().locale(Locale.ENGLISH).build();
+ var model =
mapper.readTree(YamlValidator.class.getResourceAsStream(LOCATION));
+ var factory =
JsonSchemaFactory.getInstance(SpecVersionDetector.detect(model));
+ var config =
SchemaValidatorsConfig.builder().locale(Locale.ENGLISH).build();
// include deprecated as an unknown keyword so the validator does not
WARN log about this
JsonMetaSchema jms = factory.getMetaSchema(DRAFT, null);
jms.getKeywords().put("deprecated", new
NonValidationKeyword("deprecated"));