Merge pull request #1734 from wing328/fix_array_inline_response

Fix array/map inline response/model
This commit is contained in:
Tony Tam 2015-12-27 06:18:01 -08:00
commit cbfdffb09a
2 changed files with 135 additions and 46 deletions

View File

@ -13,9 +13,13 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class InlineModelResolver { public class InlineModelResolver {
private Swagger swagger = null; private Swagger swagger = null;
private boolean skipMatches = false; private boolean skipMatches = false;
static Logger LOGGER = LoggerFactory.getLogger(InlineModelResolver.class);
Map<String, Model> addedModels = new HashMap<String, Model>(); Map<String, Model> addedModels = new HashMap<String, Model>();
Map<String, String> generatedSignature = new HashMap<String, String>(); Map<String, String> generatedSignature = new HashMap<String, String>();
@ -60,8 +64,19 @@ public class InlineModelResolver {
Property inner = am.getItems(); Property inner = am.getItems();
if(inner instanceof ObjectProperty) { if(inner instanceof ObjectProperty) {
String modelName = uniqueName(bp.getName());
ObjectProperty op = (ObjectProperty) inner; ObjectProperty op = (ObjectProperty) inner;
flattenProperties(op.getProperties(), pathname); 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) { } else if (property instanceof ArrayProperty) {
ArrayProperty ap = (ArrayProperty) property; ArrayProperty ap = (ArrayProperty) property;
if(ap.getItems() instanceof ObjectProperty) { Property inner = ap.getItems();
ObjectProperty op = (ObjectProperty) ap.getItems();
Map<String, Property> 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);
if(inner instanceof ObjectProperty) {
String modelName = uniqueName("inline_response_" + key); String modelName = uniqueName("inline_response_" + key);
ObjectProperty op = (ObjectProperty) inner;
flattenProperties(op.getProperties(), pathname);
Model innerModel = modelFromProperty(op, modelName);
String existing = matchGenerated(innerModel); String existing = matchGenerated(innerModel);
if (existing != null) { if (existing != null) {
response.setSchema(new RefProperty(existing)); ap.setItems(new RefProperty(existing));
} else { } 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); addGenerated(modelName, innerModel);
swagger.addDefinition(modelName, innerModel); swagger.addDefinition(modelName, innerModel);
} }
@ -222,6 +239,49 @@ public class InlineModelResolver {
addGenerated(modelName, model); addGenerated(modelName, model);
swagger.addDefinition(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) { if (propsToUpdate.size() > 0) {
@ -325,4 +385,5 @@ public class InlineModelResolver {
public void setSkipMatches(boolean skipMatches) { public void setSkipMatches(boolean skipMatches) {
this.skipMatches = skipMatches; this.skipMatches = skipMatches;
} }
} }

View File

@ -73,6 +73,7 @@ public class InlineModelResolverTest {
ModelImpl model = (ModelImpl)swagger.getDefinitions().get("inline_response_200"); ModelImpl model = (ModelImpl)swagger.getDefinitions().get("inline_response_200");
assertTrue(model.getProperties().size() == 1); assertTrue(model.getProperties().size() == 1);
assertNotNull(model.getProperties().get("name")); assertNotNull(model.getProperties().get("name"));
assertTrue(model.getProperties().get("name") instanceof StringProperty);
} }
@Test @Test
@ -174,13 +175,30 @@ public class InlineModelResolverTest {
ArrayModel am = (ArrayModel) schema; ArrayModel am = (ArrayModel) schema;
Property inner = am.getItems(); Property inner = am.getItems();
assertTrue(inner instanceof RefProperty);
ObjectProperty op = (ObjectProperty) inner; RefProperty rp = (RefProperty) inner;
Property name = op.getProperties().get("address");
assertTrue(name instanceof RefProperty); assertEquals(rp.getType(), "ref");
assertEquals(rp.get$ref(), "#/definitions/body");
assertEquals(rp.getSimpleRef(), "body");
Model model = swagger.getDefinitions().get("hello_address"); Model inline = swagger.getDefinitions().get("body");
assertNotNull(model); 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 @Test
@ -213,9 +231,17 @@ public class InlineModelResolverTest {
assertNotNull(p); assertNotNull(p);
ObjectProperty innerModel = (ObjectProperty) p; RefProperty rp = (RefProperty) p;
assertTrue(innerModel.getProperties().size() == 1); assertEquals(rp.getType(), "ref");
assertNotNull(innerModel.getProperties().get("name")); 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 @Test
@ -258,20 +284,15 @@ public class InlineModelResolverTest {
new InlineModelResolver().flatten(swagger); new InlineModelResolver().flatten(swagger);
Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200");
Property property = response.getSchema(); 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"); Model inline = swagger.getDefinitions().get("inline_response_200");
assertTrue(inline instanceof ModelImpl); assertTrue(inline instanceof ModelImpl);
ModelImpl impl = (ModelImpl) inline; ModelImpl impl = (ModelImpl) inline;
assertNotNull(impl.getProperties().get("name"));
Property innerProperty = impl.getAdditionalProperties(); assertTrue(impl.getProperties().get("name") instanceof StringProperty);
assertTrue(innerProperty instanceof ObjectProperty);
ObjectProperty obj = (ObjectProperty) innerProperty;
Property name = obj.getProperties().get("name");
assertTrue(name instanceof StringProperty);
} }
@Test @Test
@ -295,10 +316,17 @@ public class InlineModelResolverTest {
ArrayProperty am = (ArrayProperty) response.getSchema(); ArrayProperty am = (ArrayProperty) response.getSchema();
Property items = am.getItems(); Property items = am.getItems();
assertTrue(items instanceof ObjectProperty); assertTrue(items instanceof RefProperty);
ObjectProperty op = (ObjectProperty) items; RefProperty rp = (RefProperty) items;
Property name = op.getProperties().get("name"); assertEquals(rp.getType(), "ref");
assertTrue(name instanceof StringProperty); 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 @Test