Skip to content

Commit 9508579

Browse files
committed
added inline resolver
1 parent a5a6ae7 commit 9508579

File tree

2 files changed

+280
-0
lines changed

2 files changed

+280
-0
lines changed
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
package io.swagger.codegen;
2+
3+
import io.swagger.models.*;
4+
import io.swagger.models.parameters.BodyParameter;
5+
import io.swagger.models.parameters.Parameter;
6+
import io.swagger.models.properties.ObjectProperty;
7+
import io.swagger.models.properties.Property;
8+
import io.swagger.models.properties.RefProperty;
9+
10+
import java.util.ArrayList;
11+
import java.util.HashMap;
12+
import java.util.List;
13+
import java.util.Map;
14+
15+
public class InlineModelResolver {
16+
private Swagger swagger = null;
17+
18+
Map<String, Model> addedModels = new HashMap<String, Model>();
19+
20+
public void flatten(Swagger swagger) {
21+
this.swagger = swagger;
22+
23+
// operations
24+
Map<String, Path> paths = swagger.getPaths();
25+
Map<String, Model> models = swagger.getDefinitions();
26+
27+
if(paths != null) {
28+
for(String pathname : paths.keySet()) {
29+
Path path = paths.get(pathname);
30+
31+
for(Operation operation: path.getOperations()) {
32+
List<Parameter> parameters = operation.getParameters();
33+
34+
if(parameters != null) {
35+
for(Parameter parameter : parameters) {
36+
if(parameter instanceof BodyParameter) {
37+
BodyParameter bp = (BodyParameter) parameter;
38+
39+
if(bp.getSchema() != null) {
40+
Model model = bp.getSchema();
41+
42+
if(model instanceof ModelImpl) {
43+
String name = bp.getName();
44+
45+
if(models == null) {
46+
models = new HashMap<String, Model>();
47+
swagger.setDefinitions(models);
48+
}
49+
else {
50+
if (swagger.getDefinitions().containsKey(bp.getName())) {
51+
name += "_" + "inline";
52+
}
53+
}
54+
swagger.addDefinition(name, model);
55+
bp.setSchema(new RefModel(name));
56+
}
57+
}
58+
}
59+
}
60+
}
61+
Map<String, Response> responses = operation.getResponses();
62+
if(responses != null) {
63+
for(String key : responses.keySet()) {
64+
Response response = responses.get(key);
65+
if(response.getSchema() != null) {
66+
Property property = response.getSchema();
67+
if(property instanceof ObjectProperty) {
68+
String modelName = uniqueName("inline_response_" + key);
69+
ObjectProperty op = (ObjectProperty) property;
70+
Model model = modelFromProperty(op, modelName);
71+
response.setSchema(new RefProperty(modelName));
72+
swagger.addDefinition(modelName, model);
73+
}
74+
}
75+
}
76+
}
77+
}
78+
}
79+
}
80+
81+
// definitions
82+
if(models != null) {
83+
List<String> modelNames = new ArrayList<String>(models.keySet());
84+
for(String modelName : modelNames) {
85+
Model model = models.get(modelName);
86+
if(model instanceof ModelImpl) {
87+
ModelImpl m = (ModelImpl) model;
88+
89+
Map<String, Property> properties = m.getProperties();
90+
flattenProperties(properties, modelName);
91+
}
92+
else if (model instanceof ArrayModel) {
93+
ArrayModel m = (ArrayModel) model;
94+
Property inner = m.getItems();
95+
if(inner instanceof ObjectProperty) {
96+
String innerModelName = uniqueName(modelName + "_" + inner);
97+
Model innerModel = modelFromProperty((ObjectProperty)inner, modelName);
98+
swagger.addDefinition(innerModelName, innerModel);
99+
m.setItems(new RefProperty(innerModelName));
100+
}
101+
}
102+
else if (model instanceof ComposedModel) {
103+
ComposedModel m = (ComposedModel) model;
104+
}
105+
}
106+
}
107+
}
108+
109+
public String uniqueName(String key) {
110+
int count = 0;
111+
boolean done = false;
112+
while(!done) {
113+
String name = key;
114+
if(count > 0) {
115+
name = key + "_" + count;
116+
}
117+
if(swagger.getDefinitions() == null) {
118+
return name;
119+
}
120+
else if (!swagger.getDefinitions().containsKey(name)) {
121+
return name;
122+
}
123+
count += 1;
124+
}
125+
return key;
126+
}
127+
128+
public void flattenProperties(Map<String, Property> properties, String path) {
129+
if(properties == null) {
130+
return;
131+
}
132+
Map<String, Property> propsToUpdate = new HashMap<String, Property>();
133+
Map<String, Model> modelsToAdd = new HashMap<String, Model>();
134+
for(String key : properties.keySet()) {
135+
Property property = properties.get(key);
136+
if(property instanceof ObjectProperty) {
137+
String modelName = uniqueName(path + "_" + key);
138+
ObjectProperty op = (ObjectProperty) property;
139+
Model model = modelFromProperty(op, modelName);
140+
141+
modelsToAdd.put(modelName, model);
142+
propsToUpdate.put(key, new RefProperty(modelName));
143+
}
144+
}
145+
if(propsToUpdate.size() > 0) {
146+
for(String key : propsToUpdate.keySet()) {
147+
properties.put(key, propsToUpdate.get(key));
148+
}
149+
}
150+
for(String key : modelsToAdd.keySet()) {
151+
swagger.addDefinition(key, modelsToAdd.get(key));
152+
this.addedModels.put(key, modelsToAdd.get(key));
153+
}
154+
}
155+
156+
public Model modelFromProperty(ObjectProperty object, String path) {
157+
String access = object.getAccess();
158+
String description = object.getDescription();
159+
String example = object.getExample();
160+
String name = object.getName();
161+
Integer position = object.getPosition();
162+
Boolean readOnly = object.getReadOnly();
163+
Boolean required = object.getRequired();
164+
String title = object.getTitle();
165+
Map<String, Object> extensions = object.getVendorExtensions();
166+
Xml xml = object.getXml();
167+
168+
Map<String, Property> properties = object.getProperties();
169+
170+
ModelImpl model = new ModelImpl();
171+
model.setDescription(description);
172+
model.setExample(example);
173+
model.setName(name);
174+
model.setXml(xml);
175+
176+
if(properties != null) {
177+
flattenProperties(properties, path);
178+
model.setProperties(properties);
179+
}
180+
181+
return model;
182+
}
183+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package io.swagger.codegen;
2+
3+
4+
import io.swagger.models.*;
5+
import io.swagger.models.parameters.BodyParameter;
6+
import io.swagger.models.parameters.Parameter;
7+
import io.swagger.models.properties.ObjectProperty;
8+
import io.swagger.models.properties.StringProperty;
9+
import io.swagger.util.Json;
10+
import org.junit.Test;
11+
12+
public class InlineModelResolverTest {
13+
@Test
14+
public void resolveInlineModelTest() throws Exception {
15+
Swagger swagger = new Swagger();
16+
17+
swagger.addDefinition("User", new ModelImpl()
18+
.name("user")
19+
.description("a common user")
20+
.property("name", new StringProperty())
21+
.property("address", new ObjectProperty()
22+
.title("title")
23+
._default("default")
24+
.access("access")
25+
.readOnly(false)
26+
.required(true)
27+
.description("description")
28+
.name("name")
29+
.property("street", new StringProperty())
30+
.property("city", new StringProperty())));
31+
32+
new InlineModelResolver().flatten(swagger);
33+
34+
Json.prettyPrint(swagger);
35+
}
36+
37+
@Test
38+
public void testInlineResponseModel() throws Exception {
39+
Swagger swagger = new Swagger();
40+
41+
swagger.path("/foo/bar", new Path()
42+
.get(new Operation()
43+
.response(200, new Response()
44+
.description("it works!")
45+
.schema(new ObjectProperty()
46+
.property("name", new StringProperty())))))
47+
.path("/foo/baz", new Path()
48+
.get(new Operation()
49+
.response(200, new Response()
50+
.vendorExtension("x-foo", "bar")
51+
.description("it works!")
52+
.schema(new ObjectProperty()
53+
.vendorExtension("x-baz", "boo")
54+
.property("name", new StringProperty()
55+
.vendorExtension("x-bars", "bleh"))))));
56+
new InlineModelResolver().flatten(swagger);
57+
58+
Json.prettyPrint(swagger);
59+
}
60+
61+
@Test
62+
public void resolveInlineArrayModel() throws Exception {
63+
Swagger swagger = new Swagger();
64+
65+
swagger.addDefinition("User", new ArrayModel()
66+
.items(new ObjectProperty()
67+
.title("title")
68+
._default("default")
69+
.access("access")
70+
.readOnly(false)
71+
.required(true)
72+
.description("description")
73+
.name("name")
74+
.property("street", new StringProperty())
75+
.property("city", new StringProperty())));
76+
77+
new InlineModelResolver().flatten(swagger);
78+
79+
Json.prettyPrint(swagger);
80+
}
81+
82+
@Test
83+
public void resolveInlineBodyParameter() throws Exception {
84+
Swagger swagger = new Swagger();
85+
86+
swagger.path("/hello", new Path()
87+
.get(new Operation()
88+
.parameter(new BodyParameter()
89+
.name("body")
90+
.schema(new ModelImpl()
91+
.property("name", new StringProperty())))));
92+
93+
new InlineModelResolver().flatten(swagger);
94+
95+
Json.prettyPrint(swagger);
96+
}
97+
}

0 commit comments

Comments
 (0)