This is an automated email from the ASF dual-hosted git repository.

jamesnetherton 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 483a4910e465 CAMEL-23292: Upgrade json-schema-validator to 2.0.1
483a4910e465 is described below

commit 483a4910e465282ae4bddfacb192ade12e27ac16
Author: James Netherton <[email protected]>
AuthorDate: Thu Apr 9 07:14:03 2026 +0100

    CAMEL-23292: Upgrade json-schema-validator to 2.0.1
---
 .../jsonvalidator/DefaultJsonUriSchemaLoader.java  | 47 +++++++++++--------
 .../DefaultJsonValidationErrorHandler.java         |  8 ++--
 .../jsonvalidator/JsonUriSchemaLoader.java         |  4 +-
 .../jsonvalidator/JsonValidationException.java     | 20 ++++-----
 .../jsonvalidator/JsonValidatorEndpoint.java       | 17 +++----
 .../jsonvalidator/JsonValidatorErrorHandler.java   |  8 ++--
 .../jsonvalidator/JsonValidationExceptionTest.java | 13 +++---
 .../ROOT/pages/camel-4x-upgrade-guide-4_19.adoc    |  6 +++
 .../jbang/core/commands/mcp/TransformTools.java    | 24 +++++-----
 .../commands/validate/YamlValidateCommand.java     |  8 ++--
 .../camel/dsl/yaml/validator/ValidateMojo.java     | 12 ++---
 .../camel/dsl/yaml/validator/CamelYamlParser.java  | 13 +++---
 .../camel/dsl/yaml/validator/YamlParser.java       | 13 +++---
 .../camel/dsl/yaml/validator/YamlValidator.java    | 52 ++++++++++++++--------
 .../camel/dsl/yaml/support/YamlTestSupport.groovy  | 17 +++----
 parent/pom.xml                                     |  2 +-
 16 files changed, 149 insertions(+), 115 deletions(-)

diff --git 
a/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/DefaultJsonUriSchemaLoader.java
 
b/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/DefaultJsonUriSchemaLoader.java
index 3a5ea02e8dad..18c4242fd1d2 100644
--- 
a/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/DefaultJsonUriSchemaLoader.java
+++ 
b/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/DefaultJsonUriSchemaLoader.java
@@ -18,15 +18,15 @@ package org.apache.camel.component.jsonvalidator;
 
 import java.io.*;
 import java.net.*;
+import java.util.Optional;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.networknt.schema.JsonSchema;
-import com.networknt.schema.JsonSchemaException;
-import com.networknt.schema.JsonSchemaFactory;
-import com.networknt.schema.SchemaValidatorsConfig;
-import com.networknt.schema.SpecVersion;
-import com.networknt.schema.SpecVersionDetector;
+import com.networknt.schema.Schema;
+import com.networknt.schema.SchemaLocation;
+import com.networknt.schema.SchemaRegistry;
+import com.networknt.schema.SchemaRegistryConfig;
+import com.networknt.schema.SpecificationVersion;
 import org.apache.camel.CamelContext;
 import org.apache.camel.support.ResourceHelper;
 
