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 f727560210a..6471a0688a8 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 @@ -13,9 +13,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class InlineModelResolver { private Swagger swagger = null; private boolean skipMatches = false; + static Logger LOGGER = LoggerFactory.getLogger(InlineModelResolver.class); Map addedModels = new HashMap(); Map generatedSignature = new HashMap(); @@ -60,8 +64,19 @@ public class InlineModelResolver { Property inner = am.getItems(); if(inner instanceof ObjectProperty) { + String modelName = uniqueName(bp.getName()); ObjectProperty op = (ObjectProperty) inner; flattenProperties(op.getProperties(), pathname); + + Model innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + if (existing != null) { + am.setItems(new RefProperty(existing)); + } else { + am.setItems(new RefProperty(modelName)); + addGenerated(modelName, innerModel); + swagger.addDefinition(modelName, innerModel); + } } } } @@ -88,36 +103,38 @@ public class InlineModelResolver { } } else if (property instanceof ArrayProperty) { ArrayProperty ap = (ArrayProperty) property; - 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); + Property inner = ap.getItems(); + if(inner instanceof ObjectProperty) { String modelName = uniqueName("inline_response_" + key); + ObjectProperty op = (ObjectProperty) inner; + flattenProperties(op.getProperties(), pathname); + + Model innerModel = modelFromProperty(op, modelName); String existing = matchGenerated(innerModel); if (existing != null) { - response.setSchema(new RefProperty(existing)); + ap.setItems(new RefProperty(existing)); } else { - response.setSchema(new RefProperty(modelName)); + ap.setItems(new RefProperty(modelName)); + addGenerated(modelName, innerModel); + swagger.addDefinition(modelName, innerModel); + } + } + } else if (property instanceof MapProperty) { + MapProperty mp = (MapProperty) property; + + Property innerProperty = mp.getAdditionalProperties(); + if(innerProperty instanceof ObjectProperty) { + String modelName = uniqueName("inline_response_" + key); + ObjectProperty op = (ObjectProperty) innerProperty; + flattenProperties(op.getProperties(), pathname); + + Model innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + if (existing != null) { + mp.setAdditionalProperties(new RefProperty(existing)); + } else { + mp.setAdditionalProperties(new RefProperty(modelName)); addGenerated(modelName, innerModel); swagger.addDefinition(modelName, innerModel); } @@ -222,6 +239,49 @@ public class InlineModelResolver { addGenerated(modelName, model); swagger.addDefinition(modelName, model); } + } else if (property instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) property; + Property inner = ap.getItems(); + + if (inner instanceof ObjectProperty) { + String modelName = uniqueName(path + "_" + key); + + ObjectProperty op = (ObjectProperty) inner; + flattenProperties(op.getProperties(), path); + + Model innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + + if (existing != null) { + ap.setItems(new RefProperty(existing)); + } else { + ap.setItems(new RefProperty(modelName)); + addGenerated(modelName, innerModel); + swagger.addDefinition(modelName, innerModel); + } + } + } else if (property instanceof MapProperty) { + MapProperty mp = (MapProperty) property; + Property inner = mp.getAdditionalProperties(); + + if (inner instanceof ObjectProperty) { + String modelName = uniqueName(path + "_" + key); + + ObjectProperty op = (ObjectProperty) inner; + flattenProperties(op.getProperties(), path); + + Model innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + + if (existing != null) { + mp.setAdditionalProperties(new RefProperty(existing)); + } else { + mp.setAdditionalProperties(new RefProperty(modelName)); + addGenerated(modelName, innerModel); + swagger.addDefinition(modelName, innerModel); + } + } + } else { } } if (propsToUpdate.size() > 0) { @@ -325,4 +385,5 @@ public class InlineModelResolver { public void setSkipMatches(boolean skipMatches) { this.skipMatches = skipMatches; } + } 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 68d64562eba..f972711138b 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 @@ -73,6 +73,7 @@ public class InlineModelResolverTest { ModelImpl model = (ModelImpl)swagger.getDefinitions().get("inline_response_200"); assertTrue(model.getProperties().size() == 1); assertNotNull(model.getProperties().get("name")); + assertTrue(model.getProperties().get("name") instanceof StringProperty); } @Test @@ -174,13 +175,30 @@ public class InlineModelResolverTest { ArrayModel am = (ArrayModel) schema; Property inner = am.getItems(); + assertTrue(inner instanceof RefProperty); - ObjectProperty op = (ObjectProperty) inner; - Property name = op.getProperties().get("address"); - assertTrue(name instanceof RefProperty); + RefProperty rp = (RefProperty) inner; + + assertEquals(rp.getType(), "ref"); + assertEquals(rp.get$ref(), "#/definitions/body"); + assertEquals(rp.getSimpleRef(), "body"); - Model model = swagger.getDefinitions().get("hello_address"); - assertNotNull(model); + Model inline = swagger.getDefinitions().get("body"); + assertNotNull(inline); + assertTrue(inline instanceof ModelImpl); + ModelImpl impl = (ModelImpl) inline; + RefProperty rpAddress = (RefProperty) impl.getProperties().get("address"); + assertNotNull(rpAddress); + assertEquals(rpAddress.getType(), "ref"); + assertEquals(rpAddress.get$ref(), "#/definitions/hello_address"); + assertEquals(rpAddress.getSimpleRef(), "hello_address"); + + Model inlineProp = swagger.getDefinitions().get("hello_address"); + assertNotNull(inlineProp); + assertTrue(inlineProp instanceof ModelImpl); + ModelImpl implProp = (ModelImpl) inlineProp; + assertNotNull(implProp.getProperties().get("street")); + assertTrue(implProp.getProperties().get("street") instanceof StringProperty); } @Test @@ -213,9 +231,17 @@ public class InlineModelResolverTest { assertNotNull(p); - ObjectProperty innerModel = (ObjectProperty) p; - assertTrue(innerModel.getProperties().size() == 1); - assertNotNull(innerModel.getProperties().get("name")); + RefProperty rp = (RefProperty) p; + assertEquals(rp.getType(), "ref"); + assertEquals(rp.get$ref(), "#/definitions/inline_response_200"); + assertEquals(rp.getSimpleRef(), "inline_response_200"); + + Model inline = swagger.getDefinitions().get("inline_response_200"); + assertNotNull(inline); + assertTrue(inline instanceof ModelImpl); + ModelImpl impl = (ModelImpl) inline; + assertNotNull(impl.getProperties().get("name")); + assertTrue(impl.getProperties().get("name") instanceof StringProperty); } @Test @@ -258,20 +284,15 @@ public class InlineModelResolverTest { new InlineModelResolver().flatten(swagger); Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); - Property property = response.getSchema(); - assertTrue(property instanceof RefProperty); + assertTrue(property instanceof MapProperty); + assertTrue(swagger.getDefinitions().size() == 1); Model inline = swagger.getDefinitions().get("inline_response_200"); 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); + assertNotNull(impl.getProperties().get("name")); + assertTrue(impl.getProperties().get("name") instanceof StringProperty); } @Test @@ -295,10 +316,17 @@ public class InlineModelResolverTest { 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); + assertTrue(items instanceof RefProperty); + RefProperty rp = (RefProperty) items; + assertEquals(rp.getType(), "ref"); + assertEquals(rp.get$ref(), "#/definitions/inline_response_200"); + assertEquals(rp.getSimpleRef(), "inline_response_200"); + + Model inline = swagger.getDefinitions().get("inline_response_200"); + assertTrue(inline instanceof ModelImpl); + ModelImpl impl = (ModelImpl) inline; + assertNotNull(impl.getProperties().get("name")); + assertTrue(impl.getProperties().get("name") instanceof StringProperty); } @Test