Skip to content

Commit 1ae6aa3

Browse files
committed
Merge branch 'composed_schema_error_fixes' of https://github.com/swagger-api/swagger-codegen-generators into composed_schema_error_fixes
2 parents 2d1d2f8 + d855cb5 commit 1ae6aa3

File tree

8 files changed

+161
-10
lines changed

8 files changed

+161
-10
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4259,4 +4259,8 @@ public boolean defaultIgnoreImportMappingOption() {
42594259
public ISchemaHandler getSchemaHandler() {
42604260
return new SchemaHandler(this);
42614261
}
4262+
4263+
public OpenAPI getOpenAPI() {
4264+
return this.openAPI;
4265+
}
42624266
}

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

Lines changed: 48 additions & 1 deletion
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,6 +23,33 @@ public HtmlSchemaHandler(DefaultCodegenConfig codegenConfig) {
2223
super(codegenConfig);
2324
}
2425

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
2553
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);
@@ -43,6 +71,7 @@ protected CodegenModel processComposedSchema(CodegenModel codegenModel, Composed
4371
return null;
4472
}
4573

74+
@Override
4675
protected CodegenModel processComposedSchema(String codegenModelName, CodegenProperty codegenProperty, ComposedSchema composedSchema, Map<String, CodegenModel> allModels) {
4776
List<Schema> schemas = composedSchema.getOneOf();
4877
CodegenModel composedModel = this.createComposedModel(ONE_OF_PREFFIX + codegenModelName, schemas);
@@ -56,7 +85,7 @@ protected CodegenModel processComposedSchema(String codegenModelName, CodegenPro
5685
if (composedModel.getName().startsWith(ONE_OF_PREFFIX)) {
5786
codegenProperty.vendorExtensions.put("oneOf-model", composedModel);
5887

59-
} else if (composedModel.getName().startsWith(ONE_OF_PREFFIX)) {
88+
} else if (composedModel.getName().startsWith(ANY_OF_PREFFIX)) {
6089
codegenProperty.vendorExtensions.put("anyOf-model", composedModel);
6190
}
6291
final List<String> modelNames = new ArrayList<>();
@@ -69,4 +98,22 @@ protected CodegenModel processComposedSchema(String codegenModelName, CodegenPro
6998
composedModel.vendorExtensions.put("x-model-names", modelNames);
7099
return null;
71100
}
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;
118+
}
72119
}

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

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.swagger.codegen.v3.SupportingFile;
1616
import io.swagger.codegen.v3.generators.features.BeanValidationFeatures;
1717
import io.swagger.codegen.v3.generators.features.OptionalFeatures;
18+
import io.swagger.codegen.v3.generators.util.OpenAPIUtil;
1819
import io.swagger.codegen.v3.utils.URLPathUtil;
1920
import io.swagger.v3.oas.models.OpenAPI;
2021
import io.swagger.v3.oas.models.Operation;
@@ -27,11 +28,7 @@
2728
import java.io.IOException;
2829
import java.io.Writer;
2930
import java.net.URL;
30-
import java.util.ArrayList;
31-
import java.util.Arrays;
32-
import java.util.HashMap;
33-
import java.util.List;
34-
import java.util.Map;
31+
import java.util.*;
3532
import java.util.regex.Matcher;
3633
import java.util.stream.Collectors;
3734

@@ -792,6 +789,60 @@ public void postProcessModelProperty(CodegenModel model, CodegenProperty propert
792789
}
793790
}
794791

