Skip to content

Commit 9c24e16

Browse files
committed
Use LinkedHashSets for ValidationMessages
For things that might be read by humans, maintaining order can be valuable. This change uses LinkedHashSet rather than HashSet to maintain the iteration order of error in the order they're encountered. Additionally, there are a few optimzations in validators: - Using singletonSet and emptySet rather than a *HashSet when appropriate - Map iteration optimization - StringBuilder optimization
1 parent 03f5ef2 commit 9c24e16

28 files changed

+111
-121
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public AdditionalPropertiesValidator(String schemaPath, JsonNode schemaNode, Jso
6666
public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String at) {
6767
if (logger.isDebugEnabled()) debug(logger, node, rootNode, at);
6868

69-
Set<ValidationMessage> errors = new HashSet<ValidationMessage>();
69+
Set<ValidationMessage> errors = new LinkedHashSet<ValidationMessage>();
7070
if (!node.isObject()) {
7171
// ignore no object
7272
return errors;
@@ -97,7 +97,7 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
9797
}
9898
}
9999
}
100-
return errors;
100+
return Collections.unmodifiableSet(errors);
101101
}
102102

103103
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
import org.slf4j.LoggerFactory;
2323

2424
import java.util.ArrayList;
25-
import java.util.HashSet;
25+
import java.util.Collections;
26+
import java.util.LinkedHashSet;
2627
import java.util.List;
2728
import java.util.Set;
2829

@@ -43,13 +44,13 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
4344
debug(logger, node, rootNode, at);
4445

4546
int size = schemas.size();
46-
Set<ValidationMessage> errors = new HashSet<ValidationMessage>();
47+
Set<ValidationMessage> errors = new LinkedHashSet<ValidationMessage>();
4748

4849
for (int i = 0; i < size; i++) {
4950
errors.addAll(schemas.get(i).validate(node, rootNode, at));
5051
}
5152

52-
return errors;
53+
return Collections.unmodifiableSet(errors);
5354
}
5455

5556
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
import org.slf4j.LoggerFactory;
2323

2424
import java.util.ArrayList;
25-
import java.util.HashSet;
25+
import java.util.Collections;
26+
import java.util.LinkedHashSet;
2627
import java.util.List;
2728
import java.util.Set;
2829

@@ -43,7 +44,7 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
4344
debug(logger, node, rootNode, at);
4445

4546
int size = schemas.size();
46-
Set<ValidationMessage> allErrors = new HashSet<ValidationMessage>();
47+
Set<ValidationMessage> allErrors = new LinkedHashSet<ValidationMessage>();
4748

4849
for (int i = 0; i < size; i++) {
4950
Set<ValidationMessage> errors = schemas.get(i).validate(node, rootNode, at);
@@ -53,7 +54,7 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
5354
allErrors.addAll(errors);
5455
}
5556

56-
return allErrors;
57+
return Collections.unmodifiableSet(allErrors);
5758
}
5859

5960
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public DependenciesValidator(String schemaPath, JsonNode schemaNode, JsonSchema
5555
public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String at) {
5656
debug(logger, node, rootNode, at);
5757

58-
Set<ValidationMessage> errors = new HashSet<ValidationMessage>();
58+
Set<ValidationMessage> errors = new LinkedHashSet<ValidationMessage>();
5959

6060
for (Iterator<String> it = node.fieldNames(); it.hasNext(); ) {
6161
String pname = it.next();
@@ -73,7 +73,7 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
7373
}
7474
}
7575

76-
return errors;
76+
return Collections.unmodifiableSet(errors);
7777
}
7878

7979
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
import org.slf4j.LoggerFactory;
2323

2424
import java.util.ArrayList;
25-
import java.util.HashSet;
25+
import java.util.Collections;
26+
import java.util.LinkedHashSet;
2627
import java.util.List;
2728
import java.util.Set;
2829

@@ -57,13 +58,13 @@ public EnumValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentSc
5758
public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String at) {
5859
debug(logger, node, rootNode, at);
5960

60-
Set<ValidationMessage> errors = new HashSet<ValidationMessage>();
61+
Set<ValidationMessage> errors = new LinkedHashSet<ValidationMessage>();
6162

6263
if (!nodes.contains(node)) {
6364
errors.add(buildValidationMessage(at, error));
6465
}
6566

66-
return errors;
67+
return Collections.unmodifiableSet(errors);
6768
}
6869

6970
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121
import org.slf4j.Logger;
2222
import org.slf4j.LoggerFactory;
2323

