Skip to content

Commit

Permalink
removed discriminator property
Browse files Browse the repository at this point in the history
  • Loading branch information
devhl-labs committed Apr 21, 2024
1 parent 94fe9de commit eee1255
Show file tree
Hide file tree
Showing 119 changed files with 577 additions and 1,763 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,7 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)

List<CodegenProperty> anyOf = composedSchemas.getAnyOf();
if (anyOf != null) {
annotateComposedPropertyDiscriminator(objs, model, anyOf);
removePropertiesDeclaredInComposedTypes(objs, model, anyOf);
for (CodegenProperty property : anyOf) {
property.name = patchPropertyName(model, camelize(property.baseType));
Expand All @@ -602,6 +603,7 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)

List<CodegenProperty> oneOf = composedSchemas.getOneOf();
if (oneOf != null) {
annotateComposedPropertyDiscriminator(objs, model, oneOf);
removePropertiesDeclaredInComposedTypes(objs, model, oneOf);
for (CodegenProperty property : oneOf) {
property.name = patchPropertyName(model, camelize(property.baseType));
Expand Down Expand Up @@ -639,9 +641,38 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
patchProperty(enumRefs, model, property);
}
}

for (Map.Entry<String, ModelsMap> entry : objs.entrySet()) {
CodegenModel model = ModelUtils.getModelByName(entry.getKey(), objs);

if (model.parentModel != null) {
for (CodegenProperty property : model.allVars.stream().filter(v -> v.isNew).collect(Collectors.toList())) {
annotateNewComposedPropertyDiscriminator(model, property);
}

for (CodegenProperty property : model.vars.stream().filter(v -> v.isNew).collect(Collectors.toList())) {
annotateNewComposedPropertyDiscriminator(model, property);
}
}
}

return processed;
}

/**
* The ChildCat#PetType needs to be annotated as a discriminator
* Derived classes that override the discriminator will not have the annotations
*/
private void annotateNewComposedPropertyDiscriminator(CodegenModel model, CodegenProperty property) {
Optional<CodegenProperty> inheritedProperty = model.parentModel.allVars.stream().filter(p -> p.name.equals(property.name)).findFirst();
if (inheritedProperty.isPresent()) {
property.isDiscriminator = inheritedProperty.get().isDiscriminator;
if (inheritedProperty.get().vendorExtensions.containsKey("x-is-discriminated")) {
property.vendorExtensions.put("x-is-discriminated", inheritedProperty.get().vendorExtensions.get("x-is-discriminated"));
}
}
}

/**
* Returns true if the model contains any properties with a public setter
* If true, the model's constructor accessor should be made public to ensure end users
Expand All @@ -666,6 +697,46 @@ private boolean modelIsMutatable(CodegenModel model, Set<String> processed) {
protected void removePropertiesDeclaredInComposedTypes(Map<String, ModelsMap> objs, CodegenModel model, List<CodegenProperty> composedProperties) {
}

/**
* Mammal#className will be marked as a discriminator already, but Whale#className will not
* This just annotates Whale#className so we know it is only present due to being a discriminator
* @param objs
* @param model
* @param composedProperties
*/
protected void annotateComposedPropertyDiscriminator(Map<String, ModelsMap> objs, CodegenModel model, List<CodegenProperty> composedProperties) {
if (model.discriminator == null) {
return;
}

String discriminatorPropertyName = model.discriminator.getPropertyName();
if (discriminatorPropertyName == null) {
return;
}

for (CodegenProperty composedProperty : composedProperties) {
String ref = composedProperty.getRef();
if (ref != null) {
for (Map.Entry<String, ModelsMap> composedEntry : objs.entrySet()) {
CodegenModel referencedModel = ModelUtils.getModelByName(composedEntry.getKey(), objs);
if (ref.endsWith("/" + referencedModel.name)) {
for (CodegenProperty referencedProperty : referencedModel.allVars) {
if (referencedProperty.name.equals(discriminatorPropertyName)) {
referencedProperty.vendorExtensions.put("x-is-discriminated", model.discriminator.getPropertyBaseName());
}
}

for (CodegenProperty referencedProperty : referencedModel.vars) {
if (referencedProperty.name.equals(discriminatorPropertyName)) {
referencedProperty.vendorExtensions.put("x-is-discriminated", model.discriminator.getPropertyBaseName());
}
}
}
}
}
}
}

