forked from loafle/openapi-generator-original
Make InlineModelResolver resolve vendorExtensions correctly for Schema Object (#3719)
* Fix InlineModelResolver to ensure the vendorExtensions could be accessed via schema object or inline model. * format the code * Copy vendor extension to property only.
This commit is contained in:
parent
bc2f614b92
commit
0c59aefe90
@ -45,27 +45,26 @@ public class InlineModelResolver {
|
|||||||
BodyParameter bp = (BodyParameter) parameter;
|
BodyParameter bp = (BodyParameter) parameter;
|
||||||
if (bp.getSchema() != null) {
|
if (bp.getSchema() != null) {
|
||||||
Model model = bp.getSchema();
|
Model model = bp.getSchema();
|
||||||
if(model instanceof ModelImpl) {
|
if (model instanceof ModelImpl) {
|
||||||
ModelImpl obj = (ModelImpl) model;
|
ModelImpl obj = (ModelImpl) model;
|
||||||
if (obj.getType() == null || "object".equals(obj.getType())) {
|
if (obj.getType() == null || "object".equals(obj.getType())) {
|
||||||
if (obj.getProperties() != null && obj.getProperties().size() > 0) {
|
if (obj.getProperties() != null && obj.getProperties().size() > 0) {
|
||||||
flattenProperties(obj.getProperties(), pathname);
|
flattenProperties(obj.getProperties(), pathname);
|
||||||
String modelName = resolveModelName( obj.getTitle(), bp.getName());
|
String modelName = resolveModelName(obj.getTitle(), bp.getName());
|
||||||
bp.setSchema(new RefModel(modelName));
|
bp.setSchema(new RefModel(modelName));
|
||||||
addGenerated(modelName, model);
|
addGenerated(modelName, model);
|
||||||
swagger.addDefinition(modelName, model);
|
swagger.addDefinition(modelName, model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else if (model instanceof ArrayModel) {
|
||||||
else if (model instanceof ArrayModel) {
|
|
||||||
ArrayModel am = (ArrayModel) model;
|
ArrayModel am = (ArrayModel) model;
|
||||||
Property inner = am.getItems();
|
Property inner = am.getItems();
|
||||||
|
|
||||||
if(inner instanceof ObjectProperty) {
|
if (inner instanceof ObjectProperty) {
|
||||||
ObjectProperty op = (ObjectProperty) inner;
|
ObjectProperty op = (ObjectProperty) inner;
|
||||||
if (op.getProperties() != null && op.getProperties().size() > 0) {
|
if (op.getProperties() != null && op.getProperties().size() > 0) {
|
||||||
flattenProperties(op.getProperties(), pathname);
|
flattenProperties(op.getProperties(), pathname);
|
||||||
String modelName = resolveModelName( op.getTitle(), bp.getName());
|
String modelName = resolveModelName(op.getTitle(), bp.getName());
|
||||||
Model innerModel = modelFromProperty(op, modelName);
|
Model innerModel = modelFromProperty(op, modelName);
|
||||||
String existing = matchGenerated(innerModel);
|
String existing = matchGenerated(innerModel);
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
@ -91,13 +90,13 @@ public class InlineModelResolver {
|
|||||||
if (property instanceof ObjectProperty) {
|
if (property instanceof ObjectProperty) {
|
||||||
ObjectProperty op = (ObjectProperty) property;
|
ObjectProperty op = (ObjectProperty) property;
|
||||||
if (op.getProperties() != null && op.getProperties().size() > 0) {
|
if (op.getProperties() != null && op.getProperties().size() > 0) {
|
||||||
String modelName = resolveModelName( op.getTitle(),"inline_response_" + key);
|
String modelName = resolveModelName(op.getTitle(), "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(this.makeRefProperty(existing, property));
|
||||||
} else {
|
} else {
|
||||||
response.setSchema(new RefProperty(modelName));
|
response.setSchema(this.makeRefProperty(modelName, property));
|
||||||
addGenerated(modelName, model);
|
addGenerated(modelName, model);
|
||||||
swagger.addDefinition(modelName, model);
|
swagger.addDefinition(modelName, model);
|
||||||
}
|
}
|
||||||
@ -106,41 +105,43 @@ public class InlineModelResolver {
|
|||||||
ArrayProperty ap = (ArrayProperty) property;
|
ArrayProperty ap = (ArrayProperty) property;
|
||||||
Property inner = ap.getItems();
|
Property inner = ap.getItems();
|
||||||
|
|
||||||
if(inner instanceof ObjectProperty) {
|
if (inner instanceof ObjectProperty) {
|
||||||
ObjectProperty op = (ObjectProperty) inner;
|
ObjectProperty op = (ObjectProperty) inner;
|
||||||
if (op.getProperties() != null && op.getProperties().size() > 0) {
|
if (op.getProperties() != null && op.getProperties().size() > 0) {
|
||||||
flattenProperties(op.getProperties(), pathname);
|
flattenProperties(op.getProperties(), pathname);
|
||||||
String modelName = resolveModelName( op.getTitle(),"inline_response_" + key);
|
String modelName = resolveModelName(op.getTitle(),
|
||||||
Model innerModel = modelFromProperty(op, modelName);
|
"inline_response_" + key);
|
||||||
String existing = matchGenerated(innerModel);
|
Model innerModel = modelFromProperty(op, modelName);
|
||||||
if (existing != null) {
|
String existing = matchGenerated(innerModel);
|
||||||
ap.setItems(new RefProperty(existing));
|
if (existing != null) {
|
||||||
} else {
|
ap.setItems(this.makeRefProperty(existing, op));
|
||||||
ap.setItems(new RefProperty(modelName));
|
} else {
|
||||||
|
ap.setItems(this.makeRefProperty(modelName, op));
|
||||||
addGenerated(modelName, innerModel);
|
addGenerated(modelName, innerModel);
|
||||||
swagger.addDefinition(modelName, innerModel);
|
swagger.addDefinition(modelName, innerModel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (property instanceof MapProperty) {
|
} else if (property instanceof MapProperty) {
|
||||||
MapProperty mp = (MapProperty) property;
|
MapProperty mp = (MapProperty) property;
|
||||||
|
|
||||||
Property innerProperty = mp.getAdditionalProperties();
|
Property innerProperty = mp.getAdditionalProperties();
|
||||||
if(innerProperty instanceof ObjectProperty) {
|
if (innerProperty instanceof ObjectProperty) {
|
||||||
ObjectProperty op = (ObjectProperty) innerProperty;
|
ObjectProperty op = (ObjectProperty) innerProperty;
|
||||||
if (op.getProperties() != null && op.getProperties().size() > 0) {
|
if (op.getProperties() != null && op.getProperties().size() > 0) {
|
||||||
flattenProperties(op.getProperties(), pathname);
|
flattenProperties(op.getProperties(), pathname);
|
||||||
String modelName = resolveModelName( op.getTitle(),"inline_response_" + key);
|
String modelName = resolveModelName(op.getTitle(),
|
||||||
Model innerModel = modelFromProperty(op, modelName);
|
"inline_response_" + key);
|
||||||
String existing = matchGenerated(innerModel);
|
Model innerModel = modelFromProperty(op, modelName);
|
||||||
if (existing != null) {
|
String existing = matchGenerated(innerModel);
|
||||||
mp.setAdditionalProperties(new RefProperty(existing));
|
if (existing != null) {
|
||||||
} else {
|
mp.setAdditionalProperties(new RefProperty(existing));
|
||||||
mp.setAdditionalProperties(new RefProperty(modelName));
|
} else {
|
||||||
addGenerated(modelName, innerModel);
|
mp.setAdditionalProperties(new RefProperty(modelName));
|
||||||
swagger.addDefinition(modelName, innerModel);
|
addGenerated(modelName, innerModel);
|
||||||
}
|
swagger.addDefinition(modelName, innerModel);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -167,7 +168,7 @@ public class InlineModelResolver {
|
|||||||
if (inner instanceof ObjectProperty) {
|
if (inner instanceof ObjectProperty) {
|
||||||
ObjectProperty op = (ObjectProperty) inner;
|
ObjectProperty op = (ObjectProperty) inner;
|
||||||
if (op.getProperties() != null && op.getProperties().size() > 0) {
|
if (op.getProperties() != null && op.getProperties().size() > 0) {
|
||||||
String innerModelName = resolveModelName(op.getTitle(),modelName + "_inner");
|
String innerModelName = resolveModelName(op.getTitle(), modelName + "_inner");
|
||||||
Model innerModel = modelFromProperty(op, innerModelName);
|
Model innerModel = modelFromProperty(op, innerModelName);
|
||||||
String existing = matchGenerated(innerModel);
|
String existing = matchGenerated(innerModel);
|
||||||
if (existing == null) {
|
if (existing == null) {
|
||||||
@ -188,13 +189,12 @@ public class InlineModelResolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String resolveModelName(String title, String key ) {
|
private String resolveModelName(String title, String key) {
|
||||||
if (title == null) {
|
if (title == null) {
|
||||||
return uniqueName(key);
|
return uniqueName(key);
|
||||||
}
|
} else {
|
||||||
else {
|
return uniqueName(title);
|
||||||
return uniqueName(title);
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String matchGenerated(Model model) {
|
public String matchGenerated(Model model) {
|
||||||
@ -215,7 +215,11 @@ 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;
|
||||||
key = key.replaceAll("[^a-z_\\.A-Z0-9 ]", ""); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'.
|
key = key.replaceAll("[^a-z_\\.A-Z0-9 ]", ""); // FIXME: a parameter
|
||||||
|
// should not be
|
||||||
|
// assigned. Also declare
|
||||||
|
// the methods parameters
|
||||||
|
// as 'final'.
|
||||||
while (!done) {
|
while (!done) {
|
||||||
String name = key;
|
String name = key;
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
@ -239,9 +243,8 @@ public class InlineModelResolver {
|
|||||||
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 && ((ObjectProperty) property).getProperties() != null
|
||||||
((ObjectProperty)property).getProperties() != null &&
|
&& ((ObjectProperty) property).getProperties().size() > 0) {
|
||||||
((ObjectProperty)property).getProperties().size() > 0) {
|
|
||||||
|
|
||||||
ObjectProperty op = (ObjectProperty) property;
|
ObjectProperty op = (ObjectProperty) property;
|
||||||
|
|
||||||
@ -266,7 +269,7 @@ public class InlineModelResolver {
|
|||||||
ObjectProperty op = (ObjectProperty) inner;
|
ObjectProperty op = (ObjectProperty) inner;
|
||||||
if (op.getProperties() != null && op.getProperties().size() > 0) {
|
if (op.getProperties() != null && op.getProperties().size() > 0) {
|
||||||
flattenProperties(op.getProperties(), path);
|
flattenProperties(op.getProperties(), path);
|
||||||
String modelName = resolveModelName(op.getTitle(),path + "_" + key);
|
String modelName = resolveModelName(op.getTitle(), path + "_" + key);
|
||||||
Model innerModel = modelFromProperty(op, modelName);
|
Model innerModel = modelFromProperty(op, modelName);
|
||||||
String existing = matchGenerated(innerModel);
|
String existing = matchGenerated(innerModel);
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
@ -317,9 +320,10 @@ public class InlineModelResolver {
|
|||||||
String example = null;
|
String example = null;
|
||||||
|
|
||||||
Object obj = object.getExample();
|
Object obj = object.getExample();
|
||||||
if(obj != null) {
|
if (obj != null) {
|
||||||
example = obj.toString();
|
example = obj.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
Property inner = object.getItems();
|
Property inner = object.getItems();
|
||||||
if (inner instanceof ObjectProperty) {
|
if (inner instanceof ObjectProperty) {
|
||||||
ArrayModel model = new ArrayModel();
|
ArrayModel model = new ArrayModel();
|
||||||
@ -328,6 +332,7 @@ public class InlineModelResolver {
|
|||||||
model.setItems(object.getItems());
|
model.setItems(object.getItems());
|
||||||
return model;
|
return model;
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -336,7 +341,7 @@ public class InlineModelResolver {
|
|||||||
String example = null;
|
String example = null;
|
||||||
|
|
||||||
Object obj = object.getExample();
|
Object obj = object.getExample();
|
||||||
if(obj != null) {
|
if (obj != null) {
|
||||||
example = obj.toString();
|
example = obj.toString();
|
||||||
}
|
}
|
||||||
String name = object.getName();
|
String name = object.getName();
|
||||||
@ -363,7 +368,7 @@ public class InlineModelResolver {
|
|||||||
String example = null;
|
String example = null;
|
||||||
|
|
||||||
Object obj = object.getExample();
|
Object obj = object.getExample();
|
||||||
if(obj != null) {
|
if (obj != null) {
|
||||||
example = obj.toString();
|
example = obj.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -375,6 +380,32 @@ public class InlineModelResolver {
|
|||||||
return model;
|
return model;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make a RefProperty
|
||||||
|
*
|
||||||
|
* @param ref
|
||||||
|
* @param property
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Property makeRefProperty(String ref, Property property) {
|
||||||
|
RefProperty newProperty = new RefProperty(ref);
|
||||||
|
this.copyVendorExtensions(property, newProperty);
|
||||||
|
return newProperty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy vendor extensions from Property to another Property
|
||||||
|
*
|
||||||
|
* @param source
|
||||||
|
* @param target
|
||||||
|
*/
|
||||||
|
public void copyVendorExtensions(Property source, AbstractProperty target) {
|
||||||
|
Map<String, Object> vendorExtensions = source.getVendorExtensions();
|
||||||
|
for (String extName : vendorExtensions.keySet()) {
|
||||||
|
target.setVendorExtension(extName, vendorExtensions.get(extName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isSkipMatches() {
|
public boolean isSkipMatches() {
|
||||||
return skipMatches;
|
return skipMatches;
|
||||||
}
|
}
|
||||||
|
@ -191,21 +191,24 @@ public class InlineModelResolverTest {
|
|||||||
.response(200, new Response()
|
.response(200, new Response()
|
||||||
.description("it works!")
|
.description("it works!")
|
||||||
.schema(new ObjectProperty()
|
.schema(new ObjectProperty()
|
||||||
.property("name", new StringProperty())))))
|
.property("name", new StringProperty()).vendorExtension("x-ext", "ext-prop")))))
|
||||||
.path("/foo/baz", new Path()
|
.path("/foo/baz", new Path()
|
||||||
.get(new Operation()
|
.get(new Operation()
|
||||||
.response(200, new Response()
|
.response(200, new Response()
|
||||||
.vendorExtension("x-foo", "bar")
|
.vendorExtension("x-foo", "bar")
|
||||||
.description("it works!")
|
.description("it works!")
|
||||||
.schema(new ObjectProperty()
|
.schema(new ObjectProperty()
|
||||||
.property("name", new StringProperty())))));
|
.property("name", new StringProperty()).vendorExtension("x-ext", "ext-prop")))));
|
||||||
new InlineModelResolver().flatten(swagger);
|
new InlineModelResolver().flatten(swagger);
|
||||||
|
|
||||||
Map<String, Response> responses = swagger.getPaths().get("/foo/bar").getGet().getResponses();
|
Map<String, Response> responses = swagger.getPaths().get("/foo/bar").getGet().getResponses();
|
||||||
|
|
||||||
Response response = responses.get("200");
|
Response response = responses.get("200");
|
||||||
assertNotNull(response);
|
assertNotNull(response);
|
||||||
assertTrue(response.getSchema() instanceof RefProperty);
|
Property schema = response.getSchema();
|
||||||
|
assertTrue(schema instanceof RefProperty);
|
||||||
|
assertEquals(1, schema.getVendorExtensions().size());
|
||||||
|
assertEquals("ext-prop", schema.getVendorExtensions().get("x-ext"));
|
||||||
|
|
||||||
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);
|
||||||
@ -433,15 +436,17 @@ public class InlineModelResolverTest {
|
|||||||
public void resolveInlineArrayResponse() throws Exception {
|
public void resolveInlineArrayResponse() throws Exception {
|
||||||
Swagger swagger = new Swagger();
|
Swagger swagger = new Swagger();
|
||||||
|
|
||||||
swagger.path("/foo/baz", new Path()
|
ArrayProperty schema = new ArrayProperty()
|
||||||
|
.items(new ObjectProperty()
|
||||||
|
.property("name", new StringProperty())
|
||||||
|
.vendorExtension("x-ext", "ext-items"))
|
||||||
|
.vendorExtension("x-ext", "ext-prop");
|
||||||
|
swagger.path("/foo/baz", new Path()
|
||||||
.get(new Operation()
|
.get(new Operation()
|
||||||
.response(200, new Response()
|
.response(200, new Response()
|
||||||
.vendorExtension("x-foo", "bar")
|
.vendorExtension("x-foo", "bar")
|
||||||
.description("it works!")
|
.description("it works!")
|
||||||
.schema(new ArrayProperty()
|
.schema(schema))));
|
||||||
.items(
|
|
||||||
new ObjectProperty()
|
|
||||||
.property("name", new StringProperty()))))));
|
|
||||||
|
|
||||||
new InlineModelResolver().flatten(swagger);
|
new InlineModelResolver().flatten(swagger);
|
||||||
|
|
||||||
@ -455,6 +460,9 @@ public class InlineModelResolverTest {
|
|||||||
assertTrue(responseProperty instanceof ArrayProperty);
|
assertTrue(responseProperty instanceof ArrayProperty);
|
||||||
|
|
||||||
ArrayProperty ap = (ArrayProperty) responseProperty;
|
ArrayProperty ap = (ArrayProperty) responseProperty;
|
||||||
|
assertEquals(1, ap.getVendorExtensions().size());
|
||||||
|
assertEquals("ext-prop", ap.getVendorExtensions().get("x-ext"));
|
||||||
|
|
||||||
Property p = ap.getItems();
|
Property p = ap.getItems();
|
||||||
|
|
||||||
assertNotNull(p);
|
assertNotNull(p);
|
||||||
@ -463,6 +471,8 @@ public class InlineModelResolverTest {
|
|||||||
assertEquals(rp.getType(), "ref");
|
assertEquals(rp.getType(), "ref");
|
||||||
assertEquals(rp.get$ref(), "#/definitions/inline_response_200");
|
assertEquals(rp.get$ref(), "#/definitions/inline_response_200");
|
||||||
assertEquals(rp.getSimpleRef(), "inline_response_200");
|
assertEquals(rp.getSimpleRef(), "inline_response_200");
|
||||||
|
assertEquals(1, rp.getVendorExtensions().size());
|
||||||
|
assertEquals("ext-items", rp.getVendorExtensions().get("x-ext"));
|
||||||
|
|
||||||
Model inline = swagger.getDefinitions().get("inline_response_200");
|
Model inline = swagger.getDefinitions().get("inline_response_200");
|
||||||
assertNotNull(inline);
|
assertNotNull(inline);
|
||||||
@ -522,6 +532,7 @@ public class InlineModelResolverTest {
|
|||||||
|
|
||||||
MapProperty schema = new MapProperty();
|
MapProperty schema = new MapProperty();
|
||||||
schema.setAdditionalProperties(new StringProperty());
|
schema.setAdditionalProperties(new StringProperty());
|
||||||
|
schema.setVendorExtension("x-ext", "ext-prop");
|
||||||
|
|
||||||
swagger.path("/foo/baz", new Path()
|
swagger.path("/foo/baz", new Path()
|
||||||
.get(new Operation()
|
.get(new Operation()
|
||||||
@ -537,6 +548,8 @@ public class InlineModelResolverTest {
|
|||||||
Property property = response.getSchema();
|
Property property = response.getSchema();
|
||||||
assertTrue(property instanceof MapProperty);
|
assertTrue(property instanceof MapProperty);
|
||||||
assertTrue(swagger.getDefinitions().size() == 0);
|
assertTrue(swagger.getDefinitions().size() == 0);
|
||||||
|
assertEquals(1, property.getVendorExtensions().size());
|
||||||
|
assertEquals("ext-prop", property.getVendorExtensions().get("x-ext"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -546,6 +559,7 @@ public class InlineModelResolverTest {
|
|||||||
MapProperty schema = new MapProperty();
|
MapProperty schema = new MapProperty();
|
||||||
schema.setAdditionalProperties(new ObjectProperty()
|
schema.setAdditionalProperties(new ObjectProperty()
|
||||||
.property("name", new StringProperty()));
|
.property("name", new StringProperty()));
|
||||||
|
schema.setVendorExtension("x-ext", "ext-prop");
|
||||||
|
|
||||||
swagger.path("/foo/baz", new Path()
|
swagger.path("/foo/baz", new Path()
|
||||||
.get(new Operation()
|
.get(new Operation()
|
||||||
@ -558,6 +572,8 @@ public class InlineModelResolverTest {
|
|||||||
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 MapProperty);
|
assertTrue(property instanceof MapProperty);
|
||||||
|
assertEquals(1, property.getVendorExtensions().size());
|
||||||
|
assertEquals("ext-prop", property.getVendorExtensions().get("x-ext"));
|
||||||
assertTrue(swagger.getDefinitions().size() == 1);
|
assertTrue(swagger.getDefinitions().size() == 1);
|
||||||
|
|
||||||
Model inline = swagger.getDefinitions().get("inline_response_200");
|
Model inline = swagger.getDefinitions().get("inline_response_200");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user