forked from loafle/openapi-generator-original
Merge pull request #1734 from wing328/fix_array_inline_response
Fix array/map inline response/model
This commit is contained in:
commit
cbfdffb09a
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user