Skip to content

Commit b3ddf24

Browse files
committed
Fix processing enum extension in different formats (string, list, map)
Fixed #2453
1 parent bccb67b commit b3ddf24

File tree

8 files changed

+594
-89
lines changed

8 files changed

+594
-89
lines changed

openapi-generator/src/main/java/io/micronaut/openapi/generator/AbstractMicronautJavaCodegen.java

Lines changed: 61 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,11 @@
101101
import static io.micronaut.openapi.generator.Utils.addEnumParamsForConverters;
102102
import static io.micronaut.openapi.generator.Utils.addStrValueToEnum;
103103
import static io.micronaut.openapi.generator.Utils.calcQueryValueFormat;
104+
import static io.micronaut.openapi.generator.Utils.findEnumVar;
104105
import static io.micronaut.openapi.generator.Utils.isDateType;
105106
import static io.micronaut.openapi.generator.Utils.normalizeExtraAnnotations;
106107
import static io.micronaut.openapi.generator.Utils.processDuplicateVars;
108+
import static io.micronaut.openapi.generator.Utils.processEnumExt;
107109
import static io.micronaut.openapi.generator.Utils.processGenericAnnotations;
108110
import static io.micronaut.openapi.generator.Utils.readListOfStringsProperty;
109111
import static io.swagger.v3.parser.util.SchemaTypeUtil.BYTE_FORMAT;
@@ -1629,6 +1631,15 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
16291631
processGenericAnnotations(op.returnProperty, useBeanValidation, isGenerateHardNullable(), false, false, false, false, false, false);
16301632
op.returnType = op.returnProperty.vendorExtensions.get("typeWithEnumWithGenericAnnotations").toString();
16311633
}
1634+
1635+
var deprecatedMessage = op.vendorExtensions.get("x-deprecated-message");
1636+
var xDeprecated = op.vendorExtensions.get("x-deprecated");
1637+
if (deprecatedMessage == null && xDeprecated instanceof String xDeprecatedStr) {
1638+
deprecatedMessage = xDeprecatedStr;
1639+
}
1640+
if (deprecatedMessage != null) {
1641+
op.vendorExtensions.put("x-deprecated-message", deprecatedMessage.toString());
1642+
}
16321643
}
16331644

16341645
additionalProperties.put("enumImports", enumImports);
@@ -2247,6 +2258,16 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
22472258
}
22482259
}
22492260
model.allVars = allVars;
2261+
2262+
var deprecatedMessage = model.vendorExtensions.get("x-deprecated-message");
2263+
var xDeprecated = model.vendorExtensions.get("x-deprecated");
2264+
if (deprecatedMessage == null && xDeprecated instanceof String xDeprecatedStr) {
2265+
deprecatedMessage = xDeprecatedStr;
2266+
}
2267+
if (deprecatedMessage != null) {
2268+
model.vendorExtensions.put("x-deprecated-message", deprecatedMessage.toString());
2269+
}
2270+
22502271
model.vendorExtensions.put("requiredVars", requiredVars);
22512272
model.vendorExtensions.put("optionalVars", optionalVars);
22522273
model.vendorExtensions.put("areRequiredVarsAndReadOnlyVars", !requiredVarsWithoutDiscriminator.isEmpty() && !model.readOnlyVars.isEmpty());
@@ -2300,53 +2321,48 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
23002321

