Skip to content

Commit 1d711f4

Browse files
erosbtkledkov
andauthored
CombinedSchema#equals() fix (#498)
Fixes #497 - makes subschema sorting deterministic in CombinedSchema to resolve issue with equals() being unreliable. Co-authored-by: tkledkov <[email protected]>
1 parent dcce41d commit 1d711f4

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

core/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@
259259
<dependency>
260260
<groupId>nl.jqno.equalsverifier</groupId>
261261
<artifactId>equalsverifier</artifactId>
262-
<version>3.8.2</version>
262+
<version>3.15.3</version>
263263
<scope>test</scope>
264264
</dependency>
265265
<dependency>

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,12 @@ public CombinedSchema(Builder builder) {
172172
}
173173

174174
private static int compareBySchemaType(Schema lschema, Schema rschema) {
175-
return lschema instanceof CombinedSchema ?
176-
(rschema instanceof CombinedSchema ? 0 : -1) :
177-
(rschema instanceof CombinedSchema ? 1 : 0);
175+
boolean leftSchemaIsCombined = lschema instanceof CombinedSchema;
176+
boolean rightIsCombined = rschema instanceof CombinedSchema;
177+
int defaultRetval = lschema.hashCode() - rschema.hashCode();
178+
return leftSchemaIsCombined ?
179+
(rightIsCombined ? defaultRetval : -1) :
180+
(rightIsCombined ? 1 : defaultRetval);
178181
}
179182

180183
// ensure subschemas of type CombinedSchema are always visited first

core/src/test/java/org/everit/json/schema/loader/CombinedSchemaLoaderTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import static org.junit.jupiter.api.Assertions.*;
88

99
import java.util.HashSet;
10+
import java.util.Objects;
1011
import java.util.Set;
1112

1213
import org.everit.json.schema.BooleanSchema;
@@ -16,6 +17,7 @@
1617
import org.everit.json.schema.SchemaLocation;
1718
import org.everit.json.schema.StringSchema;
1819
import org.json.JSONObject;
20+
import org.json.JSONTokener;
1921
import org.junit.jupiter.api.Test;
2022

2123
/**
@@ -75,4 +77,19 @@ public void multipleCombinedSchemasAtTheSameNestingLevel() {
7577
assertEquals(expected, actual);
7678
}
7779

80+
@Test
81+
public void loadTheSameCombinedSeveralTimes() {
82+
JSONObject json = new JSONObject(new JSONTokener("{\"enum\": [\"V1\", \"V2\", \"V3\"],\"type\": \"string\"}"));
83+
84+
for (int i = 0; i < 100000; ++i) {
85+
Schema s0 = SchemaLoader.load(json);
86+
Schema s1 = SchemaLoader.load(json);
87+
88+
System.out.println("Iter: " + i + ", equals=" + Objects.equals(s0, s1));
89+
90+
if (i > 10) {
91+
assertEquals(s0, s1);
92+
}
93+
}
94+
}
7895
}

0 commit comments

Comments
 (0)