Skip to content

Commit

Permalink
Fix generating common path parameters, parameters with array of enum …
Browse files Browse the repository at this point in the history
…type.

Fixed #1548
  • Loading branch information
altro3 committed Apr 23, 2024
1 parent 8be733f commit ce99130
Show file tree
Hide file tree
Showing 21 changed files with 711 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -622,6 +622,9 @@ public CodegenParameter fromParameter(Parameter p, Set<String> imports) {
realName = realName.replaceFirst("_", "");
}
parameter.vendorExtensions.put("realName", realName);

addStrValueToEnum(parameter.items);

return parameter;
}

Expand Down Expand Up @@ -714,7 +717,8 @@ public void preprocessOpenAPI(OpenAPI openAPI) {
for (var param : path.getParameters()) {
var found = false;
for (var opParam : op.getParameters()) {
if (Objects.equals(opParam.getName(), param.getName())) {
if (Objects.equals(opParam.getName(), param.getName())
&& Objects.equals(opParam.get$ref(), param.get$ref())) {
found = true;
break;
}
Expand Down Expand Up @@ -914,7 +918,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
* @param imports The operation imports.
*/
private void processParametersWithAdditionalMappings(List<CodegenParameter> params, Set<String> imports) {
Map<String, ParameterMapping> additionalMappings = new LinkedHashMap<>();
var additionalMappings = new LinkedHashMap<String, ParameterMapping>();
Iterator<CodegenParameter> iter = params.iterator();
while (iter.hasNext()) {
CodegenParameter param = iter.next();
Expand Down Expand Up @@ -1084,11 +1088,13 @@ public String toVarName(String name) {

// this fix for properties started with underscores and named by reserved words
// For example, _____default
var firstNameChar = varName.toCharArray()[0];
var underscorePrefix = getUnderscorePrefix(name);
varName = getUnderscorePrefix(name)
+ (firstNameChar == '_' && !underscorePrefix.isEmpty() ? "" : Character.toLowerCase(firstNameChar))
+ varName.substring(1);
if (varName.startsWith("_")) {
var firstNameChar = varName.toCharArray()[0];
var underscorePrefix = getUnderscorePrefix(name);
varName = underscorePrefix
+ (firstNameChar == '_' && !underscorePrefix.isEmpty() ? "" : Character.toLowerCase(firstNameChar))
+ varName.substring(1);
}

return varName;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -702,7 +702,8 @@ public void preprocessOpenAPI(OpenAPI openAPI) {
for (var param : path.getParameters()) {
var found = false;
for (var opParam : op.getParameters()) {
if (Objects.equals(opParam.getName(), param.getName())) {
if (Objects.equals(opParam.getName(), param.getName())
&& Objects.equals(opParam.get$ref(), param.get$ref())) {
found = true;
break;
}
Expand Down Expand Up @@ -947,6 +948,9 @@ public CodegenParameter fromParameter(Parameter p, Set<String> imports) {
realName = realName.replace("`", "");
}
parameter.vendorExtensions.put("realName", realName);

addStrValueToEnum(parameter.items);

return parameter;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,16 @@ private void gatherInlineModels(Schema schema, String modelPrefix) {
schema.setAdditionalProperties(refSchema);
}
}
if (schema.getItems() != null) {
String schemaName = resolveModelName(schema.getTitle(), modelPrefix + "Enum");
// Recurse to create $refs for inner models
gatherInlineModels(schema.getItems(), schemaName);
if (isModelNeeded(schema.getItems())) {
// If this schema should be split into its own model, do so
Schema refSchema = makeSchemaInComponents(schemaName, schema.getItems());
schema.setAdditionalProperties(refSchema);
}
}
} else if (schema.getProperties() != null) {
// If non-object type is specified but also properties
LOGGER.error("Illegal schema found with non-object type combined with properties, no properties should be defined:\n {}", schema);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,15 +209,27 @@ private static boolean isPrimitive(String type) {
};
}

public static void addStrValueToEnum(CodegenProperty property) {
if (property == null || !property.isEnum || property.allowableValues == null) {
return;
}
var enumVars = (List<Object>) property.allowableValues.get("enumVars");
addStrValueToEnum(enumVars, property.isNumeric);
}

public static void addStrValueToEnum(CodegenModel model) {
if (!model.isEnum || model.allowableValues == null) {
if (model == null || !model.isEnum || model.allowableValues == null) {
return;
}
var enumVars = (List<Object>) model.allowableValues.get("enumVars");
addStrValueToEnum(enumVars, model.isNumeric);
}

public static void addStrValueToEnum(List<Object> enumVars, boolean isNumeric) {
for (var enumVar : enumVars) {
var varMap = (Map<String, Object>) enumVar;
var value = varMap.get("value").toString();
if (model.isNumeric) {
if (isNumeric) {
var argPos = value.indexOf('(');
// case for BigDecimal
if (argPos >= 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,19 @@ package {{package}};
import io.micronaut.http.annotation.*;
import io.micronaut.core.annotation.*;
import io.micronaut.http.client.annotation.Client;
{{#micronaut_serde_jackson}}
import io.micronaut.serde.annotation.Serdeable;
{{/micronaut_serde_jackson}}
{{#jackson}}
import com.fasterxml.jackson.annotation.*;
{{/jackson}}
{{#configureAuth}}
import {{invokerPackage}}.auth.Authorization;
{{/configureAuth}}
import io.micronaut.core.convert.format.Format;
{{#reactive}}
import reactor.core.publisher.Mono;
import reactor.core.publisher.Flux;
{{/reactive}}
{{#wrapInHttpResponse}}
import io.micronaut.http.HttpResponse;
Expand All @@ -21,9 +28,12 @@ import {{import}};
import {{javaxPackage}}.annotation.Generated;
{{/generatedAnnotation}}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
{{#useBeanValidation}}
import {{javaxPackage}}.validation.Valid;
import {{javaxPackage}}.validation.constraints.*;
Expand Down Expand Up @@ -76,6 +86,28 @@ public interface {{classname}} {
{{/formatNoEmptyLines}}
{{/operation}}
{{/operations}}

{{#operations}}
{{#operation}}
{{#allParams}}
{{#items}}
{{#isEnum}}
{{^isContainer}}
{{#indent}}
{{>common/model/enum}}
{{/indent}}
{{/isContainer}}
{{#isContainer}}
{{#mostInnerItems}}
{{#indent}}
{{>common/model/enum}}
{{/indent}}
{{/mostInnerItems}}
{{/isContainer}}
{{/isEnum}}
{{/items}}
{{/allParams}}
{{/operation}}
{{/operations}}
}
{{/formatOneEmptyLine}}

Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{{!
default type
}}{{^isDate}}{{^isDateTime}}{{{vendorExtensions.typeWithGenericAnnotations}}}{{/isDateTime}}{{/isDate}}{{!
}}{{^isDate}}{{^isDateTime}}{{{vendorExtensions.typeWithEnumWithGenericAnnotations}}}{{/isDateTime}}{{/isDate}}{{!
date-time
}}{{#isDateTime}}@Format("{{{datetimeFormat}}}") {{{vendorExtensions.typeWithGenericAnnotations}}}{{/isDateTime}}{{!
}}{{#isDateTime}}@Format("{{{datetimeFormat}}}") {{{vendorExtensions.typeWithEnumWithGenericAnnotations}}}{{/isDateTime}}{{!
date
}}{{#isDate}}@Format("{{{dateFormat}}}") {{{vendorExtensions.typeWithGenericAnnotations}}}{{/isDate}}
}}{{#isDate}}@Format("{{{dateFormat}}}") {{{vendorExtensions.typeWithEnumWithGenericAnnotations}}}{{/isDate}}
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,7 @@ import {{javaxPackage}}.validation.Valid;
{{^micronaut_serde_jackson}}
import io.micronaut.core.annotation.Introspected;
{{/micronaut_serde_jackson}}
{{^generateHardNullable}}
import io.micronaut.core.annotation.Nullable;
{{/generateHardNullable}}
{{#generateHardNullable}}
import io.micronaut.core.annotation.Nullable;
{{/generateHardNullable}}
{{#generatedAnnotation}}
import {{javaxPackage}}.annotation.Generated;
{{/generatedAnnotation}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@
package {{apiPackage}};
{{#formatNoEmptyLines}}
import io.micronaut.http.annotation.*;
{{^generateHardNullable}}
import io.micronaut.core.annotation.Nullable;
{{/generateHardNullable}}
{{#generateHardNullable}}
import io.micronaut.core.annotation.Nullable;
{{/generateHardNullable}}
import io.micronaut.core.convert.format.Format;
{{#micronaut_serde_jackson}}
import io.micronaut.serde.annotation.Serdeable;
{{/micronaut_serde_jackson}}
{{#jackson}}
import com.fasterxml.jackson.annotation.*;
{{/jackson}}
{{#useAuth}}
import io.micronaut.security.annotation.Secured;
import io.micronaut.security.rules.SecurityRule;
Expand All @@ -27,12 +28,12 @@ import {{import}};
import {{javaxPackage}}.annotation.Generated;
{{/generatedAnnotation}}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
{{#generateControllerFromExamples}}
import java.util.Arrays;
{{/generateControllerFromExamples}}
import java.util.function.Function;
import java.util.stream.Collectors;
{{#useBeanValidation}}
import {{javaxPackage}}.validation.Valid;
import {{javaxPackage}}.validation.constraints.*;
Expand All @@ -43,6 +44,7 @@ import io.swagger.annotations.*;
{{#generateSwagger2Annotations}}
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
Expand Down Expand Up @@ -86,5 +88,28 @@ public interface {{classname}} {

{{/operation}}
{{/operations}}

{{#operations}}
{{#operation}}
{{#allParams}}
{{#items}}
{{#isEnum}}
{{^isContainer}}
{{#indent}}
{{>common/model/enum}}
{{/indent}}
{{/isContainer}}
{{#isContainer}}
{{#mostInnerItems}}
{{#indent}}
{{>common/model/enum}}
{{/indent}}
{{/mostInnerItems}}
{{/isContainer}}
{{/isEnum}}
{{/items}}
{{/allParams}}
{{/operation}}
{{/operations}}
}
{{/formatOneEmptyLine}}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ package {{package}}
import io.micronaut.http.annotation.*
import io.micronaut.core.annotation.*
import io.micronaut.http.client.annotation.Client
{{#micronaut_serde_jackson}}
import io.micronaut.serde.annotation.Serdeable
{{/micronaut_serde_jackson}}
{{#jackson}}
import com.fasterxml.jackson.annotation.*
{{/jackson}}
{{#configureAuth}}
import {{invokerPackage}}.auth.Authorization
{{/configureAuth}}
Expand All @@ -27,6 +33,7 @@ import io.swagger.annotations.*
{{#generateSwagger2Annotations}}
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.Parameter
import io.swagger.v3.oas.annotations.Parameters
import io.swagger.v3.oas.annotations.media.Content
import io.swagger.v3.oas.annotations.media.Schema
import io.swagger.v3.oas.annotations.responses.ApiResponse
Expand Down Expand Up @@ -68,6 +75,28 @@ interface {{classname}} {
{{/formatNoEmptyLines}}
{{/operation}}
{{/operations}}

{{#operations}}
{{#operation}}
{{#allParams}}
{{#items}}
{{#isEnum}}
{{^isContainer}}
{{#indent}}
{{>common/model/enum}}
{{/indent}}
{{/isContainer}}
{{#isContainer}}
{{#mostInnerItems}}
{{#indent}}
{{>common/model/enum}}
{{/indent}}
{{/mostInnerItems}}
{{/isContainer}}
{{/isEnum}}
{{/items}}
{{/allParams}}
{{/operation}}
{{/operations}}
}
{{/formatOneEmptyLine}}

Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{#isBodyParam}}@Body {{>common/params/validation}}{{>client/params/type}}{{{paramName}}}: {{{vendorExtensions.typeWithGenericAnnotations}}}{{/isBodyParam}}
{{#isBodyParam}}@Body {{>common/params/validation}}{{>client/params/type}}{{{paramName}}}: {{{vendorExtensions.typeWithEnumWithGenericAnnotations}}}{{/isBodyParam}}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{#isCookieParam}}@CookieValue(value = "{{baseName}}"{{#defaultValue}}, defaultValue = "{{defaultValue}}"{{/defaultValue}}) {{>common/params/validation}}{{>client/params/type}}{{{paramName}}}: {{{vendorExtensions.typeWithGenericAnnotations}}}{{/isCookieParam}}
{{#isCookieParam}}@CookieValue(value = "{{baseName}}"{{#defaultValue}}, defaultValue = "{{defaultValue}}"{{/defaultValue}}) {{>common/params/validation}}{{>client/params/type}}{{{paramName}}}: {{{vendorExtensions.typeWithEnumWithGenericAnnotations}}}{{/isCookieParam}}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{#isFormParam}}{{>common/params/validation}}{{>client/params/type}}{{{paramName}}}: {{{vendorExtensions.typeWithGenericAnnotations}}}{{/isFormParam}}
{{#isFormParam}}{{>common/params/validation}}{{>client/params/type}}{{{paramName}}}: {{{vendorExtensions.typeWithEnumWithGenericAnnotations}}}{{/isFormParam}}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{#isHeaderParam}}@Header(name = "{{baseName}}"{{#defaultValue}}, defaultValue = "{{{defaultValue}}}"{{/defaultValue}}) {{>common/params/validation}}{{>client/params/type}}{{{paramName}}}: {{{vendorExtensions.typeWithGenericAnnotations}}}{{/isHeaderParam}}
{{#isHeaderParam}}@Header(name = "{{baseName}}"{{#defaultValue}}, defaultValue = "{{{defaultValue}}}"{{/defaultValue}}) {{>common/params/validation}}{{>client/params/type}}{{{paramName}}}: {{{vendorExtensions.typeWithEnumWithGenericAnnotations}}}{{/isHeaderParam}}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{#isPathParam}}@PathVariable({{#defaultValue}}name = {{/defaultValue}}"{{baseName}}"{{#defaultValue}}, defaultValue = "{{{defaultValue}}}"{{/defaultValue}}) {{>common/params/validation}}{{>client/params/type}}{{{paramName}}}: {{{vendorExtensions.typeWithGenericAnnotations}}}{{/isPathParam}}
{{#isPathParam}}@PathVariable({{#defaultValue}}name = {{/defaultValue}}"{{baseName}}"{{#defaultValue}}, defaultValue = "{{{defaultValue}}}"{{/defaultValue}}) {{>common/params/validation}}{{>client/params/type}}{{{paramName}}}: {{{vendorExtensions.typeWithEnumWithGenericAnnotations}}}{{/isPathParam}}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{{#isQueryParam}}@QueryValue({{#defaultValue}}value = {{/defaultValue}}"{{{baseName}}}"{{!default value}}{{#defaultValue}}, defaultValue = "{{{defaultValue}}}"{{/defaultValue}}) {{!validation and type}}{{>common/params/validation}}{{>client/params/type}}{{{paramName}}}: {{{vendorExtensions.typeWithGenericAnnotations}}}{{/isQueryParam}}
{{#isQueryParam}}@QueryValue({{#defaultValue}}value = {{/defaultValue}}"{{{baseName}}}"{{!default value}}{{#defaultValue}}, defaultValue = "{{{defaultValue}}}"{{/defaultValue}}) {{!validation and type}}{{>common/params/validation}}{{>client/params/type}}{{{paramName}}}: {{{vendorExtensions.typeWithEnumWithGenericAnnotations}}}{{/isQueryParam}}
Loading

0 comments on commit ce99130

Please sign in to comment.