23012322
@Override
23022323
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String dataType) {
2303-
super.updateEnumVarsWithExtensions(enumVars, vendorExtensions, dataType);
23042324
if (vendorExtensions == null) {
23052325
return;
23062326
}
23072327

2308-
var xDeprecated = (List<Object>) vendorExtensions.get("x-deprecated");
2328+
processEnumExt(enumVars, vendorExtensions, "enumDescription", List.of("x-enum-descriptions", "x-xl4-enum-doc"));
2329+
processEnumExt(enumVars, vendorExtensions, "enumDeprecatedMessage", List.of("x-enum-deprecated-messages", "x-xl4-enum-deprecated"));
2330+
2331+
var deprecatedExt = vendorExtensions.get("x-deprecated");
2332+
List<?> xDeprecated = null;
2333+
Map<?, ?> xDeprecatedMap = null;
2334+
if (deprecatedExt instanceof List<?> deprecatedList) {
2335+
xDeprecated = deprecatedList;
2336+
} else if (deprecatedExt instanceof Map<?, ?> deprecatedMap) {
2337+
xDeprecated = new ArrayList<>(deprecatedMap.keySet());
2338+
xDeprecatedMap = deprecatedMap;
2339+
}
2340+
var deprecatedMessagesExt = vendorExtensions.get("x-enum-deprecated-messages");
2341+
if (deprecatedMessagesExt == null) {
2342+
deprecatedMessagesExt = vendorExtensions.get("x-xl4-enum-deprecated");
2343+
}
2344+
if (xDeprecated == null && deprecatedMessagesExt instanceof Map<?, ?> deprecatedMap) {
2345+
xDeprecated = new ArrayList<>(deprecatedMap.keySet());
2346+
xDeprecatedMap = deprecatedMap;
2347+
}
23092348
if (xDeprecated != null && !xDeprecated.isEmpty()) {
23102349
for (var deprecatedItem : xDeprecated) {
2311-
Map<String, Object> foundEnumVar = null;
2312-
for (var enumVar : enumVars) {
2313-
var isString = (boolean) enumVar.get("isString");
2314-
var value = (String) enumVar.get("value");
2315-
if (!isString) {
2316-
if (value.startsWith("(short)")) {
2317-
value = value.replace("(short) ", "");
2318-
} else if (value.startsWith("(byte)")) {
2319-
value = value.replace("(byte) ", "");
2320-
}
2321-
var argPos = value.indexOf('(');
2322-
// case for BigDecimal
2323-
if (argPos >= 0) {
2324-
value = value.substring(argPos + 1, value.indexOf(')'));
2325-
}
2326-
var upperValue = value.toUpperCase(Locale.ENGLISH);
2327-
if (upperValue.endsWith("F")
2328-
|| upperValue.endsWith("L")
2329-
|| upperValue.endsWith("D")) {
2330-
value = value.substring(0, value.length() - 1);
2331-
}
2332-
if (!value.contains("'")) {
2333-
value = value.replace("'", "");
2334-
}
2335-
if (!value.contains("\"")) {
2336-
value = "\"" + value + "\"";
2337-
}
2338-
}
2339-
if (value.equals("\"" + deprecatedItem + '"')) {
2340-
foundEnumVar = enumVar;
2341-
break;
2342-
}
2350+
Map<String, Object> foundEnumVar = findEnumVar(deprecatedItem.toString(), enumVars);
2351+
if (foundEnumVar == null) {
2352+
continue;
23432353
}
2344-
if (foundEnumVar != null) {
2345-
foundEnumVar.put("deprecated", true);
2354+
foundEnumVar.put("deprecated", true);
2355+
if (xDeprecatedMap != null) {
2356+
var deprecatedMessage = xDeprecatedMap.get(deprecatedItem);
2357+
if (deprecatedMessage instanceof String deprecatedMessageStr) {
2358+
foundEnumVar.put("enumDeprecatedMessage", deprecatedMessageStr);
2359+
}
23462360
}
23472361
}
23482362
}
23492363

2364+
processEnumExt(enumVars, vendorExtensions, "name", List.of("x-enum-varnames"));
2365+
23502366
var baseType = (String) vendorExtensions.get("baseType");
23512367
for (var enumVar : enumVars) {
23522368
if ((boolean) enumVar.get("isString")) {
@@ -2466,6 +2482,15 @@ private void processDiscriminatorProperty(CodegenProperty prop, CodegenDiscrimin
24662482

24672483
private void processProperty(CodegenProperty property, boolean isServer, CodegenModel model, Map<String, ModelsMap> models) {
24682484

2485+
var deprecatedMessage = property.vendorExtensions.get("x-deprecated-message");
2486+
var xDeprecated = property.vendorExtensions.get("x-deprecated");
2487+
if (deprecatedMessage == null && xDeprecated instanceof String xDeprecatedStr) {
2488+
deprecatedMessage = xDeprecatedStr;
2489+
}
2490+
if (deprecatedMessage != null) {
2491+
property.vendorExtensions.put("x-deprecated-message", deprecatedMessage.toString());
2492+
}
2493+
24692494
property.vendorExtensions.put("inRequiredArgsConstructor", !property.isReadOnly || isServer);
24702495
property.vendorExtensions.put("isServer", isServer);
24712496
property.vendorExtensions.put("lombok", lombok);

openapi-generator/src/main/java/io/micronaut/openapi/generator/AbstractMicronautKotlinCodegen.java

Lines changed: 59 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,13 @@
111111
import static io.micronaut.openapi.generator.Utils.addEnumParamsForConverters;
112112
import static io.micronaut.openapi.generator.Utils.addStrValueToEnum;
113113
import static io.micronaut.openapi.generator.Utils.calcQueryValueFormat;
114+
import static io.micronaut.openapi.generator.Utils.findEnumVar;
114115
import static io.micronaut.openapi.generator.Utils.isDateType;
115116
import static io.micronaut.openapi.generator.Utils.normalizeExtraAnnotations;
116117
import static io.micronaut.openapi.generator.Utils.normalizeStr;
117118
import static io.micronaut.openapi.generator.Utils.normalizeStrValue;
118119
import static io.micronaut.openapi.generator.Utils.processDuplicateVars;
120+
import static io.micronaut.openapi.generator.Utils.processEnumExt;
119121
import static io.micronaut.openapi.generator.Utils.processGenericAnnotations;
120122
import static io.micronaut.openapi.generator.Utils.readListOfStringsProperty;
121123
import static io.swagger.v3.parser.util.SchemaTypeUtil.BYTE_FORMAT;
@@ -1319,8 +1321,14 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
13191321

13201322
private void normalizeTextsInOperation(CodegenOperation op) {
13211323

1322-
if (op.vendorExtensions.containsKey("x-deprecated-message")) {
1323-
op.vendorExtensions.put("x-deprecated-message-normalized", normalizeStr(op.vendorExtensions.get("x-deprecated-message").toString()));
1324+
var deprecatedMessage = op.vendorExtensions.get("x-deprecated-message");
1325+
var xDeprecated = op.vendorExtensions.get("x-deprecated");
1326+
if (deprecatedMessage == null && xDeprecated instanceof String xDeprecatedStr) {
1327+
deprecatedMessage = xDeprecatedStr;
1328+
op.vendorExtensions.put("x-deprecated-message", xDeprecatedStr);
1329+
}
1330+
if (deprecatedMessage != null) {
1331+
op.vendorExtensions.put("x-deprecated-message-normalized", normalizeStr(deprecatedMessage.toString()));
13241332
}
13251333

13261334
if (op.vendorExtensions.containsKey("x-roles")) {
@@ -2357,8 +2365,14 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
23572365
model.vendorExtensions.put("requiredParentVarsWithoutDiscriminator", requiredParentVarsWithoutDiscriminator);
23582366
}
23592367

2360-
if (model.vendorExtensions.containsKey("x-deprecated-message")) {
2361-
model.vendorExtensions.put("x-deprecated-message-normalized", normalizeStr((String) model.vendorExtensions.get("x-deprecated-message")));
2368+
var deprecatedMessage = model.vendorExtensions.get("x-deprecated-message");
2369+
var xDeprecated = model.vendorExtensions.get("x-deprecated");
2370+
if (deprecatedMessage == null && xDeprecated instanceof String xDeprecatedStr) {
2371+
deprecatedMessage = xDeprecatedStr;
2372+
model.vendorExtensions.put("x-deprecated-message", xDeprecatedStr);
2373+
}
2374+
if (deprecatedMessage != null) {
2375+
model.vendorExtensions.put("x-deprecated-message-normalized", normalizeStr(deprecatedMessage.toString()));
23622376
}
23632377
model.vendorExtensions.put("descriptionNormalized", normalizeStr(model.description));
23642378
model.vendorExtensions.put("requiredVarsWithoutDiscriminator", requiredVarsWithoutDiscriminator);
@@ -2482,50 +2496,49 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
24822496

24832497
@Override
24842498
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String dataType) {
2485-
super.updateEnumVarsWithExtensions(enumVars, vendorExtensions, dataType);
24862499
if (vendorExtensions == null) {
24872500
return;
24882501
}
2489-
var xDeprecated = (List<Object>) vendorExtensions.get("x-deprecated");
2502+
2503+
processEnumExt(enumVars, vendorExtensions, "enumDescription", List.of("x-enum-descriptions", "x-xl4-enum-doc"));
2504+
processEnumExt(enumVars, vendorExtensions, "enumDeprecatedMessage", List.of("x-enum-deprecated-messages", "x-xl4-enum-deprecated"), true);
2505+
2506+
var deprecatedExt = vendorExtensions.get("x-deprecated");
2507+
List<?> xDeprecated = null;
2508+
Map<?, ?> xDeprecatedMap = null;
2509+
if (deprecatedExt instanceof List<?> deprecatedList) {
2510+
xDeprecated = deprecatedList;
2511+
} else if (deprecatedExt instanceof Map<?, ?> deprecatedMap) {
2512+
xDeprecated = new ArrayList<>(deprecatedMap.keySet());
2513+
xDeprecatedMap = deprecatedMap;
2514+
}
2515+
var deprecatedMessagesExt = vendorExtensions.get("x-enum-deprecated-messages");
2516+
if (deprecatedMessagesExt == null) {
2517+
deprecatedMessagesExt = vendorExtensions.get("x-xl4-enum-deprecated");
2518+
}
2519+
if (xDeprecated == null && deprecatedMessagesExt instanceof Map<?, ?> deprecatedMap) {
2520+
xDeprecated = new ArrayList<>(deprecatedMap.keySet());
2521+
xDeprecatedMap = deprecatedMap;
2522+
}
24902523
if (xDeprecated != null && !xDeprecated.isEmpty()) {
24912524
for (var deprecatedItem : xDeprecated) {
2492-
Map<String, Object> foundEnumVar = null;
2493-
for (var enumVar : enumVars) {
2494-
var isString = (boolean) enumVar.get("isString");
2495-
var value = (String) enumVar.get("value");
2496-
if (!isString) {
2497-
if (value.startsWith("(short)")) {
2498-
value = value.replace("(short) ", "");
2499-
}
2500-
var argPos = value.indexOf('(');
2501-
// case for BigDecimal
2502-
if (argPos >= 0) {
2503-
value = value.substring(argPos + 1, value.indexOf(')'));
2504-
}
2505-
var upperValue = value.toUpperCase(Locale.ENGLISH);
2506-
if (upperValue.endsWith("F")
2507-
|| upperValue.endsWith("L")
2508-
|| upperValue.endsWith("D")) {
2509-
value = value.substring(0, value.length() - 1);
2510-
}
2511-
if (!value.contains("'")) {
2512-
value = value.replace("'", "");
2513-
}
2514-
if (!value.contains("\"")) {
2515-
value = "\"" + value + "\"";
2516-
}
2517-
}
2518-
if (value.equals("\"" + deprecatedItem + '"')) {
2519-
foundEnumVar = enumVar;
2520-
break;
2521-
}
2525+
Map<String, Object> foundEnumVar = findEnumVar(deprecatedItem.toString(), enumVars);
2526+
if (foundEnumVar == null) {
2527+
continue;
25222528
}
2523-
if (foundEnumVar != null) {
2524-
foundEnumVar.put("deprecated", true);
2529+
foundEnumVar.put("deprecated", true);
2530+
if (xDeprecatedMap != null) {
2531+
var deprecatedMessage = xDeprecatedMap.get(deprecatedItem);
2532+
if (deprecatedMessage instanceof String deprecatedMessageStr) {
2533+
foundEnumVar.put("enumDeprecatedMessage", deprecatedMessageStr);
2534+
foundEnumVar.put("enumDeprecatedMessageNormalized", normalizeStr(deprecatedMessageStr));
2535+
}
25252536
}
25262537
}
25272538
}
25282539

2540+
processEnumExt(enumVars, vendorExtensions, "name", List.of("x-enum-varnames"));
2541+
25292542
var baseType = (String) vendorExtensions.get("baseType");
25302543
for (var enumVar : enumVars) {
25312544
var value = (String) enumVar.get("value");
@@ -2656,8 +2669,14 @@ private void processProperty(CodegenProperty property, boolean isServer, Codegen
26562669
if (property.description != null) {
26572670
property.vendorExtensions.put("descriptionNormalized", normalizeStr(property.description));
26582671
}
2659-
if (property.vendorExtensions.containsKey("x-deprecated-message")) {
2660-
property.vendorExtensions.put("x-deprecated-message-normalized", normalizeStr((String) property.vendorExtensions.get("x-deprecated-message")));
2672+
var deprecatedMessage = property.vendorExtensions.get("x-deprecated-message");
2673+
var xDeprecated = property.vendorExtensions.get("x-deprecated");
2674+
if (deprecatedMessage == null && xDeprecated instanceof String xDeprecatedStr) {
2675+
deprecatedMessage = xDeprecatedStr;
2676+
property.vendorExtensions.put("x-deprecated-message", xDeprecatedStr);
2677+
}
2678+
if (deprecatedMessage != null) {
2679+
property.vendorExtensions.put("x-deprecated-message-normalized", normalizeStr(deprecatedMessage.toString()));
26612680
}
26622681
normalizeStrValue("x-pattern-message", property.vendorExtensions);
26632682
normalizeStrValue("x-size-message", property.vendorExtensions);

openapi-generator/src/main/java/io/micronaut/openapi/generator/Utils.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,4 +783,73 @@ public static boolean addUserParameter(CodegenOperation op, UserParameterMode us
783783

784784
return true;
785785
}
786+
787+
public static void processEnumExt(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String key, List<String> extensionKeys) {
788+
processEnumExt(enumVars, vendorExtensions, key, extensionKeys, false);
789+
}
790+
791+
public static void processEnumExt(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String key, List<String> extensionKeys, boolean withNormalization) {
792+
Object value = null;
793+
for (var extKey : extensionKeys) {
794+
value = vendorExtensions.get(extKey);
795+
if (value != null) {
796+
break;
797+
}
798+
}
799+
if (value instanceof List<?> valuesList) {
800+
int size = Math.min(enumVars.size(), valuesList.size());
801+
for (int i = 0; i < size; i++) {
802+
enumVars.get(i).put(key, valuesList.get(i));
803+
if (withNormalization) {
804+
enumVars.get(i).put(key + "Normalized", normalizeStr(valuesList.get(i).toString()));
805+
}
806+
}
807+
} else if (value instanceof Map<?, ?> valuesMap) {
808+
for (var entry : valuesMap.entrySet()) {
809+
Map<String, Object> foundEnumVar = findEnumVar(entry.getKey().toString(), enumVars);
810+
if (foundEnumVar == null) {
811+
continue;
812+
}
813+
foundEnumVar.put(key, entry.getValue().toString());
814+
if (withNormalization) {
815+
foundEnumVar.put(key + "Normalized", normalizeStr(entry.getValue().toString()));
816+
}
817+
}
818+
}
819+
}
820+
821+
public static Map<String, Object> findEnumVar(String enumConstName, List<Map<String, Object>> enumVars) {
822+
for (var enumVar : enumVars) {
823+
var isString = (boolean) enumVar.get("isString");
824+
var value = (String) enumVar.get("value");
825+
if (!isString) {
826+
if (value.startsWith("(short)")) {
827+
value = value.replace("(short) ", "");
828+
} else if (value.startsWith("(byte)")) {
829+
value = value.replace("(byte) ", "");
830+
}
831+
var argPos = value.indexOf('(');
832+
// case for BigDecimal
833+
if (argPos >= 0) {
834+
value = value.substring(argPos + 1, value.indexOf(')'));
835+
}
836+
var upperValue = value.toUpperCase(Locale.ENGLISH);
837+
if (upperValue.endsWith("F")
838+
|| upperValue.endsWith("L")
839+
|| upperValue.endsWith("D")) {
840+
value = value.substring(0, value.length() - 1);
841+
}
842+
if (!value.contains("'")) {
843+
value = value.replace("'", "");
844+
}
845+
if (!value.contains("\"")) {
846+
value = "\"" + value + "\"";
847+
}
848+
}
849+
if (value.equals("\"" + enumConstName + '"')) {
850+
return enumVar;
851+
}
852+
}
853+
return null;
854+
}
786855
}

0 commit comments

Comments
 (0)