Skip to content

Commit ca87148

Browse files
authored
Merge pull request #11071 from swagger-api/fix-oom
2 parents f2b5afe + 7109d2e commit ca87148

File tree

3 files changed

+39
-4
lines changed

3 files changed

+39
-4
lines changed

modules/swagger-codegen/pom.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,19 @@
249249
<artifactId>commons-cli</artifactId>
250250
<version>${commons-cli-version}</version>
251251
</dependency>
252+
<!--
253+
used to pretty print examples generated by ExampleGenerator.
254+
an issue with Jackson pretty printing for large specs, where
255+
for some reason memory usage goes up to OOM errors.
256+
TODO if bug (?) is fixed in Jackson pretty printing, remove
257+
the dep and use jackson instead
258+
-->
259+
<dependency>
260+
<groupId>org.json</groupId>
261+
<artifactId>json</artifactId>
262+
<version>20210307</version>
263+
</dependency>
264+
252265
<dependency>
253266
<groupId>org.testng</groupId>
254267
<artifactId>testng</artifactId>

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1381,7 +1381,13 @@ public CodegenModel fromModel(String name, Model model, Map<String, Model> allDe
13811381
m.classname = toModelName(name);
13821382
m.classVarName = toVarName(name);
13831383
m.classFilename = toModelFilename(name);
1384-
m.modelJson = Json.pretty(model);
1384+
// NOTE: not using Json.pretty() to write out model, as it
1385+
// can raise memory consumption (see comment in ExampleGenerator)
1386+
try {
1387+
m.modelJson = Json.mapper().writeValueAsString(model);
1388+
} catch (Exception e) {
1389+
m.modelJson = "{}";
1390+
}
13851391
m.externalDocs = model.getExternalDocs();
13861392
m.vendorExtensions = model.getVendorExtensions();
13871393
m.isAlias = typeAliases.containsKey(name);

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

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.swagger.models.ModelImpl;
55
import io.swagger.models.properties.*;
66
import io.swagger.util.Json;
7+
import org.json.JSONObject;
78
import org.slf4j.Logger;
89
import org.slf4j.LoggerFactory;
910

@@ -46,7 +47,15 @@ public List<Map<String, String>> generate(Map<String, Object> examples, List<Str
4647
Map<String, String> kv = new HashMap<>();
4748
kv.put(CONTENT_TYPE, mediaType);
4849
if (property != null && mediaType.startsWith(MIME_TYPE_JSON)) {
49-
String example = Json.pretty(resolvePropertyToExample("", mediaType, property, processedModels));
50+
/*
51+
org.json is used to pretty print example, because of an issue with
52+
Jackson pretty printing for large specs, where for some reason
53+
memory usage goes up to OOM errors.
54+
TODO if bug (?) is fixed in Jackson pretty printing, remove the dep and use jackson instead
55+
*/
56+
//String example = Json.pretty(resolvePropertyToExample("", mediaType, property, processedModels));
57+
String example = new JSONObject(resolvePropertyToExample("", mediaType, property, processedModels)).toString(2);
58+
5059

5160
if (example != null) {
5261
kv.put(EXAMPLE, example);
@@ -91,7 +100,14 @@ public List<Map<String, String>> generate(Map<String, Object> examples, List<Str
91100
final Model model = this.examples.get(modelName);
92101
if (model != null) {
93102

94-
String example = Json.pretty(resolveModelToExample(modelName, mediaType, model, processedModels));
103+
/*
104+
org.json is used to pretty print example, because of an issue with
105+
Jackson pretty printing for large specs, where for some reason
106+
memory usage goes up to OOM errors.
107+
TODO if bug (?) is fixed in Jackson pretty printing, remove the dep and use jackson instead
108+
*/
109+
// String example = Json.pretty(resolveModelToExample(modelName, mediaType, model, processedModels));
110+
String example = new JSONObject(resolveModelToExample(modelName, mediaType, model, processedModels)).toString(2);
95111

96112
if (example != null) {
97113
kv.put(EXAMPLE, example);
@@ -216,7 +232,7 @@ private Object resolvePropertyToExample(String propertyName, String mediaType, P
216232
}
217233
logger.warn("Ref property with empty model.");
218234
} else if (property instanceof UUIDProperty) {
219-
return "046b6c7f-0b8a-43b9-b35d-6489e6daee91";
235+
return "046b6c7f-0b8a-43b9-b35d-6489e6daee91";
220236
}
221237

222238
return "";

0 commit comments

Comments
 (0)