From eeaf4071f902534d3419cad0bf14b80b7f8dc2de Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Mon, 19 Oct 2015 21:35:45 -0700 Subject: [PATCH] updated to not flatten array, map properties in responses unless necessary --- .../swagger/codegen/InlineModelResolver.java | 47 ++++++++------ .../codegen/InlineModelResolverTest.java | 65 +++++++++++++++++-- 2 files changed, 89 insertions(+), 23 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java index 5cd2961f6f4..e137b8843c6 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java @@ -75,31 +75,41 @@ public class InlineModelResolver { swagger.addDefinition(modelName, model); } } else if (property instanceof ArrayProperty) { - String modelName = uniqueName("inline_response_" + key); ArrayProperty ap = (ArrayProperty) property; - Model model = modelFromProperty(ap, modelName); - if (model != null) { - String existing = matchGenerated(model); + if(ap.getItems() instanceof ObjectProperty) { + ObjectProperty op = (ObjectProperty) ap.getItems(); + Map props = op.getProperties(); + flattenProperties(props, "path"); + } + } else if (property instanceof MapProperty) { + MapProperty op = (MapProperty) property; + + Property innerProperty = op.getAdditionalProperties(); + if(innerProperty instanceof ObjectProperty) { + ModelImpl innerModel = new ModelImpl(); + // TODO: model props + innerModel.setTitle(property.getTitle()); + property.getVendorExtensions(); + property.getRequired(); + property.getReadOnly(); + property.getAccess(); + innerModel.setDescription(property.getDescription()); + innerModel.setExample(property.getExample()); + innerModel.setName(property.getName()); + innerModel.setXml(property.getXml()); + + innerModel.setAdditionalProperties(innerProperty); + + String modelName = uniqueName("inline_response_" + key); + String existing = matchGenerated(innerModel); if (existing != null) { response.setSchema(new RefProperty(existing)); } else { response.setSchema(new RefProperty(modelName)); - addGenerated(modelName, model); - swagger.addDefinition(modelName, model); + addGenerated(modelName, innerModel); + swagger.addDefinition(modelName, innerModel); } } - } else if (property instanceof MapProperty) { - MapProperty op = (MapProperty) property; - String modelName = uniqueName("inline_response_" + key); - Model model = modelFromProperty(op, modelName); - String existing = matchGenerated(model); - if (existing != null) { - response.setSchema(new RefProperty(existing)); - } else { - response.setSchema(new RefProperty(modelName)); - addGenerated(modelName, model); - swagger.addDefinition(modelName, model); - } } } } @@ -186,7 +196,6 @@ public class InlineModelResolver { if (property instanceof ObjectProperty) { String modelName = uniqueName(path + "_" + key); - ObjectProperty op = (ObjectProperty) property; Model model = modelFromProperty(op, modelName); diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/InlineModelResolverTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/InlineModelResolverTest.java index d3644392212..474cfad86e6 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/InlineModelResolverTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/InlineModelResolverTest.java @@ -5,6 +5,7 @@ import io.swagger.models.*; import io.swagger.models.parameters.BodyParameter; import io.swagger.models.parameters.Parameter; import io.swagger.models.properties.*; +import io.swagger.util.Json; import org.testng.annotations.Test; import java.util.Map; @@ -195,6 +196,30 @@ public class InlineModelResolverTest { MapProperty schema = new MapProperty(); schema.setAdditionalProperties(new StringProperty()); + swagger.path("/foo/baz", new Path() + .get(new Operation() + .response(200, new Response() + .vendorExtension("x-foo", "bar") + .description("it works!") + .schema(schema)))); + new InlineModelResolver().flatten(swagger); + Json.prettyPrint(swagger); + + Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + + Property property = response.getSchema(); + assertTrue(property instanceof MapProperty); + assertTrue(swagger.getDefinitions().size() == 0); + } + + @Test + public void testInlineMapResponseWithObjectProperty() throws Exception { + Swagger swagger = new Swagger(); + + MapProperty schema = new MapProperty(); + schema.setAdditionalProperties(new ObjectProperty() + .property("name", new StringProperty())); + swagger.path("/foo/baz", new Path() .get(new Operation() .response(200, new Response() @@ -209,9 +234,41 @@ public class InlineModelResolverTest { assertTrue(property instanceof RefProperty); Model inline = swagger.getDefinitions().get("inline_response_200"); - assertTrue(inline instanceof ArrayModel); - ArrayModel am = (ArrayModel) inline; - Property innerProperty = am.getItems(); - assertTrue(innerProperty instanceof StringProperty); + assertTrue(inline instanceof ModelImpl); + ModelImpl impl = (ModelImpl) inline; + + Property innerProperty = impl.getAdditionalProperties(); + assertTrue(innerProperty instanceof ObjectProperty); + + ObjectProperty obj = (ObjectProperty) innerProperty; + Property name = obj.getProperties().get("name"); + assertTrue(name instanceof StringProperty); + } + + @Test + public void testArrayResponse() { + Swagger swagger = new Swagger(); + + ArrayProperty schema = new ArrayProperty(); + schema.setItems(new ObjectProperty() + .property("name", new StringProperty())); + + swagger.path("/foo/baz", new Path() + .get(new Operation() + .response(200, new Response() + .vendorExtension("x-foo", "bar") + .description("it works!") + .schema(schema)))); + new InlineModelResolver().flatten(swagger); + + Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); + assertTrue(response.getSchema() instanceof ArrayProperty); + + ArrayProperty am = (ArrayProperty) response.getSchema(); + Property items = am.getItems(); + assertTrue(items instanceof ObjectProperty); + ObjectProperty op = (ObjectProperty) items; + Property name = op.getProperties().get("name"); + assertTrue(name instanceof StringProperty); } }