added map support

This commit is contained in:
Tony Tam 2015-10-18 21:05:57 -07:00
parent 3cf1f1a56a
commit 89dc4d29ab
2 changed files with 78 additions and 65 deletions

View File

@ -22,7 +22,7 @@ public class InlineModelResolver {
public void flatten(Swagger swagger) { public void flatten(Swagger swagger) {
this.swagger = swagger; this.swagger = swagger;
if(swagger.getDefinitions() == null) { if (swagger.getDefinitions() == null) {
swagger.setDefinitions(new HashMap<String, Model>()); swagger.setDefinitions(new HashMap<String, Model>());
} }
@ -30,61 +30,55 @@ public class InlineModelResolver {
Map<String, Path> paths = swagger.getPaths(); Map<String, Path> paths = swagger.getPaths();
Map<String, Model> models = swagger.getDefinitions(); Map<String, Model> models = swagger.getDefinitions();
if(paths != null) { if (paths != null) {
for(String pathname : paths.keySet()) { for (String pathname : paths.keySet()) {
Path path = paths.get(pathname); Path path = paths.get(pathname);
for(Operation operation: path.getOperations()) { for (Operation operation : path.getOperations()) {
List<Parameter> parameters = operation.getParameters(); List<Parameter> parameters = operation.getParameters();
if(parameters != null) { if (parameters != null) {
for(Parameter parameter : parameters) { for (Parameter parameter : parameters) {
if(parameter instanceof BodyParameter) { if (parameter instanceof BodyParameter) {
BodyParameter bp = (BodyParameter) parameter; BodyParameter bp = (BodyParameter) parameter;
if(bp.getSchema() != null) { if (bp.getSchema() != null) {
Model model = bp.getSchema(); Model model = bp.getSchema();
String existing = matchGenerated(model);
if(model instanceof ModelImpl) { if (existing != null) {
String existing = matchGenerated(model); bp.setSchema(new RefModel(existing));
if(existing != null) { } else {
bp.setSchema(new RefModel(existing)); String name = uniqueName(bp.getName());
} bp.setSchema(new RefModel(name));
else { addGenerated(name, model);
String name = uniqueName(bp.getName()); swagger.addDefinition(name, model);
bp.setSchema(new RefModel(name));
addGenerated(name, model);
swagger.addDefinition(name, model);
}
} }
} }
} }
} }
} }
Map<String, Response> responses = operation.getResponses(); Map<String, Response> responses = operation.getResponses();
if(responses != null) { if (responses != null) {
for(String key : responses.keySet()) { for (String key : responses.keySet()) {
Response response = responses.get(key); Response response = responses.get(key);
if(response.getSchema() != null) { if (response.getSchema() != null) {
Property property = response.getSchema(); Property property = response.getSchema();
if(property instanceof ObjectProperty) { if (property instanceof ObjectProperty) {
String modelName = uniqueName("inline_response_" + key); String modelName = uniqueName("inline_response_" + key);
ObjectProperty op = (ObjectProperty) property; ObjectProperty op = (ObjectProperty) property;
Model model = modelFromProperty(op, modelName); Model model = modelFromProperty(op, modelName);
String existing = matchGenerated(model); 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, model);
swagger.addDefinition(modelName, model); swagger.addDefinition(modelName, model);
} }
} } else if (property instanceof ArrayProperty) {
else if(property instanceof ArrayProperty) {
String modelName = uniqueName("inline_response_" + key); String modelName = uniqueName("inline_response_" + key);
ArrayProperty ap = (ArrayProperty) property; ArrayProperty ap = (ArrayProperty) property;
Model model = modelFromProperty(ap, modelName); Model model = modelFromProperty(ap, modelName);
if(model != null) { if (model != null) {
String existing = matchGenerated(model); String existing = matchGenerated(model);
if (existing != null) { if (existing != null) {
response.setSchema(new RefProperty(existing)); response.setSchema(new RefProperty(existing));
@ -94,16 +88,14 @@ public class InlineModelResolver {
swagger.addDefinition(modelName, model); swagger.addDefinition(modelName, model);
} }
} }
} } else if (property instanceof MapProperty) {
else if(property instanceof MapProperty) {
MapProperty op = (MapProperty) property; MapProperty op = (MapProperty) property;
String modelName = uniqueName("inline_response_" + key); String modelName = uniqueName("inline_response_" + key);
Model model = modelFromProperty(op, modelName); Model model = modelFromProperty(op, modelName);
String existing = matchGenerated(model); 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, model);
swagger.addDefinition(modelName, model); swagger.addDefinition(modelName, model);
@ -117,36 +109,33 @@ public class InlineModelResolver {
} }
// definitions // definitions
if(models != null) { if (models != null) {
List<String> modelNames = new ArrayList<String>(models.keySet()); List<String> modelNames = new ArrayList<String>(models.keySet());
for(String modelName : modelNames) { for (String modelName : modelNames) {
Model model = models.get(modelName); Model model = models.get(modelName);
if(model instanceof ModelImpl) { if (model instanceof ModelImpl) {
ModelImpl m = (ModelImpl) model; ModelImpl m = (ModelImpl) model;
Map<String, Property> properties = m.getProperties(); Map<String, Property> properties = m.getProperties();
flattenProperties(properties, modelName); flattenProperties(properties, modelName);
} } else if (model instanceof ArrayModel) {
else if (model instanceof ArrayModel) {
ArrayModel m = (ArrayModel) model; ArrayModel m = (ArrayModel) model;
Property inner = m.getItems(); Property inner = m.getItems();
if(inner instanceof ObjectProperty) { if (inner instanceof ObjectProperty) {
String innerModelName = uniqueName(modelName + "_inner"); String innerModelName = uniqueName(modelName + "_inner");
Model innerModel = modelFromProperty((ObjectProperty) inner, modelName); Model innerModel = modelFromProperty((ObjectProperty) inner, modelName);
String existing = matchGenerated(innerModel); String existing = matchGenerated(innerModel);
if(existing == null) { if (existing == null) {
swagger.addDefinition(innerModelName, innerModel); swagger.addDefinition(innerModelName, innerModel);
addGenerated(innerModelName, innerModel); addGenerated(innerModelName, innerModel);
m.setItems(new RefProperty(innerModelName)); m.setItems(new RefProperty(innerModelName));
} } else {
else {
m.setItems(new RefProperty(existing)); m.setItems(new RefProperty(existing));
} }
} }
} } else if (model instanceof ComposedModel) {
else if (model instanceof ComposedModel) {
ComposedModel m = (ComposedModel) model; ComposedModel m = (ComposedModel) model;
} }
} }
@ -154,11 +143,11 @@ public class InlineModelResolver {
} }
public String matchGenerated(Model model) { public String matchGenerated(Model model) {
if(this.skipMatches) { if (this.skipMatches) {
return null; return null;
} }
String json = Json.pretty(model); String json = Json.pretty(model);
if(generatedSignature.containsKey(json)) { if (generatedSignature.containsKey(json)) {
return generatedSignature.get(json); return generatedSignature.get(json);
} }
return null; return null;
@ -171,15 +160,14 @@ public class InlineModelResolver {
public String uniqueName(String key) { public String uniqueName(String key) {
int count = 0; int count = 0;
boolean done = false; boolean done = false;
while(!done) { while (!done) {
String name = key; String name = key;
if(count > 0) { if (count > 0) {
name = key + "_" + count; name = key + "_" + count;
} }
if(swagger.getDefinitions() == null) { if (swagger.getDefinitions() == null) {
return name; return name;
} } else if (!swagger.getDefinitions().containsKey(name)) {
else if (!swagger.getDefinitions().containsKey(name)) {
return name; return name;
} }
count += 1; count += 1;
@ -188,14 +176,14 @@ public class InlineModelResolver {
} }
public void flattenProperties(Map<String, Property> properties, String path) { public void flattenProperties(Map<String, Property> properties, String path) {
if(properties == null) { if (properties == null) {
return; return;
} }
Map<String, Property> propsToUpdate = new HashMap<String, Property>(); Map<String, Property> propsToUpdate = new HashMap<String, Property>();
Map<String, Model> modelsToAdd = new HashMap<String, Model>(); Map<String, Model> modelsToAdd = new HashMap<String, Model>();
for(String key : properties.keySet()) { for (String key : properties.keySet()) {
Property property = properties.get(key); Property property = properties.get(key);
if(property instanceof ObjectProperty) { if (property instanceof ObjectProperty) {
String modelName = uniqueName(path + "_" + key); String modelName = uniqueName(path + "_" + key);
@ -204,10 +192,9 @@ public class InlineModelResolver {
String existing = matchGenerated(model); String existing = matchGenerated(model);
if(existing != null) { if (existing != null) {
propsToUpdate.put(key, new RefProperty(existing)); propsToUpdate.put(key, new RefProperty(existing));
} } else {
else {
propsToUpdate.put(key, new RefProperty(modelName)); propsToUpdate.put(key, new RefProperty(modelName));
modelsToAdd.put(modelName, model); modelsToAdd.put(modelName, model);
addGenerated(modelName, model); addGenerated(modelName, model);
@ -215,14 +202,14 @@ public class InlineModelResolver {
} }
} }
} }
if(propsToUpdate.size() > 0) { if (propsToUpdate.size() > 0) {
for(String key : propsToUpdate.keySet()) { for (String key : propsToUpdate.keySet()) {
properties.put(key, propsToUpdate.get(key)); properties.put(key, propsToUpdate.get(key));
} }
} }
for(String key : modelsToAdd.keySet()) { for (String key : modelsToAdd.keySet()) {
swagger.addDefinition(key, modelsToAdd.get(key)); swagger.addDefinition(key, modelsToAdd.get(key));
this.addedModels.put(key, modelsToAdd.get(key)); this.addedModels.put(key, modelsToAdd.get(key));
} }
} }
@ -242,7 +229,7 @@ public class InlineModelResolver {
// Map<String, Property> properties = object.getProperties(); // Map<String, Property> properties = object.getProperties();
Property inner = object.getItems(); Property inner = object.getItems();
if(inner instanceof ObjectProperty) { if (inner instanceof ObjectProperty) {
ArrayModel model = new ArrayModel(); ArrayModel model = new ArrayModel();
model.setDescription(description); model.setDescription(description);
model.setExample(example); model.setExample(example);
@ -281,7 +268,7 @@ public class InlineModelResolver {
model.setName(name); model.setName(name);
model.setXml(xml); model.setXml(xml);
if(properties != null) { if (properties != null) {
flattenProperties(properties, path); flattenProperties(properties, path);
model.setProperties(properties); model.setProperties(properties);
} }

View File

@ -1,6 +1,7 @@
package io.swagger.codegen; package io.swagger.codegen;
import com.sun.xml.internal.ws.wsdl.writer.document.soap.Body;
import io.swagger.models.*; 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;
@ -128,6 +129,31 @@ public class InlineModelResolverTest {
assertNotNull(impl.getProperties().get("name")); assertNotNull(impl.getProperties().get("name"));
} }
@Test
public void resolveInlineArrayBodyParameter() throws Exception {
Swagger swagger = new Swagger();
swagger.path("/hello", new Path()
.get(new Operation()
.parameter(new BodyParameter()
.name("body")
.schema(new ArrayModel()
.items(new StringProperty())))));
new InlineModelResolver().flatten(swagger);
Parameter param = swagger.getPaths().get("/hello").getGet().getParameters().get(0);
assertTrue(param instanceof BodyParameter);
BodyParameter bp = (BodyParameter) param;
Model schema = bp.getSchema();
assertTrue(schema instanceof RefModel);
Model model = swagger.getDefinitions().get("body");
assertTrue(model instanceof ArrayModel);
}
@Test @Test
public void resolveInlineArrayResponse() throws Exception { public void resolveInlineArrayResponse() throws Exception {
Swagger swagger = new Swagger(); Swagger swagger = new Swagger();