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
Original file line number Diff line number Diff line change
Expand Up @@ -1560,7 +1560,7 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
param.isEnum = true;
}
if (param.isEnum) {
addEnumParamsForConverters(modelPackage, param, converterCounters, enumParams, enumImports);
addEnumParamsForConverters(modelPackage, models.get(param.dataType), param, converterCounters, enumParams, enumImports, false);
}
}
}
Expand All @@ -1572,7 +1572,7 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
p.isEnum = true;
}
if (p.isEnum) {
addEnumParamsForConverters(modelPackage, p, converterCounters, enumParams, enumImports);
addEnumParamsForConverters(modelPackage, models.get(p.dataType), p, converterCounters, enumParams, enumImports, false);
}
});
op.formParams.clear();
Expand Down Expand Up @@ -1605,7 +1605,7 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
}

if (param.isEnum && !param.isBodyParam) {
addEnumParamsForConverters(modelPackage, param, converterCounters, enumParams, enumImports);
addEnumParamsForConverters(modelPackage, models.get(param.dataType), param, converterCounters, enumParams, enumImports, false);
}
}
if (op.returnProperty != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,7 @@ protected AbstractMicronautKotlinCodegen() {
typeMapping.put("float", "Float");
typeMapping.put("long", "Long");
typeMapping.put("double", "Double");
typeMapping.put("BigInteger", "BigInteger");
typeMapping.put("ByteArray", "ByteArray");
typeMapping.put("number", "BigDecimal");
typeMapping.put("decimal", "BigDecimal");
Expand Down Expand Up @@ -447,6 +448,7 @@ protected AbstractMicronautKotlinCodegen() {

importMapping.put("File", "java.io.File");
importMapping.put("BigDecimal", "java.math.BigDecimal");
importMapping.put("BigInteger", "java.math.BigInteger");
importMapping.put("DateTime", "java.time.Instant");
importMapping.put("LocalDateTime", "java.time.LocalDateTime");
importMapping.put("OffsetDateTime", "java.time.OffsetDateTime");
Expand Down Expand Up @@ -1203,7 +1205,7 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
param.isEnum = true;
}
if (param.isEnum) {
addEnumParamsForConverters(modelPackage, param, converterCounters, enumParams, enumImports);
addEnumParamsForConverters(modelPackage, models.get(param.dataType), param, converterCounters, enumParams, enumImports, true);
}
}
}
Expand All @@ -1215,7 +1217,7 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
p.isEnum = true;
}
if (p.isEnum) {
addEnumParamsForConverters(modelPackage, p, converterCounters, enumParams, enumImports);
addEnumParamsForConverters(modelPackage, models.get(p.dataType), p, converterCounters, enumParams, enumImports, true);
}
});
op.formParams.clear();
Expand Down Expand Up @@ -1254,7 +1256,7 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
}

if (param.isEnum && !param.isBodyParam) {
addEnumParamsForConverters(modelPackage, param, converterCounters, enumParams, enumImports);
addEnumParamsForConverters(modelPackage, models.get(param.dataType), param, converterCounters, enumParams, enumImports, true);
}
}

