Skip to content

Commit 937105f

Browse files
authored
Fix patternProperties annotation (#955)
1 parent fb40864 commit 937105f

File tree

2 files changed

+50
-2
lines changed

2 files changed

+50
-2
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,10 @@ public Set<ValidationMessage> validate(ExecutionContext executionContext, JsonNo
8686
executionContext.getAnnotations()
8787
.put(JsonNodeAnnotation.builder().instanceLocation(instanceLocation)
8888
.evaluationPath(this.evaluationPath).schemaLocation(this.schemaLocation)
89-
.keyword(getKeyword()).value(matchedInstancePropertyNames).build());
89+
.keyword(getKeyword())
90+
.value(matchedInstancePropertyNames != null ? matchedInstancePropertyNames
91+
: Collections.emptySet())
92+
.build());
9093
}
9194
return errors == null ? Collections.emptySet() : Collections.unmodifiableSet(errors);
9295
}

src/test/java/com/networknt/schema/PatternPropertiesValidatorTest.java

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,17 @@
1818

1919
import com.fasterxml.jackson.databind.JsonNode;
2020
import com.networknt.schema.SpecVersion.VersionFlag;
21+
import com.networknt.schema.output.OutputUnit;
2122

2223
import org.junit.jupiter.api.Assertions;
2324
import org.junit.jupiter.api.Test;
2425

2526
import static org.junit.jupiter.api.Assertions.assertEquals;
2627
import static org.junit.jupiter.api.Assertions.assertFalse;
2728
import static org.junit.jupiter.api.Assertions.assertNull;
29+
import static org.junit.jupiter.api.Assertions.assertTrue;
2830

31+
import java.util.HashSet;
2932
import java.util.Set;
3033

3134
/**
@@ -108,7 +111,49 @@ void message() {
108111
assertEquals("999", message.getInstanceNode().toString());
109112
assertEquals("/valid_array/0: integer found, string expected", message.getMessage());
110113
assertNull(message.getProperty());
114+
}
111115

112-
116+
@SuppressWarnings("unchecked")
117+
@Test
118+
void annotation() {
119+
String schemaData = "{\n"
120+
+ " \"$id\": \"https://www.example.org/schema\",\n"
121+
+ " \"type\": \"object\",\n"
122+
+ " \"patternProperties\": {\n"
123+
+ " \"^valid_\": {\n"
124+
+ " \"type\": [\"array\", \"string\"],\n"
125+
+ " \"items\": {\n"
126+
+ " \"type\": \"string\"\n"
127+
+ " }\n"
128+
+ " }\n"
129+
+ " }\n"
130+
+ "}";
131+
JsonSchemaFactory factory = JsonSchemaFactory.getInstance(VersionFlag.V202012);
132+
SchemaValidatorsConfig config = new SchemaValidatorsConfig();
133+
config.setPathType(PathType.JSON_POINTER);
134+
JsonSchema schema = factory.getSchema(schemaData, config);
135+
String inputData = "{\n"
136+
+ " \"test\": 5\n"
137+
+ "}";
138+
OutputUnit outputUnit = schema.validate(inputData, InputFormat.JSON, OutputFormat.HIERARCHICAL, executionContext -> {
139+
executionContext.getExecutionConfig().setAnnotationCollectionEnabled(true);
140+
executionContext.getExecutionConfig().setAnnotationCollectionFilter(keyword -> true);
141+
});
142+
Set<String> patternProperties = (Set<String>) outputUnit.getAnnotations().get("patternProperties");
143+
assertTrue(patternProperties.isEmpty());
144+
145+
inputData = "{\n"
146+
+ " \"valid_array\": [\"999\", \"2\"],\n"
147+
+ " \"valid_string\": \"string_value\""
148+
+ "}";
149+
outputUnit = schema.validate(inputData, InputFormat.JSON, OutputFormat.HIERARCHICAL, executionContext -> {
150+
executionContext.getExecutionConfig().setAnnotationCollectionEnabled(true);
151+
executionContext.getExecutionConfig().setAnnotationCollectionFilter(keyword -> true);
152+
});
153+
patternProperties = (Set<String>) outputUnit.getAnnotations().get("patternProperties");
154+
Set<String> all = new HashSet<>();
155+
all.add("valid_array");
156+
all.add("valid_string");
157+
assertTrue(patternProperties.containsAll(patternProperties));
113158
}
114159
}

0 commit comments

Comments
 (0)