Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
3222389
Merge pull request #5 from networknt/master
prashanthjos Oct 21, 2020
1f92471
Merge pull request #6 from networknt/master
prashanthjos Dec 22, 2020
00a643d
Fixing walk issues for properties
prashanth-chaitanya Dec 22, 2020
161f59c
Correcting walk changes for few validators
prashanth-chaitanya Dec 24, 2020
32e8ab8
adding item walk listener
prashanth-chaitanya Dec 28, 2020
3e2e7cd
walk listener changes
prashanth-chaitanya Jan 13, 2021
51e45ba
walk listener changes
prashanth-chaitanya Jan 13, 2021
49f3300
Merging latest changes from networknt
prashanth-chaitanya Jan 15, 2021
67d36bf
Merge branch 'networknt-master'
prashanth-chaitanya Jan 15, 2021
9fdb3d0
merging changes from networknt
prashanth-chaitanya Feb 26, 2021
c27e1c9
merging changes from networknt
prashanth-chaitanya Feb 26, 2021
040d752
merging changes from networknt
prashanth-chaitanya Feb 26, 2021
4486cc4
Fixing issues with ValidatorState
prashanth-chaitanya Mar 12, 2021
cfbdf1c
changing the method name to getCollectorContext
prashanth-chaitanya Mar 15, 2021
d125abd
correcting the variable names and ValidatorState logic
prashanth-chaitanya Mar 15, 2021
abd45a8
correcting the documentation logic
prashanth-chaitanya Mar 15, 2021
2457a57
Merge branch 'master' of https://github.com/networknt/json-schema-val…
prashanth-chaitanya Mar 15, 2021
f0ca7d4
latest changes from networknt
prashanth-chaitanya Mar 15, 2021
34b8cf7
Fixing compilation issues in TypeFactoryTest
prashanth-chaitanya Mar 15, 2021
633c49b
Merge branch 'master' into master
prashanthjos Mar 17, 2021
beb6569
Fixing the minor brace issue
prashanth-chaitanya Mar 17, 2021
33d0deb
Merge pull request #10 from networknt/master
prashanthjos Mar 18, 2021
3a25c0b
Merge branch 'master' of https://github.com/networknt/json-schema-val…
prashanth-chaitanya Mar 18, 2021
895152c
Merge branch 'master' into networknt-master
prashanth-chaitanya Mar 18, 2021
bc374e5
Merge branch 'networknt-master'
prashanth-chaitanya Mar 18, 2021
a2f39a7
Merge branch 'networknt:master' into master
prashanthjos Aug 27, 2021
6a80389
Merge branch 'master' of https://github.com/prashanthjos/json-schema-…
prashanth-chaitanya Aug 27, 2021
5b59c56
Fixing the issue of propogating walk-listeners to child 's from paren…
prashanth-chaitanya Sep 2, 2021
d87b8ac
Adding tests for changing listeners
prashanth-chaitanya Sep 2, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/main/java/com/networknt/schema/AllOfValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
for (JsonSchema schema : schemas) {
errors.addAll(schema.validate(node, rootNode, at));

if (config.isOpenAPI3StyleDiscriminators()) {
if (this.validationContext.getConfig().isOpenAPI3StyleDiscriminators()) {
final Iterator<JsonNode> arrayElements = schemaNode.elements();
while (arrayElements.hasNext()) {
final ObjectNode allOfEntry = (ObjectNode) arrayElements.next();
Expand Down
26 changes: 13 additions & 13 deletions src/main/java/com/networknt/schema/AnyOfValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,13 @@ public AnyOfValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentS
int size = schemaNode.size();
for (int i = 0; i < size; i++) {
schemas.add(new JsonSchema(validationContext,
getValidatorType().getValue(),
parentSchema.getCurrentUri(),
schemaNode.get(i),
parentSchema));
getValidatorType().getValue(),
parentSchema.getCurrentUri(),
schemaNode.get(i),
parentSchema));
}

if (config.isOpenAPI3StyleDiscriminators()) {
if (this.validationContext.getConfig().isOpenAPI3StyleDiscriminators()) {
this.discriminatorContext = new ValidationContext.DiscriminatorContext();
} else {
this.discriminatorContext = null;
Expand All @@ -53,7 +53,7 @@ public AnyOfValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentS
public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String at) {
debug(logger, node, rootNode, at);

if (config.isOpenAPI3StyleDiscriminators()) {
if (this.validationContext.getConfig().isOpenAPI3StyleDiscriminators()) {
validationContext.enterDiscriminatorContext(this.discriminatorContext, at);
}

Expand All @@ -72,9 +72,9 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
}
}
Set<ValidationMessage> errors = schema.validate(node, rootNode, at);
if (errors.isEmpty() && !config.isOpenAPI3StyleDiscriminators()) {
if (errors.isEmpty() && (!this.validationContext.getConfig().isOpenAPI3StyleDiscriminators())) {
return errors;
} else if (config.isOpenAPI3StyleDiscriminators()) {
} else if (this.validationContext.getConfig().isOpenAPI3StyleDiscriminators()) {
if (discriminatorContext.isDiscriminatorMatchFound()) {
if (!errors.isEmpty()) {
errors.add(buildValidationMessage(at, DISCRIMINATOR_REMARK));
Expand All @@ -85,13 +85,13 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
allErrors.addAll(errors);
}

if (config.isOpenAPI3StyleDiscriminators() && discriminatorContext.isActive()) {
final Set<ValidationMessage> errors = new HashSet<ValidationMessage>();
errors.add(buildValidationMessage(at, "based on the provided discriminator. No alternative could be chosen based on the discriminator property"));
return Collections.unmodifiableSet(errors);
if (this.validationContext.getConfig().isOpenAPI3StyleDiscriminators() && discriminatorContext.isActive()) {
final Set<ValidationMessage> errors = new HashSet<ValidationMessage>();
errors.add(buildValidationMessage(at, "based on the provided discriminator. No alternative could be chosen based on the discriminator property"));
return Collections.unmodifiableSet(errors);
}
} finally {
if (config.isOpenAPI3StyleDiscriminators()) {
if (this.validationContext.getConfig().isOpenAPI3StyleDiscriminators()) {
validationContext.leaveDiscriminatorContextImmediately(at);
}
}
Expand Down
6 changes: 1 addition & 5 deletions src/main/java/com/networknt/schema/BaseJsonValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,13 @@ public abstract class BaseJsonValidator implements JsonValidator {
private boolean suppressSubSchemaRetrieval;
private ValidatorTypeCode validatorType;
private ErrorMessageType errorMessageType;
/**
* SchemaValidatorsConfig can only get and set in validationContext
*/
protected SchemaValidatorsConfig config;

protected final boolean failFast;

public BaseJsonValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentSchema,
ValidatorTypeCode validatorType, ValidationContext validationContext) {
this(schemaPath, schemaNode, parentSchema, validatorType, false,
validationContext.getConfig() != null && validationContext.getConfig().isFailFast());
this.config = validationContext.getConfig() == null ? new SchemaValidatorsConfig() : validationContext.getConfig();
}

public BaseJsonValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentSchema,
Expand Down
5 changes: 4 additions & 1 deletion src/main/java/com/networknt/schema/DateTimeValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
public class DateTimeValidator extends BaseJsonValidator implements JsonValidator {
private static final Logger logger = LoggerFactory.getLogger(DateTimeValidator.class);

private final ValidationContext validationContext;

private final String formatName;
private final String DATE = "date";
private final String DATETIME = "date-time";
Expand All @@ -44,6 +46,7 @@ public class DateTimeValidator extends BaseJsonValidator implements JsonValidato
public DateTimeValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentSchema, ValidationContext validationContext, String formatName) {
super(schemaPath, schemaNode, parentSchema, ValidatorTypeCode.DATETIME, validationContext);
this.formatName = formatName;
this.validationContext = validationContext;
parseErrorCode(getValidatorType().getErrorCodeKey());
}

Expand All @@ -52,7 +55,7 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String

Set<ValidationMessage> errors = new LinkedHashSet<ValidationMessage>();

JsonType nodeType = TypeFactory.getValueNodeType(node, super.config);
JsonType nodeType = TypeFactory.getValueNodeType(node, this.validationContext.getConfig());
if (nodeType != JsonType.STRING) {
return errors;
}
Expand Down
9 changes: 5 additions & 4 deletions src/main/java/com/networknt/schema/EnumValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,11 @@ public class EnumValidator extends BaseJsonValidator implements JsonValidator {

private final Set<JsonNode> nodes;
private final String error;
private final ValidationContext validationContext;

public EnumValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentSchema, ValidationContext validationContext) {
super(schemaPath, schemaNode, parentSchema, ValidatorTypeCode.ENUM, validationContext);

this.validationContext = validationContext;
if (schemaNode != null && schemaNode.isArray()) {
nodes = new HashSet<JsonNode>();
StringBuilder sb = new StringBuilder();
Expand All @@ -57,7 +58,7 @@ public EnumValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentSc
}

// check if the parent schema declares the fields as nullable
if (config.isHandleNullableField()) {
if (validationContext.getConfig().isHandleNullableField()) {
JsonNode nullable = parentSchema.getSchemaNode().get("nullable");
if (nullable != null && nullable.asBoolean()) {
nodes.add(NullNode.getInstance());
Expand All @@ -83,7 +84,7 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String

Set<ValidationMessage> errors = new LinkedHashSet<ValidationMessage>();
if (node.isNumber()) node = DecimalNode.valueOf(node.decimalValue());
if (!nodes.contains(node) && !(config.isTypeLoose() && isTypeLooseContainsInEnum(node))) {
if (!nodes.contains(node) && !( this.validationContext.getConfig().isTypeLoose() && isTypeLooseContainsInEnum(node))) {
errors.add(buildValidationMessage(at, error));
}

Expand All @@ -96,7 +97,7 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
* @param node JsonNode to check
*/
private boolean isTypeLooseContainsInEnum(JsonNode node) {
if (TypeFactory.getValueNodeType(node, super.config) == JsonType.STRING) {
if (TypeFactory.getValueNodeType(node, this.validationContext.getConfig()) == JsonType.STRING) {
String nodeText = node.textValue();
for (JsonNode n : nodes) {
String value = n.asText();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,11 @@ public class ExclusiveMaximumValidator extends BaseJsonValidator implements Json

private final ThresholdMixin typedMaximum;

private final ValidationContext validationContext;

public ExclusiveMaximumValidator(String schemaPath, final JsonNode schemaNode, JsonSchema parentSchema, ValidationContext validationContext) {
super(schemaPath, schemaNode, parentSchema, ValidatorTypeCode.EXCLUSIVE_MAXIMUM, validationContext);

this.validationContext = validationContext;
if (!schemaNode.isNumber()) {
throw new JsonSchemaException("exclusiveMaximum value is not a number");
}
Expand Down Expand Up @@ -99,7 +101,7 @@ public String thresholdValue() {
public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String at) {
debug(logger, node, rootNode, at);

if (!TypeValidator.isNumber(node, super.config)) {
if (!TypeValidator.isNumber(node, validationContext.getConfig())) {
// maximum only applies to numbers
return Collections.emptySet();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,11 @@ public class ExclusiveMinimumValidator extends BaseJsonValidator implements Json
*/
private final ThresholdMixin typedMinimum;

private final ValidationContext validationContext;

public ExclusiveMinimumValidator(String schemaPath, final JsonNode schemaNode, JsonSchema parentSchema, ValidationContext validationContext) {
super(schemaPath, schemaNode, parentSchema, ValidatorTypeCode.EXCLUSIVE_MINIMUM, validationContext);

this.validationContext = validationContext;
if (!schemaNode.isNumber()) {
throw new JsonSchemaException("exclusiveMinimum value is not a number");
}
Expand Down Expand Up @@ -106,7 +108,7 @@ public String thresholdValue() {
public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String at) {
debug(logger, node, rootNode, at);

if (!TypeValidator.isNumber(node, super.config)) {
if (!TypeValidator.isNumber(node, this.validationContext.getConfig())) {
// minimum only applies to numbers
return Collections.emptySet();
}
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/com/networknt/schema/FormatValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,12 @@ public class FormatValidator extends BaseJsonValidator implements JsonValidator
private static final Logger logger = LoggerFactory.getLogger(FormatValidator.class);

private final Format format;
private final ValidationContext validationContext;

public FormatValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentSchema, ValidationContext validationContext, Format format) {
super(schemaPath, schemaNode, parentSchema, ValidatorTypeCode.FORMAT, validationContext);
this.format = format;
this.validationContext = validationContext;
parseErrorCode(getValidatorType().getErrorCodeKey());
}

Expand All @@ -41,7 +43,7 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String

Set<ValidationMessage> errors = new LinkedHashSet<ValidationMessage>();

JsonType nodeType = TypeFactory.getValueNodeType(node, super.config);
JsonType nodeType = TypeFactory.getValueNodeType(node, this.validationContext.getConfig());
if (nodeType != JsonType.STRING) {
return errors;
}
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/com/networknt/schema/ItemsValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public class ItemsValidator extends BaseJsonValidator implements JsonValidator {
private final List<JsonSchema> tupleSchema;
private boolean additionalItems = true;
private final JsonSchema additionalSchema;
private final WalkListenerRunner arrayItemWalkListenerRunner;
private WalkListenerRunner arrayItemWalkListenerRunner;
private final ValidationContext validationContext;

public ItemsValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentSchema,
Expand Down Expand Up @@ -61,7 +61,7 @@ public ItemsValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentS
}
}
}
arrayItemWalkListenerRunner = new DefaultItemWalkListenerRunner(config.getArrayItemWalkListeners());
arrayItemWalkListenerRunner = new DefaultItemWalkListenerRunner(validationContext.getConfig().getArrayItemWalkListeners());

this.validationContext = validationContext;

Expand All @@ -76,7 +76,7 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String

Set<ValidationMessage> errors = new LinkedHashSet<ValidationMessage>();

if (!node.isArray() && !config.isTypeLoose()) {
if (!node.isArray() && !this.validationContext.getConfig().isTypeLoose()) {
// ignores non-arrays
return errors;
}
Expand Down
22 changes: 14 additions & 8 deletions src/main/java/com/networknt/schema/JsonSchema.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLDecoder;
import java.sql.Ref;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
Expand All @@ -36,6 +37,8 @@
import com.networknt.schema.walk.JsonSchemaWalker;
import com.networknt.schema.walk.WalkListenerRunner;

import javax.xml.validation.Schema;

/**
* This is the core of json constraint implementation. It parses json constraint
* file and generates JsonValidators. The class is thread safe, once it is
Expand All @@ -46,7 +49,6 @@ public class JsonSchema extends BaseJsonValidator {
private Map<String, JsonValidator> validators;
private final String idKeyword;
private final ValidationContext validationContext;
private WalkListenerRunner keywordWalkListenerRunner;
private boolean validatorsLoaded = false;

/**
Expand Down Expand Up @@ -80,13 +82,10 @@ private JsonSchema(ValidationContext validationContext, String schemaPath, URI c
super(schemaPath, schemaNode, parent, null, suppressSubSchemaRetrieval,
validationContext.getConfig() != null && validationContext.getConfig().isFailFast());
this.validationContext = validationContext;
this.config = validationContext.getConfig();
this.idKeyword = validationContext.getMetaSchema().getIdKeyword();
this.currentUri = this.combineCurrentUriWithIds(currentUri, schemaNode);
if (config != null) {
this.keywordWalkListenerRunner = new DefaultKeywordWalkListenerRunner(config.getKeywordWalkListenersMap());

if (config.isOpenAPI3StyleDiscriminators()) {
if (validationContext.getConfig() != null) {
if (validationContext.getConfig().isOpenAPI3StyleDiscriminators()) {
ObjectNode discriminator = (ObjectNode) schemaNode.get("discriminator");
if (null != discriminator && null != validationContext.getCurrentDiscriminatorContext()) {
validationContext.getCurrentDiscriminatorContext().registerDiscriminator(schemaPath, discriminator);
Expand All @@ -95,6 +94,10 @@ private JsonSchema(ValidationContext validationContext, String schemaPath, URI c
}
}

ValidationContext getValidationContext() {
return this.validationContext;
}

private URI combineCurrentUriWithIds(URI currentUri, JsonNode schemaNode) {
final String id = validationContext.resolveSchemaId(schemaNode);
if (id == null) {
Expand Down Expand Up @@ -257,6 +260,7 @@ private JsonNode getMessageNode(JsonNode schemaNode, JsonSchema parentSchema) {
/************************ START OF VALIDATE METHODS **********************************/

public Set<ValidationMessage> validate(JsonNode jsonNode, JsonNode rootNode, String at) {
SchemaValidatorsConfig config = validationContext.getConfig();
Set<ValidationMessage> errors = new LinkedHashSet<ValidationMessage>();
// Get the collector context.
getCollectorContext();
Expand Down Expand Up @@ -353,6 +357,7 @@ public ValidationResult walk(JsonNode node, boolean shouldValidateSchema) {
@Override
public Set<ValidationMessage> walk(JsonNode node, JsonNode rootNode, String at, boolean shouldValidateSchema) {
Set<ValidationMessage> validationMessages = new LinkedHashSet<ValidationMessage>();
WalkListenerRunner keywordWalkListenerRunner = new DefaultKeywordWalkListenerRunner(this.validationContext.getConfig().getKeywordWalkListenersMap());
// Walk through all the JSONWalker's.
for (Entry<String, JsonValidator> entry : getValidators().entrySet()) {
JsonSchemaWalker jsonWalker = entry.getValue();
Expand Down Expand Up @@ -401,11 +406,12 @@ private void setValidatorState(boolean isWalkEnabled, boolean shouldValidateSche
}

public CollectorContext getCollectorContext() {
SchemaValidatorsConfig config = validationContext.getConfig();
CollectorContext collectorContext = (CollectorContext) ThreadInfo
.get(CollectorContext.COLLECTOR_CONTEXT_THREAD_LOCAL_KEY);
if (collectorContext == null) {
if (this.config != null && this.config.getCollectorContext() != null) {
collectorContext = this.config.getCollectorContext();
if (config != null && config.getCollectorContext() != null) {
collectorContext = config.getCollectorContext();
} else {
collectorContext = new CollectorContext();
}
Expand Down
10 changes: 8 additions & 2 deletions src/main/java/com/networknt/schema/JsonSchemaFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -338,8 +338,14 @@ public JsonSchema getSchema(final URI schemaUri, final SchemaValidatorsConfig co
throw new JsonSchemaException(e);
}

if (uriSchemaCache.containsKey(mappedUri))
return uriSchemaCache.get(mappedUri);
if (uriSchemaCache.containsKey(mappedUri)) {
JsonSchema cachedUriSchema = uriSchemaCache.get(mappedUri);
// This is important because if we use same JsonSchemaFactory for creating multiple JSONSchema instances,
// these schemas will be cached along with config. We have to replace the config for cached $ref references
// with the latest config.
cachedUriSchema.getValidationContext().setConfig(config);
return cachedUriSchema;
}

try {
inputStream = this.uriFetcher.fetch(mappedUri);
Expand Down
7 changes: 5 additions & 2 deletions src/main/java/com/networknt/schema/MaxItemsValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,19 @@
import java.util.Set;

public class MaxItemsValidator extends BaseJsonValidator implements JsonValidator {

private static final Logger logger = LoggerFactory.getLogger(MaxItemsValidator.class);

private final ValidationContext validationContext;

private int max = 0;

public MaxItemsValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentSchema, ValidationContext validationContext) {
super(schemaPath, schemaNode, parentSchema, ValidatorTypeCode.MAX_ITEMS, validationContext);
if (schemaNode.isIntegralNumber()) {
max = schemaNode.intValue();
}

this.validationContext = validationContext;
parseErrorCode(getValidatorType().getErrorCodeKey());
}

Expand All @@ -44,7 +47,7 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
if (node.size() > max) {
return Collections.singleton(buildValidationMessage(at, "" + max));
}
} else if (config.isTypeLoose()) {
} else if (this.validationContext.getConfig().isTypeLoose()) {
if (1 > max) {
return Collections.singleton(buildValidationMessage(at, "" + max));
}
Expand Down
Loading