Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat adds has discriminator with non empty mapping #9667

Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties {
private CodegenProperty additionalProperties;
private boolean isModel;
private boolean hasRequiredVars;
private boolean hasDiscriminatorWithNonEmptyMapping;

public String getAdditionalPropertiesType() {
return additionalPropertiesType;
Expand Down Expand Up @@ -316,6 +317,9 @@ public CodegenDiscriminator getDiscriminator() {

public void setDiscriminator(CodegenDiscriminator discriminator) {
this.discriminator = discriminator;
if (discriminator instanceof CodegenDiscriminator && !discriminator.getMappedModels().isEmpty()) {
this.hasDiscriminatorWithNonEmptyMapping = true;
}
}

/**
Expand Down Expand Up @@ -768,6 +772,14 @@ public void setHasRequired(boolean hasRequired) {
this.hasRequired = hasRequired;
}

@Override
public boolean getHasDiscriminatorWithNonEmptyMapping() { return hasDiscriminatorWithNonEmptyMapping; };

@Override
public void setHasDiscriminatorWithNonEmptyMapping(boolean hasDiscriminatorWithNonEmptyMapping) {
this.hasDiscriminatorWithNonEmptyMapping = hasDiscriminatorWithNonEmptyMapping;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand Down Expand Up @@ -801,6 +813,7 @@ public boolean equals(Object o) {
hasOnlyReadOnly == that.hasOnlyReadOnly &&
isNull == that.isNull &&
hasValidation == that.hasValidation &&
hasDiscriminatorWithNonEmptyMapping == that.getHasDiscriminatorWithNonEmptyMapping() &&
getAdditionalPropertiesIsAnyType() == that.getAdditionalPropertiesIsAnyType() &&
getUniqueItems() == that.getUniqueItems() &&
getExclusiveMinimum() == that.getExclusiveMinimum() &&
Expand Down Expand Up @@ -874,7 +887,7 @@ hasChildren, isMap, isDeprecated, hasOnlyReadOnly, getExternalDocumentation(), g
getAdditionalPropertiesType(), getMaxProperties(), getMinProperties(), getUniqueItems(), getMaxItems(),
getMinItems(), getMaxLength(), getMinLength(), getExclusiveMinimum(), getExclusiveMaximum(), getMinimum(),
getMaximum(), getPattern(), getMultipleOf(), getItems(), getAdditionalProperties(), getIsModel(),
getAdditionalPropertiesIsAnyType());
getAdditionalPropertiesIsAnyType(), hasDiscriminatorWithNonEmptyMapping);
}

@Override
Expand Down Expand Up @@ -964,6 +977,7 @@ public String toString() {
sb.append(", isNull='").append(isNull);
sb.append(", hasValidation='").append(hasValidation);
sb.append(", getAdditionalPropertiesIsAnyType=").append(getAdditionalPropertiesIsAnyType());
sb.append(", getHasDiscriminatorWithNonEmptyMapping=").append(hasDiscriminatorWithNonEmptyMapping);
sb.append('}');
return sb.toString();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties {
private Integer minProperties;
public boolean isNull;
private boolean hasRequired;
private boolean hasDiscriminatorWithNonEmptyMapping;

public CodegenParameter copy() {
CodegenParameter output = new CodegenParameter();
Expand Down Expand Up @@ -156,6 +157,7 @@ public CodegenParameter copy() {
output.setAdditionalPropertiesIsAnyType(this.getAdditionalPropertiesIsAnyType());
output.setHasVars(this.hasVars);
output.setHasRequired(this.hasRequired);
output.setHasDiscriminatorWithNonEmptyMapping(this.hasDiscriminatorWithNonEmptyMapping);

if (this._enum != null) {
output._enum = new ArrayList<String>(this._enum);
Expand Down Expand Up @@ -213,7 +215,7 @@ public CodegenParameter copy() {

@Override
public int hashCode() {
return Objects.hash(isFormParam, isQueryParam, isPathParam, isHeaderParam, isCookieParam, isBodyParam, isContainer, isCollectionFormatMulti, isPrimitiveType, isModel, isExplode, baseName, paramName, dataType, datatypeWithEnum, dataFormat, collectionFormat, description, unescapedDescription, baseType, defaultValue, enumName, style, isDeepObject, example, jsonSchema, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isFreeFormObject, isAnyType, isArray, isMap, isFile, isEnum, _enum, allowableValues, items, mostInnerItems, additionalProperties, vars, requiredVars, vendorExtensions, hasValidation, getMaxProperties(), getMinProperties(), isNullable, isDeprecated, required, getMaximum(), getExclusiveMaximum(), getMinimum(), getExclusiveMinimum(), getMaxLength(), getMinLength(), getPattern(), getMaxItems(), getMinItems(), getUniqueItems(), contentType, multipleOf, isNull, additionalPropertiesIsAnyType, hasVars, hasRequired, isShort, isUnboundedInteger);
return Objects.hash(isFormParam, isQueryParam, isPathParam, isHeaderParam, isCookieParam, isBodyParam, isContainer, isCollectionFormatMulti, isPrimitiveType, isModel, isExplode, baseName, paramName, dataType, datatypeWithEnum, dataFormat, collectionFormat, description, unescapedDescription, baseType, defaultValue, enumName, style, isDeepObject, example, jsonSchema, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isFreeFormObject, isAnyType, isArray, isMap, isFile, isEnum, _enum, allowableValues, items, mostInnerItems, additionalProperties, vars, requiredVars, vendorExtensions, hasValidation, getMaxProperties(), getMinProperties(), isNullable, isDeprecated, required, getMaximum(), getExclusiveMaximum(), getMinimum(), getExclusiveMinimum(), getMaxLength(), getMinLength(), getPattern(), getMaxItems(), getMinItems(), getUniqueItems(), contentType, multipleOf, isNull, additionalPropertiesIsAnyType, hasVars, hasRequired, isShort, isUnboundedInteger, hasDiscriminatorWithNonEmptyMapping);
}

@Override
Expand Down Expand Up @@ -261,6 +263,7 @@ public boolean equals(Object o) {
isDeprecated == that.isDeprecated &&
required == that.required &&
isNull == that.isNull &&
hasDiscriminatorWithNonEmptyMapping && that.getHasDiscriminatorWithNonEmptyMapping() &&
getAdditionalPropertiesIsAnyType() == that.getAdditionalPropertiesIsAnyType() &&
getHasVars() == that.getHasVars() &&
getHasRequired() == that.getHasRequired() &&
Expand Down Expand Up @@ -386,6 +389,7 @@ public String toString() {
sb.append(", getAdditionalPropertiesIsAnyType=").append(additionalPropertiesIsAnyType);
sb.append(", getHasVars=").append(hasVars);
sb.append(", getHasRequired=").append(hasRequired);
sb.append(", getHasDiscriminatorWithNonEmptyMapping=").append(hasDiscriminatorWithNonEmptyMapping);
sb.append('}');
return sb.toString();
}
Expand Down Expand Up @@ -667,5 +671,13 @@ public boolean getHasRequired() {
public void setHasRequired(boolean hasRequired) {
this.hasRequired = hasRequired;
}

@Override
public boolean getHasDiscriminatorWithNonEmptyMapping() { return hasDiscriminatorWithNonEmptyMapping; };

@Override
public void setHasDiscriminatorWithNonEmptyMapping(boolean hasDiscriminatorWithNonEmptyMapping) {
this.hasDiscriminatorWithNonEmptyMapping = hasDiscriminatorWithNonEmptyMapping;
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti
private boolean additionalPropertiesIsAnyType;
private boolean hasVars;
private boolean hasRequired;
private boolean hasDiscriminatorWithNonEmptyMapping;

public String getBaseName() {
return baseName;
Expand Down Expand Up @@ -754,6 +755,14 @@ public void setHasRequired(boolean hasRequired) {
this.hasRequired = hasRequired;
}

@Override
public boolean getHasDiscriminatorWithNonEmptyMapping() { return hasDiscriminatorWithNonEmptyMapping; };

@Override
public void setHasDiscriminatorWithNonEmptyMapping(boolean hasDiscriminatorWithNonEmptyMapping) {
this.hasDiscriminatorWithNonEmptyMapping = hasDiscriminatorWithNonEmptyMapping;
}

@Override
public String toString() {
final StringBuilder sb = new StringBuilder("CodegenProperty{");
Expand Down Expand Up @@ -848,6 +857,7 @@ public String toString() {
sb.append(", getAdditionalPropertiesIsAnyType=").append(getAdditionalPropertiesIsAnyType());
sb.append(", getHasVars=").append(getHasVars());
sb.append(", getHasRequired=").append(getHasRequired());
sb.append(", getHasDiscriminatorWithNonEmptyMapping=").append(hasDiscriminatorWithNonEmptyMapping);
sb.append('}');
return sb.toString();
}
Expand Down Expand Up @@ -899,6 +909,7 @@ public boolean equals(Object o) {
isXmlAttribute == that.isXmlAttribute &&
isXmlWrapped == that.isXmlWrapped &&
isNull == that.isNull &&
hasDiscriminatorWithNonEmptyMapping == that.hasDiscriminatorWithNonEmptyMapping &&
getAdditionalPropertiesIsAnyType() == that.getAdditionalPropertiesIsAnyType() &&
getHasVars() == that.getHasVars() &&
getHasRequired() ==that.getHasRequired() &&
Expand Down Expand Up @@ -963,6 +974,7 @@ public int hashCode() {
items, mostInnerItems, additionalProperties, vars, requiredVars,
vendorExtensions, hasValidation, isInherited, discriminatorValue, nameInCamelCase,
nameInSnakeCase, enumName, maxItems, minItems, isXmlAttribute, xmlPrefix, xmlName,
xmlNamespace, isXmlWrapped, isNull, additionalPropertiesIsAnyType, hasVars, hasRequired);
xmlNamespace, isXmlWrapped, isNull, additionalPropertiesIsAnyType, hasVars, hasRequired,
hasDiscriminatorWithNonEmptyMapping);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ public class CodegenResponse implements IJsonSchemaValidationProperties {
private boolean additionalPropertiesIsAnyType;
private boolean hasVars;
private boolean hasRequired;
private boolean hasDiscriminatorWithNonEmptyMapping;

@Override
public int hashCode() {
Expand All @@ -94,7 +95,8 @@ public int hashCode() {
vars, requiredVars, isNull, hasValidation, isShort, isUnboundedInteger,
getMaxProperties(), getMinProperties(), uniqueItems, getMaxItems(), getMinItems(), getMaxLength(),
getMinLength(), exclusiveMinimum, exclusiveMaximum, getMinimum(), getMaximum(), getPattern(),
is1xx, is2xx, is3xx, is4xx, is5xx, additionalPropertiesIsAnyType, hasVars, hasRequired);
is1xx, is2xx, is3xx, is4xx, is5xx, additionalPropertiesIsAnyType, hasVars, hasRequired,
hasDiscriminatorWithNonEmptyMapping);
}

@Override
Expand Down Expand Up @@ -138,6 +140,7 @@ public boolean equals(Object o) {
is3xx == that.is3xx &&
is4xx == that.is4xx &&
is5xx == that.is5xx &&
hasDiscriminatorWithNonEmptyMapping == that.getHasDiscriminatorWithNonEmptyMapping() &&
getAdditionalPropertiesIsAnyType() == that.getAdditionalPropertiesIsAnyType() &&
getHasVars() == that.getHasVars() &&
getHasRequired() == that.getHasRequired() &&
Expand Down Expand Up @@ -478,6 +481,7 @@ public String toString() {
sb.append(", getAdditionalPropertiesIsAnyType=").append(additionalPropertiesIsAnyType);
sb.append(", getHasVars=").append(hasVars);
sb.append(", getHasRequired=").append(hasRequired);
sb.append(", getHasDiscriminatorWithNonEmptyMapping=").append(hasDiscriminatorWithNonEmptyMapping);
sb.append('}');
return sb.toString();
}
Expand Down Expand Up @@ -534,4 +538,12 @@ public boolean getHasVars() {
public void setHasVars(boolean hasVars) {
this.hasVars = hasVars;
}

@Override
public boolean getHasDiscriminatorWithNonEmptyMapping() { return hasDiscriminatorWithNonEmptyMapping; };

@Override
public void setHasDiscriminatorWithNonEmptyMapping(boolean hasDiscriminatorWithNonEmptyMapping) {
this.hasDiscriminatorWithNonEmptyMapping = hasDiscriminatorWithNonEmptyMapping;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2393,7 +2393,7 @@ public CodegenModel fromModel(String name, Schema schema) {
}
m.isAlias = (typeAliases.containsKey(name)
|| isAliasOfSimpleTypes(schema)); // check if the unaliased schema is an alias of simple OAS types
m.discriminator = createDiscriminator(name, schema, this.openAPI);
m.setDiscriminator(createDiscriminator(name, schema, this.openAPI));
if (!this.getLegacyDiscriminatorBehavior()) {
m.addDiscriminatorMappedModelsImports();
}
Expand Down Expand Up @@ -2453,7 +2453,7 @@ public CodegenModel fromModel(String name, Schema schema) {
for (Schema innerSchema : composed.getAllOf()) { // TODO need to work with anyOf, oneOf as well
if (m.discriminator == null && innerSchema.getDiscriminator() != null) {
LOGGER.debug("discriminator is set to null (not correctly set earlier): {}", name);
m.discriminator = createDiscriminator(name, innerSchema, this.openAPI);
m.setDiscriminator(createDiscriminator(name, innerSchema, this.openAPI));
if (!this.getLegacyDiscriminatorBehavior()) {
m.addDiscriminatorMappedModelsImports();
}
Expand Down Expand Up @@ -6663,7 +6663,7 @@ public void addOneOfInterfaceModel(ComposedSchema cs, String type, OpenAPI openA

CodegenModel cm = new CodegenModel();

cm.discriminator = createDiscriminator("", cs, openAPI);
cm.setDiscriminator(createDiscriminator("", cs, openAPI));
if (!this.getLegacyDiscriminatorBehavior()) {
cm.addDiscriminatorMappedModelsImports();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,4 +122,10 @@ public interface IJsonSchemaValidationProperties {
boolean getHasRequired();

void setHasRequired(boolean hasRequired);
}

// discriminators are only supported in request bodies and response payloads per OpenApi
boolean getHasDiscriminatorWithNonEmptyMapping();

// discriminators are only supported in request bodies and response payloads per OpenApi
void setHasDiscriminatorWithNonEmptyMapping(boolean hasDiscriminatorWithNonEmptyMapping);
}
Original file line number Diff line number Diff line change
Expand Up @@ -887,6 +887,7 @@ public void testDiscriminator() {
test.getMappedModels().add(new CodegenDiscriminator.MappedModel("Cat", "Cat"));
test.getMappedModels().add(new CodegenDiscriminator.MappedModel("BigCat", "BigCat"));
Assert.assertEquals(discriminator, test);
Assert.assertEquals(animalModel.getHasDiscriminatorWithNonEmptyMapping(), true);
}

@Test
Expand All @@ -905,6 +906,7 @@ public void testDiscriminatorWithCustomMapping() {
codegen.setOpenAPI(openAPI);
CodegenModel personModel = codegen.fromModel("Person", person);
verifyPersonDiscriminator(personModel.discriminator);
Assert.assertEquals(personModel.getHasDiscriminatorWithNonEmptyMapping(), true);
}

@Test
Expand All @@ -916,6 +918,7 @@ public void testParentName() {
codegen.setOpenAPI(openAPI);
CodegenModel childModel = codegen.fromModel("Child", child);
Assert.assertEquals(childModel.parentSchema, "Person");
Assert.assertEquals(childModel.getHasDiscriminatorWithNonEmptyMapping(), false);
}

@Test
Expand Down Expand Up @@ -989,6 +992,7 @@ public void testComposedSchemaAllOfDiscriminatorMap() {
Schema leafSc = openAPI.getComponents().getSchemas().get(leafModelName);
CodegenModel leafCm = codegen.fromModel(leafModelName, leafSc);
Assert.assertEquals(leafCm.discriminator, emptyMapDisc);
Assert.assertEquals(leafCm.getHasDiscriminatorWithNonEmptyMapping(), false);
}

// the Pet discriminator map contains all animals + Reptile (children + grandchildren)
Expand All @@ -1004,6 +1008,7 @@ public void testComposedSchemaAllOfDiscriminatorMap() {
modelName = "Pet";
sc = openAPI.getComponents().getSchemas().get(modelName);
CodegenModel pet = codegen.fromModel(modelName, sc);
Assert.assertEquals(pet.getHasDiscriminatorWithNonEmptyMapping(), true);
Assert.assertEquals(pet.discriminator, petDisc);

// the Reptile discriminator contains both reptiles
Expand All @@ -1019,6 +1024,7 @@ public void testComposedSchemaAllOfDiscriminatorMap() {
modelName = "Reptile";
sc = openAPI.getComponents().getSchemas().get(modelName);
CodegenModel reptile = codegen.fromModel(modelName, sc);
Assert.assertEquals(reptile.getHasDiscriminatorWithNonEmptyMapping(), true);
Assert.assertEquals(reptile.discriminator, reptileDisc);

// the MyPets discriminator contains Cat and Lizard
Expand All @@ -1034,12 +1040,14 @@ public void testComposedSchemaAllOfDiscriminatorMap() {
modelName = "MyPets";
sc = openAPI.getComponents().getSchemas().get(modelName);
CodegenModel myPets = codegen.fromModel(modelName, sc);
Assert.assertEquals(myPets.getHasDiscriminatorWithNonEmptyMapping(), true);
Assert.assertEquals(myPets.discriminator, myPetDisc);

// the MyPetsNoDisc discriminator is created because all oneOf classes have the same discriminator
modelName = "MyPetsNoDisc";
sc = openAPI.getComponents().getSchemas().get(modelName);
CodegenModel myPetsNoDisc = codegen.fromModel(modelName, sc);
Assert.assertEquals(myPetsNoDisc.getHasDiscriminatorWithNonEmptyMapping(), true);
Assert.assertEquals(myPetsNoDisc.discriminator, myPetDisc);

CodegenModel cm;
Expand All @@ -1052,6 +1060,7 @@ public void testComposedSchemaAllOfDiscriminatorMap() {
hs.add(new CodegenDiscriminator.MappedModel("b", codegen.toModelName("B")));
hs.add(new CodegenDiscriminator.MappedModel("B", codegen.toModelName("B")));
hs.add(new CodegenDiscriminator.MappedModel("C", codegen.toModelName("C")));
Assert.assertEquals(cm.getHasDiscriminatorWithNonEmptyMapping(), true);
Assert.assertEquals(cm.discriminator.getMappedModels(), hs);

// the mapping in b is in B
Expand All @@ -1061,7 +1070,7 @@ public void testComposedSchemaAllOfDiscriminatorMap() {
hs.clear();
hs.add(new CodegenDiscriminator.MappedModel("b", codegen.toModelName("B")));
hs.add(new CodegenDiscriminator.MappedModel("C", codegen.toModelName("C")));

Assert.assertEquals(cm.getHasDiscriminatorWithNonEmptyMapping(), true);
Assert.assertEquals(cm.discriminator.getMappedModels(), hs);

// the mapping in b is in C
Expand All @@ -1070,6 +1079,7 @@ public void testComposedSchemaAllOfDiscriminatorMap() {
cm = codegen.fromModel(modelName, sc);
hs.clear();
hs.add(new CodegenDiscriminator.MappedModel("b", codegen.toModelName("B")));
Assert.assertEquals(cm.getHasDiscriminatorWithNonEmptyMapping(), true);
Assert.assertEquals(cm.discriminator.getMappedModels(), hs);
}

Expand Down
Binary file not shown.
Loading