Skip to content

Commit 4555b37

Browse files
authored
Merge pull request #603 from trohrberg/issue_602
#602 Generated code does not implement model inheritance correctly
2 parents 52f95a9 + ca3097b commit 4555b37

File tree

3 files changed

+73
-15
lines changed

3 files changed

+73
-15
lines changed

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/resources/handlebars/JavaSpring/model.mustache

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package {{package}};
22

3-
{{^x-is-composed-model}}
3+
{{^isComposedModel}}
44
import java.util.Objects;
55
{{#imports}}import {{import}};
66
{{/imports}}
@@ -21,20 +21,20 @@ import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
2121
{{#withXml}}
2222
import javax.xml.bind.annotation.*;
2323
{{/withXml}}
24-
{{/x-is-composed-model}}
24+
{{/isComposedModel}}
2525

2626
{{#models}}
2727
{{#model}}
28-
{{#vendorExtensions.x-is-composed-model}}
28+
{{#isComposedModel}}
2929
{{>interface}}
30-
{{/vendorExtensions.x-is-composed-model}}
31-
{{^vendorExtensions.x-is-composed-model}}
30+
{{/isComposedModel}}
31+
{{^isComposedModel}}
3232
{{#isEnum}}
3333
{{>enumOuterClass}}
3434
{{/isEnum}}
3535
{{^isEnum}}
3636
{{>pojo}}
3737
{{/isEnum}}
38-
{{/vendorExtensions.x-is-composed-model}}
38+
{{/isComposedModel}}
3939
{{/model}}
4040
{{/models}}
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}}

0 commit comments

Comments
 (0)