@@ -34,24 +34,22 @@ public class DefaultJsonUriSchemaLoader implements 
JsonUriSchemaLoader {
 
     protected ObjectMapper mapper = new ObjectMapper();
 
-    protected SchemaValidatorsConfig config = new SchemaValidatorsConfig();
+    protected SchemaRegistryConfig config = 
SchemaRegistryConfig.builder().build();
 
-    protected SpecVersion.VersionFlag defaultVersion = 
SpecVersion.VersionFlag.V201909;
+    protected SpecificationVersion defaultVersion = 
SpecificationVersion.DRAFT_2019_09;
 
     @Override
-    public JsonSchema createSchema(CamelContext camelContext, String 
schemaUri) throws Exception {
-        // determine schema version
+    public Schema createSchema(CamelContext camelContext, String schemaUri) 
throws Exception {
+        // Load the schema content
         InputStream stream = 
ResourceHelper.resolveMandatoryResourceAsInputStream(camelContext, schemaUri);
         JsonNode node = mapper.readTree(stream);
-        SpecVersion.VersionFlag version;
-        try {
-            version = SpecVersionDetector.detect(node);
-        } catch (JsonSchemaException e) {
-            // default if no schema version was specified
-            version = defaultVersion;
-        }
 
-        JsonSchemaFactory factory = JsonSchemaFactory.getInstance(version);
+        // Determine schema version from $schema property or use the default
+        SpecificationVersion version = 
getSpecificationVersion(node).orElse(defaultVersion);
+
+        // Create schema registry with the detected version
+        SchemaRegistry schemaRegistry = 
SchemaRegistry.withDefaultDialect(version,
+                builder -> builder.schemaRegistryConfig(config));
 
         // the URI based method will correctly resolve relative schema 
references to other schema in the same directory
         URI uri;
@@ -60,7 +58,18 @@ public class DefaultJsonUriSchemaLoader implements 
JsonUriSchemaLoader {
         } else {
             uri = URI.create("classpath:" + schemaUri);
         }
-        return factory.getSchema(uri, node, config);
+
+        SchemaLocation schemaLocation = SchemaLocation.of(uri.toString());
+        return schemaRegistry.getSchema(schemaLocation, node);
     }
 
+    static Optional<SpecificationVersion> getSpecificationVersion(JsonNode 
schemaNode) {
+        if (schemaNode != null) {
+            JsonNode schema = schemaNode.get("$schema");
+            if (schema != null && schema.isTextual()) {
+                return SpecificationVersion.fromDialectId(schema.asText());
+            }
+        }
+        return Optional.empty();
+    }
 }
diff --git 
a/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/DefaultJsonValidationErrorHandler.java
 
b/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/DefaultJsonValidationErrorHandler.java
index 51d977a0bfe6..f96da6307b7b 100644
--- 
a/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/DefaultJsonValidationErrorHandler.java
+++ 
b/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/DefaultJsonValidationErrorHandler.java
@@ -18,20 +18,20 @@ package org.apache.camel.component.jsonvalidator;
 
 import java.util.Set;
 
-import com.networknt.schema.JsonSchema;
-import com.networknt.schema.ValidationMessage;
+import com.networknt.schema.Error;
+import com.networknt.schema.Schema;
 import org.apache.camel.Exchange;
 import org.apache.camel.ValidationException;
 
 public class DefaultJsonValidationErrorHandler implements 
JsonValidatorErrorHandler {
 
     @Override
-    public void handleErrors(Exchange exchange, JsonSchema schema, 
Set<ValidationMessage> errors) throws ValidationException {
+    public void handleErrors(Exchange exchange, Schema schema, Set<Error> 
errors) throws ValidationException {
         throw new JsonValidationException(exchange, schema, errors);
     }
 
     @Override
-    public void handleErrors(Exchange exchange, JsonSchema schema, Exception 
e) throws ValidationException {
+    public void handleErrors(Exchange exchange, Schema schema, Exception e) 
throws ValidationException {
         throw new JsonValidationException(exchange, schema, e);
     }
 
diff --git 
a/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonUriSchemaLoader.java
 
b/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonUriSchemaLoader.java
index 3aeab7e028aa..62db61e970f9 100644
--- 
a/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonUriSchemaLoader.java
+++ 
b/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonUriSchemaLoader.java
@@ -16,7 +16,7 @@
  */
 package org.apache.camel.component.jsonvalidator;
 
-import com.networknt.schema.JsonSchema;
+import com.networknt.schema.Schema;
 import org.apache.camel.CamelContext;
 
 /**
@@ -31,6 +31,6 @@ public interface JsonUriSchemaLoader {
      * @param  schemaUri    the schema URI
      * @return              a Schema to be used when validating incoming 
requests
      */
-    JsonSchema createSchema(CamelContext camelContext, String schemaUri) 
throws Exception;
+    Schema createSchema(CamelContext camelContext, String schemaUri) throws 
Exception;
 
 }
diff --git 
a/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonValidationException.java
 
b/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonValidationException.java
index 78a77268dc9f..c83f1ee02fbd 100644
--- 
a/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonValidationException.java
+++ 
b/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonValidationException.java
@@ -21,8 +21,8 @@ import java.util.Collections;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import com.networknt.schema.JsonSchema;
-import com.networknt.schema.ValidationMessage;
+import com.networknt.schema.Error;
+import com.networknt.schema.Schema;
 import org.apache.camel.Exchange;
 import org.apache.camel.ValidationException;
 
@@ -31,26 +31,26 @@ public class JsonValidationException extends 
ValidationException {
     @Serial
     private static final long serialVersionUID = 1L;
 
-    private final JsonSchema schema;
-    private final Set<ValidationMessage> errors;
+    private final Schema schema;
+    private final Set<Error> errors;
 
-    public JsonValidationException(Exchange exchange, JsonSchema schema, 
Set<ValidationMessage> errors) {
+    public JsonValidationException(Exchange exchange, Schema schema, 
Set<Error> errors) {
         super(exchange, "JSON validation error with " + errors.size() + " 
errors:\n" + toString(errors));
         this.schema = schema;
         this.errors = errors;
     }
 
-    public JsonValidationException(Exchange exchange, JsonSchema schema, 
Exception e) {
+    public JsonValidationException(Exchange exchange, Schema schema, Exception 
e) {
         super(e.getMessage(), exchange, e);
         this.schema = schema;
         this.errors = Collections.emptySet();
     }
 
-    public JsonSchema getSchema() {
+    public Schema getSchema() {
         return schema;
     }
 
-    public Set<ValidationMessage> getErrors() {
+    public Set<Error> getErrors() {
         return errors;
     }
 
@@ -58,7 +58,7 @@ public class JsonValidationException extends 
ValidationException {
         return errors.size();
     }
 
-    private static String toString(Set<ValidationMessage> errors) {
-        return 
errors.stream().map(ValidationMessage::toString).collect(Collectors.joining("\n"));
+    private static String toString(Set<Error> errors) {
+        return 
errors.stream().map(Error::toString).collect(Collectors.joining("\n"));
     }
 }
diff --git 
a/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonValidatorEndpoint.java
 
b/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonValidatorEndpoint.java
index 9c921cedefbd..44713220763d 100644
--- 
a/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonValidatorEndpoint.java
+++ 
b/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonValidatorEndpoint.java
@@ -17,13 +17,14 @@
 package org.apache.camel.component.jsonvalidator;
 
 import java.io.InputStream;
-import java.util.Set;
+import java.util.HashSet;
+import java.util.List;
 
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.networknt.schema.JsonSchema;
-import com.networknt.schema.ValidationMessage;
+import com.networknt.schema.Error;
+import com.networknt.schema.Schema;
 import org.apache.camel.Category;
 import org.apache.camel.Component;
 import org.apache.camel.Exchange;
@@ -44,7 +45,7 @@ import org.apache.camel.spi.UriParam;
              remote = false, producerOnly = true, category = { 
Category.VALIDATION })
 public class JsonValidatorEndpoint extends ResourceEndpoint {
 
-    private volatile JsonSchema schema;
+    private volatile Schema schema;
 
     @UriParam(defaultValue = "true")
     private boolean failOnNullBody = true;
@@ -123,7 +124,7 @@ public class JsonValidatorEndpoint extends ResourceEndpoint 
{
         }
 
         // Get a local copy of the current schema to improve concurrency.
-        JsonSchema localSchema = this.schema;
+        Schema localSchema = this.schema;
         if (localSchema == null) {
             localSchema = getOrCreateSchema();
         }
@@ -148,11 +149,11 @@ public class JsonValidatorEndpoint extends 
ResourceEndpoint {
                     if (node == null) {
                         throw new NoJsonBodyValidationException(exchange);
                     }
-                    Set<ValidationMessage> errors = localSchema.validate(node);
+                    List<Error> errors = localSchema.validate(node);
 
                     if (!errors.isEmpty()) {
                         this.log.debug("Validated JSON has {} errors", 
errors.size());
-                        this.errorHandler.handleErrors(exchange, schema, 
errors);
+                        this.errorHandler.handleErrors(exchange, schema, new 
HashSet<>(errors));
                     } else {
                         this.log.debug("Validated JSON success");
                     }
@@ -187,7 +188,7 @@ public class JsonValidatorEndpoint extends ResourceEndpoint 
{
      *
      * @return The currently loaded schema
      */
-    private JsonSchema getOrCreateSchema() throws Exception {
+    private Schema getOrCreateSchema() throws Exception {
         getInternalLock().lock();
         try {
             if (this.schema == null) {
diff --git 
a/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonValidatorErrorHandler.java
 
b/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonValidatorErrorHandler.java
index d391c143aa53..dba59f966848 100644
--- 
a/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonValidatorErrorHandler.java
+++ 
b/components/camel-json-validator/src/main/java/org/apache/camel/component/jsonvalidator/JsonValidatorErrorHandler.java
@@ -18,8 +18,8 @@ package org.apache.camel.component.jsonvalidator;
 
 import java.util.Set;
 
-import com.networknt.schema.JsonSchema;
-import com.networknt.schema.ValidationMessage;
+import com.networknt.schema.Error;
+import com.networknt.schema.Schema;
 import org.apache.camel.Exchange;
 import org.apache.camel.ValidationException;
 
@@ -33,7 +33,7 @@ public interface JsonValidatorErrorHandler {
      * @param  errors              the validation errors
      * @throws ValidationException is thrown in case of validation errors
      */
-    void handleErrors(Exchange exchange, JsonSchema schema, 
Set<ValidationMessage> errors) throws ValidationException;
+    void handleErrors(Exchange exchange, Schema schema, Set<Error> errors) 
throws ValidationException;
 
     /**
      * Process a general error that happens during valdating
@@ -43,6 +43,6 @@ public interface JsonValidatorErrorHandler {
      * @param  e                   general error
      * @throws ValidationException is thrown in case of validation errors
      */
-    void handleErrors(Exchange exchange, JsonSchema schema, Exception e) 
throws ValidationException;
+    void handleErrors(Exchange exchange, Schema schema, Exception e) throws 
ValidationException;
 
 }
diff --git 
a/components/camel-json-validator/src/test/java/org/apache/camel/component/jsonvalidator/JsonValidationExceptionTest.java
 
b/components/camel-json-validator/src/test/java/org/apache/camel/component/jsonvalidator/JsonValidationExceptionTest.java
index a4020631bd82..75bae1cb37dc 100644
--- 
a/components/camel-json-validator/src/test/java/org/apache/camel/component/jsonvalidator/JsonValidationExceptionTest.java
+++ 
b/components/camel-json-validator/src/test/java/org/apache/camel/component/jsonvalidator/JsonValidationExceptionTest.java
@@ -20,7 +20,7 @@ import java.text.MessageFormat;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
-import com.networknt.schema.ValidationMessage;
+import com.networknt.schema.Error;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -30,13 +30,13 @@ public class JsonValidationExceptionTest {
 
     @Test
     void testErrorsInfoInMessage() {
-        Set<ValidationMessage> errors = new LinkedHashSet<>();
+        Set<Error> errors = new LinkedHashSet<>();
         errors.add(createError("name: is missing but it is required"));
         errors.add(createError("id: string found, integer expected"));
         final JsonValidationException jsonValidationException = new 
JsonValidationException(null, null, errors);
 
         assertEquals(
-                "JSON validation error with 2 errors:\nname: is missing but it 
is required\nid: string found, integer expected",
+                "JSON validation error with 2 errors:\n: name: is missing but 
it is required\n: id: string found, integer expected",
                 jsonValidationException.getMessage());
     }
 
@@ -45,9 +45,10 @@ public class JsonValidationExceptionTest {
         assertEquals(0, new JsonValidationException(null, null, new 
Exception()).getNumberOfErrors());
     }
 
-    private ValidationMessage createError(String msg) {
-        return new ValidationMessage.Builder()
+    private Error createError(String msg) {
+        return Error.builder()
                 .messageKey(String.valueOf(errorId++))
-                .format(new MessageFormat(msg)).build();
+                .format(new MessageFormat(msg))
+                .build();
     }
 }
diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_19.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_19.adoc
index 6b38eb74b9b4..3541ddc87685 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_19.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_19.adoc
@@ -587,6 +587,12 @@ Five new configuration properties have been added to the 
SSH endpoint to expose
 
 All properties default to `0`, which means the Apache MINA SSHD defaults are 
used. This is an additive change with no impact on existing configurations.
 
+=== camel-json-validator
+
+The JSON validation library `com.networknt:json-schema-validator` used by 
`camel-json-validator` has been upgraded from 1.x to 2.x.
+
+The `json-schema-validator` 
https://github.com/networknt/json-schema-validator/blob/master/doc/migration-2.0.0.md[migration
 guide] can help to migrate your applications if you refer to types that have 
been updated or removed in 2.x.
+
 === MDC older logic (Deprecation)
 
 The older logic used for MDC (enabled via `camel.main.useMdcLogging = true`) 
is deprecated in favor of `camel-mdc` component.
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/TransformTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/TransformTools.java
index ed9d857075bd..9f638f385b2b 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/TransformTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/TransformTools.java
@@ -29,7 +29,7 @@ import java.util.Map;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
 
-import com.networknt.schema.ValidationMessage;
+import com.networknt.schema.Error;
 import io.quarkiverse.mcp.server.Tool;
 import io.quarkiverse.mcp.server.ToolArg;
 import io.quarkiverse.mcp.server.ToolCallException;
@@ -282,20 +282,20 @@ public class TransformTools {
             File tempFile = File.createTempFile("camel-validate-", ".yaml");
             try {
                 Files.writeString(tempFile.toPath(), route);
-                List<ValidationMessage> messages = 
yamlValidator.validate(tempFile);
-
-                List<YamlDslError> errors = null;
-                if (!messages.isEmpty()) {
-                    errors = messages.stream()
-                            .map(m -> new YamlDslError(
-                                    m.getMessage(),
-                                    m.getInstanceLocation() != null ? 
m.getInstanceLocation().toString() : null,
-                                    m.getType(),
-                                    m.getSchemaLocation() != null ? 
m.getSchemaLocation().toString() : null))
+                List<Error> errors = yamlValidator.validate(tempFile);
+
+                List<YamlDslError> errorDetails = null;
+                if (!errors.isEmpty()) {
+                    errorDetails = errors.stream()
+                            .map(e -> new YamlDslError(
+                                    e.getMessage(),
+                                    e.getInstanceLocation() != null ? 
e.getInstanceLocation().toString() : null,
+                                    e.getMessageKey(),
+                                    e.getSchemaLocation() != null ? 
e.getSchemaLocation().toString() : null))
                             .toList();
                 }
 
-                return new YamlDslValidationResult(messages.isEmpty(), 
messages.size(), errors);
+                return new YamlDslValidationResult(errors.isEmpty(), 
errors.size(), errorDetails);
             } finally {
                 tempFile.delete();
             }
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
index 84436f06e96d..3d72ed72876c 100644
--- 
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
@@ -25,7 +25,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Stack;
 
-import com.networknt.schema.ValidationMessage;
+import com.networknt.schema.Error;
 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;
@@ -53,7 +53,7 @@ public class YamlValidateCommand extends CamelCommand {
         YamlValidator validator = new YamlValidator();
         validator.init();
 
-        Map<String, List<ValidationMessage>> reports = new LinkedHashMap<>();
+        Map<String, List<Error>> reports = new LinkedHashMap<>();
         for (String n : files) {
             if (matchFile(n)) {
                 var report = validator.validate(new File(n));
@@ -100,9 +100,9 @@ public class YamlValidateCommand extends CamelCommand {
         return "yml".equals(ext) || "yaml".equals(ext);
     }
 
-    private static int errorCounts(Map<String, List<ValidationMessage>> 
reports) {
+    private static int errorCounts(Map<String, List<Error>> reports) {
         int count = 0;
-        for (List<ValidationMessage> list : reports.values()) {
+        for (List<Error> list : reports.values()) {
             if (!list.isEmpty()) {
                 count++;
             }
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 56da16719c1e..a8dc751afba7 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
@@ -27,7 +27,7 @@ import java.util.Set;
 
 import javax.inject.Inject;
 
-import com.networknt.schema.ValidationMessage;
+import com.networknt.schema.Error;
 import org.apache.camel.support.PatternHelper;
 import org.apache.camel.util.FileUtil;
 import org.apache.maven.execution.MavenSession;
@@ -124,7 +124,7 @@ public class ValidateMojo extends AbstractMojo {
         findYamlRouters(yamlFiles, includeTest, ext, project);
         getLog().debug("Found " + yamlFiles.size() + " YAML files ...");
 
-        Map<File, List<ValidationMessage>> reports = new LinkedHashMap<>();
+        Map<File, List<Error>> reports = new LinkedHashMap<>();
         List<File> matched = new ArrayList<>();
         for (File file : yamlFiles) {
             if (matchFile(file)) {
@@ -147,7 +147,7 @@ public class ValidateMojo extends AbstractMojo {
         validateResults(reports);
     }
 
-    private void validateResults(Map<File, List<ValidationMessage>> reports) 
throws MojoExecutionException {
+    private void validateResults(Map<File, List<Error>> reports) throws 
MojoExecutionException {
         int count = errorCounts(reports);
         if (count == 0) {
             getLog().info("Validation success (files:" + reports.size() + ")");
@@ -174,9 +174,9 @@ public class ValidateMojo extends AbstractMojo {
         }
     }
 
-    private int errorCounts(Map<File, List<ValidationMessage>> reports) {
+    private int errorCounts(Map<File, List<Error>> reports) {
         int count = 0;
-        for (List<ValidationMessage> list : reports.values()) {
+        for (List<Error> list : reports.values()) {
             if (!list.isEmpty()) {
                 count++;
             }
@@ -184,7 +184,7 @@ public class ValidateMojo extends AbstractMojo {
         return count;
     }
 
-    private List<ValidationMessage> validateYamlRoute(File file) throws 
Exception {
+    private List<Error> validateYamlRoute(File file) throws Exception {
         getLog().debug("Validating YAML DSL in file: " + file);
         return validator.validate(file);
     }
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java
index bf2975578880..6a3d2a244b9a 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java
@@ -18,10 +18,11 @@ package org.apache.camel.dsl.yaml.validator;
 
 import java.io.File;
 import java.nio.file.Files;
+import java.text.MessageFormat;
 import java.util.Collections;
 import java.util.List;
 
-import com.networknt.schema.ValidationMessage;
+import com.networknt.schema.Error;
 import org.apache.camel.CamelContext;
 import org.apache.camel.TypeConverterExists;
 import org.apache.camel.component.properties.PropertiesComponent;
@@ -49,7 +50,7 @@ import org.apache.camel.support.ResourceHelper;
  */
 public class CamelYamlParser {
 
-    public List<ValidationMessage> parse(File file) throws Exception {
+    public List<Error> parse(File file) throws Exception {
         DefaultRegistry registry = new DefaultRegistry();
         registry.addBeanRepository(new StubBeanRepository("*"));
 
@@ -96,9 +97,11 @@ public class CamelYamlParser {
                 return Collections.emptyList();
             }
         } catch (Exception e) {
-            ValidationMessage vm = ValidationMessage.builder().type("parser")
-                    .messageSupplier(() -> e.getClass().getName() + ": " + 
e.getMessage()).build();
-            return List.of(vm);
+            Error error = Error.builder()
+                    .messageKey("parser")
+                    .format(new MessageFormat(e.getClass().getName() + ": " + 
e.getMessage()))
+                    .build();
+            return List.of(error);
         }
     }
 
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlParser.java
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlParser.java
index ccf1ca30ec2a..16142ce61b62 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlParser.java
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlParser.java
@@ -17,12 +17,13 @@
 package org.apache.camel.dsl.yaml.validator;
 
 import java.io.File;
+import java.text.MessageFormat;
 import java.util.Collections;
 import java.util.List;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import com.networknt.schema.ValidationMessage;
+import com.networknt.schema.Error;
 
 /**
  * YAML DSL parser that tooling can use to parse Camel source files to check 
if they can be YAML parsed.
@@ -34,14 +35,16 @@ public class YamlParser {
 
     private final ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
 
-    public List<ValidationMessage> parse(File file) throws Exception {
+    public List<Error> parse(File file) throws Exception {
         try {
             mapper.readTree(file);
             return Collections.emptyList();
         } catch (Exception e) {
-            ValidationMessage vm = ValidationMessage.builder().type("parser")
-                    .messageSupplier(() -> e.getClass().getName() + ": " + 
e.getMessage()).build();
-            return List.of(vm);
+            Error error = Error.builder()
+                    .messageKey("parser")
+                    .format(new MessageFormat(e.getClass().getName() + ": " + 
e.getMessage()))
+                    .build();
+            return List.of(error);
         }
     }
 
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 39b3d7a13e33..72922f3f16b3 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,19 +17,21 @@
 package org.apache.camel.dsl.yaml.validator;
 
 import java.io.File;
+import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
+import java.util.Optional;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import com.networknt.schema.JsonMetaSchema;
-import com.networknt.schema.JsonSchema;
-import com.networknt.schema.JsonSchemaFactory;
-import com.networknt.schema.NonValidationKeyword;
-import com.networknt.schema.SchemaValidatorsConfig;
-import com.networknt.schema.SpecVersionDetector;
-import com.networknt.schema.ValidationMessage;
+import com.networknt.schema.Error;
+import com.networknt.schema.Schema;
+import com.networknt.schema.SchemaLocation;
+import com.networknt.schema.SchemaRegistry;
+import com.networknt.schema.SchemaRegistryConfig;
+import com.networknt.schema.SpecificationVersion;
 
 /**
  * YAML DSL validator that tooling can use to validate Camel source files if 
they can be parsed and are valid according
@@ -37,13 +39,12 @@ import com.networknt.schema.ValidationMessage;
  */
 public class YamlValidator {
 
-    private static final String DRAFT = 
"http://json-schema.org/draft-04/schema#";;
     private static final String LOCATION = "/schema/camelYamlDsl.json";
 
     private final ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
-    private JsonSchema schema;
+    private Schema schema;
 
-    public List<ValidationMessage> validate(File file) throws Exception {
+    public List<Error> validate(File file) throws Exception {
         if (schema == null) {
             init();
         }
@@ -51,20 +52,33 @@ public class YamlValidator {
             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);
+            Error error = Error.builder()
+                    .messageKey("parser")
+                    .format(new MessageFormat(e.getClass().getName() + ": " + 
e.getMessage()))
+                    .build();
+            return List.of(error);
         }
     }
 
     public void init() throws Exception {
         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"));
-        schema = factory.getSchema(model, config);
+        var version = 
getSpecificationVersion(model).orElse(SpecificationVersion.DRAFT_4);
+        var config = 
SchemaRegistryConfig.builder().locale(Locale.ENGLISH).build();
+
+        var schemaRegistry = SchemaRegistry.withDefaultDialect(version,
+                builder -> builder.schemaRegistryConfig(config));
+
+        // Use a proper URI for the schema location to ensure $ref resolution 
works
+        var schemaLocation = SchemaLocation.of(LOCATION);
+        schema = schemaRegistry.getSchema(schemaLocation, model);
+    }
+
+    private static Optional<SpecificationVersion> 
getSpecificationVersion(JsonNode schemaNode) {
+        var schemaField = schemaNode.get("$schema");
+        if (schemaField != null && schemaField.isTextual()) {
+            return SpecificationVersion.fromDialectId(schemaField.asText());
+        }
+        return Optional.empty();
     }
 
 }
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy
index b5753649c37f..3fde4697ce05 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy
@@ -18,9 +18,10 @@ package org.apache.camel.dsl.yaml.support
 
 import com.fasterxml.jackson.databind.ObjectMapper
 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
-import com.networknt.schema.JsonSchemaFactory
-import com.networknt.schema.SchemaValidatorsConfig
-import com.networknt.schema.SpecVersionDetector
+import com.networknt.schema.SchemaLocation
+import com.networknt.schema.SchemaRegistry
+import com.networknt.schema.SchemaRegistryConfig
+import com.networknt.schema.SpecificationVersion
 import groovy.util.logging.Slf4j
 import org.apache.camel.CamelContext
 import org.apache.camel.FluentProducerTemplate
@@ -42,13 +43,9 @@ import java.nio.charset.StandardCharsets
 class YamlTestSupport extends Specification implements HasCamelContext {
     static def MAPPER = new ObjectMapper(new YAMLFactory())
     static def SCHEMA_NODE = 
MAPPER.readTree(ResourceHelper.getResourceAsStream('/schema/camelYamlDsl.json'))
-    static def FACTORY = 
JsonSchemaFactory.getInstance(SpecVersionDetector.detect(SCHEMA_NODE))
-    static def SCHEMA_VALIDATORS_CONFIG = {
-        SchemaValidatorsConfig config = new SchemaValidatorsConfig()
-        config.setLocale(Locale.ENGLISH)
-        return config
-    }()
-    static def SCHEMA = FACTORY.getSchema(SCHEMA_NODE, 
SCHEMA_VALIDATORS_CONFIG)
+    static def SCHEMA_REGISTRY_CONFIG = 
SchemaRegistryConfig.builder().locale(Locale.ENGLISH).build()
+    static def SCHEMA_REGISTRY = 
SchemaRegistry.withDefaultDialect(SpecificationVersion.DRAFT_4, builder -> 
builder.schemaRegistryConfig(SCHEMA_REGISTRY_CONFIG))
+    static def SCHEMA = 
SCHEMA_REGISTRY.getSchema(SchemaLocation.of('/schema/camelYamlDsl.json'), 
SCHEMA_NODE)
 
     @AutoCleanup
     def context = new DefaultCamelContext()
diff --git a/parent/pom.xml b/parent/pom.xml
index c6cc6b9bc581..1279aa8e2c98 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -435,7 +435,7 @@
         <neo4j-version>6.0.4</neo4j-version>
         <netty-version>4.2.12.Final</netty-version>
         <netty-reactive-streams-version>2.0.5</netty-reactive-streams-version>
-        
<networknt-json-schema-validator-version>1.5.9</networknt-json-schema-validator-version>
+        
<networknt-json-schema-validator-version>2.0.1</networknt-json-schema-validator-version>
         <nimbus-jose-jwt>10.9</nimbus-jose-jwt>
         <olingo2-version>2.0.13</olingo2-version>
         <olingo4-version>5.0.0</olingo4-version>


Reply via email to