24+
import java.util.Collections;
2425
import java.util.HashMap;
25-
import java.util.HashSet;
26+
import java.util.LinkedHashSet;
2627
import java.util.Map;
2728
import java.util.Set;
2829
import java.util.regex.Matcher;
@@ -74,7 +75,7 @@ public FormatValidator(String schemaPath, JsonNode schemaNode, JsonSchema parent
7475
public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String at) {
7576
debug(logger, node, rootNode, at);
7677

77-
Set<ValidationMessage> errors = new HashSet<ValidationMessage>();
78+
Set<ValidationMessage> errors = new LinkedHashSet<ValidationMessage>();
7879

7980
JsonType nodeType = TypeFactory.getValueNodeType(node);
8081
if (nodeType != JsonType.STRING) {
@@ -93,7 +94,7 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
9394
}
9495
}
9596

96-
return errors;
97+
return Collections.unmodifiableSet(errors);
9798
}
9899

99100
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
import org.slf4j.LoggerFactory;
2323

2424
import java.util.ArrayList;
25-
import java.util.HashSet;
25+
import java.util.Collections;
26+
import java.util.LinkedHashSet;
2627
import java.util.List;
2728
import java.util.Set;
2829

@@ -61,7 +62,7 @@ public ItemsValidator(String schemaPath, JsonNode schemaNode, JsonSchema parentS
6162
public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String at) {
6263
debug(logger, node, rootNode, at);
6364

64-
Set<ValidationMessage> errors = new HashSet<ValidationMessage>();
65+
Set<ValidationMessage> errors = new LinkedHashSet<ValidationMessage>();
6566

6667
if (!node.isArray()) {
6768
// ignores non-arrays
@@ -93,7 +94,7 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
9394

9495
i++;
9596
}
96-
return errors;
97+
return Collections.unmodifiableSet(errors);
9798
}
9899

99100
}

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import org.slf4j.Logger;
2222
import org.slf4j.LoggerFactory;
2323

24-
import java.util.HashSet;
24+
import java.util.Collections;
2525
import java.util.Set;
2626

2727
public class MaxItemsValidator extends BaseJsonValidator implements JsonValidator {
@@ -41,15 +41,13 @@ public MaxItemsValidator(String schemaPath, JsonNode schemaNode, JsonSchema pare
4141
public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String at) {
4242
debug(logger, node, rootNode, at);
4343

44-
Set<ValidationMessage> errors = new HashSet<ValidationMessage>();
45-
4644
if (node.isArray()) {
4745
if (node.size() > max) {
48-
errors.add(buildValidationMessage(at, "" + max));
46+
return Collections.singleton(buildValidationMessage(at, "" + max));
4947
}
5048
}
5149

52-
return errors;
50+
return Collections.emptySet();
5351
}
5452

5553
}

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import org.slf4j.Logger;
2222
import org.slf4j.LoggerFactory;
2323

24-
import java.util.HashSet;
24+
import java.util.Collections;
2525
import java.util.Set;
2626

2727
public class MaxLengthValidator extends BaseJsonValidator implements JsonValidator {
@@ -43,15 +43,14 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
4343
debug(logger, node, rootNode, at);
4444

4545
JsonType nodeType = TypeFactory.getValueNodeType(node);
46-
Set<ValidationMessage> errors = new HashSet<ValidationMessage>();
4746
if (nodeType != JsonType.STRING) {
4847
// ignore no-string typs
49-
return errors;
48+
return Collections.emptySet();
5049
}
5150
if (node.textValue().codePointCount(0, node.textValue().length()) > maxLength) {
52-
errors.add(buildValidationMessage(at, "" + maxLength));
51+
return Collections.singleton(buildValidationMessage(at, "" + maxLength));
5352
}
54-
return errors;
53+
return Collections.emptySet();
5554
}
5655

5756
}

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import org.slf4j.Logger;
2222
import org.slf4j.LoggerFactory;
2323

24-
import java.util.HashSet;
24+
import java.util.Collections;
2525
import java.util.Set;
2626

2727
public class MaxPropertiesValidator extends BaseJsonValidator implements JsonValidator {
@@ -42,15 +42,13 @@ public MaxPropertiesValidator(String schemaPath, JsonNode schemaNode, JsonSchema
4242
public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String at) {
4343
debug(logger, node, rootNode, at);
4444

45-
Set<ValidationMessage> errors = new HashSet<ValidationMessage>();
46-
4745
if (node.isObject()) {
4846
if (node.size() > max) {
49-
errors.add(buildValidationMessage(at, "" + max));
47+
return Collections.singleton(buildValidationMessage(at, "" + max));
5048
}
5149
}
5250

53-
return errors;
51+
return Collections.emptySet();
5452
}
5553

5654
}

0 commit comments

Comments
 (0)