Skip to content

Commit 1e86057

Browse files
djankowsfrantuma
authored andcommitted
Add
1 parent 2ea7373 commit 1e86057

File tree

7 files changed

+156
-11
lines changed

7 files changed

+156
-11
lines changed

modules/swagger-annotations/src/main/java/io/swagger/v3/oas/annotations/media/Schema.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,15 @@
417417
@OpenAPI31
418418
String $dynamicAnchor() default "";
419419

420+
/**
421+
* Provides the $dynamicRef related to schema
422+
*
423+
* @since 2.2.32 / OpenAPI 3.1
424+
* @return $dynamicRef schema
425+
*/
426+
@OpenAPI31
427+
String $dynamicRef() default "";
428+
420429
/**
421430
* Provides the content encoding related to this schema
422431
*

modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2962,6 +2962,13 @@ protected String resolveId(Annotated a, Annotation[] annotations, io.swagger.v3.
29622962
return null;
29632963
}
29642964

2965+
protected String resolve$dynamicRef(Annotated a, Annotation[] annotations, io.swagger.v3.oas.annotations.media.Schema schema) {
2966+
if (schema != null && StringUtils.isNotBlank(schema.$dynamicRef())) {
2967+
return schema.$dynamicRef();
2968+
}
2969+
return null;
2970+
}
2971+
29652972
protected String resolveContentEncoding(Annotated a, Annotation[] annotations, io.swagger.v3.oas.annotations.media.Schema schema) {
29662973
if (schema != null && StringUtils.isNotBlank(schema.contentEncoding())) {
29672974
return schema.contentEncoding();
@@ -3332,6 +3339,10 @@ protected void resolveSchemaMembers(Schema schema, Annotated a, Annotation[] ann
33323339
if ($dynamicAnchor != null) {
33333340
schema.$dynamicAnchor($dynamicAnchor);
33343341
}
3342+
String $dynamicRef = resolve$dynamicRef(a, annotations, schemaAnnotation);
3343+
if ($dynamicRef != null) {
3344+
schema.$dynamicRef($dynamicRef);
3345+
}
33353346
String contentEncoding = resolveContentEncoding(a, annotations, schemaAnnotation);
33363347
if (contentEncoding != null) {
33373348
schema.setContentEncoding(contentEncoding);

modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,9 @@ public static Optional<Schema> getSchemaFromAnnotation(
671671
if (StringUtils.isNotBlank(schema.$dynamicAnchor())) {
672672
schemaObject.set$dynamicAnchor(schema.$dynamicAnchor());
673673
}
674+
if (StringUtils.isNotBlank(schema.$dynamicRef())) {
675+
schemaObject.set$dynamicRef(schema.$dynamicRef());
676+
}
674677
if (StringUtils.isNotBlank(schema.contentEncoding())) {
675678
schemaObject.setContentEncoding(schema.contentEncoding());
676679
}
@@ -2484,6 +2487,14 @@ public Class<?> contains() {
24842487
return patch.$dynamicAnchor();
24852488
}
24862489

2490+
@Override
2491+
public String $dynamicRef() {
2492+
if (StringUtils.isNotBlank(master.$dynamicRef()) || StringUtils.isBlank(patch.$dynamicRef())) {
2493+
return master.$dynamicRef();
2494+
}
2495+
return patch.$dynamicRef();
2496+
}
2497+
24872498
@Override
24882499
public String contentEncoding() {
24892500
if (StringUtils.isNotBlank(master.contentEncoding()) || StringUtils.isBlank(patch.contentEncoding())) {

modules/swagger-core/src/test/java/io/swagger/v3/core/converting/SwaggerSerializerTest.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import static org.testng.Assert.assertTrue;
3838

3939
public class SwaggerSerializerTest {
40-
ObjectMapper m = Json.mapper();
4140

4241
@Test(description = "it should convert a spec")
4342
public void convertSpec() throws IOException {
@@ -63,15 +62,10 @@ public void convertSpec() throws IOException {
6362
.info(info)
6463
.addServersItem(new Server()
6564
.url("http://petstore.swagger.io"))
66-
67-
// .securityDefinition("api-key", new ApiKeyAuthDefinition("key", In.HEADER))
68-
// .consumes("application/json")
69-
// .produces("application/json")
7065
.schema("Person", personModel)
7166
.schema("Error", errorModel);
7267

7368
final Operation get = new Operation()
74-
// .produces("application/json")
7569
.summary("finds pets in the system")
7670
.description("a longer description")
7771
.addTagsItem("Pet Operations")
@@ -173,7 +167,7 @@ public void writeSpecWithParameterReferences() throws IOException {
173167
.addParametersItem(new Parameter().$ref("#/parameters/Foo"));
174168

175169
swagger
176-
.components(new Components().addParameters("Foo", parameter))
170+
.components(swagger.getComponents().addParameters("Foo", parameter))
177171
.path("/pets", new PathItem().get(get));
178172

179173
final String swaggerJson = Json.mapper().writeValueAsString(swagger);
@@ -225,4 +219,17 @@ public void setValue(String value) {
225219

226220
}
227221
}
222+
223+
@Test
224+
public void testDynamicRefSerialization() throws IOException {
225+
Schema<?> dynamicRefSchema = new Schema<>();
226+
dynamicRefSchema.set$dynamicRef("#node");
227+
228+
Components components = new Components().addSchemas("DynamicRefSchema", dynamicRefSchema);
229+
OpenAPI openAPI = new OpenAPI().components(components);
230+
String json = Json.mapper().writeValueAsString(openAPI);
231+
232+
assertTrue(json.contains("\"$dynamicRef\":\"#node\""));
233+
}
234+
228235
}

modules/swagger-core/src/test/java/io/swagger/v3/core/deserialization/OpenAPI3_1DeserializationTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import io.swagger.v3.core.util.Yaml31;
99
import io.swagger.v3.oas.models.Components;
1010
import io.swagger.v3.oas.models.OpenAPI;
11+
import io.swagger.v3.oas.models.media.JsonSchema;
1112
import io.swagger.v3.oas.models.media.Schema;
1213
import org.testng.annotations.Test;
1314

@@ -251,4 +252,18 @@ public void testBooleanSchemaDeserialization() throws Exception{
251252
oas = Yaml.mapper().readValue(yaml, OpenAPI.class);
252253
assertNull(oas.getComponents().getSchemas().get("test").getBooleanSchemaValue());
253254
}
255+
256+
@Test
257+
public void testDynamicRefDeserializationOnOAS31() throws IOException {
258+
final String jsonString = ResourceUtils.loadClassResource(getClass(), "specFiles/3.1.0/specWithDynamicRef.yaml");
259+
OpenAPI openAPI = Yaml31.mapper().readValue(jsonString, OpenAPI.class);
260+
assertNotNull(openAPI);
261+
262+
Schema baseNodeSchema = openAPI.getComponents().getSchemas().get("BaseNode");
263+
assertNotNull(baseNodeSchema);
264+
assertNotNull(baseNodeSchema.getProperties().get("children"));
265+
JsonSchema childrenSchema = (JsonSchema) baseNodeSchema.getProperties().get("children");
266+
assertEquals(childrenSchema.getItems().get$dynamicRef(), "#node");
267+
}
268+
254269
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
openapi: 3.1.0
2+
info:
3+
title: Tree API
4+
version: 1.0.0
5+
6+
paths:
7+
/tree:
8+
post:
9+
summary: Create a tree structure
10+
requestBody:
11+
required: true
12+
content:
13+
application/json:
14+
schema:
15+
$ref: '#/components/schemas/ExtendedNode'
16+
responses:
17+
'200':
18+
description: Tree accepted
19+
content:
20+
application/json:
21+
schema:
22+
type: string
23+
24+
components:
25+
schemas:
26+
BaseNode:
27+
$id: "https://example.com/schemas/base-node"
28+
$schema: "https://json-schema.org/draft/2020-12/schema"
29+
$dynamicAnchor: "node"
30+
type: object
31+
properties:
32+
name:
33+
type: string
34+
children:
35+
type: array
36+
items:
37+
$dynamicRef: "#node"
38+
required: [name]
39+
40+
ExtendedProperties:
41+
$id: "https://example.com/schemas/extended-properties"
42+
$schema: "https://json-schema.org/draft/2020-12/schema"
43+
$dynamicAnchor: "node"
44+
type: object
45+
properties:
46+
type:
47+
type: string
48+
enum: [folder, file]
49+
required: [type]
50+
51+
ExtendedNode:
52+
$schema: "https://json-schema.org/draft/2020-12/schema"
53+
$id: "https://example.com/schemas/extended-node"
54+
allOf:
55+
- $ref: "#/components/schemas/BaseNode"
56+
- $ref: "#/components/schemas/ExtendedProperties"
57+

modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/Schema.java

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,11 @@ public Schema specVersion(SpecVersion specVersion) {
208208
@OpenAPI31
209209
private String $dynamicAnchor;
210210

211+
/**
212+
* @since 2.2.32 (OpenAPI 3.1.0)
213+
*/
214+
@OpenAPI31
215+
private String $dynamicRef;
211216

