From 1cf0bf83bbfb570b2aa328de4b1aa15d9a5040cb Mon Sep 17 00:00:00 2001
From: Justin Tay <49700559+justin-tay@users.noreply.github.com>
Date: Sat, 11 Oct 2025 11:18:17 +0800
Subject: [PATCH] Refactor evaluation context out from validator state
---
.../com/networknt/schema/AbsoluteIri.java | 7 +-
.../networknt/schema/ExecutionContext.java | 68 +++-
.../java/com/networknt/schema/Schema.java | 304 ++++++++----------
.../com/networknt/schema/SchemaContext.java | 9 +-
.../com/networknt/schema/SchemaLocation.java | 8 +-
.../com/networknt/schema/SchemaRegistry.java | 77 ++---
.../schema/SchemaRegistryConfig.java | 76 +----
.../java/com/networknt/schema/Validator.java | 9 -
.../schema/annotation/Annotation.java | 9 +
.../com/networknt/schema/dialect/Dialect.java | 8 +-
.../schema/format/BaseFormatValidator.java | 5 +-
.../keyword/AbstractKeywordValidator.java | 87 ++++-
.../AdditionalPropertiesValidator.java | 26 +-
.../schema/keyword/AllOfValidator.java | 30 +-
.../schema/keyword/AnnotationKeyword.java | 8 +-
.../schema/keyword/AnyOfValidator.java | 74 ++---
.../schema/keyword/BaseKeywordValidator.java | 65 +---
.../schema/keyword/ConstValidator.java | 8 +-
.../schema/keyword/ContainsValidator.java | 42 +--
.../keyword/ContentEncodingValidator.java | 8 +-
.../keyword/ContentMediaTypeValidator.java | 7 +-
.../schema/keyword/DependenciesValidator.java | 16 +-
.../schema/keyword/DependentRequired.java | 6 +-
.../schema/keyword/DependentSchemas.java | 24 +-
.../keyword/DiscriminatorValidator.java | 6 +-
.../schema/keyword/DynamicRefValidator.java | 84 ++---
.../schema/keyword/EnumValidator.java | 6 +-
.../keyword/ExclusiveMaximumValidator.java | 6 +-
.../keyword/ExclusiveMinimumValidator.java | 6 +-
.../schema/keyword/FalseValidator.java | 11 +-
.../schema/keyword/FormatKeyword.java | 5 +-
.../schema/keyword/FormatValidator.java | 8 +-
.../networknt/schema/keyword/IfValidator.java | 75 ++++-
.../schema/keyword/ItemsLegacyValidator.java | 162 ++++++----
.../schema/keyword/ItemsValidator.java | 44 +--
.../com/networknt/schema/keyword/Keyword.java | 4 +-
.../networknt/schema/keyword/KeywordType.java | 9 +-
.../schema/keyword/MaxItemsValidator.java | 8 +-
.../schema/keyword/MaxLengthValidator.java | 6 +-
.../keyword/MaxPropertiesValidator.java | 6 +-
.../schema/keyword/MaximumValidator.java | 6 +-
.../schema/keyword/MinItemsValidator.java | 8 +-
.../schema/keyword/MinLengthValidator.java | 6 +-
.../keyword/MinMaxContainsValidator.java | 5 +-
.../keyword/MinPropertiesValidator.java | 6 +-
.../schema/keyword/MinimumValidator.java | 6 +-
.../schema/keyword/MultipleOfValidator.java | 6 +-
.../schema/keyword/NonValidationKeyword.java | 12 +-
.../schema/keyword/NotAllowedValidator.java | 6 +-
.../schema/keyword/NotValidator.java | 8 +-
.../schema/keyword/OneOfValidator.java | 71 ++--
.../keyword/PatternPropertiesValidator.java | 32 +-
.../schema/keyword/PatternValidator.java | 6 +-
.../schema/keyword/PrefixItemsValidator.java | 58 ++--
.../schema/keyword/PropertiesValidator.java | 66 ++--
.../PropertyDependenciesValidator.java | 48 ++-
.../keyword/PropertyNamesValidator.java | 8 +-
.../schema/keyword/ReadOnlyValidator.java | 6 +-
.../schema/keyword/RecursiveRefValidator.java | 83 +----
.../schema/keyword/RefValidator.java | 49 +--
.../schema/keyword/RequiredValidator.java | 6 +-
.../schema/keyword/TrueValidator.java | 4 +-
.../schema/keyword/TypeValidator.java | 14 +-
.../keyword/UnevaluatedItemsValidator.java | 16 +-
.../UnevaluatedPropertiesValidator.java | 15 +-
.../schema/keyword/UnionTypeValidator.java | 21 +-
.../schema/keyword/UniqueItemsValidator.java | 6 +-
.../schema/keyword/WriteOnlyValidator.java | 6 +-
.../schema/output/OutputUnitData.java | 5 +-
.../com/networknt/schema/path/NodePath.java | 2 +-
.../java/com/networknt/schema/path/Path.java | 23 ++
.../networknt/schema/utils/JsonNodeTypes.java | 20 +-
.../networknt/schema/utils/SchemaRefs.java | 7 +-
.../com/networknt/schema/utils/Strings.java | 43 +++
.../networknt/schema/utils/TypeFactory.java | 3 +-
.../com/networknt/schema/walk/WalkEvent.java | 10 +-
.../schema/CollectorContextTest.java | 24 +-
.../schema/CustomMetaSchemaTest.java | 8 +-
.../schema/FormatKeywordFactoryTest.java | 3 +-
.../com/networknt/schema/IfValidatorTest.java | 4 +-
.../com/networknt/schema/Issue1091Test.java | 19 +-
.../com/networknt/schema/Issue467Test.java | 4 +-
.../schema/JsonSchemaPreloadTest.java | 1 -
.../com/networknt/schema/JsonWalkTest.java | 8 +-
.../com/networknt/schema/MessageTest.java | 10 +-
.../PatternPropertiesValidatorTest.java | 10 +-
.../schema/PropertiesValidatorTest.java | 26 --
...ursiveReferenceValidatorExceptionTest.java | 4 +-
.../com/networknt/schema/TypeFactoryTest.java | 4 +-
.../keyword/PropertiesValidatorTest.java | 123 +++++++
.../PropertyDependenciesValidatorTest.java | 2 +-
.../networknt/schema/oas/OpenApi30Test.java | 4 +-
.../schema/path/EvaluationPathTest.java | 88 +++++
.../schema/walk/WalkListenerTest.java | 98 +++---
94 files changed, 1369 insertions(+), 1195 deletions(-)
create mode 100644 src/main/java/com/networknt/schema/path/Path.java
delete mode 100644 src/test/java/com/networknt/schema/PropertiesValidatorTest.java
create mode 100644 src/test/java/com/networknt/schema/keyword/PropertiesValidatorTest.java
create mode 100644 src/test/java/com/networknt/schema/path/EvaluationPathTest.java
diff --git a/src/main/java/com/networknt/schema/AbsoluteIri.java b/src/main/java/com/networknt/schema/AbsoluteIri.java
index 1ade74363..890f5e003 100644
--- a/src/main/java/com/networknt/schema/AbsoluteIri.java
+++ b/src/main/java/com/networknt/schema/AbsoluteIri.java
@@ -17,6 +17,8 @@
import java.util.Objects;
+import com.networknt.schema.utils.Strings;
+
/**
* The absolute IRI is an IRI without the fragment.
*
@@ -131,7 +133,7 @@ public static String resolve(String parent, String iri) {
}
base = parent(base, scheme);
- String[] iriParts = iri.split("/");
+ String[] iriParts = Strings.split(iri, '/');
for (int x = 0; x < iriParts.length; x++) {
if ("..".equals(iriParts[x])) {
base = parent(base, scheme);
@@ -149,9 +151,6 @@ public static String resolve(String parent, String iri) {
}
}
}
- if (iri.endsWith("/")) {
- base = base + "/";
- }
return base;
}
}
diff --git a/src/main/java/com/networknt/schema/ExecutionContext.java b/src/main/java/com/networknt/schema/ExecutionContext.java
index 5cb78dba1..51037797f 100644
--- a/src/main/java/com/networknt/schema/ExecutionContext.java
+++ b/src/main/java/com/networknt/schema/ExecutionContext.java
@@ -16,6 +16,7 @@
package com.networknt.schema;
+import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -25,7 +26,7 @@
import com.networknt.schema.annotation.Annotations;
import com.networknt.schema.keyword.DiscriminatorState;
import com.networknt.schema.path.NodePath;
-import com.networknt.schema.result.InstanceResults;
+//import com.networknt.schema.result.InstanceResults;
import com.networknt.schema.walk.WalkConfig;
/**
@@ -37,11 +38,40 @@ public class ExecutionContext {
private CollectorContext collectorContext = null;
private Annotations annotations = null;
- private InstanceResults instanceResults = null;
+// private InstanceResults instanceResults = null;
private List errors = new ArrayList<>();
- private Map discriminatorMapping = new HashMap<>();
+ private final Map discriminatorMapping = new HashMap<>();
+ NodePath evaluationPath;
+ final ArrayDeque evaluationSchema = new ArrayDeque<>(64);
+ final ArrayDeque