Skip to content
Merged
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 @@ -101,9 +101,11 @@
import static io.micronaut.openapi.generator.Utils.addEnumParamsForConverters;
import static io.micronaut.openapi.generator.Utils.addStrValueToEnum;
import static io.micronaut.openapi.generator.Utils.calcQueryValueFormat;
import static io.micronaut.openapi.generator.Utils.findEnumVar;
import static io.micronaut.openapi.generator.Utils.isDateType;
import static io.micronaut.openapi.generator.Utils.normalizeExtraAnnotations;
import static io.micronaut.openapi.generator.Utils.processDuplicateVars;
import static io.micronaut.openapi.generator.Utils.processEnumExt;
import static io.micronaut.openapi.generator.Utils.processGenericAnnotations;
import static io.micronaut.openapi.generator.Utils.readListOfStringsProperty;
import static io.swagger.v3.parser.util.SchemaTypeUtil.BYTE_FORMAT;
Expand Down Expand Up @@ -1629,6 +1631,15 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
processGenericAnnotations(op.returnProperty, useBeanValidation, isGenerateHardNullable(), false, false, false, false, false, false);
op.returnType = op.returnProperty.vendorExtensions.get("typeWithEnumWithGenericAnnotations").toString();
}

var deprecatedMessage = op.vendorExtensions.get("x-deprecated-message");
var xDeprecated = op.vendorExtensions.get("x-deprecated");
if (deprecatedMessage == null && xDeprecated instanceof String xDeprecatedStr) {
deprecatedMessage = xDeprecatedStr;
}
if (deprecatedMessage != null) {
op.vendorExtensions.put("x-deprecated-message", deprecatedMessage.toString());
}
}

additionalProperties.put("enumImports", enumImports);
Expand Down Expand Up @@ -2247,6 +2258,16 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
}
}
model.allVars = allVars;

var deprecatedMessage = model.vendorExtensions.get("x-deprecated-message");
var xDeprecated = model.vendorExtensions.get("x-deprecated");
if (deprecatedMessage == null && xDeprecated instanceof String xDeprecatedStr) {
deprecatedMessage = xDeprecatedStr;
}
if (deprecatedMessage != null) {
model.vendorExtensions.put("x-deprecated-message", deprecatedMessage.toString());
}

model.vendorExtensions.put("requiredVars", requiredVars);
model.vendorExtensions.put("optionalVars", optionalVars);
model.vendorExtensions.put("areRequiredVarsAndReadOnlyVars", !requiredVarsWithoutDiscriminator.isEmpty() && !model.readOnlyVars.isEmpty());
Expand Down Expand Up @@ -2300,53 +2321,48 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)