Expand Down Expand Up @@ -1917,14 +1919,16 @@ public String toEnumVarName(String value, String datatype) {
String varName = value;

// number
if ("Int".equalsIgnoreCase(datatype)
if (
"Int".equalsIgnoreCase(datatype)
|| "Byte".equalsIgnoreCase(datatype)
|| "Short".equalsIgnoreCase(datatype)
|| "Integer".equalsIgnoreCase(datatype)
|| "Long".equalsIgnoreCase(datatype)
|| "Float".equalsIgnoreCase(datatype)
|| "Double".equalsIgnoreCase(datatype)
|| "BigDecimal".equals(datatype)) {
|| "BigDecimal".equals(datatype)
) {
varName = "NUMBER_" + varName;
varName = varName.replaceAll("-", "MINUS_");
varName = varName.replaceAll("\\+", "PLUS_");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -618,10 +618,12 @@ public static void processDuplicateVars(List<CodegenProperty> vars) {

public static void addEnumParamsForConverters(
String modelPackage,
CodegenModel enumModel,
CodegenParameter param,
Map<String, Integer> converterCounters,
List<CodegenParameter> enumParams,
List<String> enumImports
List<String> enumImports,
boolean isKotlin
) {
var converterName = param.dataType;
var alreadyAdded = false;
Expand All @@ -631,17 +633,101 @@ public static void addEnumParamsForConverters(
break;
}
}
if (!alreadyAdded) {
var counter = converterCounters.get(converterName);
if (counter == null) {
converterCounters.put(converterName, 0);
} else {
converterCounters.put(converterName, counter + 1);
if (alreadyAdded) {
return;
}

var counter = converterCounters.get(converterName);
converterCounters.put(converterName, counter == null ? 0 : counter + 1);
param.vendorExtensions.put("converterName", converterName + (counter != null ? counter : ""));

var convertFun = (enumModel.isNullable ? "Optional.ofNullable(" : "Optional.of(")
+ param.dataType + ".fromValue(" + (isKotlin ? getKotlinEnumConvertFun(enumModel.dataType) : getJavaEnumConvertFun(enumModel.dataType, enumImports)) + "))";

param.vendorExtensions.put("convertFun", convertFun);
param.vendorExtensions.put("convertToStrFun", isKotlin ? getKotlinEnumConvertToStrFun(enumModel.dataType) : getJavaEnumConvertToStrFun((String) enumModel.vendorExtensions.get("baseType")));
enumParams.add(param);
enumImports.add(modelPackage + "." + param.dataType);
}

private static String getKotlinEnumConvertToStrFun(String type) {
return "String".equals(type) ? "v.value" : "v.value.toString()";
}

private static String getJavaEnumConvertToStrFun(String type) {
if ("String".equals(type)) {
return "v.getValue()";
} else if (
"char".equals(type)
|| "byte".equals(type)
|| "short".equals(type)
|| "int".equals(type)
|| "long".equals(type)
|| "float".equals(type)
|| "double".equals(type)
|| "boolean".equals(type)
) {
return "String.valueOf(v.getValue())";
} else {
return "v.getValue().toString()";
}
}


private static String getKotlinEnumConvertFun(String type) {
if ("Char".equals(type)) {
return "v[0]";
} else if ("Byte".equals(type)) {
return "v.toByte()";
} else if ("Short".equals(type)) {
return "v.toShort()";
} else if ("Int".equals(type)) {
return "v.toInt()";
} else if ("Long".equals(type)) {
return "v.toLong()";
} else if ("Float".equals(type)) {
return "v.toFloat()";
} else if ("Double".equals(type)) {
return "v.toDouble()";
} else if ("Boolean".equals(type)) {
return "v.toBoolean()";
} else if ("BigDecimal".equals(type)) {
return "v.toBigDecimal()";
} else if ("BigInteger".equals(type)) {
return "v.toBigInteger()";
}
return "v";
}

private static String getJavaEnumConvertFun(String type, List<String> imports) {
if ("Character".equals(type) || "char".equals(type)) {
return "v.charAt(0)";
} else if ("Byte".equals(type) || "byte".equals(type)) {
return "Byte.valueOf(v)";
} else if ("Short".equals(type) || "short".equals(type)) {
return "Short.valueOf(v)";
} else if ("Integer".equals(type) || "int".equals(type)) {
return "Integer.valueOf(v)";
} else if ("Long".equals(type) || "long".equals(type)) {
return "Long.valueOf(v)";
} else if ("Float".equals(type) || "float".equals(type)) {
return "Float.valueOf(v)";
} else if ("Double".equals(type) || "double".equals(type)) {
return "Double.valueOf(v)";
} else if ("Boolean".equals(type) || "boolean".equals(type)) {
return "Boolean.valueOf(v)";
} else if ("BigDecimal".equals(type)) {
if (!imports.contains("java.math.BigDecimal")) {
imports.add("java.math.BigDecimal");
}
return "new BigDecimal(v)";
} else if ("BigInteger".equals(type)) {
if (!imports.contains("java.math.BigInteger")) {
imports.add("java.math.BigInteger");
}
param.vendorExtensions.put("converterName", converterName + (counter != null ? counter : ""));
enumParams.add(param);
enumImports.add(modelPackage + "." + param.dataType);
return "new BigInteger(v)";
}
return "v";
}

public static boolean addUserParameter(CodegenOperation op, UserParameterMode userParameterMode, boolean isAnonymous, boolean isDenyAll) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,65 +4,29 @@ package {{invokerPackage}}.config;
import io.micronaut.context.annotation.Bean;
import io.micronaut.context.annotation.Factory;
import io.micronaut.core.convert.TypeConverter;
import io.micronaut.serde.ObjectMapper;
{{#generatedAnnotation}}
import {{javaxPackage}}.annotation.Generated;
{{/generatedAnnotation}}
{{#lombok}}
import lombok.RequiredArgsConstructor;
{{/lombok}}
{{#enumImports}}
import {{{.}}};
{{/enumImports}}
import java.util.Optional;

import java.io.IOException;

{{#lombok}}
@RequiredArgsConstructor
{{/lombok}}
@Factory
{{#generatedAnnotation}}
{{>common/generatedAnnotation}}
{{/generatedAnnotation}}
public class {{{enumConfigClassName}}} {

private final ObjectMapper objectMapper;
{{^lombok}}

public {{{enumConfigClassName}}}(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
{{/lombok}}
{{#enumParams}}

@Bean
public TypeConverter<String, {{{dataType}}}> toEnum{{{vendorExtensions.converterName}}}() {
return commonToEnumConverter({{{dataType}}}.class, objectMapper);
return (v, c, ctx) -> {{{vendorExtensions.convertFun}}};
}

@Bean
public TypeConverter<{{{dataType}}}, String> toStr{{{vendorExtensions.converterName}}}() {
return commonToStrConverter({{{dataType}}}.class, objectMapper);
return (v, c, ctx) -> Optional.of({{{vendorExtensions.convertToStrFun}}});
}
{{/enumParams}}

public static <T> TypeConverter<T, String> commonToStrConverter(Class<T> clazz, ObjectMapper objectMapper) {
return TypeConverter.of(clazz, String.class, (value) -> {
try {
return objectMapper.writeValueAsString(value);
} catch (IOException e) {
throw new RuntimeException(e);
}
});
}

public static <T> TypeConverter<String, T> commonToEnumConverter(Class<T> clazz, ObjectMapper objectMapper) {
return TypeConverter.of(String.class, clazz, (value) -> {
try {
return objectMapper.readValue(value, clazz);
} catch (IOException e) {
throw new RuntimeException(e);
}
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,52 +4,25 @@ package {{invokerPackage}}.config
import io.micronaut.context.annotation.Bean
import io.micronaut.context.annotation.Factory
import io.micronaut.core.convert.TypeConverter
import io.micronaut.serde.ObjectMapper
{{#generatedAnnotation}}
import {{javaxPackage}}.annotation.Generated
{{/generatedAnnotation}}
{{#enumImports}}
import {{{.}}}
{{/enumImports}}

import java.io.IOException
import java.util.Optional

@Factory
{{#generatedAnnotation}}
{{>common/generatedAnnotation}}
{{/generatedAnnotation}}
class {{{enumConfigClassName}}}(
private val objectMapper: ObjectMapper,
) {
class {{{enumConfigClassName}}} {
{{#enumParams}}

@Bean
fun toEnum{{{vendorExtensions.converterName}}}(): TypeConverter<String, {{{dataType}}}> =
commonToEnumConverter({{{dataType}}}::class.java, objectMapper)
fun toEnum{{{vendorExtensions.converterName}}}() = TypeConverter<String, {{{dataType}}}> { v, _, _ -> {{{vendorExtensions.convertFun}}} }

@Bean
fun toStr{{{vendorExtensions.converterName}}}(): TypeConverter<{{{dataType}}}, String> =
commonToStrConverter({{{dataType}}}::class.java, objectMapper)
fun toStr{{{vendorExtensions.converterName}}}() = TypeConverter<{{{dataType}}}, String> { v, _, _ -> Optional.of({{{vendorExtensions.convertToStrFun}}}) }
{{/enumParams}}

companion object {

fun <T> commonToStrConverter(clazz: Class<T>, objectMapper: ObjectMapper): TypeConverter<T, String> =
TypeConverter.of(clazz, String::class.java) {
try {
objectMapper.writeValueAsString(it)
} catch (e: IOException) {
throw RuntimeException(e)
}
}

fun <T> commonToEnumConverter(clazz: Class<T>, objectMapper: ObjectMapper): TypeConverter<String, T> =
TypeConverter.of(String::class.java, clazz) {
try {
objectMapper.readValue(it, clazz)
} catch (e: IOException) {
throw RuntimeException(e)
}
}
}
}
Loading
Loading