Skip to content

Commit 9dcec57

Browse files
committed
fixed recursive model break issue for javascript generator
1 parent a9f00d3 commit 9dcec57

File tree

4 files changed

+104
-5
lines changed

4 files changed

+104
-5
lines changed

modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1051,9 +1051,11 @@ public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> o
10511051

10521052
// Provide access to all property models.
10531053
for (CodegenModel cgModel : new HashSet<CodegenModel>(cgModels.values())) {
1054+
detectRecursiveModel(cgModel.allVars, cgModel.classname, cgModels);
10541055
postProcessProperties(cgModel.vars, cgModels);
1055-
if (cgModel.allVars != cgModel.vars)
1056+
if (cgModel.allVars != cgModel.vars) {
10561057
postProcessProperties(cgModel.allVars, cgModels);
1058+
}
10571059
}
10581060

10591061
return objs;
@@ -1305,6 +1307,27 @@ public Map<String, Object> postProcessModels(Map<String, Object> objs) {
13051307
return objs;
13061308
}
13071309

1310+
public void detectRecursiveModel(List<CodegenProperty> allVars, String className, Map<String, CodegenModel> allModels) {
1311+
if (allVars == null || allVars.isEmpty()) {
1312+
return;
1313+
}
1314+
for (CodegenProperty codegenProperty : allVars) {
1315+
if (codegenProperty.isPrimitiveType) {
1316+
continue;
1317+
}
1318+
if (codegenProperty.isListContainer || codegenProperty.isMapContainer) {
1319+
if (className.equalsIgnoreCase(codegenProperty.items.datatype)) {
1320+
codegenProperty.items.vendorExtensions.put("x-is-recursive-model", Boolean.TRUE);
1321+
continue;
1322+
}
1323+
}
1324+
if (className.equalsIgnoreCase(codegenProperty.datatype)) {
1325+
codegenProperty.vendorExtensions.put("x-is-recursive-model", Boolean.TRUE);
1326+
continue;
1327+
}
1328+
}
1329+
}
1330+
13081331
@Override
13091332
protected boolean needToImport(String type) {
13101333
return !defaultIncludes.contains(type)

modules/swagger-codegen/src/main/resources/Javascript/api-test-response-property.mustache

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414
}}{{^loadTestDataFromFile}}{{>api-test-property}}{{/loadTestDataFromFile}});
1515
{{/isPrimitiveType}}
1616
{{^isPrimitiveType}}
17-
{{#vendorExtensions.x-indent}}
18-
{{#vendorExtensions.x-indent}}
17+
{{^vendorExtensions.x-is-recursive-model}}
18+
{{#vendorExtensions.x-indent}}
19+
{{#vendorExtensions.x-indent}}
1920
{{>api-test-response-complex}}{{!
20-
}}{{/vendorExtensions.x-indent}}{{!
21-
}}{{/vendorExtensions.x-indent}}{{!
21+
}}{{/vendorExtensions.x-indent}}{{!
22+
}}{{/vendorExtensions.x-indent}}
23+
{{/vendorExtensions.x-is-recursive-model}}{{!
2224
}}{{/isPrimitiveType}}{{!
2325
}} }
2426
{{/items}}

modules/swagger-codegen/src/test/java/io/swagger/codegen/javascript/JavascriptClientCodegenTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package io.swagger.codegen.javascript;
22

3+
import io.swagger.codegen.ClientOptInput;
4+
import io.swagger.codegen.DefaultGenerator;
5+
import io.swagger.codegen.config.CodegenConfigurator;
6+
import org.junit.rules.TemporaryFolder;
37
import org.testng.Assert;
48
import org.testng.annotations.Test;
59

610
import io.swagger.codegen.CodegenConstants;
711
import io.swagger.codegen.languages.JavascriptClientCodegen;
812

13+
import java.io.File;
14+
915
public class JavascriptClientCodegenTest {
1016

1117
@Test
@@ -43,4 +49,42 @@ public void testAdditionalPropertiesPutForConfigValues() throws Exception {
4349
Assert.assertEquals(codegen.isHideGenerationTimestamp(), false);
4450
}
4551

52+
@Test
53+
public void testRecursiveModel() {
54+
//final TemporaryFolder folder = new TemporaryFolder();
55+
56+
//folder.create();
57+
//final File output = folder.getRoot();
58+
59+
final CodegenConfigurator configurator = new CodegenConfigurator()
60+
.setLang("javascript")
61+
.setInputSpec("src/test/resources/2_0/recursive_model.yaml")
62+
.setOutputDir("/Users/hugomercado/Dropbox/Documents/swagger-codegen/output");
63+
64+
final ClientOptInput clientOptInput = configurator.toClientOptInput();
65+
new DefaultGenerator().opts(clientOptInput).generate();
66+
67+
68+
//folder.delete();
69+
70+
// final TemporaryFolder folder = new TemporaryFolder();
71+
//
72+
// folder.create();
73+
// final File output = folder.getRoot();
74+
//
75+
// final CodegenConfigurator configurator = new CodegenConfigurator()
76+
// .setLang("javascript")
77+
// .setInputSpec("src/test/resources/2_0/recursive_model.yaml")
78+
// .setOutputDir(output.getAbsolutePath());
79+
//
80+
// final ClientOptInput clientOptInput = configurator.toClientOptInput();
81+
// new DefaultGenerator().opts(clientOptInput).generate();
82+
//
83+
// final File orderFile = new File(output, "src/api/TestClassApi.js");
84+
// Assert.assertTrue(orderFile.exists());
85+
//
86+
// folder.delete();
87+
88+
}
89+
4690
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
swagger: '2.0'
2+
info:
3+
title: My API
4+
version: v1
5+
paths:
6+
/api/test:
7+
get:
8+
tags:
9+
- TestClass
10+
produces:
11+
- text/plain
12+
- application/json
13+
- text/json
14+
responses:
15+
'200':
16+
description: Success
17+
schema:
18+
type: array
19+
items:
20+
$ref: '#/definitions/TestClass'
21+
definitions:
22+
TestClass:
23+
type: object
24+
properties:
25+
name:
26+
type: string
27+
children:
28+
type: array
29+
items:
30+
$ref: '#/definitions/TestClass'

0 commit comments

Comments
 (0)