[powershell-experimental] Protects against stackoverflow when OAS spec has circular references (#5646)

* protects against stackoverflow when OAS spec has circular references

* protects against stackoverflow when OAS spec has circular references
This commit is contained in:
Vikrant Balyan 2020-03-23 13:24:32 +05:30 committed by GitHub
parent 57eb1a0fcf
commit 5549c1dd2d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -594,6 +594,7 @@ public class PowerShellExperimentalClientCodegen extends DefaultCodegen implemen
public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> objs, List<Object> allModels) { public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> objs, List<Object> allModels) {
Map<String, Object> operations = (Map<String, Object>) objs.get("operations"); Map<String, Object> operations = (Map<String, Object>) objs.get("operations");
HashMap<String, CodegenModel> modelMaps = new HashMap<String, CodegenModel>(); HashMap<String, CodegenModel> modelMaps = new HashMap<String, CodegenModel>();
HashMap<String, Boolean> processedModelMaps = new HashMap<String, Boolean>();
for (Object o : allModels) { for (Object o : allModels) {
HashMap<String, Object> h = (HashMap<String, Object>) o; HashMap<String, Object> h = (HashMap<String, Object>) o;
@ -606,7 +607,7 @@ public class PowerShellExperimentalClientCodegen extends DefaultCodegen implemen
int index = 0; int index = 0;
for (CodegenParameter p : op.allParams) { for (CodegenParameter p : op.allParams) {
p.vendorExtensions.put("x-powershell-data-type", getPSDataType(p)); p.vendorExtensions.put("x-powershell-data-type", getPSDataType(p));
p.vendorExtensions.put("x-powershell-example", constructExampleCode(p, modelMaps)); p.vendorExtensions.put("x-powershell-example", constructExampleCode(p, modelMaps, processedModelMaps));
p.vendorExtensions.put("x-index", index); p.vendorExtensions.put("x-index", index);
index++; index++;
} }
@ -620,9 +621,10 @@ public class PowerShellExperimentalClientCodegen extends DefaultCodegen implemen
} }
} }
processedModelMaps.clear();
for (CodegenOperation operation : operationList) { for (CodegenOperation operation : operationList) {
for (CodegenParameter cp : operation.allParams) { for (CodegenParameter cp : operation.allParams) {
cp.vendorExtensions.put("x-powershell-example", constructExampleCode(cp, modelMaps)); cp.vendorExtensions.put("x-powershell-example", constructExampleCode(cp, modelMaps, processedModelMaps));
} }
} }
@ -670,9 +672,9 @@ public class PowerShellExperimentalClientCodegen extends DefaultCodegen implemen
return name; return name;
} }
private String constructExampleCode(CodegenParameter codegenParameter, HashMap<String, CodegenModel> modelMaps) { private String constructExampleCode(CodegenParameter codegenParameter, HashMap<String, CodegenModel> modelMaps, HashMap<String, Boolean> processedModelMap) {
if (codegenParameter.isListContainer) { // array if (codegenParameter.isListContainer) { // array
return "@(" + constructExampleCode(codegenParameter.items, modelMaps) + ")"; return "@(" + constructExampleCode(codegenParameter.items, modelMaps, processedModelMap) + ")";
} else if (codegenParameter.isMapContainer) { // TODO: map, file type } else if (codegenParameter.isMapContainer) { // TODO: map, file type
return "\"TODO\""; return "\"TODO\"";
} else if (languageSpecificPrimitives.contains(codegenParameter.dataType) || } else if (languageSpecificPrimitives.contains(codegenParameter.dataType) ||
@ -704,7 +706,7 @@ public class PowerShellExperimentalClientCodegen extends DefaultCodegen implemen
} else { // model } else { // model
// look up the model // look up the model
if (modelMaps.containsKey(codegenParameter.dataType)) { if (modelMaps.containsKey(codegenParameter.dataType)) {
return constructExampleCode(modelMaps.get(codegenParameter.dataType), modelMaps); return constructExampleCode(modelMaps.get(codegenParameter.dataType), modelMaps, processedModelMap);
} else { } else {
//LOGGER.error("Error in constructing examples. Failed to look up the model " + codegenParameter.dataType); //LOGGER.error("Error in constructing examples. Failed to look up the model " + codegenParameter.dataType);
return "TODO"; return "TODO";
@ -712,9 +714,9 @@ public class PowerShellExperimentalClientCodegen extends DefaultCodegen implemen
} }
} }
private String constructExampleCode(CodegenProperty codegenProperty, HashMap<String, CodegenModel> modelMaps) { private String constructExampleCode(CodegenProperty codegenProperty, HashMap<String, CodegenModel> modelMaps, HashMap<String, Boolean> processedModelMap) {
if (codegenProperty.isListContainer) { // array if (codegenProperty.isListContainer) { // array
return "@(" + constructExampleCode(codegenProperty.items, modelMaps) + ")"; return "@(" + constructExampleCode(codegenProperty.items, modelMaps, processedModelMap) + ")";
} else if (codegenProperty.isMapContainer) { // map } else if (codegenProperty.isMapContainer) { // map
return "\"TODO\""; return "\"TODO\"";
} else if (languageSpecificPrimitives.contains(codegenProperty.dataType) || // primitive type } else if (languageSpecificPrimitives.contains(codegenProperty.dataType) || // primitive type
@ -746,7 +748,7 @@ public class PowerShellExperimentalClientCodegen extends DefaultCodegen implemen
} else { } else {
// look up the model // look up the model
if (modelMaps.containsKey(codegenProperty.dataType)) { if (modelMaps.containsKey(codegenProperty.dataType)) {
return constructExampleCode(modelMaps.get(codegenProperty.dataType), modelMaps); return constructExampleCode(modelMaps.get(codegenProperty.dataType), modelMaps, processedModelMap);
} else { } else {
//LOGGER.error("Error in constructing examples. Failed to look up the model " + codegenProperty.dataType); //LOGGER.error("Error in constructing examples. Failed to look up the model " + codegenProperty.dataType);
return "\"TODO\""; return "\"TODO\"";
@ -754,12 +756,20 @@ public class PowerShellExperimentalClientCodegen extends DefaultCodegen implemen
} }
} }
private String constructExampleCode(CodegenModel codegenModel, HashMap<String, CodegenModel> modelMaps) { private String constructExampleCode(CodegenModel codegenModel, HashMap<String, CodegenModel> modelMaps, HashMap<String, Boolean> processedModelMap) {
String example; String example;
// break infinite recursion. Return, in case a model is already processed in the current context.
String model = codegenModel.name;
if (processedModelMap.containsKey(model)) {
return "";
}
processedModelMap.put(model, true);
example = "(New-" + codegenModel.name; example = "(New-" + codegenModel.name;
List<String> propertyExamples = new ArrayList<>(); List<String> propertyExamples = new ArrayList<>();
for (CodegenProperty codegenProperty : codegenModel.vars) { for (CodegenProperty codegenProperty : codegenModel.vars) {
propertyExamples.add(" -" + codegenProperty.name + " " + constructExampleCode(codegenProperty, modelMaps)); propertyExamples.add(" -" + codegenProperty.name + " " + constructExampleCode(codegenProperty, modelMaps, processedModelMap));
} }
example += StringUtils.join(propertyExamples, " "); example += StringUtils.join(propertyExamples, " ");
example += ")"; example += ")";