Skip to content

Commit 5dc929e

Browse files
authored
Improve schema retrieval docs (#959)
1 parent e60f81f commit 5dc929e

File tree

2 files changed

+86
-26
lines changed

2 files changed

+86
-26
lines changed

doc/schema-retrieval.md

Lines changed: 85 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,100 @@ In the event a schema references a schema identifier that is not a subschema res
66

77
In the event that the schema does not define a schema identifier using the `$id` keyword, the retrieval IRI will be used as it's schema identifier.
88

9+
## Loading Schemas from memory
10+
11+
Schemas can be loaded through a map.
12+
13+
```java
14+
String schemaData = "{\r\n"
15+
+ " \"type\": \"integer\"\r\n"
16+
+ "}";
17+
Map<String, String> schemas = Collections.singletonMap("https://www.example.com/integer.json", schemaData);
18+
JsonSchemaFactory schemaFactory = JsonSchemaFactory
19+
.getInstance(VersionFlag.V7,
20+
builder -> builder.schemaLoaders(schemaLoaders -> schemaLoaders.schemas(schemas)));
21+
```
22+
23+
Schemas can be loaded through a function.
24+
25+
```java
26+
String schemaData = "{\r\n"
27+
+ " \"type\": \"integer\"\r\n"
28+
+ "}";
29+
Map<String, String> schemas = Collections.singletonMap("https://www.example.com/integer.json", schemaData);
30+
JsonSchemaFactory schemaFactory = JsonSchemaFactory
31+
.getInstance(VersionFlag.V7,
32+
builder -> builder.schemaLoaders(schemaLoaders -> schemaLoaders.schemas(schemas::get)));
33+
```
34+
35+
Schemas can also be loaded in the following manner.
36+
37+
```java
38+
class RegistryEntry {
39+
private final String schemaData;
40+
41+
public RegistryEntry(String schemaData) {
42+
this.schemaData = schemaData;
43+
}
44+
45+
public String getSchemaData() {
46+
return this.schemaData;
47+
}
48+
}
49+
50+
String schemaData = "{\r\n"
51+
+ " \"type\": \"integer\"\r\n"
52+
+ "}";
53+
Map<String, RegistryEntry> registry = Collections
54+
.singletonMap("https://www.example.com/integer.json", new RegistryEntry(schemaData));
55+
JsonSchemaFactory schemaFactory = JsonSchemaFactory
56+
.getInstance(VersionFlag.V7, builder -> builder
57+
.schemaLoaders(schemaLoaders -> schemaLoaders.schemas(registry::get, RegistryEntry::getSchemaData)));
58+
```
59+
960
## Mapping Schema Identifier to Retrieval IRI
1061

1162
The schema identifier can be mapped to the retrieval IRI by implementing the `SchemaMapper` interface.
1263

1364
### Configuring Schema Mapper
1465

1566
```java
16-
JsonSchemaFactory schemaFactory = JsonSchemaFactory.builder()
17-
.schemaMappers(schemaMappers -> schemaMappers
18-
.add(new CustomSchemaMapper())
19-
.addMetaSchema(JsonMetaSchema.getV7())
20-
.defaultMetaSchemaURI(JsonMetaSchema.getV7().getUri())
21-
.build();
67+
class CustomSchemaMapper implements SchemaMapper {
68+
@Override
69+
public AbsoluteIri map(AbsoluteIri absoluteIRI) {
70+
String iri = absoluteIRI.toString();
71+
if ("https://www.example.com/integer.json".equals(iri)) {
72+
return AbsoluteIri.of("classpath:schemas/integer.json");
73+
}
74+
return null;
75+
}
76+
}
77+
78+
JsonSchemaFactory schemaFactory = JsonSchemaFactory
79+
.getInstance(VersionFlag.V7,
80+
builder -> builder.schemaMappers(schemaMappers -> schemaMappers.add(new CustomSchemaMapper())));
2281
```
2382

2483
### Configuring Prefix Mappings
2584

2685
```java
27-
JsonSchemaFactory schemaFactory = JsonSchemaFactory.builder()
28-
.schemaMappers(schemaMappers -> schemaMappers
29-
.mapPrefix("https://", "http://")
30-
.mapPrefix("http://json-schema.org", "classpath:"))
31-
.addMetaSchema(JsonMetaSchema.getV7())
32-
.defaultMetaSchemaURI(JsonMetaSchema.getV7().getUri())
33-
.build();
86+
JsonSchemaFactory schemaFactory = JsonSchemaFactory
87+
.getInstance(VersionFlag.V7,
88+
builder -> builder
89+
.schemaMappers(schemaMappers -> schemaMappers
90+
.mapPrefix("https://json-schema.org", "classpath:")
91+
.mapPrefix("http://json-schema.org", "classpath:")));
92+
```
93+
94+
### Configuring Mappings
95+
96+
```java
97+
Map<String, String> mappings = Collections
98+
.singletonMap("https://www.example.com/integer.json", "classpath:schemas/integer.json");
99+
100+
JsonSchemaFactory schemaFactory = JsonSchemaFactory
101+
.getInstance(VersionFlag.V7,
102+
builder -> builder.schemaMappers(schemaMappers -> schemaMappers.mappings(mappings)));
34103
```
35104

36105
## Customizing Network Schema Retrieval
@@ -45,11 +114,8 @@ The `SchemaLoader` interface must implemented and the implementation configured
45114

46115
```java
47116
public class CustomUriSchemaLoader implements SchemaLoader {
48-
49117
private static final Logger LOGGER = LoggerFactory.getLogger(CustomUriSchemaLoader.class);
50-
51118
private final String authorizationToken;
52-
53119
private final HttpClient client;
54120

55121
public CustomUriSchemaLoader(String authorizationToken) {
@@ -86,13 +152,7 @@ Within the `JsonSchemaFactory` the custom `SchemaLoader` must be configured.
86152
```java
87153
CustomUriSchemaLoader uriSchemaLoader = new CustomUriSchemaLoader(authorizationToken);
88154

89-
JsonSchemaFactory schemaFactory = JsonSchemaFactory.builder()
90-
.schemaLoaders(schemaLoaders -> schemaLoaders.add(uriSchemaLoader))
91-
.addMetaSchema(JsonMetaSchema.getV7())
92-
.defaultMetaSchemaURI(JsonMetaSchema.getV7().getUri())
93-
.build();
94-
JsonSchema jsonSchema = schemaFactory.getSchema(schemaUri);
95-
for (ValidationMessage validationMessage : jsonSchema.validate(jsonNodeRecord)) {
96-
// handle the validation messages
97-
}
155+
JsonSchemaFactory schemaFactory = JsonSchemaFactory
156+
.getInstance(VersionFlag.V7,
157+
builder -> builder.schemaLoaders(schemaLoaders -> schemaLoaders.add(uriSchemaLoader)));
98158
```

doc/upgrading.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ The following are removed and replaced by `SchemaLoader` and `SchemaMapper`.
9393
* `URLFetcher` - Replaced by `UriSchemaLoader`.
9494
* `URNURIFactory` - No replacement as `URIFactory` isn't required anymore.
9595

96-
The `SchemaLoader` and `SchemaMapper` are configured in the `JsonSchemaFactory.Builder`.
96+
The `SchemaLoader` and `SchemaMapper` are configured in the `JsonSchemaFactory.Builder`. See [Customizing Schema Retrieval](schema-retrieval.md).
9797

9898
As per the specification. The `format` keyword since Draft 2019-09 no longer generates assertions by default.
9999

0 commit comments

Comments
 (0)