add constant support

This commit is contained in:
William Cheng
2023-09-15 15:58:05 +08:00
parent 4b87606665
commit e9c767d098
4 changed files with 69 additions and 16 deletions

View File

@@ -112,6 +112,9 @@ public class CodegenParameter implements IJsonSchemaValidationProperties {
* See http://json-schema.org/latest/json-schema-validation.html#anchor14
*/
public Number multipleOf;
public String constant; // for const
private Integer maxProperties;
private Integer minProperties;
public boolean isNull;
@@ -164,6 +167,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties {
output.uniqueItems = this.uniqueItems;
output.setUniqueItemsBoolean(this.uniqueItemsBoolean);
output.multipleOf = this.multipleOf;
output.constant = this.constant;
output.jsonSchema = this.jsonSchema;
output.defaultValue = this.defaultValue;
output.enumDefaultValue = this.enumDefaultValue;
@@ -260,7 +264,20 @@ public class CodegenParameter implements IJsonSchemaValidationProperties {
@Override
public int hashCode() {
return Objects.hash(isFormParam, isQueryParam, isPathParam, isHeaderParam, isCookieParam, isBodyParam, isContainer, isCollectionFormatMulti, isPrimitiveType, isModel, isExplode, baseName, paramName, dataType, datatypeWithEnum, dataFormat, collectionFormat, description, unescapedDescription, baseType, containerType, containerTypeMapped, defaultValue, enumDefaultValue, enumName, style, isDeepObject, isMatrix, isAllowEmptyValue, example, examples, jsonSchema, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isPassword, isFreeFormObject, isAnyType, isArray, isMap, isFile, isEnum, isEnumRef, _enum, allowableValues, items, mostInnerItems, additionalProperties, vars, requiredVars, vendorExtensions, hasValidation, getMaxProperties(), getMinProperties(), isNullable, isDeprecated, required, getMaximum(), getExclusiveMaximum(), getMinimum(), getExclusiveMinimum(), getMaxLength(), getMinLength(), getPattern(), getMaxItems(), getMinItems(), getUniqueItems(), contentType, multipleOf, isNull, isVoid, additionalPropertiesIsAnyType, hasVars, hasRequired, isShort, isUnboundedInteger, hasDiscriminatorWithNonEmptyMapping, composedSchemas, hasMultipleTypes, schema, content, requiredVarsMap, ref, uniqueItemsBoolean, schemaIsFromAdditionalProperties);
return Objects.hash(isFormParam, isQueryParam, isPathParam, isHeaderParam, isCookieParam, isBodyParam,
isContainer, isCollectionFormatMulti, isPrimitiveType, isModel, isExplode, baseName, paramName,
dataType, datatypeWithEnum, dataFormat, collectionFormat, description, unescapedDescription, baseType,
containerType, containerTypeMapped, defaultValue, enumDefaultValue, enumName, style, isDeepObject,
isMatrix, isAllowEmptyValue, example, examples, jsonSchema, isString, isNumeric, isInteger, isLong,
isNumber, isFloat, isDouble, isDecimal, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid,
isUri, isEmail, isPassword, isFreeFormObject, isAnyType, isArray, isMap, isFile, isEnum, isEnumRef,
_enum, allowableValues, items, mostInnerItems, additionalProperties, vars, requiredVars,
vendorExtensions, hasValidation, getMaxProperties(), getMinProperties(), isNullable, isDeprecated,
required, getMaximum(), getExclusiveMaximum(), getMinimum(), getExclusiveMinimum(), getMaxLength(),
getMinLength(), getPattern(), getMaxItems(), getMinItems(), getUniqueItems(), contentType, multipleOf,
isNull, isVoid, additionalPropertiesIsAnyType, hasVars, hasRequired, isShort, isUnboundedInteger,
hasDiscriminatorWithNonEmptyMapping, composedSchemas, hasMultipleTypes, schema, content,
requiredVarsMap, ref, uniqueItemsBoolean, schemaIsFromAdditionalProperties, constant);
}
@Override
@@ -365,6 +382,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties {
Objects.equals(getMaxItems(), that.getMaxItems()) &&
Objects.equals(getMinItems(), that.getMinItems()) &&
Objects.equals(contentType, that.contentType) &&
Objects.equals(constant, that.constant) &&
Objects.equals(multipleOf, that.multipleOf);
}
@@ -465,6 +483,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties {
sb.append(", uniqueItemsBoolean=").append(uniqueItemsBoolean);
sb.append(", contentType=").append(contentType);
sb.append(", multipleOf=").append(multipleOf);
sb.append(", constant=").append(constant);
sb.append(", isNull=").append(isNull);
sb.append(", isVoid=").append(isVoid);
sb.append(", getAdditionalPropertiesIsAnyType=").append(additionalPropertiesIsAnyType);

View File

@@ -211,6 +211,9 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti
private LinkedHashMap<String, List<String>> dependentRequired;
private CodegenProperty contains;
// JSON Schema keywords
private String constant; // for `const`
@Override
public CodegenProperty getContains() {
return contains;
@@ -1036,6 +1039,14 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti
return isEnum || isEnumRef;
}
public void setConstant(String constant) {
this.constant = constant;
}
public String getConstant() {
return constant;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("CodegenProperty{");
@@ -1150,6 +1161,7 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti
sb.append(", format=").append(format);
sb.append(", dependentRequired=").append(dependentRequired);
sb.append(", contains=").append(contains);
sb.append(", constant=").append(constant);
sb.append('}');
return sb.toString();
}
@@ -1266,7 +1278,8 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti
Objects.equals(xmlPrefix, that.xmlPrefix) &&
Objects.equals(xmlName, that.xmlName) &&
Objects.equals(xmlNamespace, that.xmlNamespace) &&
Objects.equals(multipleOf, that.multipleOf);
Objects.equals(multipleOf, that.multipleOf) &&
Objects.equals(constant, that.getConstant());
}
@Override
@@ -1288,6 +1301,6 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti
xmlNamespace, isXmlWrapped, isNull, isVoid, additionalPropertiesIsAnyType, hasVars, hasRequired,
hasDiscriminatorWithNonEmptyMapping, composedSchemas, hasMultipleTypes, requiredVarsMap,
ref, uniqueItemsBoolean, schemaIsFromAdditionalProperties, isBooleanSchemaTrue, isBooleanSchemaFalse,
format, dependentRequired, contains);
format, dependentRequired, contains, constant);
}
}

