Skip to content

Commit 9adb077

Browse files
committed
Merge branch 'feature/inline-models'
2 parents a2fda60 + 10a9c62 commit 9adb077

File tree

205 files changed

+3562
-1229
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

205 files changed

+3562
-1229
lines changed

modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ public List<File> generate() {
127127
String basePath = hostBuilder.toString();
128128

129129

130+
// resolve inline models
131+
InlineModelResolver inlineModelResolver = new InlineModelResolver();
132+
inlineModelResolver.flatten(swagger);
133+
130134
List<Object> allOperations = new ArrayList<Object>();
131135
List<Object> allModels = new ArrayList<Object>();
132136

Lines changed: 326 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,326 @@
1+
package io.swagger.codegen;
2+
3+
import com.sun.org.apache.xpath.internal.operations.Mod;
4+
import io.swagger.models.*;
5+
import io.swagger.models.parameters.BodyParameter;
6+
import io.swagger.models.parameters.Parameter;
7+
import io.swagger.models.parameters.RefParameter;
8+
import io.swagger.models.properties.*;
9+
import io.swagger.util.Json;
10+
11+
import java.util.ArrayList;
12+
import java.util.HashMap;
13+
import java.util.List;
14+
import java.util.Map;
15+
16+
public class InlineModelResolver {
17+
private Swagger swagger = null;
18+
private boolean skipMatches = false;
19+
20+
Map<String, Model> addedModels = new HashMap<String, Model>();
21+
Map<String, String> generatedSignature = new HashMap<String, String>();
22+
23+
public void flatten(Swagger swagger) {
24+
this.swagger = swagger;
25+
26+
if (swagger.getDefinitions() == null) {
27+
swagger.setDefinitions(new HashMap<String, Model>());
28+
}
29+
30+
// operations
31+
Map<String, Path> paths = swagger.getPaths();
32+
Map<String, Model> models = swagger.getDefinitions();
33+
34+
if (paths != null) {
35+
for (String pathname : paths.keySet()) {
36+
Path path = paths.get(pathname);
37+
38+
for (Operation operation : path.getOperations()) {
39+
List<Parameter> parameters = operation.getParameters();
40+
41+
if (parameters != null) {
42+
for (Parameter parameter : parameters) {
43+
if (parameter instanceof BodyParameter) {
44+
BodyParameter bp = (BodyParameter) parameter;
45+
if (bp.getSchema() != null) {
46+
Model model = bp.getSchema();
47+
if(model instanceof ModelImpl) {
48+
String modelName = uniqueName(bp.getName());
49+
ModelImpl obj = (ModelImpl) model;
50+
flattenProperties(obj.getProperties(), pathname);
51+
52+
bp.setSchema(new RefModel(modelName));
53+
addGenerated(modelName, model);
54+
swagger.addDefinition(modelName, model);
55+
}
56+
else if (model instanceof ArrayModel) {
57+
ArrayModel am = (ArrayModel) model;
58+
Property inner = am.getItems();
59+
60+
if(inner instanceof ObjectProperty) {
61+
ObjectProperty op = (ObjectProperty) inner;
62+
flattenProperties(op.getProperties(), pathname);
63+
}
64+
}
65+
}
66+
}
67+
}
68+
}
69+
Map<String, Response> responses = operation.getResponses();
70+
if (responses != null) {
71+
for (String key : responses.keySet()) {
72+
Response response = responses.get(key);
73+
if (response.getSchema() != null) {
74+
Property property = response.getSchema();
75+
if (property instanceof ObjectProperty) {
76+
String modelName = uniqueName("inline_response_" + key);
77+
ObjectProperty op = (ObjectProperty) property;
78+
Model model = modelFromProperty(op, modelName);
79+
String existing = matchGenerated(model);
80+
if (existing != null) {
81+
response.setSchema(new RefProperty(existing));
82+
} else {
83+
response.setSchema(new RefProperty(modelName));
84+
addGenerated(modelName, model);
85+
swagger.addDefinition(modelName, model);
86+
}
87+
} else if (property instanceof ArrayProperty) {
88+
ArrayProperty ap = (ArrayProperty) property;
89+
if(ap.getItems() instanceof ObjectProperty) {
90+
ObjectProperty op = (ObjectProperty) ap.getItems();
91+
Map<String, Property> props = op.getProperties();
92+
flattenProperties(props, "path");
93+
}
94+
} else if (property instanceof MapProperty) {
95+
MapProperty op = (MapProperty) property;
96+
97+
Property innerProperty = op.getAdditionalProperties();
98+
if(innerProperty instanceof ObjectProperty) {
99+
ModelImpl innerModel = new ModelImpl();
100+
// TODO: model props
101+
innerModel.setTitle(property.getTitle());
102+
property.getVendorExtensions();
103+
property.getRequired();
104+
property.getReadOnly();
105+
property.getAccess();
106+
innerModel.setDescription(property.getDescription());
107+
innerModel.setExample(property.getExample());
108+
innerModel.setName(property.getName());
109+
innerModel.setXml(property.getXml());
110+
111+
innerModel.setAdditionalProperties(innerProperty);
112+
113+
String modelName = uniqueName("inline_response_" + key);
114+
String existing = matchGenerated(innerModel);
115+
if (existing != null) {
116+
response.setSchema(new RefProperty(existing));
117+
} else {
118+
response.setSchema(new RefProperty(modelName));
119+
addGenerated(modelName, innerModel);
120+
swagger.addDefinition(modelName, innerModel);
121+
}
122+
}
123+
}
124+
}
125+
}
126+
}
127+
}
128+
}
129+
}
130+
131+
// definitions
132+
if (models != null) {
133+
List<String> modelNames = new ArrayList<String>(models.keySet());
134+
for (String modelName : modelNames) {
135+
Model model = models.get(modelName);
136+
if (model instanceof ModelImpl) {
137+
ModelImpl m = (ModelImpl) model;
138+
139+
Map<String, Property> properties = m.getProperties();
140+
flattenProperties(properties, modelName);
141+
142+
} else if (model instanceof ArrayModel) {
143+
ArrayModel m = (ArrayModel) model;
144+
Property inner = m.getItems();
145+
if (inner instanceof ObjectProperty) {
146+
String innerModelName = uniqueName(modelName + "_inner");
147+
Model innerModel = modelFromProperty((ObjectProperty) inner, modelName);
148+
149+
String existing = matchGenerated(innerModel);
150+
if (existing == null) {
151+
swagger.addDefinition(innerModelName, innerModel);
152+
addGenerated(innerModelName, innerModel);
153+
m.setItems(new RefProperty(innerModelName));
154+
} else {
155+
m.setItems(new RefProperty(existing));
156+
}
157+
}
158+
} else if (model instanceof ComposedModel) {
159+
ComposedModel m = (ComposedModel) model;
160+
}
161+
}
162+
}
163+
}
164+
165+
public String matchGenerated(Model model) {
166+
if (this.skipMatches) {
167+
return null;
168+
}
169+
String json = Json.pretty(model);
170+
if (generatedSignature.containsKey(json)) {
171+
return generatedSignature.get(json);
172+
}
173+
return null;
174+
}
175+
176+
public void addGenerated(String name, Model model) {
177+
generatedSignature.put(Json.pretty(model), name);
178+
}
179+
180+
public String uniqueName(String key) {
181+
int count = 0;
182+
boolean done = false;
183+
key = key.replaceAll("[^a-z_\\.A-Z0-9 ]", "");
184+
while (!done) {
185+
String name = key;
186+
if (count > 0) {
187+
name = key + "_" + count;
188+
}
189+
if (swagger.getDefinitions() == null) {
190+
return name;
191+
} else if (!swagger.getDefinitions().containsKey(name)) {
192+
return name;
193+
}
194+
count += 1;
195+
}
196+
return key;
197+
}
198+
199+
public void flattenProperties(Map<String, Property> properties, String path) {
200+
if (properties == null) {
201+
return;
202+
}
203+
Map<String, Property> propsToUpdate = new HashMap<String, Property>();
204+
Map<String, Model> modelsToAdd = new HashMap<String, Model>();
205+
for (String key : properties.keySet()) {
206+
Property property = properties.get(key);
207+
if (property instanceof ObjectProperty) {
208+
String modelName = uniqueName(path + "_" + key);
209+
210+
ObjectProperty op = (ObjectProperty) property;
211+
Model model = modelFromProperty(op, modelName);
212+
213+
String existing = matchGenerated(model);
214+
215+
if (existing != null) {
216+
propsToUpdate.put(key, new RefProperty(existing));
217+
} else {
218+
propsToUpdate.put(key, new RefProperty(modelName));
219+
modelsToAdd.put(modelName, model);
220+
addGenerated(modelName, model);
221+
swagger.addDefinition(modelName, model);
222+
}
223+
}
224+
}
225+
if (propsToUpdate.size() > 0) {
226+
for (String key : propsToUpdate.keySet()) {
227+
properties.put(key, propsToUpdate.get(key));
228+
}
229+
}
230+
for (String key : modelsToAdd.keySet()) {
231+
swagger.addDefinition(key, modelsToAdd.get(key));
232+
this.addedModels.put(key, modelsToAdd.get(key));
233+
}
234+
}
235+
236+
public Model modelFromProperty(ArrayProperty object, String path) {
237+
String access = object.getAccess();
238+
String description = object.getDescription();
239+
String example = object.getExample();
240+
String name = object.getName();
241+
Integer position = object.getPosition();
242+
Boolean readOnly = object.getReadOnly();
243+
Boolean required = object.getRequired();
244+
String title = object.getTitle();
245+
Map<String, Object> extensions = object.getVendorExtensions();
246+
Xml xml = object.getXml();
247+
248+
// object.getItems()
249+
// Map<String, Property> properties = object.getProperties();
250+
251+
Property inner = object.getItems();
252+
if (inner instanceof ObjectProperty) {
253+
ArrayModel model = new ArrayModel();
254+
model.setDescription(description);
255+
model.setExample(example);
256+
// model.setName(name);
257+
// model.setXml(xml);
258+
259+
model.setItems(object.getItems());
260+
return model;
261+
}
262+
263+
// if(properties != null) {
264+
// flattenProperties(properties, path);
265+
// model.setProperties(properties);
266+
// }
267+
268+
return null;
269+
}
270+
271+
public Model modelFromProperty(ObjectProperty object, String path) {
272+
String access = object.getAccess();
273+
String description = object.getDescription();
274+
String example = object.getExample();
275+
String name = object.getName();
276+
Integer position = object.getPosition();
277+
Boolean readOnly = object.getReadOnly();
278+
Boolean required = object.getRequired();
279+
String title = object.getTitle();
280+
Map<String, Object> extensions = object.getVendorExtensions();
281+
Xml xml = object.getXml();
282+
283+
Map<String, Property> properties = object.getProperties();
284+
285+
ModelImpl model = new ModelImpl();
286+
model.setDescription(description);
287+
model.setExample(example);
288+
model.setName(name);
289+
model.setXml(xml);
290+
291+
if (properties != null) {
292+
flattenProperties(properties, path);
293+
model.setProperties(properties);
294+
}
295+
296+
return model;
297+
}
298+
299+
public Model modelFromProperty(MapProperty object, String path) {
300+
String access = object.getAccess();
301+
String description = object.getDescription();
302+
String example = object.getExample();
303+
String name = object.getName();
304+
Integer position = object.getPosition();
305+
Boolean readOnly = object.getReadOnly();
306+
Boolean required = object.getRequired();
307+
String title = object.getTitle();
308+
Map<String, Object> extensions = object.getVendorExtensions();
309+
Xml xml = object.getXml();
310+
311+
ArrayModel model = new ArrayModel();
312+
model.setDescription(description);
313+
model.setExample(example);
314+
model.setItems(object.getAdditionalProperties());
315+
316+
return model;
317+
}
318+
319+
public boolean isSkipMatches() {
320+
return skipMatches;
321+
}
322+
323+
public void setSkipMatches(boolean skipMatches) {
324+
this.skipMatches = skipMatches;
325+
}
326+
}

modules/swagger-codegen/src/main/java/io/swagger/codegen/examples/XmlExampleGenerator.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,15 @@ protected String modelImplToXml(ModelImpl model, int indent, Collection<String>
8484
name = xml.getName();
8585
}
8686
}
87-
for (String pName : model.getProperties().keySet()) {
88-
Property p = model.getProperties().get(pName);
89-
if (p != null && p.getXml() != null && p.getXml().getAttribute() != null && p.getXml().getAttribute()) {
90-
attributes.put(pName, p);
91-
} else {
92-
elements.put(pName, p);
87+
// TODO: map objects will not enter this block
88+
if(model.getProperties() != null) {
89+
for (String pName : model.getProperties().keySet()) {
90+
Property p = model.getProperties().get(pName);
91+
if (p != null && p.getXml() != null && p.getXml().getAttribute() != null && p.getXml().getAttribute()) {
92+
attributes.put(pName, p);
93+
} else {
94+
elements.put(pName, p);
95+
}
9396
}
9497
}
9598
sb.append(indent(indent)).append(TAG_START);

modules/swagger-codegen/src/main/resources/Groovy/build.gradle.mustache

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@ repositories {
2424
dependencies {
2525
groovy "org.codehaus.groovy:groovy-all:2.0.5"
2626
compile 'org.codehaus.groovy.modules.http-builder:http-builder:0.6'
27-
28-
2927
}
3028

3129
task wrapper(type: Wrapper) { gradleVersion = '1.6' }
32-

modules/swagger-codegen/src/main/resources/Java/pom.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@
161161
</dependency>
162162
</dependencies>
163163
<properties>
164-
<swagger-annotations-version>1.5.0</swagger-annotations-version>
164+
<swagger-annotations-version>1.5.4</swagger-annotations-version>
165165
<jersey-version>1.18</jersey-version>
166166
<jackson-version>2.4.2</jackson-version>
167167
<jodatime-version>2.3</jodatime-version>

modules/swagger-codegen/src/main/resources/JavaInflector/pom.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
</dependencies>
8484
<properties>
8585
<maven-plugin-version>1.0.0</maven-plugin-version>
86-
<swagger-core-version>1.5.3</swagger-core-version>
86+
<swagger-core-version>1.5.4</swagger-core-version>
8787
<jetty-version>9.2.9.v20150224</jetty-version>
8888
<logback-version>1.0.1</logback-version>
8989
<junit-version>4.8.2</junit-version>

modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@
168168
</repository>
169169
</repositories>
170170
<properties>
171-
<swagger-core-version>1.5.3</swagger-core-version>
171+
<swagger-core-version>1.5.4</swagger-core-version>
172172
<jetty-version>9.2.9.v20150224</jetty-version>
173173
<jersey-version>1.18.1</jersey-version>
174174
<slf4j-version>1.6.3</slf4j-version>

0 commit comments

Comments
 (0)