Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions core/src/main/java/org/everit/json/schema/ReferenceSchema.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ public static class Builder extends Schema.Builder<ReferenceSchema> {
*/
private String refValue = "";

/**
* Map to store retval and location
*/
private Map<SchemaLocation, ReferenceSchema> retvalMap = new HashMap<>();

/**
* This method caches its result, so multiple invocations will return referentially the same
* {@link ReferenceSchema} instance.
Expand All @@ -36,6 +41,10 @@ public ReferenceSchema build() {
if (retval == null) {
retval = new ReferenceSchema(this);
}
// store it in the map, so we can retrieve appropriate retval based on schema location
if (retval.getLocation() != null) {
retvalMap.put(retval.getLocation(), retval);
}
return retval;
}

Expand All @@ -46,6 +55,15 @@ public Builder refValue(String refValue) {

@Override public ReferenceSchema.Builder unprocessedProperties(Map<String, Object> unprocessedProperties) {
if (retval != null) {
// create brand new reference schema
ReferenceSchema brandNewRefSchema = new ReferenceSchema(this);
brandNewRefSchema.setReferredSchema(retval.getReferredSchema());
// if schema exists return from the map.
if (retvalMap.containsKey(brandNewRefSchema.getLocation())) {
retval = retvalMap.get(brandNewRefSchema.getLocation());
} else if (brandNewRefSchema.getReferredSchema() != null) {
retval = brandNewRefSchema;
}
retval.unprocessedProperties = new HashMap<>(unprocessedProperties);
}
super.unprocessedProperties(unprocessedProperties);
Expand Down
12 changes: 12 additions & 0 deletions core/src/test/java/org/everit/json/schema/ReferenceSchemaTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -107,13 +107,25 @@ public void unprocessedPropertiesAfterSettingRefSchema() {
public void unprocessedPropertiesAfterBuild() {
Builder builder = ReferenceSchema.builder()
.refValue("#/pointer");
builder.schemaLocation(SchemaLocation.empty().addPointerSegment("key"));
ReferenceSchema subject = builder
.build();
subject.setReferredSchema(EmptySchema.builder().build());
builder.unprocessedProperties(UNPROC_PROPS);
assertEquals(UNPROC_PROPS, subject.getUnprocessedProperties());
}

@Test
public void unprocessedPropertiesAfterBuildWithNoLocation() {
Builder builder = ReferenceSchema.builder()
.refValue("#/pointer");
ReferenceSchema subject = builder
.build();
subject.setReferredSchema(EmptySchema.builder().build());
builder.unprocessedProperties(UNPROC_PROPS);
assertTrue(subject.getUnprocessedProperties().isEmpty());
}

@Test
public void emptyUnprocessedProperties() {
ReferenceSchema subject = ReferenceSchema.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -747,23 +747,43 @@ public void commonPropsAreNotUnprocessedProps() {

@Test
public void unprocessedPropertiesAreLoadedForRefElement() {
SchemaLoader loader = SchemaLoader.builder()
SchemaLoader loader =
SchemaLoader.builder()
.draftV7Support()
.useDefaults(true)
.schemaJson(get("schemaRefWithUnprocessedProperties"))
.build();
ObjectSchema actual = (ObjectSchema) loader.load().build();

assertEquals(ImmutableMap.of(
"unproc8", false
), ((ReferenceSchema) actual.getPropertySchemas().get("prop4")).getReferredSchema().getUnprocessedProperties());
"unproc6", false
), actual.getPropertySchemas().get("prop3").getUnprocessedProperties());

assertEquals(ImmutableMap.of("unproc4", true, "unproc5", JSONObject.NULL),
actual.getPropertySchemas().get("prop2").getUnprocessedProperties());
assertEquals(
ImmutableMap.of("unproc8", false),
((ReferenceSchema) actual.getPropertySchemas().get("prop4"))
.getReferredSchema()
.getUnprocessedProperties());

assertEquals(ImmutableMap.of(
"unproc7", JSONObject.NULL
), actual.getPropertySchemas().get("prop4").getUnprocessedProperties());
assertEquals(
ImmutableMap.of("unproc4", true, "unproc5", JSONObject.NULL),
actual.getPropertySchemas().get("prop2").getUnprocessedProperties());

assertEquals(
ImmutableMap.of("unproc7", JSONObject.NULL),
actual.getPropertySchemas().get("prop4").getUnprocessedProperties());

assertEquals(
ImmutableMap.of("unproc8", false),
((ReferenceSchema) actual.getPropertySchemas().get("prop4")).getReferredSchema().getUnprocessedProperties());

assertEquals(
ImmutableMap.of("unproc9", ImmutableMap.of("unproc9-01",false)),
actual.getPropertySchemas().get("prop5").getUnprocessedProperties());

assertEquals(
ImmutableMap.of("unproc8", false),
((ReferenceSchema) actual.getPropertySchemas().get("prop5")).getReferredSchema().getUnprocessedProperties());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -722,6 +722,12 @@
"prop4": {
"$ref": "#/definitions/dateMonthDayYear",
"unproc7": null
},
"prop5": {
"$ref": "#/definitions/dateMonthDayYear",
"unproc9": {
"unproc9-01": false
}
}
}
}
Expand Down