212217
/**
213218
* @since 2.2.0 (OpenAPI 3.1.0)
@@ -616,6 +621,34 @@ public Schema typesItem(String type) {
616621
return this;
617622
}
618623

624+
/**
625+
*
626+
* @since 2.2.32 (OpenAPI 3.1.0)
627+
*/
628+
@OpenAPI31
629+
public String get$dynamicRef() {
630+
return $dynamicRef;
631+
}
632+
633+
/**
634+
*
635+
* @since 2.2.32 (OpenAPI 3.1.0)
636+
*/
637+
@OpenAPI31
638+
public void set$dynamicRef(String $dynamicRef) {
639+
this.$dynamicRef = $dynamicRef;
640+
}
641+
642+
/**
643+
*
644+
* @since 2.2.32 (OpenAPI 3.1.0)
645+
*/
646+
@OpenAPI31
647+
public Schema $dynamicRef(String $dynamicRef) {
648+
this.$dynamicRef = $dynamicRef;
649+
return this;
650+
}
651+
619652
/**
620653
*
621654
* @since 2.2.0 (OpenAPI 3.1.0)
@@ -2098,6 +2131,7 @@ public boolean equals(java.lang.Object o) {
20982131
Objects.equals(this.$schema, schema.$schema) &&
20992132
Objects.equals(this.$vocabulary, schema.$vocabulary) &&
21002133
Objects.equals(this.$dynamicAnchor, schema.$dynamicAnchor) &&
2134+
Objects.equals(this.$dynamicRef, schema.$dynamicRef) &&
21012135
Objects.equals(this.types, schema.types) &&
21022136
Objects.equals(this.allOf, schema.allOf) &&
21032137
Objects.equals(this.anyOf, schema.anyOf) &&
@@ -2132,10 +2166,10 @@ public int hashCode() {
21322166
exclusiveMinimum, exclusiveMinimumValue, maxLength, minLength, pattern, maxItems, minItems, uniqueItems,
21332167
maxProperties, minProperties, required, type, not, properties, additionalProperties, description,
21342168
format, $ref, nullable, readOnly, writeOnly, example, externalDocs, deprecated, xml, extensions,
2135-
discriminator, _enum, _default, patternProperties, $id, $anchor, $schema, $vocabulary, $dynamicAnchor, types, allOf, anyOf, oneOf, _const,
2136-
contentEncoding, contentMediaType, contentSchema, propertyNames, unevaluatedProperties, maxContains,
2137-
minContains, additionalItems, unevaluatedItems, _if, _else, then, dependentRequired, dependentSchemas,
2138-
$comment, examples, prefixItems, items);
2169+
discriminator, _enum, _default, patternProperties, $id, $anchor, $schema, $vocabulary, $dynamicAnchor,
2170+
$dynamicRef, types, allOf, anyOf, oneOf, _const, contentEncoding, contentMediaType, contentSchema,
2171+
propertyNames, unevaluatedProperties, maxContains, minContains, additionalItems, unevaluatedItems,
2172+
_if, _else, then, dependentRequired, dependentSchemas, $comment, examples, prefixItems, items);
21392173
}
21402174

21412175
public java.util.Map<String, Object> getExtensions() {
@@ -2206,6 +2240,7 @@ public String toString() {
22062240
sb.append(" $schema: ").append(toIndentedString($schema)).append("\n");
22072241
sb.append(" $vocabulary: ").append(toIndentedString($vocabulary)).append("\n");
22082242
sb.append(" $dynamicAnchor: ").append(toIndentedString($dynamicAnchor)).append("\n");
2243+
sb.append(" $dynamicRef: ").append(toIndentedString($dynamicRef)).append("\n");
22092244
sb.append(" const: ").append(toIndentedString(_const)).append("\n");
22102245
sb.append(" contentEncoding: ").append(toIndentedString(contentEncoding)).append("\n");
22112246
sb.append(" contentMediaType: ").append(toIndentedString(contentMediaType)).append("\n");

0 commit comments

Comments
 (0)