diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java index 9ae3f6ed321538a0047e2e73f8fd88530d8afed4..2915e039f1dcc4152c68c7e814c3d48d203f4b04 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java @@ -972,7 +972,8 @@ public class ModelUtils { public static String getParentName(ComposedSchema composedSchema, Map<String, Schema> allSchemas) { List<Schema> interfaces = getInterfaces(composedSchema); - List<String> refedParentNames = new ArrayList<>(); + List<String> refedWithoutDiscriminator = new ArrayList<>(); + if (interfaces != null && !interfaces.isEmpty()) { for (Schema schema : interfaces) { // get the actual schema @@ -986,9 +987,8 @@ public class ModelUtils { // discriminator.propertyName is used return parentName; } else { - LOGGER.debug("Not a parent since discriminator.propertyName is not set {}", s.get$ref()); // not a parent since discriminator.propertyName is not set - refedParentNames.add(parentName); + refedWithoutDiscriminator.add(parentName); } } else { // not a ref, doing nothing @@ -997,11 +997,11 @@ public class ModelUtils { } // parent name only makes sense when there is a single obvious parent - if (refedParentNames.size() == 1) { + if (refedWithoutDiscriminator.size() == 1) { LOGGER.warn("[deprecated] inheritance without use of 'discriminator.propertyName' is deprecated " + "and will be removed in a future release. Generating model for composed schema name: {}. Title: {}", composedSchema.getName(), composedSchema.getTitle()); - return refedParentNames.get(0); + return refedWithoutDiscriminator.get(0); } return null; @@ -1018,6 +1018,7 @@ public class ModelUtils { public static List<String> getAllParentsName(ComposedSchema composedSchema, Map<String, Schema> allSchemas, boolean includeAncestors) { List<Schema> interfaces = getInterfaces(composedSchema); List<String> names = new ArrayList<String>(); + List<String> refedWithoutDiscriminator = new ArrayList<>(); if (interfaces != null && !interfaces.isEmpty()) { for (Schema schema : interfaces) { @@ -1035,8 +1036,8 @@ public class ModelUtils { names.addAll(getAllParentsName((ComposedSchema) s, allSchemas, true)); } } else { - LOGGER.debug("Not a parent since discriminator.propertyName is not set {}", s.get$ref()); // not a parent since discriminator.propertyName is not set + refedWithoutDiscriminator.add(parentName); } } else { // not a ref, doing nothing @@ -1044,6 +1045,12 @@ public class ModelUtils { } } + if (names.size() == 0 && refedWithoutDiscriminator.size() == 1) { + LOGGER.warn("[deprecated] inheritance without use of 'discriminator.propertyName' is deprecated " + + "and will be removed in a future release. Generating model for {}. Title: {}", composedSchema.getName(), composedSchema.getTitle()); + return refedWithoutDiscriminator; + } + return names; } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 83dfc91ebd256f4b39174c5c9ba8a05241853cf8..0511b10f723a638c03447a68fa0cfea93459813f 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -528,9 +528,31 @@ public class DefaultCodegenTest { Schema child = openAPI.getComponents().getSchemas().get("clubForCreation"); codegen.setOpenAPI(openAPI); CodegenModel childModel = codegen.fromModel("clubForCreation", child); - showVars(childModel); + Assert.assertEquals(getRequiredVars(childModel), Collections.singletonList("name")); } + @Test + public void testAllOfSingleRefNoOwnProps() { + final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/2_0/composed-allof.yaml"); + final DefaultCodegen codegen = new CodegenWithMultipleInheritance(); + + Schema schema = openAPI.getComponents().getSchemas().get("NewMessageEventCoreNoOwnProps"); + codegen.setOpenAPI(openAPI); + CodegenModel model = codegen.fromModel("NewMessageEventCoreNoOwnProps", schema); + Assert.assertEquals(getNames(model.getVars()), Collections.emptyList()); + Assert.assertEquals(model.parent, "MessageEventCore"); + Assert.assertEquals(model.allParents, Collections.singletonList("MessageEventCore")); + } + + class CodegenWithMultipleInheritance extends DefaultCodegen { + public CodegenWithMultipleInheritance() { + super(); + supportsInheritance = true; + supportsMultipleInheritance = true; + } + } + + @Test public void testAllOfParent() { final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/allOf-required-parent.yaml"); @@ -539,24 +561,25 @@ public class DefaultCodegenTest { Schema person = openAPI.getComponents().getSchemas().get("person"); CodegenModel personModel = codegen.fromModel("person", person); - showVars(personModel); + Assert.assertEquals(getRequiredVars(personModel), Arrays.asList("firstName", "name", "email", "id")); Schema personForCreation = openAPI.getComponents().getSchemas().get("personForCreation"); CodegenModel personForCreationModel = codegen.fromModel("personForCreation", personForCreation); - showVars(personForCreationModel); + Assert.assertEquals(getRequiredVars(personForCreationModel), Arrays.asList("firstName", "name", "email")); Schema personForUpdate = openAPI.getComponents().getSchemas().get("personForUpdate"); CodegenModel personForUpdateModel = codegen.fromModel("personForUpdate", personForUpdate); - showVars(personForUpdateModel); + Assert.assertEquals(getRequiredVars(personForUpdateModel), Collections.emptyList()); } - private void showVars(CodegenModel model) { - if(model.getRequiredVars() != null) { - - System.out.println(model.getRequiredVars().stream().map(v -> v.name).collect(Collectors.toList())); - } + private List<String> getRequiredVars(CodegenModel model) { + return getNames(model.getRequiredVars()); } + private List<String> getNames(List<CodegenProperty> props) { + if(props == null) return null; + return props.stream().map(v -> v.name).collect(Collectors.toList()); + } @Test public void testCallbacks() { diff --git a/modules/openapi-generator/src/test/resources/2_0/composed-allof.yaml b/modules/openapi-generator/src/test/resources/2_0/composed-allof.yaml index 579c2f796b4bbd6d2e9660b2d620b70ca727fcc7..ca79c2eb35878c5d9e2d01fd7a528e04d44bb001 100644 --- a/modules/openapi-generator/src/test/resources/2_0/composed-allof.yaml +++ b/modules/openapi-generator/src/test/resources/2_0/composed-allof.yaml @@ -50,4 +50,9 @@ definitions: p1: type: string p2: - type: string \ No newline at end of file + type: string + + NewMessageEventCoreNoOwnProps: + type: object + allOf: + - $ref: "#/definitions/MessageEventCore"