Merge pull request #2872 from dmytrobr/feature/issue-2868

use Title attribute as model name
This commit is contained in:
wing328 2016-06-01 10:55:54 +08:00
commit 7b6747e6f3
3 changed files with 141 additions and 24 deletions

View File

@ -1 +1,2 @@
/.settings/ /.settings/
/test-output/

View File

@ -50,7 +50,7 @@ public class InlineModelResolver {
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 = uniqueName(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);
@ -65,7 +65,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(), pathname); flattenProperties(op.getProperties(), pathname);
String modelName = uniqueName(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,7 +91,7 @@ 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 = uniqueName("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) {
@ -110,7 +110,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(), pathname); flattenProperties(op.getProperties(), pathname);
String modelName = uniqueName("inline_response_" + key); String modelName = resolveModelName( op.getTitle(),"inline_response_" + 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) {
@ -130,7 +130,7 @@ public class InlineModelResolver {
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 = uniqueName("inline_response_" + key); String modelName = resolveModelName( op.getTitle(),"inline_response_" + 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) {
@ -184,6 +184,15 @@ public class InlineModelResolver {
} }
} }
private String resolveModelName(String title, String key ) {
if (title == null) {
return uniqueName(key);
}
else {
return uniqueName(title);
}
}
public String matchGenerated(Model model) { public String matchGenerated(Model model) {
if (this.skipMatches) { if (this.skipMatches) {
return null; return null;

View File

@ -77,6 +77,40 @@ public class InlineModelResolverTest {
assertTrue(model.getProperties().get("name") instanceof StringProperty); assertTrue(model.getProperties().get("name") instanceof StringProperty);
} }
@Test
public void testInlineResponseModelWithTitle() throws Exception {
Swagger swagger = new Swagger();
String responseTitle = "GetBarResponse";
swagger.path("/foo/bar", new Path()
.get(new Operation()
.response(200, new Response()
.description("it works!")
.schema(new ObjectProperty().title(responseTitle)
.property("name", new StringProperty())))))
.path("/foo/baz", new Path()
.get(new Operation()
.response(200, new Response()
.vendorExtension("x-foo", "bar")
.description("it works!")
.schema(new ObjectProperty()
.property("name", new StringProperty())))));
new InlineModelResolver().flatten(swagger);
Map<String, Response> responses = swagger.getPaths().get("/foo/bar").getGet().getResponses();
Response response = responses.get("200");
assertNotNull(response);
assertTrue(response.getSchema() instanceof RefProperty);
ModelImpl model = (ModelImpl)swagger.getDefinitions().get(responseTitle);
assertTrue(model.getProperties().size() == 1);
assertNotNull(model.getProperties().get("name"));
assertTrue(model.getProperties().get("name") instanceof StringProperty);
}
@Test @Test
public void resolveInlineArrayModel() throws Exception { public void resolveInlineArrayModel() throws Exception {
Swagger swagger = new Swagger(); Swagger swagger = new Swagger();
@ -129,6 +163,35 @@ public class InlineModelResolverTest {
assertNotNull(impl.getProperties().get("address")); assertNotNull(impl.getProperties().get("address"));
} }
@Test
public void resolveInlineBodyParameterWithTitle() throws Exception {
Swagger swagger = new Swagger();
ModelImpl addressModelItem = new ModelImpl();
String addressModelName = "DetailedAddress";
addressModelItem.setTitle(addressModelName);
swagger.path("/hello", new Path()
.get(new Operation()
.parameter(new BodyParameter()
.name("body")
.schema(addressModelItem
.property("address", new ObjectProperty()
.property("street", new StringProperty()))
.property("name", new StringProperty())))));
new InlineModelResolver().flatten(swagger);
Operation operation = swagger.getPaths().get("/hello").getGet();
BodyParameter bp = (BodyParameter)operation.getParameters().get(0);
assertTrue(bp.getSchema() instanceof RefModel);
Model body = swagger.getDefinitions().get(addressModelName);
assertTrue(body instanceof ModelImpl);
ModelImpl impl = (ModelImpl) body;
assertNotNull(impl.getProperties().get("address"));
}
@Test @Test
public void notResolveNonModelBodyParameter() throws Exception { public void notResolveNonModelBodyParameter() throws Exception {
Swagger swagger = new Swagger(); Swagger swagger = new Swagger();
@ -245,6 +308,50 @@ public class InlineModelResolverTest {
assertTrue(impl.getProperties().get("name") instanceof StringProperty); assertTrue(impl.getProperties().get("name") instanceof StringProperty);
} }
@Test
public void resolveInlineArrayResponseWithTitle() throws Exception {
Swagger swagger = new Swagger();
swagger.path("/foo/baz", new Path()
.get(new Operation()
.response(200, new Response()
.vendorExtension("x-foo", "bar")
.description("it works!")
.schema(new ArrayProperty()
.items(
new ObjectProperty()
.title("FooBar")
.property("name", new StringProperty()))))));
new InlineModelResolver().flatten(swagger);
Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200");
assertNotNull(response);
assertNotNull(response.getSchema());
Property responseProperty = response.getSchema();
// no need to flatten more
assertTrue(responseProperty instanceof ArrayProperty);
ArrayProperty ap = (ArrayProperty) responseProperty;
Property p = ap.getItems();
assertNotNull(p);
RefProperty rp = (RefProperty) p;
assertEquals(rp.getType(), "ref");
assertEquals(rp.get$ref(), "#/definitions/"+ "FooBar");
assertEquals(rp.getSimpleRef(), "FooBar");
Model inline = swagger.getDefinitions().get("FooBar");
assertNotNull(inline);
assertTrue(inline instanceof ModelImpl);
ModelImpl impl = (ModelImpl) inline;
assertNotNull(impl.getProperties().get("name"));
assertTrue(impl.getProperties().get("name") instanceof StringProperty);
}
@Test @Test
public void testInlineMapResponse() throws Exception { public void testInlineMapResponse() throws Exception {
Swagger swagger = new Swagger(); Swagger swagger = new Swagger();