Skip to content

Commit e4a7af3

Browse files
author
Klas Kalaß
committed
Improved handling for unknown keywords
1 parent 79acd4d commit e4a7af3

File tree

3 files changed

+54
-4
lines changed

3 files changed

+54
-4
lines changed

src/main/java/com/networknt/schema/JsonMetaSchema.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@
1818

1919
import java.lang.reflect.InvocationTargetException;
2020
import java.util.ArrayList;
21+
import java.util.Arrays;
2122
import java.util.Collection;
2223
import java.util.Collections;
2324
import java.util.HashMap;
2425
import java.util.List;
2526
import java.util.Map;
2627
import java.util.Optional;
28+
import java.util.concurrent.ConcurrentHashMap;
2729

2830
import org.apache.commons.lang3.StringUtils;
2931
import org.slf4j.Logger;
@@ -36,7 +38,7 @@ public class JsonMetaSchema {
3638

3739
private static final Logger logger = LoggerFactory
3840
.getLogger(JsonMetaSchema.class);
39-
41+
private static Map<String, String> UNKNOWN_KEYWORDS = new ConcurrentHashMap<String, String>();
4042

4143
private static class DraftV4 {
4244
private static String URI = "http://json-schema.org/draft-04/schema#";
@@ -76,6 +78,15 @@ public static JsonMetaSchema getInstance() {
7678
.idKeyword(DRAFT_4_ID)
7779
.addFormats(BUILTIN_FORMATS)
7880
.addKeywords(ValidatorTypeCode.getNonFormatKeywords())
81+
// keywords that may validly exist, but have no validation aspect to them
82+
.addKeywords(Arrays.asList(
83+
new NonValidationKeyword("$schema"),
84+
new NonValidationKeyword("id"),
85+
new NonValidationKeyword("title"),
86+
new NonValidationKeyword("description"),
87+
new NonValidationKeyword("default"),
88+
new NonValidationKeyword("definitions")
89+
))
7990
.build();
8091
}
8192
}
@@ -221,7 +232,10 @@ public Optional<JsonValidator> newValidator(ValidationContext validationContext,
221232
try {
222233
Keyword kw = keywords.get(keyword);
223234
if (kw == null) {
224-
logger.warn("Unknown keyword " + keyword);
235+
if (!UNKNOWN_KEYWORDS.containsKey(keyword)) {
236+
UNKNOWN_KEYWORDS.put(keyword, keyword);
237+
logger.warn("Unknown keyword " + keyword + " - you should define your own Meta Schema. If the keyword is irrelevant for validation, just use a NonValidationKeyword");
238+
}
225239
return Optional.empty();
226240
}
227241
return Optional.of(kw.newValidator(schemaPath, schemaNode, parentSchema, validationContext));

src/main/java/com/networknt/schema/JsonSchemaFactory.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,11 @@ private boolean idMatchesSourceUrl(JsonMetaSchema metaSchema, JsonNode schema, U
214214
if (id == null || id.isEmpty()) {
215215
return false;
216216
}
217-
logger.info("Matching " + id + " to " + schemaUrl.toString());
218-
return id.equals(schemaUrl.toString());
217+
boolean result = id.equals(schemaUrl.toString());
218+
if (logger.isDebugEnabled()) {
219+
logger.debug("Matching " + id + " to " + schemaUrl.toString() + ": " + result);
220+
}
221+
return result;
219222

220223
}
221224

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.networknt.schema;
2+
3+
import java.util.Collections;
4+
import java.util.Set;
5+
6+
import com.fasterxml.jackson.databind.JsonNode;
7+
8+
/**
9+
* Used for Keywords that have no validation aspect, but are part of the metaschema.
10+
*/
11+
public class NonValidationKeyword extends AbstractKeyword {
12+
13+
private static final class Validator extends AbstractJsonValidator {
14+
private Validator(String keyword) {
15+
super(keyword);
16+
}
17+
18+
@Override
19+
public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String at) {
20+
return Collections.emptySet();
21+
}
22+
}
23+
24+
public NonValidationKeyword(String keyword) {
25+
super(keyword);
26+
}
27+
28+
@Override
29+
public JsonValidator newValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentSchema,
30+
ValidationContext validationContext) throws JsonSchemaException, Exception {
31+
return new Validator(getValue());
32+
}
33+
}

0 commit comments

Comments
 (0)