Skip to content

Commit 2381e48

Browse files
authored
Maintain insertion order for subschemas of CombinedSchema (#522)
Maintain insertion order for subschemas of CombinedSchema. This is an alternative to #519 that maintains the subschemas in insertion order. The subschemas were originally maintained in insertion order, but it was changed due to #405, which ensured that subschemas that were of type CombinedSchema were visited first during validation, and by #498, which tries to maintain a stable order for "equivalent" instances. This PR simply restores the insertion order, but maintains an internally sorted collection for the two purposes listed above, namely visiting subschemas during validation and equivalence checks during equals/hashCode.
1 parent 68ff15d commit 2381e48

File tree

3 files changed

+33
-6
lines changed

3 files changed

+33
-6
lines changed

core/src/main/java/org/everit/json/schema/CombinedSchema.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,8 @@ public static Builder oneOf(Collection<Schema> schemas) {
156156

157157
private final Collection<Schema> subschemas;
158158

159+
private final Collection<Schema> sortedSubschemas;
160+
159161
private final ValidationCriterion criterion;
160162

161163
/**
@@ -168,7 +170,8 @@ public CombinedSchema(Builder builder) {
168170
super(builder);
169171
this.synthetic = builder.synthetic;
170172
this.criterion = requireNonNull(builder.criterion, "criterion cannot be null");
171-
this.subschemas = sortByCombinedFirst(requireNonNull(builder.subschemas, "subschemas cannot be null"));
173+
this.subschemas = builder.subschemas;
174+
this.sortedSubschemas = sortByCombinedFirst(requireNonNull(builder.subschemas, "subschemas cannot be null"));
172175
}
173176

174177
private static int compareBySchemaType(Schema lschema, Schema rschema) {
@@ -191,10 +194,22 @@ public ValidationCriterion getCriterion() {
191194
return criterion;
192195
}
193196

197+
/**
198+
* Returns the subschemas in the order they were added.
199+
* @return the subschemas in insertion order
200+
*/
194201
public Collection<Schema> getSubschemas() {
195202
return subschemas;
196203
}
197204

205+
/*
206+
* Internal method that returns the subschemas in the order they should be visited
207+
* by the ValidatingVisitor and the equals and hashCode methods.
208+
*/
209+
Collection<Schema> subschemasWithCombinedFirst() {
210+
return sortedSubschemas;
211+
}
212+
198213
public boolean hasMultipleCombinedSchemasOfSameCriterion() {
199214
return subschemas.stream()
200215
.filter(schema -> schema instanceof CombinedSchema)
@@ -235,7 +250,7 @@ public boolean equals(Object o) {
235250
if (o instanceof CombinedSchema) {
236251
CombinedSchema that = (CombinedSchema) o;
237252
return that.canEqual(this) &&
238-
Objects.equals(subschemas, that.subschemas) &&
253+
Objects.equals(sortedSubschemas, that.sortedSubschemas) &&
239254
Objects.equals(criterion, that.criterion) &&
240255
synthetic == that.synthetic &&
241256
super.equals(that);
@@ -246,7 +261,7 @@ public boolean equals(Object o) {
246261

247262
@Override
248263
public int hashCode() {
249-
return Objects.hash(super.hashCode(), subschemas, criterion, synthetic);
264+
return Objects.hash(super.hashCode(), sortedSubschemas, criterion, synthetic);
250265
}
251266

252267
@Override

core/src/main/java/org/everit/json/schema/ValidatingVisitor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ void visitStringSchema(StringSchema stringSchema) {
157157

158158
@Override
159159
void visitCombinedSchema(CombinedSchema combinedSchema) {
160-
Collection<Schema> subschemas = combinedSchema.getSubschemas();
160+
Collection<Schema> subschemas = combinedSchema.subschemasWithCombinedFirst();
161161
List<ValidationException> failures = new ArrayList<>(subschemas.size());
162162
CombinedSchema.ValidationCriterion criterion = combinedSchema.getCriterion();
163163
for (Schema subschema : subschemas) {

core/src/test/java/org/everit/json/schema/CombinedSchemaTest.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void subschemasSort() {
6868
.isSynthetic(true)
6969
.build();
7070

71-
Object[] subschemas = subject.getSubschemas().toArray();
71+
Object[] subschemas = subject.subschemasWithCombinedFirst().toArray();
7272

7373
assertEquals(8, subschemas.length);
7474
assertEquals(subcombined1, subschemas[0]);
@@ -79,6 +79,18 @@ public void subschemasSort() {
7979
assertEquals(booleanSchema2, subschemas[5]);
8080
assertEquals(emptySchema2, subschemas[6]);
8181
assertEquals(nullSchema2, subschemas[7]);
82+
83+
subschemas = subject.getSubschemas().toArray();
84+
85+
assertEquals(8, subschemas.length);
86+
assertEquals(nullSchema1, subschemas[0]);
87+
assertEquals(emptySchema1, subschemas[1]);
88+
assertEquals(booleanSchema1, subschemas[2]);
89+
assertEquals(subcombined1, subschemas[3]);
90+
assertEquals(booleanSchema2, subschemas[4]);
91+
assertEquals(emptySchema2, subschemas[5]);
92+
assertEquals(nullSchema2, subschemas[6]);
93+
assertEquals(subcombined2, subschemas[7]);
8294
}
8395

8496
@Test
@@ -172,7 +184,7 @@ public void reportCauses() {
172184
public void equalsVerifier() {
173185
EqualsVerifier.forClass(CombinedSchema.class)
174186
.withRedefinedSuperclass()
175-
.withIgnoredFields("schemaLocation", "location")
187+
.withIgnoredFields("schemaLocation", "location", "subschemas")
176188
.suppress(Warning.STRICT_INHERITANCE)
177189
.verify();
178190
}

0 commit comments

Comments
 (0)