forked from loafle/openapi-generator-original
[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:
parent
57eb1a0fcf
commit
5549c1dd2d
@ -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 += ")";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user