View File

@@ -4593,6 +4593,7 @@ public class DefaultCodegen implements CodegenConfig {
List<CodegenParameter> optionalParams = new ArrayList<>();
List<CodegenParameter> requiredAndNotNullableParams = new ArrayList<>();
List<CodegenParameter> notNullableParams = new ArrayList<>();
List<CodegenParameter> constantParams = new ArrayList<>();
CodegenParameter bodyParam = null;
RequestBody requestBody = operation.getRequestBody();
@@ -4656,20 +4657,22 @@ public class DefaultCodegen implements CodegenConfig {
}
}
allParams.add(p);
if (param instanceof QueryParameter || "query".equalsIgnoreCase(param.getIn())) {
queryParams.add(p.copy());
} else if (param instanceof PathParameter || "path".equalsIgnoreCase(param.getIn())) {
pathParams.add(p.copy());
} else if (param instanceof HeaderParameter || "header".equalsIgnoreCase(param.getIn())) {
headerParams.add(p.copy());
} else if (param instanceof CookieParameter || "cookie".equalsIgnoreCase(param.getIn())) {
cookieParams.add(p.copy());
} else {
LOGGER.warn("Unknown parameter type {} for {}", p.baseType, p.baseName);
if (p.constant != null) { // for constant
constantParams.add(p.copy());
} else { // a typical parameter
allParams.add(p);
if (param instanceof QueryParameter || "query".equalsIgnoreCase(param.getIn())) {
queryParams.add(p.copy());
} else if (param instanceof PathParameter || "path".equalsIgnoreCase(param.getIn())) {
pathParams.add(p.copy());
} else if (param instanceof HeaderParameter || "header".equalsIgnoreCase(param.getIn())) {
headerParams.add(p.copy());
} else if (param instanceof CookieParameter || "cookie".equalsIgnoreCase(param.getIn())) {
cookieParams.add(p.copy());
} else {
LOGGER.warn("Unknown parameter type {} for {}", p.baseType, p.baseName);
}
}
}
}
@@ -5355,6 +5358,16 @@ public class DefaultCodegen implements CodegenConfig {
// set default value
codegenParameter.defaultValue = toDefaultParameterValue(codegenProperty, parameterSchema);
// set constant
if (codegenParameter.getIsEnumOrRef()) { // enum with only 1 item
Schema enumSchema = ModelUtils.getReferencedSchema(openAPI, unaliasSchema(parameterSchema));
if (enumSchema.getEnum() != null && enumSchema.getEnum().size() == 1) { // only 1 element
codegenParameter.constant = toDefaultParameterValue(codegenProperty, enumSchema);
}
} else if (parameterSchema.getConst() != null) { // JSON Sschema keyword `const`
codegenParameter.constant = String.valueOf(parameterSchema.getConst());
}
finishUpdatingParameter(codegenParameter, parameter);
return codegenParameter;
}

View File

@@ -85,6 +85,14 @@ paths:
description: Multiple status values can be provided with comma separated strings
operationId: findPetsByStatus
parameters:
- description: to test const
explode: true
in: query
name: constant_test
required: true
schema:
type: string
style: form
- deprecated: true
description: Status values that need to be considered for filter
explode: false