Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix for Flatten Map Schema when Inline ComposedSchema #1386

Merged
merged 1 commit into from
Jun 4, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@ public void flatten(OpenAPI openAPI) {
} else if (model instanceof ArraySchema) {
ArraySchema am = (ArraySchema) model;
Schema inner = am.getItems();

if (isObjectSchema(inner)) {
if (inner.getProperties() != null && inner.getProperties().size() > 0) {
flattenProperties(inner.getProperties(), pathname);
Expand Down Expand Up @@ -186,7 +185,7 @@ public void flatten(OpenAPI openAPI) {
if (media.getSchema() != null) {
Schema mediaSchema = media.getSchema();
if (isObjectSchema(mediaSchema)) {
if (mediaSchema.getProperties() != null && mediaSchema.getProperties().size() > 0) {
if (mediaSchema.getProperties() != null && mediaSchema.getProperties().size() > 0 || mediaSchema instanceof ComposedSchema) {
String modelName = resolveModelName(mediaSchema.getTitle(), "inline_response_" + key);
String existing = matchGenerated(mediaSchema);
if (existing != null) {
Expand All @@ -196,63 +195,31 @@ public void flatten(OpenAPI openAPI) {
addGenerated(modelName, mediaSchema);
openAPI.getComponents().addSchemas(modelName, mediaSchema);
}
}else if (mediaSchema instanceof ComposedSchema) {
String modelName = resolveModelName(mediaSchema.getTitle(), "inline_response_" + key);
String existing = matchGenerated(mediaSchema);
if (existing != null) {
media.setSchema(this.makeRefProperty(existing, mediaSchema));
} else {
media.setSchema(this.makeRefProperty(modelName, mediaSchema));
addGenerated(modelName, mediaSchema);
openAPI.getComponents().addSchemas(modelName, mediaSchema);
}else if (mediaSchema.getAdditionalProperties() != null && !(mediaSchema.getAdditionalProperties() instanceof Boolean)) {
Schema innerProperty = (Schema) mediaSchema.getAdditionalProperties();
if (isObjectSchema(innerProperty)) {
key = "inline_response_map" + key;
flattenMapSchema(innerProperty, key, pathname, mediaSchema);
} else if (innerProperty instanceof ArraySchema) {
ArraySchema arraySchema = (ArraySchema) innerProperty;
Schema inner = arraySchema.getItems();
if (isObjectSchema(inner)) {
key = "inline_response_map_items" + key;
flattenMapSchema(inner,key,pathname,mediaSchema);
}
}
}

}else if (mediaSchema instanceof ArraySchema) {
ArraySchema ap = (ArraySchema) mediaSchema;
Schema inner = ap.getItems();

if (isObjectSchema(inner)) {
if (inner.getProperties() != null && inner.getProperties().size() > 0) {
flattenProperties(inner.getProperties(), pathname);
String modelName = resolveModelName(inner.getTitle(),
"inline_response_" + key);
String existing = matchGenerated(inner);
if (existing != null) {
ap.setItems(this.makeRefProperty(existing, inner));
} else {
ap.setItems(this.makeRefProperty(modelName, inner));
addGenerated(modelName, inner);
openAPI.getComponents().addSchemas(modelName, inner);
}
}else if (inner instanceof ComposedSchema && this.flattenComposedSchemas){
flattenComposedSchema(inner,key);
if (inner.get$ref() == null) {
String modelName = resolveModelName(inner.getTitle(), "inline_response_items" + key);
ap.setItems(this.makeRefProperty(modelName, inner));
addGenerated(modelName, inner);
openAPI.getComponents().addSchemas(modelName, inner);
}
}
flattenArraySchema(inner, key, pathname, ap);
}

} else if (mediaSchema.getAdditionalProperties() != null && mediaSchema.getAdditionalProperties() instanceof Schema) {

} else if (mediaSchema.getAdditionalProperties() != null && !(mediaSchema.getAdditionalProperties() instanceof Boolean)) {
Schema innerProperty = (Schema) mediaSchema.getAdditionalProperties();
if (isObjectSchema(innerProperty)) {
if (innerProperty.getProperties() != null && innerProperty.getProperties().size() > 0) {
flattenProperties(innerProperty.getProperties(), pathname);
String modelName = resolveModelName(innerProperty.getTitle(),
"inline_response_" + key);
String existing = matchGenerated(innerProperty);
if (existing != null) {
mediaSchema.setAdditionalProperties(new Schema().$ref(existing));
} else {
mediaSchema.setAdditionalProperties(new Schema().$ref(modelName));
addGenerated(modelName, innerProperty);
openAPI.getComponents().addSchemas(modelName, innerProperty);
}
}
key = "inline_response_map" + key;
flattenMapSchema(innerProperty, key, pathname, mediaSchema);
}
}
}
Expand Down Expand Up @@ -301,7 +268,6 @@ public void flatten(OpenAPI openAPI) {
} else if (model instanceof ComposedSchema) {
ComposedSchema composedSchema = (ComposedSchema) model;
String inlineModelName = "";

List<Schema> list = null;
if (composedSchema.getAllOf() != null) {
list = composedSchema.getAllOf();
Expand Down Expand Up @@ -334,6 +300,54 @@ public void flatten(OpenAPI openAPI) {
}
}

private void flattenArraySchema(Schema inner, String key, String pathname, ArraySchema ap) {
if (inner.getProperties() != null && inner.getProperties().size() > 0) {
flattenProperties(inner.getProperties(), pathname);
key = "inline_response_" + key;
String modelName = resolveModelName(inner.getTitle(), key);
String existing = matchGenerated(inner);
if (existing != null) {
ap.setItems(this.makeRefProperty(existing, inner));
} else {
ap.setItems(this.makeRefProperty(modelName, inner));
addGenerated(modelName, inner);
openAPI.getComponents().addSchemas(modelName, inner);
}
}else if (inner instanceof ComposedSchema && this.flattenComposedSchemas){
flattenComposedSchema(inner,key);
if (inner.get$ref() == null) {
key = "inline_response_items" + key;
String modelName = resolveModelName(inner.getTitle(), key );
ap.setItems(this.makeRefProperty(modelName, inner));
addGenerated(modelName, inner);
openAPI.getComponents().addSchemas(modelName, inner);
}
}
}


private void flattenMapSchema(Schema innerProperty, String key, String pathname, Schema mediaSchema) {
if (innerProperty.getProperties() != null && innerProperty.getProperties().size() > 0) {
flattenProperties(innerProperty.getProperties(), pathname);
String modelName = resolveModelName(innerProperty.getTitle(), key);
String existing = matchGenerated(innerProperty);
if (existing != null) {
mediaSchema.setAdditionalProperties(new Schema().$ref(existing));
} else {
mediaSchema.setAdditionalProperties(new Schema().$ref(modelName));
addGenerated(modelName, innerProperty);
openAPI.getComponents().addSchemas(modelName, innerProperty);
}
}else if (innerProperty instanceof ComposedSchema && this.flattenComposedSchemas){
flattenComposedSchema(innerProperty,key);
if (innerProperty.get$ref() == null) {
String modelName = resolveModelName(innerProperty.getTitle(), key);
mediaSchema.setAdditionalProperties(new Schema().$ref(modelName));
addGenerated(modelName, innerProperty);
openAPI.getComponents().addSchemas(modelName, innerProperty);
}
}
}


/**
Expand Down Expand Up @@ -418,12 +432,9 @@ public void flattenProperties(Map<String, Schema> properties, String path) {
for (String key : properties.keySet()) {
Schema property = properties.get(key);
if (isObjectSchema(property) && property.getProperties() != null && property.getProperties().size() > 0) {

String modelName = resolveModelName(property.getTitle(), path + "_" + key);
Schema model = createModelFromProperty(property, modelName);

String existing = matchGenerated(model);

if (existing != null) {
propsToUpdate.put(key, new Schema().$ref(existing));
} else {
Expand All @@ -435,7 +446,6 @@ public void flattenProperties(Map<String, Schema> properties, String path) {
} else if (property instanceof ArraySchema) {
ArraySchema ap = (ArraySchema) property;
Schema inner = ap.getItems();

if (isObjectSchema(inner)) {
if (inner.getProperties() != null && inner.getProperties().size() > 0) {
flattenProperties(inner.getProperties(), path);
Expand All @@ -449,23 +459,9 @@ public void flattenProperties(Map<String, Schema> properties, String path) {
addGenerated(modelName, innerModel);
openAPI.getComponents().addSchemas(modelName, innerModel);
}
}else if (inner instanceof ComposedSchema && this.flattenComposedSchemas){
ComposedSchema composedSchema = (ComposedSchema) inner;
}else if (inner instanceof ComposedSchema && this.flattenComposedSchemas) {
flattenComposedSchema(inner,key);
String modelName = resolveModelName(inner.getTitle(), path + "_" + key);
List<Schema> list = null;
if (composedSchema.getAllOf() != null) {
list = composedSchema.getAllOf();
}else if (composedSchema.getAnyOf() != null) {
list = composedSchema.getAnyOf();
}else if (composedSchema.getOneOf() != null) {
list = composedSchema.getOneOf();
}
for(int i= 0; i<list.size();i++){
if (list.get(i).getProperties()!= null){
flattenProperties(list.get(i).getProperties(), modelName);
}
}

Schema innerModel = createModelFromProperty(inner, modelName);
String existing = matchGenerated(innerModel);
if (existing != null) {
Expand All @@ -476,11 +472,9 @@ public void flattenProperties(Map<String, Schema> properties, String path) {
openAPI.getComponents().addSchemas(modelName, innerModel);
}
}

}
} else if (property.getAdditionalProperties() != null && property.getAdditionalProperties() instanceof Schema) {
} else if (property.getAdditionalProperties() != null && !(property.getAdditionalProperties() instanceof Boolean)) {
Schema inner = (Schema) property.getAdditionalProperties();

if (isObjectSchema(inner)) {
if (inner.getProperties() != null && inner.getProperties().size() > 0) {
flattenProperties(inner.getProperties(), path);
Expand Down Expand Up @@ -623,11 +617,9 @@ public Schema modelFromProperty(Schema object, @SuppressWarnings("unused") Strin
ArraySchema model = new ArraySchema();
model.setDescription(description);
model.setExample(example);
if (object.getAdditionalProperties() != null && object.getAdditionalProperties() instanceof Schema) {
if (object.getAdditionalProperties() != null && !(object.getAdditionalProperties() instanceof Boolean)) {
model.setItems((Schema) object.getAdditionalProperties());
}


return model;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,27 @@ public class OpenAPIV3ParserTest {
protected int serverPort = getDynamicPort();
protected WireMockServer wireMockServer;


@Test
public void testIssueFlattenAdditionalPropertiesSchemaInlineModelTrue() {
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();
ParseOptions options = new ParseOptions();
options.setResolve(true);
options.setFlatten(true);
options.setFlattenComposedSchemas(true);
options.setCamelCaseFlattenNaming(true);
SwaggerParseResult parseResult = openApiParser.readLocation("additionalPropertiesFlatten.yaml", null, options);
OpenAPI openAPI = parseResult.getOpenAPI();

//responses
assertNotNull(openAPI.getComponents().getSchemas().get("Inline_response_map200"));
assertEquals(((ComposedSchema)openAPI.getComponents().getSchemas().get("Inline_response_map200")).getOneOf().get(0).get$ref(),"#/components/schemas/Macaw1");
assertNotNull(openAPI.getComponents().getSchemas().get("Inline_response_map_items404"));
assertEquals(((ComposedSchema)openAPI.getComponents().getSchemas().get("Inline_response_map_items404")).getAnyOf().get(0).get$ref(),"#/components/schemas/Macaw2");

}


@Test
public void testIssueFlattenArraySchemaItemsInlineModelFalse() {
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -951,7 +951,7 @@ public void testInlineMapResponseWithObjectSchema() throws Exception {
assertEquals("ext-prop", property.getExtensions().get("x-ext"));
assertTrue(openAPI.getComponents().getSchemas().size() == 1);

Schema inline = openAPI.getComponents().getSchemas().get("inline_response_200");
Schema inline = openAPI.getComponents().getSchemas().get("inline_response_map200");
assertTrue(inline instanceof Schema);
assertNotNull(inline.getProperties().get("name"));
assertTrue(inline.getProperties().get("name") instanceof StringSchema);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
openapi: 3.0.2
info:
title: test - OAS3
version: 1.0.0
paths:
/responses:
get:
responses:
'200':
description: it works!
content:
application/json:
schema:
additionalProperties:
oneOf:
- "$ref": "#/components/schemas/Macaw1"
- "$ref": "#/components/schemas/Parakeet1"
'404':
description: it works!
content:
application/json:
schema:
additionalProperties:
type: array
items:
anyOf:
- "$ref": "#/components/schemas/Macaw2"
- "$ref": "#/components/schemas/Parakeet2"

Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,26 @@ paths:
anyOf:
- "$ref": "#/components/schemas/Macaw3"
- "$ref": "#/components/schemas/Parakeet3"
'404':
description: it works!
content:
application/json:
schema:
additionalProperties:
oneOf:
- "$ref": "#/components/schemas/Macaw4"
- "$ref": "#/components/schemas/Parakeet4"
'500':
description: it works!
content:
application/json:
schema:
additionalProperties:
type: array
items:
anyOf:
- "$ref": "#/components/schemas/Macaw5"
- "$ref": "#/components/schemas/Parakeet5"
/requestBodies:
post:
requestBody:
Expand Down