Skip to content

Commit cd15a50

Browse files
committed
fixing #259 in an other way that doesn't break the mutability of the Schema class
1 parent 35a5357 commit cd15a50

File tree

4 files changed

+77
-21
lines changed

4 files changed

+77
-21
lines changed

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

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import static java.util.Objects.requireNonNull;
44

5+
import java.util.HashMap;
6+
import java.util.Map;
57
import java.util.Objects;
68

79
import org.everit.json.schema.internal.JSONPrinter;
@@ -34,15 +36,21 @@ public ReferenceSchema build() {
3436
if (retval == null) {
3537
retval = new ReferenceSchema(this);
3638
}
37-
// adding unprocessed properties from the parent to the actual referenced schema
38-
retval.appendUnprocessedProperties(new ReferenceSchema(this).getUnprocessedProperties());
3939
return retval;
4040
}
4141

4242
public Builder refValue(String refValue) {
4343
this.refValue = refValue;
4444
return this;
4545
}
46+
47+
@Override public ReferenceSchema.Builder unprocessedProperties(Map<String, Object> unprocessedProperties) {
48+
if (retval != null) {
49+
retval.unprocessedProperties = new HashMap<>(unprocessedProperties);
50+
}
51+
super.unprocessedProperties(unprocessedProperties);
52+
return this;
53+
}
4654
}
4755

