updated to not flatten array, map properties in responses unless necessary

This commit is contained in:
Tony Tam 2015-10-19 21:35:45 -07:00
parent 84b7302f12
commit eeaf4071f9
2 changed files with 89 additions and 23 deletions

View File

@ -75,30 +75,40 @@ public class InlineModelResolver {
swagger.addDefinition(modelName, model); swagger.addDefinition(modelName, model);
} }
} else if (property instanceof ArrayProperty) { } else if (property instanceof ArrayProperty) {
String modelName = uniqueName("inline_response_" + key);
ArrayProperty ap = (ArrayProperty) property; ArrayProperty ap = (ArrayProperty) property;
Model model = modelFromProperty(ap, modelName); if(ap.getItems() instanceof ObjectProperty) {
if (model != null) { ObjectProperty op = (ObjectProperty) ap.getItems();
String existing = matchGenerated(model); Map<String, Property> props = op.getProperties();
if (existing != null) { flattenProperties(props, "path");
response.setSchema(new RefProperty(existing));
} else {
response.setSchema(new RefProperty(modelName));
addGenerated(modelName, model);
swagger.addDefinition(modelName, model);
}
} }
} else if (property instanceof MapProperty) { } else if (property instanceof MapProperty) {
MapProperty op = (MapProperty) property; 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 modelName = uniqueName("inline_response_" + key);
Model model = modelFromProperty(op, modelName); String existing = matchGenerated(innerModel);
String existing = matchGenerated(model);
if (existing != null) { if (existing != null) {
response.setSchema(new RefProperty(existing)); response.setSchema(new RefProperty(existing));
} else { } else {
response.setSchema(new RefProperty(modelName)); response.setSchema(new RefProperty(modelName));
addGenerated(modelName, model); addGenerated(modelName, innerModel);
swagger.addDefinition(modelName, model); swagger.addDefinition(modelName, innerModel);
}
} }
} }
} }
@ -186,7 +196,6 @@ public class InlineModelResolver {
if (property instanceof ObjectProperty) { if (property instanceof ObjectProperty) {
String modelName = uniqueName(path + "_" + key); String modelName = uniqueName(path + "_" + key);
ObjectProperty op = (ObjectProperty) property; ObjectProperty op = (ObjectProperty) property;
Model model = modelFromProperty(op, modelName); Model model = modelFromProperty(op, modelName);

View File

@ -5,6 +5,7 @@ import io.swagger.models.*;
import io.swagger.models.parameters.BodyParameter; import io.swagger.models.parameters.BodyParameter;
import io.swagger.models.parameters.Parameter; import io.swagger.models.parameters.Parameter;
import io.swagger.models.properties.*; import io.swagger.models.properties.*;
import io.swagger.util.Json;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import java.util.Map; import java.util.Map;
@ -195,6 +196,30 @@ public class InlineModelResolverTest {
MapProperty schema = new MapProperty(); MapProperty schema = new MapProperty();
schema.setAdditionalProperties(new StringProperty()); 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() swagger.path("/foo/baz", new Path()
.get(new Operation() .get(new Operation()
.response(200, new Response() .response(200, new Response()
@ -209,9 +234,41 @@ public class InlineModelResolverTest {
assertTrue(property instanceof RefProperty); assertTrue(property instanceof RefProperty);
Model inline = swagger.getDefinitions().get("inline_response_200"); Model inline = swagger.getDefinitions().get("inline_response_200");
assertTrue(inline instanceof ArrayModel); assertTrue(inline instanceof ModelImpl);
ArrayModel am = (ArrayModel) inline; ModelImpl impl = (ModelImpl) inline;
Property innerProperty = am.getItems();
assertTrue(innerProperty instanceof StringProperty); 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);
} }
} }