792+
@Override
793+
public Map<String, Object> postProcessAllModels(Map<String, Object> objs) {
794+
Map<String, Object> allProcessedModels = super.postProcessAllModels(objs);
795+
796+
List<Object> allModels = new ArrayList<Object>();
797+
for (String name: allProcessedModels.keySet()) {
798+
Map<String, Object> models = (Map<String, Object>)allProcessedModels.get(name);
799+
try {
800+
allModels.add(((List<Object>) models.get("models")).get(0));
801+
} catch (Exception e){
802+
e.printStackTrace();
803+
}
804+
}
805+
806+
additionalProperties.put("parent", modelInheritanceSupport(allModels));
807+
808+
return allProcessedModels;
809+
}
810+
811+
protected List<Map<String, Object>> modelInheritanceSupport(List<?> allModels) {
812+
Map<CodegenModel, List<CodegenModel>> byParent = new LinkedHashMap<>();
813+
for (Object model : allModels) {
814+
Map entry = (Map) model;
815+
CodegenModel parent = ((CodegenModel)entry.get("model")).parentModel;
816+
if(null!= parent) {
817+
byParent.computeIfAbsent(parent, k -> new LinkedList<>()).add((CodegenModel)entry.get("model"));
818+
}
819+
}
820+
821+
List<Map<String, Object>> parentsList = new ArrayList<>();
822+
for (Map.Entry<CodegenModel, List<CodegenModel>> parentModelEntry : byParent.entrySet()) {
823+
CodegenModel parentModel = parentModelEntry.getKey();
824+
List<Map<String, Object>> childrenList = new ArrayList<>();
825+
Map<String, Object> parent = new HashMap<>();
826+
parent.put("classname", parentModel.classname);
827+
List<CodegenModel> childrenModels = byParent.get(parentModel);
828+
for (CodegenModel model : childrenModels) {
829+
Map<String, Object> child = new HashMap<>();
830+
child.put("name", model.name);
831+
child.put("classname", model.classname);
832+
childrenList.add(child);
833+
}
834+
parent.put("children", childrenList);
835+
parent.put("discriminator", parentModel.discriminator);
836+
if(parentModel.discriminator != null && parentModel.discriminator.getMapping() != null)
837+
{
838+
parentModel.discriminator.getMapping().replaceAll((key, value) -> OpenAPIUtil.getSimpleRef(value));
839+
}
840+
parentsList.add(parent);
841+
}
842+
843+
return parentsList;
844+
}
845+
795846
@Override
796847
public Map<String, Object> postProcessModelsEnum(Map<String, Object> objs) {
797848
objs = super.postProcessModelsEnum(objs);

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) {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public void processComposedSchemas(CodegenModel codegenModel, Schema schema, Map
2828

2929
if (isAlias) {
3030
codegenModel.getVendorExtensions().put(CodegenConstants.IS_ALIAS_EXT_NAME, Boolean.TRUE);
31+
codegenModel.dataType = this.codegenConfig.getSchemaType(schema);
3132
this.codegenConfig.addImport(codegenModel, codegenModel.dataType);
3233
}
3334
}

src/main/java/io/swagger/codegen/v3/generators/util/OpenAPIUtil.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.swagger.v3.oas.models.media.Schema;
77
import org.apache.commons.lang3.StringUtils;
88

9+
import java.util.List;
910
import java.util.Map;
1011

1112
import static io.swagger.codegen.v3.CodegenConstants.HAS_VALIDATION_EXT_NAME;
@@ -57,4 +58,20 @@ public static Schema getSchemaFromRefSchema(Schema refSchema, OpenAPI openAPI) {
5758
final String name = getSimpleRef(refSchema.get$ref());
5859
return getSchemaFromName(name, openAPI);
5960
}
61+
62+
public static Schema getPropertyFromAllOfSchema(String propertyName, List<Schema> schemas, OpenAPI openAPI) {
63+
for (Schema schema : schemas) {
64+
if (StringUtils.isNotBlank(schema.get$ref())) {
65+
schema = getSchemaFromRefSchema(schema, openAPI);
66+
}
67+
final Map<String, Schema> schemaProperties = schema.getProperties();
68+
if (schemaProperties == null) {
69+
continue;
70+
}
71+
if (schemaProperties.containsKey(propertyName)) {
72+
return schemaProperties.get(propertyName);
73+
}
74+
}
75+
return null;
76+
}
6077
}
Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
{{#jackson}}
22
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{discriminator.propertyName}}", visible = true )
33
@JsonSubTypes({
4-
{{#children}}
5-
@JsonSubTypes.Type(value = {{classname}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
6-
{{/children}}
7-
}){{/jackson}}
4+
{{#if discriminator.mapping}}
5+
{{#each discriminator.mapping}}
6+
@JsonSubTypes.Type(value = {{this}}.class, name = "{{@key}}"),
7+
{{/each}}
8+
{{else}}
9+
{{#children}}
10+
@JsonSubTypes.Type(value = {{classname}}.class, name = "{{name}}"),
11+
{{/children}}
12+
{{/if}}
13+
})
14+
{{/jackson}}

src/main/resources/handlebars/htmlDocs2/index.mustache

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,12 @@
114114
var defs = {}
115115
{{#models}}
116116
{{#model}}
117+
{{#isComposedModel}}
118+
defs.{{name}} = {};
119+
{{/isComposedModel}}
120+
{{^isComposedModel}}
117121
defs.{{name}} = {{{modelJson}}};
122+
{{/isComposedModel}}
118123
{{/model}}
119124
{{/models}}
120125
</script>

0 commit comments

Comments
 (0)