Skip to content

Commit dc2a639

Browse files
authored
Merge pull request #605 from swagger-api/composed_schema_error_fixes
Composed schema error fixes
2 parents 99f6103 + c081a3e commit dc2a639

File tree

66 files changed

+454
-76
lines changed

Some content is hidden

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

66 files changed

+454
-76
lines changed

src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2932,7 +2932,7 @@ public void addOperationToGroup(String tag, String resourcePath, Operation opera
29322932
co.baseName = tag;
29332933
}
29342934

2935-
private void addParentContainer(CodegenModel codegenModel, String name, Schema schema) {
2935+
public void addParentContainer(CodegenModel codegenModel, String name, Schema schema) {
29362936
final CodegenProperty codegenProperty = fromProperty(name, schema);
29372937
addImport(codegenModel, codegenProperty.complexType);
29382938
codegenModel.parent = toInstantiationType(schema);
@@ -4194,12 +4194,7 @@ protected void configuresParameterForMediaType(CodegenOperation codegenOperation
41944194
codegenOperation.getContents().add(content);
41954195
return;
41964196
}
4197-
for (CodegenContent content : codegenContents) {
4198-
addParemeters(content, codegenOperation.headerParams);
4199-
addParemeters(content, codegenOperation.queryParams);
4200-
addParemeters(content, codegenOperation.pathParams);
4201-
addParemeters(content, codegenOperation.cookieParams);
4202-
}
4197+
this.addCodegenContentParemeters(codegenOperation, codegenContents);
42034198
for (CodegenContent content : codegenContents) {
42044199
Collections.sort(content.getParameters(), (CodegenParameter one, CodegenParameter another) -> {
42054200
if (one.required == another.required){
@@ -4226,6 +4221,15 @@ protected void addParemeters(CodegenContent codegenContent, List<CodegenParamete
42264221
}
42274222
}
42284223

4224+
protected void addCodegenContentParemeters(CodegenOperation codegenOperation, List<CodegenContent> codegenContents) {
4225+
for (CodegenContent content : codegenContents) {
4226+
addParemeters(content, codegenOperation.headerParams);
4227+
addParemeters(content, codegenOperation.queryParams);
4228+
addParemeters(content, codegenOperation.pathParams);
4229+
addParemeters(content, codegenOperation.cookieParams);
4230+
}
4231+
}
4232+
42294233
protected void setParameterNullable(CodegenParameter parameter, CodegenProperty property) {
42304234
parameter.nullable = property.nullable;
42314235
}
@@ -4255,4 +4259,8 @@ public boolean defaultIgnoreImportMappingOption() {
42554259
public ISchemaHandler getSchemaHandler() {
42564260
return new SchemaHandler(this);
42574261
}
4262+
4263+
public OpenAPI getOpenAPI() {
4264+
return this.openAPI;
4265+
}
42584266
}

src/main/java/io/swagger/codegen/v3/generators/SchemaHandler.java

Lines changed: 75 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import io.swagger.codegen.v3.CodegenModelType;
66
import io.swagger.codegen.v3.CodegenProperty;
77
import io.swagger.codegen.v3.ISchemaHandler;
8-
import io.swagger.codegen.v3.generators.util.OpenAPIUtil;
98
import io.swagger.v3.oas.models.media.ArraySchema;
109
import io.swagger.v3.oas.models.media.ComposedSchema;
1110
import io.swagger.v3.oas.models.media.Schema;
@@ -32,11 +31,11 @@ public SchemaHandler(DefaultCodegenConfig codegenConfig) {
3231
@Override
3332
public void processComposedSchemas(CodegenModel codegenModel, Schema schema, Map<String, CodegenModel> allModels) {
3433
if (schema instanceof ComposedSchema) {
35-
this.processComposedSchema(codegenModel, (ComposedSchema) schema, allModels);
34+
this.addComposedModel(this.processComposedSchema(codegenModel, (ComposedSchema) schema, allModels));
3635
return;
3736
}
3837
if (schema instanceof ArraySchema) {
39-
this.processArrayItemSchema(codegenModel, (ArraySchema) schema, allModels);
38+
this.addComposedModel(this.processArrayItemSchema(codegenModel, (ArraySchema) schema, allModels));
4039
return;
4140
}
4241
final Map<String, Schema> properties = schema.getProperties();
@@ -55,11 +54,11 @@ public void processComposedSchemas(CodegenModel codegenModel, Schema schema, Map
5554
final CodegenProperty codegenProperty = optionalCodegenProperty.get();
5655
final String codegenName = codegenModel.getName() + codegenConfig.toModelName(codegenProperty.getName());
5756
if (property instanceof ComposedSchema) {
58-
processComposedSchema(codegenName, codegenProperty, (ComposedSchema) property, allModels);
57+
this.addComposedModel(this.processComposedSchema(codegenName, codegenProperty, (ComposedSchema) property, allModels));
5958
continue;
6059
}
6160
if (property instanceof ArraySchema) {
62-
this.processArrayItemSchema(codegenName, codegenProperty, (ArraySchema) property, allModels);
61+
this.addComposedModel(this.processArrayItemSchema(codegenName, codegenProperty, (ArraySchema) property, allModels));
6362
continue;
6463
}
6564
}
@@ -70,54 +69,74 @@ public List<CodegenModel> getModels() {
7069
return composedModels;
7170
}
7271

73-
protected void processComposedSchema(CodegenModel codegenModel, ComposedSchema composedSchema, Map<String, CodegenModel> allModels) {
72+
protected CodegenModel processComposedSchema(CodegenModel codegenModel, ComposedSchema composedSchema, Map<String, CodegenModel> allModels) {
7473
List<Schema> schemas = composedSchema.getOneOf();
7574
CodegenModel composedModel = this.createComposedModel(ONE_OF_PREFFIX + codegenModel.getName(), schemas);
7675
if (composedModel == null) {
7776
schemas = composedSchema.getAnyOf();
7877
composedModel = this.createComposedModel(ANY_OF_PREFFIX + codegenModel.getName(), schemas);
7978
if (composedModel == null) {
80-
return;
79+
return null;
8180
}
8281
}
8382
this.addInterfaceModel(codegenModel, composedModel);
8483
this.addInterfaces(schemas, composedModel, allModels);
85-
composedModels.add(composedModel);
84+
return composedModel;
85+
}
86+
87+
protected CodegenModel processComposedSchema(String name, ComposedSchema composedSchema, Map<String, CodegenModel> allModels) {
88+
List<Schema> schemas = composedSchema.getOneOf();
89+
CodegenModel composedModel = this.createComposedModel(ONE_OF_PREFFIX + name, schemas);
90+
if (composedModel == null) {
91+
schemas = composedSchema.getAnyOf();
92+
composedModel = this.createComposedModel(ANY_OF_PREFFIX + name, schemas);
93+
if (composedModel == null) {
94+
return null;
95+
}
96+
}
97+
this.addInterfaces(schemas, composedModel, allModels);
98+
return composedModel;
8699
}
87100

88-
protected void processComposedSchema(String codegenModelName, CodegenProperty codegenProperty, ComposedSchema composedSchema, Map<String, CodegenModel> allModels) {
101+
protected CodegenModel processComposedSchema(String codegenModelName, CodegenProperty codegenProperty, ComposedSchema composedSchema, Map<String, CodegenModel> allModels) {
89102
List<Schema> schemas = composedSchema.getOneOf();
90103
CodegenModel composedModel = this.createComposedModel(ONE_OF_PREFFIX + codegenModelName, schemas);
91104
if (composedModel == null) {
92105
schemas = composedSchema.getAnyOf();
93106
composedModel = this.createComposedModel(ANY_OF_PREFFIX + codegenModelName, schemas);
94107
if (composedModel == null) {
95-
return;
108+
return null;
96109
}
97110
}
98111
this.addInterfaces(schemas, composedModel, allModels);
99-
codegenProperty.datatype = composedModel.getName();
100-
codegenProperty.datatypeWithEnum = composedModel.getName();
101-
codegenProperty.baseType = composedModel.getName();
102-
codegenProperty.complexType = composedModel.getName();
103-
104-
composedModels.add(composedModel);
112+
codegenProperty.datatype = composedModel.getClassname();
113+
codegenProperty.datatypeWithEnum = composedModel.getClassname();
114+
codegenProperty.baseType = composedModel.getClassname();
115+
codegenProperty.complexType = composedModel.getClassname();
116+
return composedModel;
105117
}
106118

107-
protected void processArrayItemSchema(CodegenModel codegenModel, ArraySchema arraySchema, Map<String, CodegenModel> allModels) {
119+
protected CodegenModel processArrayItemSchema(CodegenModel codegenModel, ArraySchema arraySchema, Map<String, CodegenModel> allModels) {
108120
final Schema itemsSchema = arraySchema.getItems();
109121
if (itemsSchema instanceof ComposedSchema) {
110-
final CodegenModel itemsModel = CodegenModelFactory.newInstance(CodegenModelType.MODEL);
111-
itemsModel.setName(codegenModel.name + ARRAY_ITEMS_SUFFIX);
112-
this.processComposedSchema(itemsModel, (ComposedSchema) itemsSchema, allModels);
122+
final CodegenModel composedModel = this.processComposedSchema(codegenModel.name + ARRAY_ITEMS_SUFFIX, (ComposedSchema) itemsSchema, allModels);
123+
this.updateArrayModel(codegenModel, composedModel.name, arraySchema);
124+
return composedModel;
113125
}
126+
return null;
114127
}
115128

116-
protected void processArrayItemSchema(String codegenModelName, CodegenProperty codegenProperty, ArraySchema arraySchema, Map<String, CodegenModel> allModels) {
129+
protected CodegenModel processArrayItemSchema(String codegenModelName, CodegenProperty codegenProperty, ArraySchema arraySchema, Map<String, CodegenModel> allModels) {
117130
final Schema itemsSchema = arraySchema.getItems();
118131
if (itemsSchema instanceof ComposedSchema) {
119-
this.processComposedSchema(codegenModelName, codegenProperty, (ComposedSchema) itemsSchema, allModels);
132+
final CodegenModel composedModel = this.processComposedSchema(codegenModelName + ARRAY_ITEMS_SUFFIX, codegenProperty.items, (ComposedSchema) itemsSchema, allModels);
133+
if (composedModel == null) {
134+
return null;
135+
}
136+
this.updatePropertyDataType(codegenProperty, composedModel.name, arraySchema);
137+
return composedModel;
120138
}
139+
return null;
121140
}
122141

123142
protected CodegenModel createComposedModel(String name, List<Schema> schemas) {
@@ -168,4 +187,38 @@ protected boolean hasNonObjectSchema(List<Schema> schemas) {
168187
}
169188
return false;
170189
}
190+
191+
protected void addComposedModel(CodegenModel composedModel) {
192+
if (composedModel == null) {
193+
return;
194+
}
195+
this.composedModels.add(composedModel);
196+
}
197+
198+
protected void updatePropertyDataType(CodegenProperty codegenProperty, String schemaName, ArraySchema arraySchema) {
199+
final Schema items = arraySchema.getItems();
200+
final Schema refSchema = new Schema();
201+
refSchema.set$ref("#/components/schemas/" + schemaName);
202+
arraySchema.setItems(refSchema);
203+
codegenProperty.setDatatype(this.codegenConfig.getTypeDeclaration(arraySchema));
204+
codegenProperty.setDatatypeWithEnum(codegenProperty.getDatatype());
205+
206+
codegenProperty.defaultValue = this.codegenConfig.toDefaultValue(arraySchema);
207+
codegenProperty.defaultValueWithParam = this.codegenConfig.toDefaultValueWithParam(codegenProperty.baseName, arraySchema);
208+
209+
arraySchema.setItems(items);
210+
}
211+
212+
protected void updateArrayModel(CodegenModel codegenModel, String schemaName, ArraySchema arraySchema) {
213+
final Schema items = arraySchema.getItems();
214+
final Schema refSchema = new Schema();
215+
refSchema.set$ref("#/components/schemas/" + schemaName);
216+
arraySchema.setItems(refSchema);
217+
218+
this.codegenConfig.addParentContainer(codegenModel, codegenModel.name, arraySchema);
219+
codegenModel.defaultValue = this.codegenConfig.toDefaultValue(arraySchema);
220+
codegenModel.arrayModelType = this.codegenConfig.fromProperty(codegenModel.name, arraySchema).complexType;
221+
222+
arraySchema.setItems(items);
223+
}
171224
}

src/main/java/io/swagger/codegen/v3/generators/dotnet/AbstractCSharpCodegen.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
import com.github.jknack.handlebars.Lambda;
55
import com.google.common.collect.ImmutableMap;
66
import io.swagger.codegen.v3.CodegenConstants;
7+
import io.swagger.codegen.v3.CodegenContent;
78
import io.swagger.codegen.v3.CodegenModel;
89
import io.swagger.codegen.v3.CodegenOperation;
910
import io.swagger.codegen.v3.CodegenProperty;
11+
import io.swagger.codegen.v3.ISchemaHandler;
1012
import io.swagger.codegen.v3.generators.DefaultCodegenConfig;
1113
import io.swagger.codegen.v3.generators.handlebars.csharp.CsharpHelper;
1214
import io.swagger.codegen.v3.generators.handlebars.lambda.CamelCaseLambda;
@@ -1067,6 +1069,14 @@ public void addHandlebarHelpers(Handlebars handlebars) {
10671069
handlebars.registerHelpers(new CsharpHelper());
10681070
}
10691071

1072+
@Override
1073+
protected void addCodegenContentParemeters(CodegenOperation codegenOperation, List<CodegenContent> codegenContents) {
1074+
for (CodegenContent content : codegenContents) {
1075+
addParemeters(content, codegenOperation.headerParams);
1076+
addParemeters(content, codegenOperation.queryParams);
1077+
addParemeters(content, codegenOperation.pathParams);
1078+
}
1079+
}
10701080
/*
10711081
TODO: uncomment if/when switching to stream for file upload
10721082
@Override

src/main/java/io/swagger/codegen/v3/generators/html/HtmlSchemaHandler.java

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io.swagger.codegen.v3.generators.DefaultCodegenConfig;
88
import io.swagger.codegen.v3.generators.SchemaHandler;
99
import io.swagger.codegen.v3.generators.util.OpenAPIUtil;
10+
import io.swagger.util.Json;
1011
import io.swagger.v3.oas.models.media.ArraySchema;
1112
import io.swagger.v3.oas.models.media.ComposedSchema;
1213
import io.swagger.v3.oas.models.media.Schema;
@@ -22,14 +23,41 @@ public HtmlSchemaHandler(DefaultCodegenConfig codegenConfig) {
2223
super(codegenConfig);
2324
}
2425

25-
protected void processComposedSchema(CodegenModel codegenModel, ComposedSchema composedSchema, Map<String, CodegenModel> allModels) {
26+
public void processComposedSchemas(CodegenModel codegenModel, Schema schema, Map<String, CodegenModel> allModels) {
27+
if(!(schema instanceof ComposedSchema)) {
28+
super.processComposedSchemas(codegenModel, schema, allModels);
29+
return;
30+
}
31+
final ComposedSchema composedSchema = (ComposedSchema) schema;
32+
if (composedSchema.getAllOf() == null || composedSchema.getAllOf().isEmpty()) {
33+
super.processComposedSchemas(codegenModel, composedSchema, allModels);
34+
return;
35+
}
36+
final List<CodegenProperty> codegenProperties = codegenModel.vars;
37+
if (codegenProperties == null || codegenProperties.isEmpty()) {
38+
return;
39+
}
40+
for (CodegenProperty codegenProperty : codegenProperties) {
41+
if (codegenProperty.getIsListContainer()) {
42+
Schema schemaProperty = OpenAPIUtil.getPropertyFromAllOfSchema(codegenProperty.baseName, composedSchema.getAllOf(), this.codegenConfig.getOpenAPI());
43+
if (schemaProperty == null || !(schemaProperty instanceof ArraySchema)) {
44+
continue;
45+
}
46+
this.processArrayItemSchema(StringUtils.EMPTY, codegenProperty, (ArraySchema) schemaProperty, allModels);
47+
break;
48+
}
49+
}
50+
}
51+
52+
@Override
53+
protected CodegenModel processComposedSchema(CodegenModel codegenModel, ComposedSchema composedSchema, Map<String, CodegenModel> allModels) {
2654
List<Schema> schemas = composedSchema.getOneOf();
2755
CodegenModel composedModel = this.createComposedModel(ONE_OF_PREFFIX + codegenModel.getName(), schemas);
2856
if (composedModel == null) {
2957
schemas = composedSchema.getAnyOf();
3058
composedModel = this.createComposedModel(ANY_OF_PREFFIX + codegenModel.getName(), schemas);
3159
if (composedModel == null) {
32-
return;
60+
return null;
3361
}
3462
}
3563
this.addInterfaceModel(codegenModel, composedModel);
@@ -40,22 +68,24 @@ protected void processComposedSchema(CodegenModel codegenModel, ComposedSchema c
4068
} else if (composedModel.getName().startsWith(ONE_OF_PREFFIX)) {
4169
codegenModel.vendorExtensions.put("anyOf-model", composedModel);
4270
}
71+
return null;
4372
}
4473

45-
protected void processComposedSchema(String codegenModelName, CodegenProperty codegenProperty, ComposedSchema composedSchema, Map<String, CodegenModel> allModels) {
74+
@Override
75+
protected CodegenModel processComposedSchema(String codegenModelName, CodegenProperty codegenProperty, ComposedSchema composedSchema, Map<String, CodegenModel> allModels) {
4676
List<Schema> schemas = composedSchema.getOneOf();
4777
CodegenModel composedModel = this.createComposedModel(ONE_OF_PREFFIX + codegenModelName, schemas);
4878
if (composedModel == null) {
4979
schemas = composedSchema.getAnyOf();
5080
composedModel = this.createComposedModel(ANY_OF_PREFFIX + codegenModelName, schemas);
5181
if (composedModel == null) {
52-
return;
82+
return null;
5383
}
5484
}
5585
if (composedModel.getName().startsWith(ONE_OF_PREFFIX)) {
5686
codegenProperty.vendorExtensions.put("oneOf-model", composedModel);
5787

58-
} else if (composedModel.getName().startsWith(ONE_OF_PREFFIX)) {
88+
} else if (composedModel.getName().startsWith(ANY_OF_PREFFIX)) {
5989
codegenProperty.vendorExtensions.put("anyOf-model", composedModel);
6090
}
6191
final List<String> modelNames = new ArrayList<>();
@@ -66,5 +96,24 @@ protected void processComposedSchema(String codegenModelName, CodegenProperty co
6696
}
6797
}
6898
composedModel.vendorExtensions.put("x-model-names", modelNames);
99+
return null;
100+
}
101+
102+
@Override
103+
protected CodegenModel processArrayItemSchema(CodegenModel codegenModel, ArraySchema arraySchema, Map<String, CodegenModel> allModels) {
104+
final Schema itemsSchema = arraySchema.getItems();
105+
if (itemsSchema instanceof ComposedSchema) {
106+
this.processComposedSchema(codegenModel, (ComposedSchema) itemsSchema, allModels);
107+
}
108+
return null;
109+
}
110+
111+
@Override
112+
protected CodegenModel processArrayItemSchema(String codegenModelName, CodegenProperty codegenProperty, ArraySchema arraySchema, Map<String, CodegenModel> allModels) {
113+
final Schema itemsSchema = arraySchema.getItems();
114+
if (itemsSchema instanceof ComposedSchema) {
115+
this.processComposedSchema(codegenModelName, codegenProperty.items, (ComposedSchema) itemsSchema, allModels);
116+
}
117+
return null;
69118
}
70119
}

src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAngularClientCodegen.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.swagger.codegen.v3.CodegenParameter;
1616
import io.swagger.codegen.v3.CodegenOperation;
1717
import io.swagger.codegen.v3.SupportingFile;
18+
import io.swagger.codegen.v3.utils.ModelUtils;
1819
import io.swagger.codegen.v3.utils.SemVer;
1920
import io.swagger.v3.oas.models.media.ArraySchema;
2021
import io.swagger.v3.oas.models.media.BinarySchema;
@@ -27,6 +28,9 @@
2728
import org.slf4j.Logger;
2829
import org.slf4j.LoggerFactory;
2930

31+
import static io.swagger.codegen.v3.CodegenConstants.IS_ENUM_EXT_NAME;
32+
import static io.swagger.codegen.v3.generators.handlebars.ExtensionHelper.getBooleanValue;
33+
3034
public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCodegen {
3135

3236
private static Logger LOGGER = LoggerFactory.getLogger(TypeScriptAngularClientCodegen.class);
@@ -455,6 +459,21 @@ public Map<String, Object> postProcessModels(Map<String, Object> objs) {
455459
return result;
456460
}
457461

462+
@Override
463+
public Map<String, Object> postProcessAllModels(Map<String, Object> processedModels) {
464+
for (Map.Entry<String, Object> entry : processedModels.entrySet()) {
465+
final Map<String, Object> inner = (Map<String, Object>) entry.getValue();
466+
final List<Map<String, Object>> models = (List<Map<String, Object>>) inner.get("models");
467+
for (Map<String, Object> mo : models) {
468+
final CodegenModel codegenModel = (CodegenModel) mo.get("model");
469+
if (codegenModel.getIsAlias() && codegenModel.imports != null && !codegenModel.imports.isEmpty()) {
470+
mo.put("tsImports", toTsImports(codegenModel, codegenModel.imports));
471+
}
472+
}
473+
}
474+
return processedModels;
475+
}
476+
458477
private List<Map<String, String>> toTsImports(CodegenModel cm, Set<String> imports) {
459478
List<Map<String, String>> tsImports = new ArrayList<>();
460479
for (String im : imports) {

0 commit comments

Comments
 (0)