From 9b1658c8009c9cf635e6b0cec64f886293a6ca2a Mon Sep 17 00:00:00 2001 From: Meer Patel Date: Fri, 29 Mar 2024 23:27:13 -0300 Subject: [PATCH 1/5] segregated getDefaultNode in utils --- .../com/networknt/schema/ItemsValidator.java | 20 ++++--------------- .../schema/ItemsValidator202012.java | 16 +++------------ .../schema/PrefixItemsValidator.java | 14 ++----------- .../networknt/schema/PropertiesValidator.java | 15 ++------------ .../networknt/schema/utils/DefaultNode.java | 19 ++++++++++++++++++ 5 files changed, 30 insertions(+), 54 deletions(-) create mode 100644 src/main/java/com/networknt/schema/utils/DefaultNode.java diff --git a/src/main/java/com/networknt/schema/ItemsValidator.java b/src/main/java/com/networknt/schema/ItemsValidator.java index 7912ebd8b..42f4fa3c6 100644 --- a/src/main/java/com/networknt/schema/ItemsValidator.java +++ b/src/main/java/com/networknt/schema/ItemsValidator.java @@ -19,9 +19,8 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.networknt.schema.annotation.JsonNodeAnnotation; -import com.networknt.schema.utils.JsonSchemaRefs; import com.networknt.schema.utils.SetView; - +import com.networknt.schema.utils.DefaultNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -241,7 +240,7 @@ public Set walk(ExecutionContext executionContext, JsonNode n ArrayNode arrayNode = (ArrayNode) node; JsonNode defaultNode = null; if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyArrayDefaults()) { - defaultNode = getDefaultNode(this.schema); + defaultNode = DefaultNode.getDefaultNode(this.schema); } for (int i = 0; i < count; i++) { JsonNode n = arrayNode.get(i); @@ -266,7 +265,7 @@ else if (this.tupleSchema != null) { JsonNode defaultNode = null; JsonNode n = arrayNode.get(i); if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyArrayDefaults()) { - defaultNode = getDefaultNode(this.tupleSchema.get(i)); + defaultNode = DefaultNode.getDefaultNode(this.tupleSchema.get(i)); } if (n != null) { if (n.isNull() && defaultNode != null) { @@ -293,7 +292,7 @@ else if (this.tupleSchema != null) { JsonNode defaultNode = null; JsonNode n = arrayNode.get(i); if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyArrayDefaults()) { - defaultNode = getDefaultNode(this.additionalSchema); + defaultNode = DefaultNode.getDefaultNode(this.additionalSchema); } if (n != null) { if (n.isNull() && defaultNode != null) { @@ -326,17 +325,6 @@ else if (this.tupleSchema != null) { return validationMessages; } - private static JsonNode getDefaultNode(JsonSchema schema) { - JsonNode result = schema.getSchemaNode().get("default"); - if (result == null) { - JsonSchemaRef schemaRef = JsonSchemaRefs.from(schema); - if (schemaRef != null) { - result = getDefaultNode(schemaRef.getSchema()); - } - } - return result; - } - private void walkSchema(ExecutionContext executionContext, JsonSchema walkSchema, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema, Set validationMessages, String keyword) { boolean executeWalk = this.validationContext.getConfig().getItemWalkListenerRunner().runPreWalkListeners(executionContext, keyword, diff --git a/src/main/java/com/networknt/schema/ItemsValidator202012.java b/src/main/java/com/networknt/schema/ItemsValidator202012.java index 9edcb37ef..50ff3a785 100644 --- a/src/main/java/com/networknt/schema/ItemsValidator202012.java +++ b/src/main/java/com/networknt/schema/ItemsValidator202012.java @@ -19,7 +19,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.networknt.schema.annotation.JsonNodeAnnotation; -import com.networknt.schema.utils.JsonSchemaRefs; +import com.networknt.schema.utils.DefaultNode; import com.networknt.schema.utils.SetView; import org.slf4j.Logger; @@ -120,7 +120,7 @@ public Set walk(ExecutionContext executionContext, JsonNode n JsonNode defaultNode = null; if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyArrayDefaults() && this.schema != null) { - defaultNode = getDefaultNode(this.schema); + defaultNode = DefaultNode.getDefaultNode(this.schema); } boolean evaluated = false; for (int i = this.prefixCount; i < node.size(); ++i) { @@ -155,17 +155,7 @@ public Set walk(ExecutionContext executionContext, JsonNode n return validationMessages; } - private static JsonNode getDefaultNode(JsonSchema schema) { - JsonNode result = schema.getSchemaNode().get("default"); - if (result == null) { - JsonSchemaRef schemaRef = JsonSchemaRefs.from(schema); - if (schemaRef != null) { - result = getDefaultNode(schemaRef.getSchema()); - } - } - return result; - } - + private void walkSchema(ExecutionContext executionContext, JsonSchema walkSchema, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema, Set validationMessages) { //@formatter:off diff --git a/src/main/java/com/networknt/schema/PrefixItemsValidator.java b/src/main/java/com/networknt/schema/PrefixItemsValidator.java index ccda85859..985620513 100644 --- a/src/main/java/com/networknt/schema/PrefixItemsValidator.java +++ b/src/main/java/com/networknt/schema/PrefixItemsValidator.java @@ -19,7 +19,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.networknt.schema.annotation.JsonNodeAnnotation; -import com.networknt.schema.utils.JsonSchemaRefs; +import com.networknt.schema.utils.DefaultNode; import com.networknt.schema.utils.SetView; import org.slf4j.Logger; @@ -110,7 +110,7 @@ public Set walk(ExecutionContext executionContext, JsonNode n for (int i = 0; i < count; ++i) { JsonNode n = node.get(i); if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyArrayDefaults()) { - JsonNode defaultNode = getDefaultNode(this.tupleSchema.get(i)); + JsonNode defaultNode = DefaultNode.getDefaultNode(this.tupleSchema.get(i)); if (n != null) { // Defaults only set if array index is explicitly null if (n.isNull() && defaultNode != null) { @@ -150,16 +150,6 @@ public Set walk(ExecutionContext executionContext, JsonNode n return validationMessages; } - private static JsonNode getDefaultNode(JsonSchema schema) { - JsonNode result = schema.getSchemaNode().get("default"); - if (result == null) { - JsonSchemaRef schemaRef = JsonSchemaRefs.from(schema); - if (schemaRef != null) { - result = getDefaultNode(schemaRef.getSchema()); - } - } - return result; - } private void doWalk(ExecutionContext executionContext, Set validationMessages, int i, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema) { diff --git a/src/main/java/com/networknt/schema/PropertiesValidator.java b/src/main/java/com/networknt/schema/PropertiesValidator.java index f378905ee..7d7b6687f 100644 --- a/src/main/java/com/networknt/schema/PropertiesValidator.java +++ b/src/main/java/com/networknt/schema/PropertiesValidator.java @@ -21,7 +21,7 @@ import com.fasterxml.jackson.databind.node.MissingNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.networknt.schema.annotation.JsonNodeAnnotation; -import com.networknt.schema.utils.JsonSchemaRefs; +import com.networknt.schema.utils.DefaultNode; import com.networknt.schema.utils.SetView; import com.networknt.schema.walk.WalkListenerRunner; import org.slf4j.Logger; @@ -192,7 +192,7 @@ private void applyPropertyDefaults(ObjectNode node) { for (Map.Entry entry : this.schemas.entrySet()) { JsonNode propertyNode = node.get(entry.getKey()); - JsonNode defaultNode = getDefaultNode(entry.getValue()); + JsonNode defaultNode = DefaultNode.getDefaultNode(entry.getValue()); if (defaultNode == null) { continue; } @@ -204,17 +204,6 @@ private void applyPropertyDefaults(ObjectNode node) { } } - private static JsonNode getDefaultNode(JsonSchema schema) { - JsonNode result = schema.getSchemaNode().get("default"); - if (result == null) { - JsonSchemaRef schemaRef = JsonSchemaRefs.from(schema); - if (schemaRef != null) { - result = getDefaultNode(schemaRef.getSchema()); - } - } - return result; - } - private void walkSchema(ExecutionContext executionContext, Map.Entry entry, JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean shouldValidateSchema, SetView validationMessages, WalkListenerRunner propertyWalkListenerRunner) { diff --git a/src/main/java/com/networknt/schema/utils/DefaultNode.java b/src/main/java/com/networknt/schema/utils/DefaultNode.java new file mode 100644 index 000000000..dbf09b2f3 --- /dev/null +++ b/src/main/java/com/networknt/schema/utils/DefaultNode.java @@ -0,0 +1,19 @@ +package com.networknt.schema.utils; + +import com.fasterxml.jackson.databind.JsonNode; +import com.networknt.schema.JsonSchema; +import com.networknt.schema.JsonSchemaRef; + +public class DefaultNode { + + public static JsonNode getDefaultNode(JsonSchema schema) { + JsonNode result = schema.getSchemaNode().get("default"); + if (result == null) { + JsonSchemaRef schemaRef = JsonSchemaRefs.from(schema); + if (schemaRef != null) { + result = getDefaultNode(schemaRef.getSchema()); + } + } + return result; + } +} From 68cd4ecabff4d3b2dd0c89327932f4f63b257e76 Mon Sep 17 00:00:00 2001 From: Meer Patel Date: Sat, 30 Mar 2024 19:17:06 -0300 Subject: [PATCH 2/5] changed class name to Default and added test cases --- .../com/networknt/schema/ItemsValidator.java | 8 ++-- .../schema/ItemsValidator202012.java | 4 +- .../schema/PrefixItemsValidator.java | 4 +- .../networknt/schema/PropertiesValidator.java | 4 +- .../utils/{DefaultNode.java => Default.java} | 2 +- .../networknt/schema/utils/DefaultTest.java | 38 +++++++++++++++++++ 6 files changed, 49 insertions(+), 11 deletions(-) rename src/main/java/com/networknt/schema/utils/{DefaultNode.java => Default.java} (95%) create mode 100644 src/test/java/com/networknt/schema/utils/DefaultTest.java diff --git a/src/main/java/com/networknt/schema/ItemsValidator.java b/src/main/java/com/networknt/schema/ItemsValidator.java index 42f4fa3c6..0db1cd994 100644 --- a/src/main/java/com/networknt/schema/ItemsValidator.java +++ b/src/main/java/com/networknt/schema/ItemsValidator.java @@ -20,7 +20,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.networknt.schema.annotation.JsonNodeAnnotation; import com.networknt.schema.utils.SetView; -import com.networknt.schema.utils.DefaultNode; +import com.networknt.schema.utils.Default; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -240,7 +240,7 @@ public Set walk(ExecutionContext executionContext, JsonNode n ArrayNode arrayNode = (ArrayNode) node; JsonNode defaultNode = null; if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyArrayDefaults()) { - defaultNode = DefaultNode.getDefaultNode(this.schema); + defaultNode = Default.getDefaultNode(this.schema); } for (int i = 0; i < count; i++) { JsonNode n = arrayNode.get(i); @@ -265,7 +265,7 @@ else if (this.tupleSchema != null) { JsonNode defaultNode = null; JsonNode n = arrayNode.get(i); if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyArrayDefaults()) { - defaultNode = DefaultNode.getDefaultNode(this.tupleSchema.get(i)); + defaultNode = Default.getDefaultNode(this.tupleSchema.get(i)); } if (n != null) { if (n.isNull() && defaultNode != null) { @@ -292,7 +292,7 @@ else if (this.tupleSchema != null) { JsonNode defaultNode = null; JsonNode n = arrayNode.get(i); if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyArrayDefaults()) { - defaultNode = DefaultNode.getDefaultNode(this.additionalSchema); + defaultNode = Default.getDefaultNode(this.additionalSchema); } if (n != null) { if (n.isNull() && defaultNode != null) { diff --git a/src/main/java/com/networknt/schema/ItemsValidator202012.java b/src/main/java/com/networknt/schema/ItemsValidator202012.java index 50ff3a785..991ac8a4f 100644 --- a/src/main/java/com/networknt/schema/ItemsValidator202012.java +++ b/src/main/java/com/networknt/schema/ItemsValidator202012.java @@ -19,7 +19,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.networknt.schema.annotation.JsonNodeAnnotation; -import com.networknt.schema.utils.DefaultNode; +import com.networknt.schema.utils.Default; import com.networknt.schema.utils.SetView; import org.slf4j.Logger; @@ -120,7 +120,7 @@ public Set walk(ExecutionContext executionContext, JsonNode n JsonNode defaultNode = null; if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyArrayDefaults() && this.schema != null) { - defaultNode = DefaultNode.getDefaultNode(this.schema); + defaultNode = Default.getDefaultNode(this.schema); } boolean evaluated = false; for (int i = this.prefixCount; i < node.size(); ++i) { diff --git a/src/main/java/com/networknt/schema/PrefixItemsValidator.java b/src/main/java/com/networknt/schema/PrefixItemsValidator.java index 985620513..52babcd74 100644 --- a/src/main/java/com/networknt/schema/PrefixItemsValidator.java +++ b/src/main/java/com/networknt/schema/PrefixItemsValidator.java @@ -19,7 +19,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.networknt.schema.annotation.JsonNodeAnnotation; -import com.networknt.schema.utils.DefaultNode; +import com.networknt.schema.utils.Default; import com.networknt.schema.utils.SetView; import org.slf4j.Logger; @@ -110,7 +110,7 @@ public Set walk(ExecutionContext executionContext, JsonNode n for (int i = 0; i < count; ++i) { JsonNode n = node.get(i); if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyArrayDefaults()) { - JsonNode defaultNode = DefaultNode.getDefaultNode(this.tupleSchema.get(i)); + JsonNode defaultNode = Default.getDefaultNode(this.tupleSchema.get(i)); if (n != null) { // Defaults only set if array index is explicitly null if (n.isNull() && defaultNode != null) { diff --git a/src/main/java/com/networknt/schema/PropertiesValidator.java b/src/main/java/com/networknt/schema/PropertiesValidator.java index 7d7b6687f..1dafe3b88 100644 --- a/src/main/java/com/networknt/schema/PropertiesValidator.java +++ b/src/main/java/com/networknt/schema/PropertiesValidator.java @@ -21,7 +21,7 @@ import com.fasterxml.jackson.databind.node.MissingNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.networknt.schema.annotation.JsonNodeAnnotation; -import com.networknt.schema.utils.DefaultNode; +import com.networknt.schema.utils.Default; import com.networknt.schema.utils.SetView; import com.networknt.schema.walk.WalkListenerRunner; import org.slf4j.Logger; @@ -192,7 +192,7 @@ private void applyPropertyDefaults(ObjectNode node) { for (Map.Entry entry : this.schemas.entrySet()) { JsonNode propertyNode = node.get(entry.getKey()); - JsonNode defaultNode = DefaultNode.getDefaultNode(entry.getValue()); + JsonNode defaultNode = Default.getDefaultNode(entry.getValue()); if (defaultNode == null) { continue; } diff --git a/src/main/java/com/networknt/schema/utils/DefaultNode.java b/src/main/java/com/networknt/schema/utils/Default.java similarity index 95% rename from src/main/java/com/networknt/schema/utils/DefaultNode.java rename to src/main/java/com/networknt/schema/utils/Default.java index dbf09b2f3..80a68e0f4 100644 --- a/src/main/java/com/networknt/schema/utils/DefaultNode.java +++ b/src/main/java/com/networknt/schema/utils/Default.java @@ -4,7 +4,7 @@ import com.networknt.schema.JsonSchema; import com.networknt.schema.JsonSchemaRef; -public class DefaultNode { +public class Default { public static JsonNode getDefaultNode(JsonSchema schema) { JsonNode result = schema.getSchemaNode().get("default"); diff --git a/src/test/java/com/networknt/schema/utils/DefaultTest.java b/src/test/java/com/networknt/schema/utils/DefaultTest.java new file mode 100644 index 000000000..a55c63530 --- /dev/null +++ b/src/test/java/com/networknt/schema/utils/DefaultTest.java @@ -0,0 +1,38 @@ +package com.networknt.schema.utils; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.io.IOException; + +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.networknt.schema.JsonSchema; +import com.networknt.schema.JsonSchemaFactory; +import com.networknt.schema.JsonSchemaRef; +import com.networknt.schema.SpecVersion.VersionFlag; +public class DefaultTest { + + @Test + void testGetDefaultNodeNotNull() throws Exception { + ObjectMapper mapper = new ObjectMapper(); + JsonNode node = mapper.readTree("{\"default\": \"defaultValue\"}"); + JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V7); + JsonSchema schema = factory.getSchema(node); + JsonNode result = Default.getDefaultNode(schema); + assertNotNull(result, "Default node should not be null"); + } + + @Test + void testGetDefaultNodeEquals() throws Exception { + ObjectMapper mapper = new ObjectMapper(); + JsonNode node = mapper.readTree("{\"default\": \"defaultValue\"}"); + JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V7); + JsonSchema schema = factory.getSchema(node); + JsonNode result = Default.getDefaultNode(schema); + assertEquals("defaultValue", result.asText(), "Default node should have the default value"); + } +} \ No newline at end of file From 1ea8ae04b0c79ce34ec866f35831a7c9f82e0850 Mon Sep 17 00:00:00 2001 From: Meer Patel Date: Sat, 30 Mar 2024 22:55:07 -0300 Subject: [PATCH 3/5] changed name to Defaults --- src/main/java/com/networknt/schema/ItemsValidator.java | 8 ++++---- .../java/com/networknt/schema/ItemsValidator202012.java | 4 ++-- .../java/com/networknt/schema/PrefixItemsValidator.java | 4 ++-- .../java/com/networknt/schema/PropertiesValidator.java | 4 ++-- .../schema/utils/{Default.java => Defaults.java} | 2 +- .../schema/utils/{DefaultTest.java => DefaultsTest.java} | 6 +++--- 6 files changed, 14 insertions(+), 14 deletions(-) rename src/main/java/com/networknt/schema/utils/{Default.java => Defaults.java} (95%) rename src/test/java/com/networknt/schema/utils/{DefaultTest.java => DefaultsTest.java} (90%) diff --git a/src/main/java/com/networknt/schema/ItemsValidator.java b/src/main/java/com/networknt/schema/ItemsValidator.java index 0db1cd994..d08ee99d3 100644 --- a/src/main/java/com/networknt/schema/ItemsValidator.java +++ b/src/main/java/com/networknt/schema/ItemsValidator.java @@ -20,7 +20,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.networknt.schema.annotation.JsonNodeAnnotation; import com.networknt.schema.utils.SetView; -import com.networknt.schema.utils.Default; +import com.networknt.schema.utils.Defaults; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -240,7 +240,7 @@ public Set walk(ExecutionContext executionContext, JsonNode n ArrayNode arrayNode = (ArrayNode) node; JsonNode defaultNode = null; if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyArrayDefaults()) { - defaultNode = Default.getDefaultNode(this.schema); + defaultNode = Defaults.getDefaultNode(this.schema); } for (int i = 0; i < count; i++) { JsonNode n = arrayNode.get(i); @@ -265,7 +265,7 @@ else if (this.tupleSchema != null) { JsonNode defaultNode = null; JsonNode n = arrayNode.get(i); if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyArrayDefaults()) { - defaultNode = Default.getDefaultNode(this.tupleSchema.get(i)); + defaultNode = Defaults.getDefaultNode(this.tupleSchema.get(i)); } if (n != null) { if (n.isNull() && defaultNode != null) { @@ -292,7 +292,7 @@ else if (this.tupleSchema != null) { JsonNode defaultNode = null; JsonNode n = arrayNode.get(i); if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyArrayDefaults()) { - defaultNode = Default.getDefaultNode(this.additionalSchema); + defaultNode = Defaults.getDefaultNode(this.additionalSchema); } if (n != null) { if (n.isNull() && defaultNode != null) { diff --git a/src/main/java/com/networknt/schema/ItemsValidator202012.java b/src/main/java/com/networknt/schema/ItemsValidator202012.java index 991ac8a4f..065db6c16 100644 --- a/src/main/java/com/networknt/schema/ItemsValidator202012.java +++ b/src/main/java/com/networknt/schema/ItemsValidator202012.java @@ -19,7 +19,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.networknt.schema.annotation.JsonNodeAnnotation; -import com.networknt.schema.utils.Default; +import com.networknt.schema.utils.Defaults; import com.networknt.schema.utils.SetView; import org.slf4j.Logger; @@ -120,7 +120,7 @@ public Set walk(ExecutionContext executionContext, JsonNode n JsonNode defaultNode = null; if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyArrayDefaults() && this.schema != null) { - defaultNode = Default.getDefaultNode(this.schema); + defaultNode = Defaults.getDefaultNode(this.schema); } boolean evaluated = false; for (int i = this.prefixCount; i < node.size(); ++i) { diff --git a/src/main/java/com/networknt/schema/PrefixItemsValidator.java b/src/main/java/com/networknt/schema/PrefixItemsValidator.java index 52babcd74..987aaa929 100644 --- a/src/main/java/com/networknt/schema/PrefixItemsValidator.java +++ b/src/main/java/com/networknt/schema/PrefixItemsValidator.java @@ -19,7 +19,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.networknt.schema.annotation.JsonNodeAnnotation; -import com.networknt.schema.utils.Default; +import com.networknt.schema.utils.Defaults; import com.networknt.schema.utils.SetView; import org.slf4j.Logger; @@ -110,7 +110,7 @@ public Set walk(ExecutionContext executionContext, JsonNode n for (int i = 0; i < count; ++i) { JsonNode n = node.get(i); if (this.validationContext.getConfig().getApplyDefaultsStrategy().shouldApplyArrayDefaults()) { - JsonNode defaultNode = Default.getDefaultNode(this.tupleSchema.get(i)); + JsonNode defaultNode = Defaults.getDefaultNode(this.tupleSchema.get(i)); if (n != null) { // Defaults only set if array index is explicitly null if (n.isNull() && defaultNode != null) { diff --git a/src/main/java/com/networknt/schema/PropertiesValidator.java b/src/main/java/com/networknt/schema/PropertiesValidator.java index 1dafe3b88..b6147548e 100644 --- a/src/main/java/com/networknt/schema/PropertiesValidator.java +++ b/src/main/java/com/networknt/schema/PropertiesValidator.java @@ -21,7 +21,7 @@ import com.fasterxml.jackson.databind.node.MissingNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.networknt.schema.annotation.JsonNodeAnnotation; -import com.networknt.schema.utils.Default; +import com.networknt.schema.utils.Defaults; import com.networknt.schema.utils.SetView; import com.networknt.schema.walk.WalkListenerRunner; import org.slf4j.Logger; @@ -192,7 +192,7 @@ private void applyPropertyDefaults(ObjectNode node) { for (Map.Entry entry : this.schemas.entrySet()) { JsonNode propertyNode = node.get(entry.getKey()); - JsonNode defaultNode = Default.getDefaultNode(entry.getValue()); + JsonNode defaultNode = Defaults.getDefaultNode(entry.getValue()); if (defaultNode == null) { continue; } diff --git a/src/main/java/com/networknt/schema/utils/Default.java b/src/main/java/com/networknt/schema/utils/Defaults.java similarity index 95% rename from src/main/java/com/networknt/schema/utils/Default.java rename to src/main/java/com/networknt/schema/utils/Defaults.java index 80a68e0f4..8da093d44 100644 --- a/src/main/java/com/networknt/schema/utils/Default.java +++ b/src/main/java/com/networknt/schema/utils/Defaults.java @@ -4,7 +4,7 @@ import com.networknt.schema.JsonSchema; import com.networknt.schema.JsonSchemaRef; -public class Default { +public class Defaults { public static JsonNode getDefaultNode(JsonSchema schema) { JsonNode result = schema.getSchemaNode().get("default"); diff --git a/src/test/java/com/networknt/schema/utils/DefaultTest.java b/src/test/java/com/networknt/schema/utils/DefaultsTest.java similarity index 90% rename from src/test/java/com/networknt/schema/utils/DefaultTest.java rename to src/test/java/com/networknt/schema/utils/DefaultsTest.java index a55c63530..e77e23895 100644 --- a/src/test/java/com/networknt/schema/utils/DefaultTest.java +++ b/src/test/java/com/networknt/schema/utils/DefaultsTest.java @@ -14,7 +14,7 @@ import com.networknt.schema.JsonSchemaFactory; import com.networknt.schema.JsonSchemaRef; import com.networknt.schema.SpecVersion.VersionFlag; -public class DefaultTest { +public class DefaultsTest { @Test void testGetDefaultNodeNotNull() throws Exception { @@ -22,7 +22,7 @@ void testGetDefaultNodeNotNull() throws Exception { JsonNode node = mapper.readTree("{\"default\": \"defaultValue\"}"); JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V7); JsonSchema schema = factory.getSchema(node); - JsonNode result = Default.getDefaultNode(schema); + JsonNode result = Defaults.getDefaultNode(schema); assertNotNull(result, "Default node should not be null"); } @@ -32,7 +32,7 @@ void testGetDefaultNodeEquals() throws Exception { JsonNode node = mapper.readTree("{\"default\": \"defaultValue\"}"); JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V7); JsonSchema schema = factory.getSchema(node); - JsonNode result = Default.getDefaultNode(schema); + JsonNode result = Defaults.getDefaultNode(schema); assertEquals("defaultValue", result.asText(), "Default node should have the default value"); } } \ No newline at end of file From e78395da1f270103538e334c17768fa8c04ce644 Mon Sep 17 00:00:00 2001 From: Meer Patel Date: Thu, 4 Apr 2024 22:47:01 -0300 Subject: [PATCH 4/5] added licence and default-not-found test case --- .../java/com/networknt/schema/utils/Defaults.java | 15 +++++++++++++++ .../com/networknt/schema/utils/DefaultsTest.java | 14 +++++--------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/networknt/schema/utils/Defaults.java b/src/main/java/com/networknt/schema/utils/Defaults.java index 8da093d44..a0e0edfb7 100644 --- a/src/main/java/com/networknt/schema/utils/Defaults.java +++ b/src/main/java/com/networknt/schema/utils/Defaults.java @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2024 the original author or authors. + * + * Licensed 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 com.networknt.schema.utils; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/test/java/com/networknt/schema/utils/DefaultsTest.java b/src/test/java/com/networknt/schema/utils/DefaultsTest.java index e77e23895..e2859c18a 100644 --- a/src/test/java/com/networknt/schema/utils/DefaultsTest.java +++ b/src/test/java/com/networknt/schema/utils/DefaultsTest.java @@ -1,18 +1,12 @@ package com.networknt.schema.utils; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; - -import java.io.IOException; - import org.junit.jupiter.api.Test; - import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.networknt.schema.JsonSchema; import com.networknt.schema.JsonSchemaFactory; -import com.networknt.schema.JsonSchemaRef; import com.networknt.schema.SpecVersion.VersionFlag; public class DefaultsTest { @@ -27,12 +21,14 @@ void testGetDefaultNodeNotNull() throws Exception { } @Test - void testGetDefaultNodeEquals() throws Exception { + void testGetDefaultNodeWhenDefaultNotFound() throws Exception { ObjectMapper mapper = new ObjectMapper(); - JsonNode node = mapper.readTree("{\"default\": \"defaultValue\"}"); + // Create a JsonNode without a "default" field + JsonNode node = mapper.readTree("{\"notDefault\": \"value\"}"); JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V7); JsonSchema schema = factory.getSchema(node); JsonNode result = Defaults.getDefaultNode(schema); - assertEquals("defaultValue", result.asText(), "Default node should have the default value"); + // Assert that the result is null, as there's no "default" node in the schema + assertNull(result, "Default node should be null when 'default' node is not found in the schema"); } } \ No newline at end of file From 729ab1492806e0aff3bbb352d7b1a43c30f1bd9d Mon Sep 17 00:00:00 2001 From: Meer Patel Date: Fri, 5 Apr 2024 00:28:49 -0300 Subject: [PATCH 5/5] added DefaultNodeWhenDefaultInRef test case and javadoc --- .../com/networknt/schema/utils/Defaults.java | 36 +++++++++++++++++-- .../networknt/schema/utils/DefaultsTest.java | 19 ++++++++++ src/test/resources/mainSchema.json | 3 ++ src/test/resources/referredSchema.json | 4 +++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/mainSchema.json create mode 100644 src/test/resources/referredSchema.json diff --git a/src/main/java/com/networknt/schema/utils/Defaults.java b/src/main/java/com/networknt/schema/utils/Defaults.java index a0e0edfb7..23b26631e 100644 --- a/src/main/java/com/networknt/schema/utils/Defaults.java +++ b/src/main/java/com/networknt/schema/utils/Defaults.java @@ -19,9 +19,41 @@ import com.networknt.schema.JsonSchema; import com.networknt.schema.JsonSchemaRef; +/** + * The 'Defaults' class provides utility methods for retrieving default values + * from a JSON schema. + * + * This class contains a single static method, 'getDefaultNode', which takes a + * 'JsonSchema' object as input + * and returns the default value specified in the schema. If the schema does not + * have a default value, + * it checks if the schema has a reference to another schema and recursively + * calls itself with the referenced schema. + * + * Usage: + * JsonSchema schema = ...; // create or obtain a JSON schema + * JsonNode defaultNode = Defaults.getDefaultNode(schema); // retrieve the + * default value from the schema + * + * Note: This class requires the 'com.networknt.schema.JsonSchema' and + * 'com.networknt.schema.JsonSchemaRef' classes + * from the 'networknt/json-schema-validator' library. + */ public class Defaults { - - public static JsonNode getDefaultNode(JsonSchema schema) { + /** + * Retrieves the default value specified in the JSON schema. + * + * This method takes a 'JsonSchema' object as input and returns the default + * value specified in the schema. + * If the schema does not have a default value, it checks if the schema has a + * reference to another schema + * and recursively calls itself with the referenced schema. + * + * @param schema the JSON schema from which to retrieve the default value + * @return the default value specified in the schema, or null if no default + * value is found + */ + public static JsonNode getDefaultNode(JsonSchema schema) { JsonNode result = schema.getSchemaNode().get("default"); if (result == null) { JsonSchemaRef schemaRef = JsonSchemaRefs.from(schema); diff --git a/src/test/java/com/networknt/schema/utils/DefaultsTest.java b/src/test/java/com/networknt/schema/utils/DefaultsTest.java index e2859c18a..67b68dfd3 100644 --- a/src/test/java/com/networknt/schema/utils/DefaultsTest.java +++ b/src/test/java/com/networknt/schema/utils/DefaultsTest.java @@ -1,7 +1,11 @@ package com.networknt.schema.utils; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; + +import java.io.InputStream; + import org.junit.jupiter.api.Test; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -31,4 +35,19 @@ void testGetDefaultNodeWhenDefaultNotFound() throws Exception { // Assert that the result is null, as there's no "default" node in the schema assertNull(result, "Default node should be null when 'default' node is not found in the schema"); } + + @Test + void testGetDefaultNodeWhenDefaultInRef() throws Exception { + InputStream mainSchemaInputStream = DefaultsTest.class.getResourceAsStream("/mainSchema.json"); + InputStream referredSchemaInputStream = DefaultsTest.class.getResourceAsStream("/referredSchema.json"); + ObjectMapper mapper = new ObjectMapper(); + JsonNode mainSchemaNode = mapper.readTree(mainSchemaInputStream); + JsonNode referredSchemaNode = mapper.readTree(referredSchemaInputStream); + JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V7); + JsonSchema mainSchema = factory.getSchema(referredSchemaNode); // Use referred schema here + JsonNode result = Defaults.getDefaultNode(mainSchema); + assertNotNull(result, "Default node should not be null when 'default' node is in the referred schema"); + assertEquals("defaultValue", result.asText(), "Default node should have the default value in the referred schema"); + } + } \ No newline at end of file diff --git a/src/test/resources/mainSchema.json b/src/test/resources/mainSchema.json new file mode 100644 index 000000000..87b45735e --- /dev/null +++ b/src/test/resources/mainSchema.json @@ -0,0 +1,3 @@ +{ + "$ref": "referredSchema.json" +} diff --git a/src/test/resources/referredSchema.json b/src/test/resources/referredSchema.json new file mode 100644 index 000000000..147ef1fcc --- /dev/null +++ b/src/test/resources/referredSchema.json @@ -0,0 +1,4 @@ +{ + "type": "string", + "default": "defaultValue" +}