@Override
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String dataType) {
super.updateEnumVarsWithExtensions(enumVars, vendorExtensions, dataType);
if (vendorExtensions == null) {
return;
}

var xDeprecated = (List<Object>) vendorExtensions.get("x-deprecated");
processEnumExt(enumVars, vendorExtensions, "enumDescription", List.of("x-enum-descriptions", "x-xl4-enum-doc"));
processEnumExt(enumVars, vendorExtensions, "enumDeprecatedMessage", List.of("x-enum-deprecated-messages", "x-xl4-enum-deprecated"));

var deprecatedExt = vendorExtensions.get("x-deprecated");
List<?> xDeprecated = null;
Map<?, ?> xDeprecatedMap = null;
if (deprecatedExt instanceof List<?> deprecatedList) {
xDeprecated = deprecatedList;
} else if (deprecatedExt instanceof Map<?, ?> deprecatedMap) {
xDeprecated = new ArrayList<>(deprecatedMap.keySet());
xDeprecatedMap = deprecatedMap;
}
var deprecatedMessagesExt = vendorExtensions.get("x-enum-deprecated-messages");
if (deprecatedMessagesExt == null) {
deprecatedMessagesExt = vendorExtensions.get("x-xl4-enum-deprecated");
}
if (xDeprecated == null && deprecatedMessagesExt instanceof Map<?, ?> deprecatedMap) {
xDeprecated = new ArrayList<>(deprecatedMap.keySet());
xDeprecatedMap = deprecatedMap;
}
if (xDeprecated != null && !xDeprecated.isEmpty()) {
for (var deprecatedItem : xDeprecated) {
Map<String, Object> foundEnumVar = null;
for (var enumVar : enumVars) {
var isString = (boolean) enumVar.get("isString");
var value = (String) enumVar.get("value");
if (!isString) {
if (value.startsWith("(short)")) {
value = value.replace("(short) ", "");
} else if (value.startsWith("(byte)")) {
value = value.replace("(byte) ", "");
}
var argPos = value.indexOf('(');
// case for BigDecimal
if (argPos >= 0) {
value = value.substring(argPos + 1, value.indexOf(')'));
}
var upperValue = value.toUpperCase(Locale.ENGLISH);
if (upperValue.endsWith("F")
|| upperValue.endsWith("L")
|| upperValue.endsWith("D")) {
value = value.substring(0, value.length() - 1);
}
if (!value.contains("'")) {
value = value.replace("'", "");
}
if (!value.contains("\"")) {
value = "\"" + value + "\"";
}
}
if (value.equals("\"" + deprecatedItem + '"')) {
foundEnumVar = enumVar;
break;
}
Map<String, Object> foundEnumVar = findEnumVar(deprecatedItem.toString(), enumVars);
if (foundEnumVar == null) {
continue;
}
if (foundEnumVar != null) {
foundEnumVar.put("deprecated", true);
foundEnumVar.put("deprecated", true);
if (xDeprecatedMap != null) {
var deprecatedMessage = xDeprecatedMap.get(deprecatedItem);
if (deprecatedMessage instanceof String deprecatedMessageStr) {
foundEnumVar.put("enumDeprecatedMessage", deprecatedMessageStr);
}
}
}
}

processEnumExt(enumVars, vendorExtensions, "name", List.of("x-enum-varnames"));

var baseType = (String) vendorExtensions.get("baseType");
for (var enumVar : enumVars) {
if ((boolean) enumVar.get("isString")) {
Expand Down Expand Up @@ -2466,6 +2482,15 @@ private void processDiscriminatorProperty(CodegenProperty prop, CodegenDiscrimin

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

var deprecatedMessage = property.vendorExtensions.get("x-deprecated-message");
var xDeprecated = property.vendorExtensions.get("x-deprecated");
if (deprecatedMessage == null && xDeprecated instanceof String xDeprecatedStr) {
deprecatedMessage = xDeprecatedStr;
}
if (deprecatedMessage != null) {
property.vendorExtensions.put("x-deprecated-message", deprecatedMessage.toString());
}

property.vendorExtensions.put("inRequiredArgsConstructor", !property.isReadOnly || isServer);
property.vendorExtensions.put("isServer", isServer);
property.vendorExtensions.put("lombok", lombok);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,13 @@
import static io.micronaut.openapi.generator.Utils.addEnumParamsForConverters;
import static io.micronaut.openapi.generator.Utils.addStrValueToEnum;
import static io.micronaut.openapi.generator.Utils.calcQueryValueFormat;
import static io.micronaut.openapi.generator.Utils.findEnumVar;
import static io.micronaut.openapi.generator.Utils.isDateType;
import static io.micronaut.openapi.generator.Utils.normalizeExtraAnnotations;
import static io.micronaut.openapi.generator.Utils.normalizeStr;
import static io.micronaut.openapi.generator.Utils.normalizeStrValue;
import static io.micronaut.openapi.generator.Utils.processDuplicateVars;
import static io.micronaut.openapi.generator.Utils.processEnumExt;
import static io.micronaut.openapi.generator.Utils.processGenericAnnotations;
import static io.micronaut.openapi.generator.Utils.readListOfStringsProperty;
import static io.swagger.v3.parser.util.SchemaTypeUtil.BYTE_FORMAT;
Expand Down Expand Up @@ -1319,8 +1321,14 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo

private void normalizeTextsInOperation(CodegenOperation op) {

if (op.vendorExtensions.containsKey("x-deprecated-message")) {
op.vendorExtensions.put("x-deprecated-message-normalized", normalizeStr(op.vendorExtensions.get("x-deprecated-message").toString()));
var deprecatedMessage = op.vendorExtensions.get("x-deprecated-message");
var xDeprecated = op.vendorExtensions.get("x-deprecated");
if (deprecatedMessage == null && xDeprecated instanceof String xDeprecatedStr) {
deprecatedMessage = xDeprecatedStr;
op.vendorExtensions.put("x-deprecated-message", xDeprecatedStr);
}
if (deprecatedMessage != null) {
op.vendorExtensions.put("x-deprecated-message-normalized", normalizeStr(deprecatedMessage.toString()));
}

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

if (model.vendorExtensions.containsKey("x-deprecated-message")) {
model.vendorExtensions.put("x-deprecated-message-normalized", normalizeStr((String) model.vendorExtensions.get("x-deprecated-message")));
var deprecatedMessage = model.vendorExtensions.get("x-deprecated-message");
var xDeprecated = model.vendorExtensions.get("x-deprecated");
if (deprecatedMessage == null && xDeprecated instanceof String xDeprecatedStr) {
deprecatedMessage = xDeprecatedStr;
model.vendorExtensions.put("x-deprecated-message", xDeprecatedStr);
}
if (deprecatedMessage != null) {
model.vendorExtensions.put("x-deprecated-message-normalized", normalizeStr(deprecatedMessage.toString()));
}
model.vendorExtensions.put("descriptionNormalized", normalizeStr(model.description));
model.vendorExtensions.put("requiredVarsWithoutDiscriminator", requiredVarsWithoutDiscriminator);
Expand Down Expand Up @@ -2482,50 +2496,49 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)

@Override
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String dataType) {
super.updateEnumVarsWithExtensions(enumVars, vendorExtensions, dataType);
if (vendorExtensions == null) {
return;
}
var xDeprecated = (List<Object>) vendorExtensions.get("x-deprecated");

processEnumExt(enumVars, vendorExtensions, "enumDescription", List.of("x-enum-descriptions", "x-xl4-enum-doc"));
processEnumExt(enumVars, vendorExtensions, "enumDeprecatedMessage", List.of("x-enum-deprecated-messages", "x-xl4-enum-deprecated"), true);

var deprecatedExt = vendorExtensions.get("x-deprecated");
List<?> xDeprecated = null;
Map<?, ?> xDeprecatedMap = null;
if (deprecatedExt instanceof List<?> deprecatedList) {
xDeprecated = deprecatedList;
} else if (deprecatedExt instanceof Map<?, ?> deprecatedMap) {
xDeprecated = new ArrayList<>(deprecatedMap.keySet());
xDeprecatedMap = deprecatedMap;
}
var deprecatedMessagesExt = vendorExtensions.get("x-enum-deprecated-messages");
if (deprecatedMessagesExt == null) {
deprecatedMessagesExt = vendorExtensions.get("x-xl4-enum-deprecated");
}
if (xDeprecated == null && deprecatedMessagesExt instanceof Map<?, ?> deprecatedMap) {
xDeprecated = new ArrayList<>(deprecatedMap.keySet());
xDeprecatedMap = deprecatedMap;
}
if (xDeprecated != null && !xDeprecated.isEmpty()) {
for (var deprecatedItem : xDeprecated) {
Map<String, Object> foundEnumVar = null;
for (var enumVar : enumVars) {
var isString = (boolean) enumVar.get("isString");
var value = (String) enumVar.get("value");
if (!isString) {
if (value.startsWith("(short)")) {
value = value.replace("(short) ", "");
}
var argPos = value.indexOf('(');
// case for BigDecimal
if (argPos >= 0) {
value = value.substring(argPos + 1, value.indexOf(')'));
}
var upperValue = value.toUpperCase(Locale.ENGLISH);
if (upperValue.endsWith("F")
|| upperValue.endsWith("L")
|| upperValue.endsWith("D")) {
value = value.substring(0, value.length() - 1);
}
if (!value.contains("'")) {
value = value.replace("'", "");
}
if (!value.contains("\"")) {
value = "\"" + value + "\"";
}
}
if (value.equals("\"" + deprecatedItem + '"')) {
foundEnumVar = enumVar;
break;
}
Map<String, Object> foundEnumVar = findEnumVar(deprecatedItem.toString(), enumVars);
if (foundEnumVar == null) {
continue;
}
if (foundEnumVar != null) {
foundEnumVar.put("deprecated", true);
foundEnumVar.put("deprecated", true);
if (xDeprecatedMap != null) {
var deprecatedMessage = xDeprecatedMap.get(deprecatedItem);
if (deprecatedMessage instanceof String deprecatedMessageStr) {
foundEnumVar.put("enumDeprecatedMessage", deprecatedMessageStr);
foundEnumVar.put("enumDeprecatedMessageNormalized", normalizeStr(deprecatedMessageStr));
}
}
}
}

processEnumExt(enumVars, vendorExtensions, "name", List.of("x-enum-varnames"));

var baseType = (String) vendorExtensions.get("baseType");
for (var enumVar : enumVars) {
var value = (String) enumVar.get("value");
Expand Down Expand Up @@ -2656,8 +2669,14 @@ private void processProperty(CodegenProperty property, boolean isServer, Codegen
if (property.description != null) {
property.vendorExtensions.put("descriptionNormalized", normalizeStr(property.description));
}
if (property.vendorExtensions.containsKey("x-deprecated-message")) {
property.vendorExtensions.put("x-deprecated-message-normalized", normalizeStr((String) property.vendorExtensions.get("x-deprecated-message")));
var deprecatedMessage = property.vendorExtensions.get("x-deprecated-message");
var xDeprecated = property.vendorExtensions.get("x-deprecated");
if (deprecatedMessage == null && xDeprecated instanceof String xDeprecatedStr) {
deprecatedMessage = xDeprecatedStr;
property.vendorExtensions.put("x-deprecated-message", xDeprecatedStr);
}
if (deprecatedMessage != null) {
property.vendorExtensions.put("x-deprecated-message-normalized", normalizeStr(deprecatedMessage.toString()));
}
normalizeStrValue("x-pattern-message", property.vendorExtensions);
normalizeStrValue("x-size-message", property.vendorExtensions);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -783,4 +783,73 @@ public static boolean addUserParameter(CodegenOperation op, UserParameterMode us

return true;
}

public static void processEnumExt(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String key, List<String> extensionKeys) {
processEnumExt(enumVars, vendorExtensions, key, extensionKeys, false);
}

public static void processEnumExt(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String key, List<String> extensionKeys, boolean withNormalization) {
Object value = null;
for (var extKey : extensionKeys) {
value = vendorExtensions.get(extKey);
if (value != null) {
break;
}
}
if (value instanceof List<?> valuesList) {
int size = Math.min(enumVars.size(), valuesList.size());
for (int i = 0; i < size; i++) {
enumVars.get(i).put(key, valuesList.get(i));
if (withNormalization) {
enumVars.get(i).put(key + "Normalized", normalizeStr(valuesList.get(i).toString()));
}
}
} else if (value instanceof Map<?, ?> valuesMap) {
for (var entry : valuesMap.entrySet()) {
Map<String, Object> foundEnumVar = findEnumVar(entry.getKey().toString(), enumVars);
if (foundEnumVar == null) {
continue;
}
foundEnumVar.put(key, entry.getValue().toString());
if (withNormalization) {
foundEnumVar.put(key + "Normalized", normalizeStr(entry.getValue().toString()));
}
}
}
}

public static Map<String, Object> findEnumVar(String enumConstName, List<Map<String, Object>> enumVars) {
for (var enumVar : enumVars) {
var isString = (boolean) enumVar.get("isString");
var value = (String) enumVar.get("value");
if (!isString) {
if (value.startsWith("(short)")) {
value = value.replace("(short) ", "");
} else if (value.startsWith("(byte)")) {
value = value.replace("(byte) ", "");
}
var argPos = value.indexOf('(');
// case for BigDecimal
if (argPos >= 0) {
value = value.substring(argPos + 1, value.indexOf(')'));
}
var upperValue = value.toUpperCase(Locale.ENGLISH);
if (upperValue.endsWith("F")
|| upperValue.endsWith("L")
|| upperValue.endsWith("D")) {
value = value.substring(0, value.length() - 1);
}
if (!value.contains("'")) {
value = value.replace("'", "");
}
if (!value.contains("\"")) {
value = "\"" + value + "\"";
}
}
if (value.equals("\"" + enumConstName + '"')) {
return enumVar;
}
}
return null;
}
}
Loading
Loading