4856
public static Builder builder() {
@@ -53,9 +61,12 @@ public static Builder builder() {
5361

5462
private final String refValue;
5563

64+
private Map<String, Object> unprocessedProperties;
65+
5666
public ReferenceSchema(final Builder builder) {
5767
super(builder);
5868
this.refValue = requireNonNull(builder.refValue, "refValue cannot be null");
69+
this.unprocessedProperties = builder.unprocessedProperties;
5970
}
6071

6172
@Override
@@ -92,6 +103,7 @@ public boolean equals(Object o) {
92103
ReferenceSchema that = (ReferenceSchema) o;
93104
return that.canEqual(this) &&
94105
Objects.equals(refValue, that.refValue) &&
106+
Objects.equals(unprocessedProperties, that.unprocessedProperties) &&
95107
Objects.equals(referredSchema, that.referredSchema) &&
96108
super.equals(that);
97109
} else {
@@ -101,7 +113,7 @@ public boolean equals(Object o) {
101113

102114
@Override
103115
public int hashCode() {
104-
return Objects.hash(super.hashCode(), referredSchema, refValue);
116+
return Objects.hash(super.hashCode(), referredSchema, refValue, unprocessedProperties);
105117
}
106118

107119
@Override
@@ -117,4 +129,8 @@ protected boolean canEqual(Object other) {
117129
writer.key("$ref");
118130
writer.value(refValue);
119131
}
132+
133+
@Override public Map<String, Object> getUnprocessedProperties() {
134+
return unprocessedProperties;
135+
}
120136
}

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public abstract static class Builder<S extends Schema> {
4141

4242
private Boolean writeOnly = null;
4343

44-
private Map<String, Object> unprocessedProperties = new HashMap<>(0);
44+
public Map<String, Object> unprocessedProperties = new HashMap<>(0);
4545

4646
public Builder<S> title(String title) {
4747
this.title = title;
@@ -272,14 +272,6 @@ public Map<String, Object> getUnprocessedProperties() {
272272
return unmodifiableMap(unprocessedProperties);
273273
}
274274

275-
/**
276-
* Append properties to unprocessed properties.
277-
* @param unprocessedProperties
278-
*/
279-
public void appendUnprocessedProperties(Map<String, Object> unprocessedProperties){
280-
this.unprocessedProperties.putAll(unprocessedProperties);
281-
}
282-
283275
/**
284276
* Describes the instance as a JSONObject to {@code writer}.
285277
* <p>
@@ -301,7 +293,7 @@ public void describeTo(JSONPrinter writer) {
301293
writer.ifPresent("readOnly", readOnly);
302294
writer.ifPresent("writeOnly", writeOnly);
303295
describePropertiesTo(writer);
304-
unprocessedProperties.forEach((key, val) -> {
296+
getUnprocessedProperties().forEach((key, val) -> {
305297
writer.key(key).value(val);
306298
});
307299
writer.endObject();

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

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
*/
1616
package org.everit.json.schema;
1717

18+
import static java.util.Collections.emptyMap;
1819
import static org.everit.json.schema.TestSupport.buildWithLocation;
20+
import static org.junit.Assert.assertEquals;
1921
import static org.junit.Assert.assertTrue;
2022

2123
import org.everit.json.schema.ReferenceSchema.Builder;
@@ -24,11 +26,15 @@
2426
import org.junit.Assert;
2527
import org.junit.Test;
2628

29+
import com.google.common.collect.ImmutableMap;
30+
2731
import nl.jqno.equalsverifier.EqualsVerifier;
2832
import nl.jqno.equalsverifier.Warning;
2933

3034
public class ReferenceSchemaTest {
3135

36+
public static final ImmutableMap<String, Object> UNPROC_PROPS = ImmutableMap.of("unproc", true);
37+
3238
@Test
3339
public void constructorMustRunOnlyOnce() {
3440
Builder builder = ReferenceSchema.builder();
@@ -77,11 +83,50 @@ public void equalsVerifier() {
7783
.verify();
7884
}
7985

86+
@Test
87+
public void unprocessedPropertiesBeforeSettingRefSchema() {
88+
ReferenceSchema subject = ReferenceSchema.builder()
89+
.unprocessedProperties(UNPROC_PROPS)
90+
.refValue("#/pointer")
91+
.build();
92+
subject.setReferredSchema(EmptySchema.builder().build());
93+
assertEquals(UNPROC_PROPS, subject.getUnprocessedProperties());
94+
}
95+
96+
@Test
97+
public void unprocessedPropertiesAfterSettingRefSchema() {
98+
ReferenceSchema subject = ReferenceSchema.builder()
99+
.refValue("#/pointer")
100+
.unprocessedProperties(UNPROC_PROPS)
101+
.build();
102+
subject.setReferredSchema(EmptySchema.builder().build());
103+
assertEquals(UNPROC_PROPS, subject.getUnprocessedProperties());
104+
}
105+
106+
@Test
107+
public void unprocessedPropertiesAfterBuild() {
108+
Builder builder = ReferenceSchema.builder()
109+
.refValue("#/pointer");
110+
ReferenceSchema subject = builder
111+
.build();
112+
subject.setReferredSchema(EmptySchema.builder().build());
113+
builder.unprocessedProperties(UNPROC_PROPS);
114+
assertEquals(UNPROC_PROPS, subject.getUnprocessedProperties());
115+
}
116+
117+
@Test
118+
public void emptyUnprocessedProperties() {
119+
ReferenceSchema subject = ReferenceSchema.builder()
120+
.refValue("#/pointer")
121+
.build();
122+
subject.setReferredSchema(EmptySchema.builder().build());
123+
assertEquals(emptyMap(), subject.getUnprocessedProperties());
124+
}
125+
80126
@Test
81127
public void toStringTest() {
82128
JSONObject rawSchemaJson = ResourceLoader.DEFAULT.readObj("tostring/ref.json");
83129
String actual = SchemaLoader.load(rawSchemaJson).toString();
84-
System.out.println(actual);
85130
assertTrue(ObjectComparator.deepEquals(rawSchemaJson.query("/properties"),
86131
new JSONObject(actual).query("/properties")));
87132
}

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -748,18 +748,21 @@ public void commonPropsAreNotUnprocessedProps() {
748748
@Test
749749
public void unprocessedPropertiesAreLoadedForRefElement() {
750750
SchemaLoader loader = SchemaLoader.builder()
751-
.draftV7Support()
752-
.useDefaults(true)
753-
.schemaJson(get("schemaRefWithUnprocessedProperties"))
754-
.build();
751+
.draftV7Support()
752+
.useDefaults(true)
753+
.schemaJson(get("schemaRefWithUnprocessedProperties"))
754+
.build();
755755
ObjectSchema actual = (ObjectSchema) loader.load().build();
756756

757757
assertEquals(ImmutableMap.of(
758-
"unproc8", false
759-
), ((ReferenceSchema)actual.getPropertySchemas().get("prop4")).getReferredSchema().getUnprocessedProperties());
758+
"unproc8", false
759+
), ((ReferenceSchema) actual.getPropertySchemas().get("prop4")).getReferredSchema().getUnprocessedProperties());
760+
761+
assertEquals(ImmutableMap.of("unproc4", true, "unproc5", JSONObject.NULL),
762+
actual.getPropertySchemas().get("prop2").getUnprocessedProperties());
760763

761764
assertEquals(ImmutableMap.of(
762-
"unproc7", JSONObject.NULL
765+
"unproc7", JSONObject.NULL
763766
), actual.getPropertySchemas().get("prop4").getUnprocessedProperties());
764767
}
765768

0 commit comments

Comments
 (0)