Skip to content
Closed
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 @@ -21,9 +21,19 @@ private static void setVendorExtension(IJsonSchemaValidationProperties property,
model.vendorExtensions.put(key, value);
} else if (property instanceof CodegenProperty prop) {
prop.vendorExtensions.put(key, value);
} else if (property instanceof CodegenParameter param) {
param.vendorExtensions.put(key, value);
} else if (property instanceof CodegenOperation ope) {
ope.vendorExtensions.put(key, value);
} else {
throw new IllegalArgumentException("Unsupported type for vendor extension: " + property.getClass());
}
}

private static boolean getBooleanValue(Map<String, Object> vendorExtensions, String key) {
return (boolean) vendorExtensions.getOrDefault(key, false);
}

/**
* Add the property x-propagated-generic to a model or property, meaning it should be replaced
* with T directly
Expand All @@ -41,19 +51,21 @@ private static void setHasChildGeneric(IJsonSchemaValidationProperties property)
}

/**
* @return true if the vendor extensions of the property contains either x-propagated-generic or
* x-has-child-generic
* @return true if the vendor extensions of the property contains either x-propagated-generic,
* x-has-child-generic, or x-is-generic
*/
private static boolean hasGeneric(IJsonSchemaValidationProperties property) {
if (property instanceof CodegenModel) {
if (property instanceof CodegenModel model) {
return (
(boolean) ((CodegenModel) property).vendorExtensions.getOrDefault("x-propagated-generic", false) ||
(boolean) ((CodegenModel) property).vendorExtensions.getOrDefault("x-has-child-generic", false)
getBooleanValue(model.vendorExtensions, "x-propagated-generic") ||
getBooleanValue(model.vendorExtensions, "x-has-child-generic") ||
getBooleanValue(model.vendorExtensions, "x-is-generic")
);
} else if (property instanceof CodegenProperty) {
} else if (property instanceof CodegenProperty prop) {
return (
(boolean) ((CodegenProperty) property).vendorExtensions.getOrDefault("x-propagated-generic", false) ||
(boolean) ((CodegenProperty) property).vendorExtensions.getOrDefault("x-has-child-generic", false)
getBooleanValue(prop.vendorExtensions, "x-propagated-generic") ||
getBooleanValue(prop.vendorExtensions, "x-has-child-generic") ||
getBooleanValue(prop.vendorExtensions, "x-is-generic")
);
}
return false;
Expand Down Expand Up @@ -189,21 +201,53 @@ public static void propagateGenericsToModels(Map<String, ModelsMap> modelsMap, b
}
}

/** Mark operations with a generic return type with x-is-generic */
private static void setOperationGeneric(CodegenOperation ope, boolean returnIsGeneric) {
ope.vendorExtensions.put("x-is-generic", true);
ope.vendorExtensions.put("x-return-is-generic", returnIsGeneric);
// we use {{#optionalParams.0}} to check for optionalParams, so we loose the
// vendorExtensions at the operation level in the java generator
if (!ope.optionalParams.isEmpty()) {
ope.optionalParams.get(0).vendorExtensions.put("x-is-generic", true);
ope.optionalParams.get(0).vendorExtensions.put("x-return-is-generic", returnIsGeneric);
}
}

/** Mark operations with a generic parameters or return type with x-is-generic */
public static void propagateGenericsToOperations(OperationsMap operations, List<ModelMap> allModels) {
Map<String, CodegenModel> models = convertToMap(allModels);
for (CodegenOperation ope : operations.getOperations().getOperation()) {
// apply the value to all sets of params
for (CodegenParameter param : ope.requiredParams) {
CodegenModel paramType = models.get(param.dataType);
if (hasGeneric(paramType)) {
setHasChildGeneric(param);
break;
}
}

for (CodegenParameter param : ope.optionalParams) {
CodegenModel paramType = models.get(param.dataType);
if (hasGeneric(paramType)) {
setHasChildGeneric(param);
break;
}
}

for (CodegenParameter param : ope.allParams) {
CodegenModel paramType = models.get(param.dataType);
if (hasGeneric(paramType)) {
setOperationGeneric(ope, false);
break;
}
}

// also check for the return type
if (ope.returnType == null) {
continue;
}
CodegenModel returnType = models.get(ope.returnType);
if (returnType != null && hasGeneric(returnType)) {
ope.vendorExtensions.put("x-is-generic", true);
// we use {{#optionalParams.0}} to check for optionalParams, so we loose the
// vendorExtensions at the operation level
if (!ope.optionalParams.isEmpty()) {
ope.optionalParams.get(0).vendorExtensions.put("x-is-generic", true);
}
if (hasGeneric(returnType)) {
setOperationGeneric(ope, true);
}
}
}
Expand Down
1 change: 1 addition & 0 deletions specs/search/paths/objects/batch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ post:
$ref: 'common/schemas.yml#/action'
body:
type: object
x-is-generic: true
description: Operation arguments (varies with specified `action`).
example:
name: Betty Jane McCamey
Expand Down
Loading