Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions openapi/openapi-generator/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,15 @@ sourceSets {
addOpenapiDir("petstoreV3_implicit_headers_regex")
addOpenapiDir("petstoreV3_server_request")
addOpenapiDir("petstoreV3_additional_props")
addOpenapiDir("petstoreV3_additional_props_enable_json_nullable")
addOpenapiDir("petstoreV3_discriminator")
addOpenapiDir("petstoreV3_discriminator_enable_json_nullable")
addOpenapiDir("petstoreV3_default_delegate")
addOpenapiDir("petstoreV3_enum")
addOpenapiDir("petstoreV3_filter")
addOpenapiDir("petstoreV3_form")
addOpenapiDir("petstoreV3_nullable")
addOpenapiDir("petstoreV3_nullable_enable_json_nullable")
addOpenapiDir("petstoreV3_request_parameters")
addOpenapiDir("petstoreV3_security_all")
addOpenapiDir("petstoreV3_security_api_key")
Expand All @@ -97,6 +99,7 @@ sourceSets {
addOpenapiDir("petstoreV3_single_response")
addOpenapiDir("petstoreV3_types")
addOpenapiDir("petstoreV3_validation")
addOpenapiDir("petstoreV3_validation_enable_json_nullable")
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.PathItem;
import io.swagger.v3.oas.models.examples.Example;
import io.swagger.v3.oas.models.media.*;
import io.swagger.v3.oas.models.media.ComposedSchema;
import io.swagger.v3.oas.models.media.ObjectSchema;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.media.StringSchema;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.oas.models.parameters.RequestBody;
import io.swagger.v3.oas.models.servers.Server;
Expand Down Expand Up @@ -665,7 +668,7 @@ public Map<String, ModelsMap> updateAllModels(Map<String, ModelsMap> objs) {
if (variable.isNullable && !variable.required) {
if (params.enableJsonNullable) {
variable.vendorExtensions.put("x-json-nullable", true);
} else if(params.forceIncludeOptional) {
} else if (params.forceIncludeOptional) {
variable.vendorExtensions.put("x-json-include-always", true);
} else {
//TODO remove in 2.0 and make default behavior that ENABLE_JSON_NULLABLE is enabled
Expand Down Expand Up @@ -703,7 +706,7 @@ public Map<String, ModelsMap> updateAllModels(Map<String, ModelsMap> objs) {
if (variable.isNullable && !variable.required) {
if (params.enableJsonNullable) {
variable.vendorExtensions.put("x-json-nullable", true);
} else if(params.forceIncludeOptional) {
} else if (params.forceIncludeOptional) {
variable.vendorExtensions.put("x-json-include-always", true);
} else {
//TODO remove in 2.0 and make default behavior that ENABLE_JSON_NULLABLE is enabled
Expand Down Expand Up @@ -788,6 +791,8 @@ public Map<String, ModelsMap> updateAllModels(Map<String, ModelsMap> objs) {
} else {
prop.isOverridden = haveReqVar;
}
} else if (model.requiredVars.stream().anyMatch(p -> p.name.equals(prop.name))) {
prop.isOverridden = true;
}
}

Expand Down Expand Up @@ -849,42 +854,49 @@ public Map<String, ModelsMap> updateAllModels(Map<String, ModelsMap> objs) {
if (!requiredVar.required) {
continue;
}
if (requiredVar.isInteger) {
if (!typeMapping.containsKey("Integer") && !typeMapping.containsKey(Integer.class.getCanonicalName())) {
requiredVar.dataType = "int";
requiredVar.datatypeWithEnum = "int";
}
}
if (requiredVar.isLong) {
if (!typeMapping.containsKey("Long") && !typeMapping.containsKey(Long.class.getCanonicalName())) {
requiredVar.dataType = "long";
requiredVar.datatypeWithEnum = "long";
}
}
if (requiredVar.isFloat) {
if (!typeMapping.containsKey("Float") && !typeMapping.containsKey(Float.class.getCanonicalName())) {
requiredVar.dataType = "float";
requiredVar.datatypeWithEnum = "float";
}
}
if (requiredVar.isDouble) {
if (!typeMapping.containsKey("Double") && !typeMapping.containsKey(Double.class.getCanonicalName())) {
requiredVar.dataType = "double";
requiredVar.datatypeWithEnum = "double";
}
}
if (requiredVar.isBoolean) {
if (!typeMapping.containsKey("Boolean") && !typeMapping.containsKey(Boolean.class.getCanonicalName())) {
requiredVar.dataType = "boolean";
requiredVar.datatypeWithEnum = "boolean";
}
}
processRequiredModelVar(requiredVar);
}
for (var requiredVar : model.requiredVars) {
processRequiredModelVar(requiredVar);
}
}
}
return objs;
}

private void processRequiredModelVar(CodegenProperty requiredVar) {
if (requiredVar.isInteger) {
if (!typeMapping.containsKey("Integer") && !typeMapping.containsKey(Integer.class.getCanonicalName())) {
requiredVar.dataType = "int";
requiredVar.datatypeWithEnum = "int";
}
}
if (requiredVar.isLong) {
if (!typeMapping.containsKey("Long") && !typeMapping.containsKey(Long.class.getCanonicalName())) {
requiredVar.dataType = "long";
requiredVar.datatypeWithEnum = "long";
}
}
if (requiredVar.isFloat) {
if (!typeMapping.containsKey("Float") && !typeMapping.containsKey(Float.class.getCanonicalName())) {
requiredVar.dataType = "float";
requiredVar.datatypeWithEnum = "float";
}
}
if (requiredVar.isDouble) {
if (!typeMapping.containsKey("Double") && !typeMapping.containsKey(Double.class.getCanonicalName())) {
requiredVar.dataType = "double";
requiredVar.datatypeWithEnum = "double";
}
}
if (requiredVar.isBoolean) {
if (!typeMapping.containsKey("Boolean") && !typeMapping.containsKey(Boolean.class.getCanonicalName())) {
requiredVar.dataType = "boolean";
requiredVar.datatypeWithEnum = "boolean";
}
}
}

private String getUpperSnakeCase(String value, Locale locale) {
return Arrays.stream(value.split("[^a-zA-Z0-9]"))
.map(String::strip)
Expand Down Expand Up @@ -1222,10 +1234,21 @@ public String getTypeDeclaration(Schema p) {
/**
* Same as original, but have different mapping for Map of String to T
*/
public String getTypeDeclarationAndProp(Schema p, CodegenProperty property) {
public String getTypeDeclarationForProperty(Schema p, CodegenProperty property) {
var schema = ModelUtils.unaliasSchema(this.openAPI, p, importMapping);
var target = ModelUtils.isGenerateAliasAsModel() ? p : schema;
if (ModelUtils.isMapSchema(target)) {
if (ModelUtils.isArraySchema(target)) {
var items = getSchemaItems(target);
var itemsDataType = getTypeDeclarationForProperty(items, property);

final boolean isItemNullable = Boolean.TRUE.equals(items.getNullable())
|| (target.getExtensions() != null && Boolean.parseBoolean(String.valueOf(target.getExtensions().get("x-items-nullable"))));
if (params.codegenMode.isKotlin() && isItemNullable) {
return getSchemaType(target) + "<" + itemsDataType + "?>";
} else {
return getSchemaType(target) + "<" + itemsDataType + ">";
}
} else if (ModelUtils.isMapSchema(target)) {
// Note: ModelUtils.isMapSchema(p) returns true when p is a composed schema that also defines
// additionalproperties: true
var inner = ModelUtils.getAdditionalProperties(target);
Expand All @@ -1235,36 +1258,48 @@ public String getTypeDeclarationAndProp(Schema p, CodegenProperty property) {
p.setAdditionalProperties(inner);
}

if (params.codegenMode.isKotlin() && property.isNullable) {
if (params.enableJsonNullable) {
if (property.required) {
return getSchemaType(target) + "<String, ru.tinkoff.kora.json.common.JsonNullable<" + getTypeDeclaration(inner) + ">>";
} else {
return getSchemaType(target) + "<String, ru.tinkoff.kora.json.common.JsonNullable<" + getTypeDeclaration(inner) + ">>?";
}
} else {
return getSchemaType(target) + "<String, " + getTypeDeclaration(inner) + "?>";
final boolean isKeyNullable = target.getExtensions() != null
&& Boolean.parseBoolean(String.valueOf(target.getExtensions().get("x-key-nullable")));
final boolean isValueNullable = target.getExtensions() != null
&& Boolean.parseBoolean(String.valueOf(target.getExtensions().get("x-items-nullable")));

String mapType = getSchemaType(target);
String keyType = (target.getExtensions() == null)
? "String"
: String.valueOf(target.getExtensions().getOrDefault("x-key-type", "String"));
String valueType = getTypeDeclaration(inner);

if (params.codegenMode.isKotlin()) {
if (isKeyNullable) {
keyType = keyType + "?";
}
if (isValueNullable) {
valueType = valueType + "?";
}
} else if (property.isNullable && !property.required && params.enableJsonNullable) {
return getSchemaType(target) + "<String, ru.tinkoff.kora.json.common.JsonNullable<" + getTypeDeclaration(inner) + ">>";
} else {
return getSchemaType(target) + "<String, " + getTypeDeclaration(inner) + ">";
}
}

return super.getTypeDeclaration(target);
return "%s<%s, %s>".formatted(mapType, keyType, valueType);
} else {
return getTypeDeclaration(target);
}
}

@Override
public CodegenProperty fromProperty(String name, Schema p, boolean required, boolean schemaIsFromAdditionalProperties) {
var property = super.fromProperty(name, p, required, schemaIsFromAdditionalProperties);
var schema = ModelUtils.unaliasSchema(this.openAPI, p, importMapping);
var target = ModelUtils.isGenerateAliasAsModel() ? p : schema;
if (ModelUtils.isMapSchema(target)) {
var dataType = getTypeDeclarationAndProp(p, property);
if (ModelUtils.isArraySchema(target)) {
var dataType = getTypeDeclarationForProperty(target, property);
property.dataType = dataType;
if (!property.isEnum) {
property.datatypeWithEnum = dataType;
}
} else if (ModelUtils.isMapSchema(target)) {
var dataType = getTypeDeclarationForProperty(p, property);
property.dataType = dataType;
if (!property.isEnum) {
property.datatypeWithEnum = property.dataType;
property.datatypeWithEnum = dataType;
}
}
return property;
Expand Down Expand Up @@ -2247,7 +2282,7 @@ record AuthMethodGroup(String name, List<CodegenSecurity> methods) {}
if (formParam.isModel || isEnum) {
formParam.vendorExtensions.put("requiresMapper", true);
String type;
if(isEnum) {
if (isEnum) {
type = allModels.stream()
.filter(m -> m.getModel().name.equals(formParam.dataType))
.findFirst()
Expand All @@ -2257,7 +2292,7 @@ record AuthMethodGroup(String name, List<CodegenSecurity> methods) {}
.findFirst()
.map(m -> m.get("importPath") + "." + formParam.datatypeWithEnum))
.orElseThrow(() -> new IllegalArgumentException("Unknown form param model: " + formParam));
if(formParam.datatypeWithEnum != null) {
if (formParam.datatypeWithEnum != null) {
formParam.dataType = type;
}
} else {
Expand Down Expand Up @@ -2285,12 +2320,12 @@ record AuthMethodGroup(String name, List<CodegenSecurity> methods) {}
"last", false
)));
}
} else if(formParam.isString
|| formParam.isBoolean
|| formParam.isDouble
|| formParam.isFloat
|| formParam.isInteger
|| formParam.isLong) {
} else if (formParam.isString
|| formParam.isBoolean
|| formParam.isDouble
|| formParam.isFloat
|| formParam.isInteger
|| formParam.isLong) {
formParam.vendorExtensions.put("isPrimitive", true);
} else {
formParam.vendorExtensions.put("requiresMapper", true);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
/**
* {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{{description}}}{{/description}}
*/
/** {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{{description}}}{{/description}} */
@ru.tinkoff.kora.common.annotation.Generated("openapi generator kora")
{{#additionalEnumTypeAnnotations}}
{{{.}}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,31 +28,25 @@ public sealed interface {{classname}} permits {{#vendorExtensions.x-unique-mappe

/** {{#description}}{{.}}{{/description}}{{^description}}{{name}}{{/description}}{{#example}} (example: {{.}}){{/example}} */
{{{datatypeWithEnum}}} {{name}}();{{/vendorExtensions.x-discriminator-property}}
{{#vendorExtensions.x-discriminator-property}}

{{^isContainer}}{{>javaEnumClass}}{{/isContainer}}
{{#isContainer}}{{#mostInnerItems}}{{>javaEnumClass}}{{/mostInnerItems}}{{/isContainer}}
{{/vendorExtensions.x-discriminator-property}}
{{#allVars}}{{^isDiscriminator}}{{#example}}
{{#allVars}}{{^isDiscriminator}}{{#example}}
/** (example: {{.}}) */{{/example}}
{{{classname}}} with{{#lambda.titlecase}}{{name}}{{/lambda.titlecase}}({{^vendorExtensions.x-json-nullable}}{{^required}}@Nullable {{/required}}{{{datatypeWithEnum}}}{{/vendorExtensions.x-json-nullable}}{{#vendorExtensions.x-json-nullable}}ru.tinkoff.kora.json.common.JsonNullable<{{{datatypeWithEnum}}}>{{/vendorExtensions.x-json-nullable}} {{name}});
{{/isDiscriminator}}{{/allVars}}
{{#allVars}}
{{^isDiscriminator}}
{{#isEnum}}
{{^isContainer}}
{{>javaEnumClass}}
{{/isContainer}}
{{#isContainer}}
{{#mostInnerItems}}
{{>javaEnumClass}}
{{/mostInnerItems}}
{{/isContainer}}
{{/isEnum}}

/** {{#description}}{{.}}{{/description}}{{^description}}{{name}}{{/description}}{{#example}} (example: {{.}}){{/example}} */
{{^vendorExtensions.x-json-nullable}}{{^required}}@Nullable {{/required}}{{{datatypeWithEnum}}}{{/vendorExtensions.x-json-nullable}}{{#vendorExtensions.x-json-nullable}}ru.tinkoff.kora.json.common.JsonNullable<{{{datatypeWithEnum}}}>{{/vendorExtensions.x-json-nullable}} {{name}}();{{/isDiscriminator}}
{{^isDiscriminator}}{{#isEnum}}{{^isContainer}}
{{>javaEnumClass}}
{{/isContainer}}{{#isContainer}}{{#mostInnerItems}}
{{>javaEnumClass}}
{{/mostInnerItems}}{{/isContainer}}{{/isEnum}}
/** {{#description}}{{.}}{{/description}}{{^description}}{{name}}{{/description}}{{#example}} (example: {{.}}){{/example}} */{{^vendorExtensions.x-json-nullable}}{{^required}}
@Nullable {{/required}}
{{{datatypeWithEnum}}}{{/vendorExtensions.x-json-nullable}}{{#vendorExtensions.x-json-nullable}}ru.tinkoff.kora.json.common.JsonNullable<{{{datatypeWithEnum}}}>{{/vendorExtensions.x-json-nullable}} {{name}}();{{/isDiscriminator}}
{{/allVars}}
{{#vendorExtensions.x-discriminator-property}}

{{^isContainer}}{{>javaEnumClass}}{{/isContainer}}
{{#isContainer}}{{#mostInnerItems}}{{>javaEnumClass}}{{/mostInnerItems}}{{/isContainer}}
{{/vendorExtensions.x-discriminator-property}}
}
{{/discriminator}}
{{^discriminator}}
Expand Down Expand Up @@ -84,11 +78,13 @@ public record {{classname}}(
""";
{{/isArray}}{{#additionalConstructor}}

public {{classname}}({{#requiredVars}}{{^vendorExtensions.x-discriminator-single}}{{^vendorExtensions.x-json-nullable}}{{^required}}@Nullable {{/required}}{{{datatypeWithEnum}}}{{/vendorExtensions.x-json-nullable}}{{#vendorExtensions.x-json-nullable}}ru.tinkoff.kora.json.common.JsonNullable<{{{datatypeWithEnum}}}>{{/vendorExtensions.x-json-nullable}} {{name}}{{^-last}}, {{/-last}}{{/vendorExtensions.x-discriminator-single}}{{/requiredVars}}) {
public {{classname}}({{#requiredVars}}{{^vendorExtensions.x-discriminator-single}}{{^vendorExtensions.x-json-nullable}}{{^required}}@Nullable {{/required}}{{{datatypeWithEnum}}}{{/vendorExtensions.x-json-nullable}}{{#vendorExtensions.x-json-nullable}}ru.tinkoff.kora.json.common.JsonNullable<{{{datatypeWithEnum}}}>{{/vendorExtensions.x-json-nullable}} {{name}}{{^-last}},
{{/-last}}{{/vendorExtensions.x-discriminator-single}}{{/requiredVars}}) {
this({{#allVars}}{{#required}}{{#vendorExtensions.x-discriminator-single}}{{vendorExtensions.x-discriminator-single}}{{/vendorExtensions.x-discriminator-single}}{{^vendorExtensions.x-discriminator-single}}{{name}}{{/vendorExtensions.x-discriminator-single}}{{/required}}{{^required}}null{{/required}}{{^-last}}, {{/-last}}{{/allVars}});
}{{/additionalConstructor}}{{#vendorExtensions.x-discriminator-single}}

public {{classname}}({{#allVars}}{{^isDiscriminator}}{{^vendorExtensions.x-json-nullable}}{{^required}}@Nullable {{/required}}{{{datatypeWithEnum}}}{{/vendorExtensions.x-json-nullable}}{{#vendorExtensions.x-json-nullable}}ru.tinkoff.kora.json.common.JsonNullable<{{{datatypeWithEnum}}}>{{/vendorExtensions.x-json-nullable}} {{name}}{{^-last}}, {{/-last}}{{/isDiscriminator}}{{/allVars}}) {
public {{classname}}({{#allVars}}{{^isDiscriminator}}{{^vendorExtensions.x-json-nullable}}{{^required}}@Nullable {{/required}}{{{datatypeWithEnum}}}{{/vendorExtensions.x-json-nullable}}{{#vendorExtensions.x-json-nullable}}ru.tinkoff.kora.json.common.JsonNullable<{{{datatypeWithEnum}}}>{{/vendorExtensions.x-json-nullable}} {{name}}{{^-last}},
{{/-last}}{{/isDiscriminator}}{{/allVars}}) {
this({{#allVars}}{{#isDiscriminator}}{{vendorExtensions.x-discriminator-single}}{{/isDiscriminator}}{{^isDiscriminator}}{{name}}{{/isDiscriminator}}{{^-last}}, {{/-last}}{{/allVars}});
}{{/vendorExtensions.x-discriminator-single}}

Expand Down
Loading