private String patchPropertyName(CodegenModel model, String value) {
String name = escapeReservedWord(model, value);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@
{{#model.hasDiscriminatorWithNonEmptyMapping}}
{{#mappedModels}}
if ({{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}} != null)
return new {{classname}}({{#lambda.joinWithComma}}{{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}{{^isNullable}}.Value{{/isNullable}}{{/vendorExtensions.x-is-value-type}} {{#model.composedSchemas.anyOf}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}{{^isNullable}}.Value{{/isNullable}}{{/vendorExtensions.x-is-value-type}} {{/model.composedSchemas.anyOf}}{{#allVars}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#required}}.Value{{nrt!}}{{^isNullable}}{{#vendorExtensions.x-is-value-type}}.Value{{/vendorExtensions.x-is-value-type}}{{/isNullable}}{{/required}} {{/allVars}}{{/lambda.joinWithComma}});
return new {{classname}}({{#lambda.joinWithComma}}{{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}{{^isNullable}}.Value{{/isNullable}}{{/vendorExtensions.x-is-value-type}} {{#model.composedSchemas.anyOf}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}{{^isNullable}}.Value{{/isNullable}}{{/vendorExtensions.x-is-value-type}} {{/model.composedSchemas.anyOf}}{{#allVars}}{{^isDiscriminator}}{{^vendorExtensions.x-is-discriminated}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#required}}.Value{{nrt!}}{{^isNullable}}{{#vendorExtensions.x-is-value-type}}.Value{{/vendorExtensions.x-is-value-type}}{{/isNullable}}{{/required}} {{/vendorExtensions.x-is-discriminated}}{{/isDiscriminator}}{{/allVars}}{{/lambda.joinWithComma}});

{{#-last}}
throw new JsonException();
Expand All @@ -300,14 +300,14 @@

{{/-last}}
{{/required}}
return new {{classname}}({{#lambda.joinWithComma}}{{#model.composedSchemas.anyOf}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}ParsedValue{{#required}}.Value{{#vendorExtensions.x-is-value-type}}{{nrt!}}.Value{{nrt!}}{{/vendorExtensions.x-is-value-type}}{{/required}} {{/model.composedSchemas.anyOf}}{{#allVars}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#required}}.Value{{nrt!}}{{^isNullable}}{{#vendorExtensions.x-is-value-type}}.Value{{nrt!}}{{/vendorExtensions.x-is-value-type}}{{/isNullable}}{{/required}} {{/allVars}}{{/lambda.joinWithComma}});
return new {{classname}}({{#lambda.joinWithComma}}{{#model.composedSchemas.anyOf}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}ParsedValue{{#required}}.Value{{#vendorExtensions.x-is-value-type}}{{nrt!}}.Value{{nrt!}}{{/vendorExtensions.x-is-value-type}}{{/required}} {{/model.composedSchemas.anyOf}}{{#allVars}}{{^isDiscriminator}}{{^vendorExtensions.x-is-discriminated}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#required}}.Value{{nrt!}}{{^isNullable}}{{#vendorExtensions.x-is-value-type}}.Value{{nrt!}}{{/vendorExtensions.x-is-value-type}}{{/isNullable}}{{/required}} {{/vendorExtensions.x-is-discriminated}}{{/isDiscriminator}}{{/allVars}}{{/lambda.joinWithComma}});
{{/composedSchemas.oneOf}}
{{^model.discriminator}}
{{#composedSchemas}}
{{#oneOf}}
{{^vendorExtensions.x-duplicated-data-type}}
if ({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}} != null)
return new {{classname}}({{#lambda.joinWithComma}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}.Value{{/vendorExtensions.x-is-value-type}} {{#model.composedSchemas.anyOf}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}{{^isNullable}}.Value{{/isNullable}}{{/vendorExtensions.x-is-value-type}} {{/model.composedSchemas.anyOf}}{{#allVars}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#required}}ParsedValue{{/required}} {{/allVars}}{{/lambda.joinWithComma}});
return new {{classname}}({{#lambda.joinWithComma}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}.Value{{/vendorExtensions.x-is-value-type}} {{#model.composedSchemas.anyOf}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}{{^isNullable}}.Value{{/isNullable}}{{/vendorExtensions.x-is-value-type}} {{/model.composedSchemas.anyOf}}{{#allVars}}{{^isDiscriminator}}{{^vendorExtensions.x-is-discriminated}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#required}}ParsedValue{{/required}} {{/vendorExtensions.x-is-discriminated}}{{/isDiscriminator}}{{/allVars}}{{/lambda.joinWithComma}});

{{/vendorExtensions.x-duplicated-data-type}}
{{#-last}}
Expand Down Expand Up @@ -375,15 +375,31 @@
{{#lambda.trimTrailingWithNewLine}}
{{#lambda.trimLineBreaks}}
{{#allVars}}
{{^isDiscriminator}}
{{^vendorExtensions.x-is-discriminated}}
{{^isNullable}}
{{#vendorExtensions.x-is-reference-type}}
if ({{^required}}{{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}Option.IsSet && {{/required}}{{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}} == null)
throw new ArgumentNullException(nameof({{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}), "Property is required for class {{classname}}.");

{{/vendorExtensions.x-is-reference-type}}
{{/isNullable}}
{{/vendorExtensions.x-is-discriminated}}
{{/isDiscriminator}}
{{/allVars}}
{{#allVars}}
{{#vendorExtensions.x-is-discriminated}}
writer.WriteString("{{.}}", "{{model.name}}");

{{/vendorExtensions.x-is-discriminated}}
{{#isDiscriminator}}
{{^vendorExtensions.x-is-discriminated}}
writer.WriteString("{{baseName}}", "{{model.name}}");

{{/vendorExtensions.x-is-discriminated}}
{{/isDiscriminator}}
{{^isDiscriminator}}
{{^vendorExtensions.x-is-discriminated}}
{{#isString}}
{{^isMap}}
{{^isEnum}}
Expand Down Expand Up @@ -579,6 +595,8 @@
{{/isString}}
{{/isEnum}}
{{/isUuid}}
{{/vendorExtensions.x-is-discriminated}}
{{/isDiscriminator}}
{{/allVars}}
{{/lambda.trimLineBreaks}}
{{/lambda.trimTrailingWithNewLine}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{#parentModel.composedSchemas.anyOf}}{{#lambda.camelcase_sanitize_param}}{{parent}}{{/lambda.camelcase_sanitize_param}}.{{#lambda.titlecase}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.titlecase}} {{/parentModel.composedSchemas.anyOf}}{{#allVars}}{{#isInherited}}{{^isNew}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{/isNew}}{{#isNew}}{{#isEnum}}{{#isInnerEnum}}{{classname}}.{{{datatypeWithEnum}}}ToJsonValue{{/isInnerEnum}}{{^isInnerEnum}}{{{datatypeWithEnum}}}ValueConverter.ToJsonValue{{/isInnerEnum}}({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{^required}}.Value{{/required}}){{/isEnum}}{{^isEnum}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}.ToString(){{/isEnum}}{{/isNew}} {{/isInherited}}{{/allVars}}
{{#parentModel.composedSchemas.anyOf}}{{#lambda.camelcase_sanitize_param}}{{parent}}{{/lambda.camelcase_sanitize_param}}.{{#lambda.titlecase}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.titlecase}} {{/parentModel.composedSchemas.anyOf}}{{#allVars}}{{^isDiscriminator}}{{^vendorExtensions.x-is-discriminated}}{{#isInherited}}{{^isNew}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{/isNew}}{{#isNew}}{{#isEnum}}{{#isInnerEnum}}{{classname}}.{{{datatypeWithEnum}}}ToJsonValue{{/isInnerEnum}}{{^isInnerEnum}}{{{datatypeWithEnum}}}ValueConverter.ToJsonValue{{/isInnerEnum}}({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{^required}}.Value{{/required}}){{/isEnum}}{{^isEnum}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}.ToString(){{/isEnum}}{{/isNew}} {{/isInherited}}{{/vendorExtensions.x-is-discriminated}}{{/isDiscriminator}}{{/allVars}}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{#model.allVars}}{{^required}}Option<{{/required}}{{{datatypeWithEnum}}}{{>NullConditionalProperty}}{{^required}}>{{/required}} {{#lambda.escape_reserved_word}}{{#lambda.camel_case}}{{name}}{{/lambda.camel_case}}{{/lambda.escape_reserved_word}}{{#defaultValue}} = {{^required}}default{{/required}}{{#required}}{{^isDateTime}}{{#isString}}{{^isEnum}}@{{/isEnum}}{{/isString}}{{{.}}}{{/isDateTime}}{{#isDateTime}}default{{/isDateTime}}{{/required}}{{/defaultValue}}{{^defaultValue}}{{#lambda.first}}{{#isNullable}} = default {{/isNullable}}{{^required}} = default {{/required}}{{/lambda.first}}{{/defaultValue}} {{/model.allVars}}
{{#model.allVars}}{{^isDiscriminator}}{{^vendorExtensions.x-is-discriminated}}{{^required}}Option<{{/required}}{{{datatypeWithEnum}}}{{>NullConditionalProperty}}{{^required}}>{{/required}} {{#lambda.escape_reserved_word}}{{#lambda.camel_case}}{{name}}{{/lambda.camel_case}}{{/lambda.escape_reserved_word}}{{#defaultValue}} = {{^required}}default{{/required}}{{#required}}{{^isDateTime}}{{#isString}}{{^isEnum}}@{{/isEnum}}{{/isString}}{{{.}}}{{/isDateTime}}{{#isDateTime}}default{{/isDateTime}}{{/required}}{{/defaultValue}}{{^defaultValue}}{{#lambda.first}}{{#isNullable}} = default {{/isNullable}}{{^required}} = default {{/required}}{{/lambda.first}}{{/defaultValue}} {{/vendorExtensions.x-is-discriminated}}{{/isDiscriminator}}{{/model.allVars}}
Loading

0 comments on commit eee1255

Please sign in to comment.