Skip to content

Adds additionalProperties to core schema classes #7761

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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 @@ -150,6 +150,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties {
private String pattern;
private Number multipleOf;
private CodegenProperty items;
private CodegenProperty additionalProperties;
private boolean isModel;

public String getAdditionalPropertiesType() {
Expand Down Expand Up @@ -602,6 +603,14 @@ public void setIsArray(boolean isArray) {
this.isArray = isArray;
}

@Override
public CodegenProperty getAdditionalProperties() { return additionalProperties; }

@Override
public void setAdditionalProperties(CodegenProperty additionalProperties) {
this.additionalProperties = additionalProperties;
}

// indicates if the model component has validation on the root level schema
// this will be true when minItems or minProperties is set
public boolean hasValidation() {
Expand Down Expand Up @@ -769,6 +778,7 @@ public boolean equals(Object o) {
Objects.equals(getMaximum(), that.getMaximum()) &&
Objects.equals(getPattern(), that.getPattern()) &&
Objects.equals(getItems(), that.getItems()) &&
Objects.equals(getAdditionalProperties(), that.getAdditionalProperties()) &&
Objects.equals(getIsModel(), that.getIsModel()) &&
Objects.equals(getMultipleOf(), that.getMultipleOf());
}
Expand All @@ -787,7 +797,7 @@ public int hashCode() {
hasChildren, isMap, isDeprecated, hasOnlyReadOnly, getExternalDocumentation(), getVendorExtensions(),
getAdditionalPropertiesType(), getMaxProperties(), getMinProperties(), getUniqueItems(), getMaxItems(),
getMinItems(), getMaxLength(), getMinLength(), getExclusiveMinimum(), getExclusiveMaximum(), getMinimum(),
getMaximum(), getPattern(), getMultipleOf(), getItems(), getIsModel());
getMaximum(), getPattern(), getMultipleOf(), getItems(), getAdditionalProperties(), getIsModel());
}

@Override
Expand Down Expand Up @@ -869,6 +879,7 @@ public String toString() {
sb.append(", pattern='").append(pattern).append('\'');
sb.append(", multipleOf='").append(multipleOf).append('\'');
sb.append(", items='").append(items).append('\'');
sb.append(", additionalProperties='").append(additionalProperties).append('\'');
sb.append(", isModel='").append(isModel).append('\'');
sb.append('}');
return sb.toString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties {
public List<String> _enum;
public Map<String, Object> allowableValues;
public CodegenProperty items;
public CodegenProperty additionalProperties;
public CodegenProperty mostInnerItems;
public Map<String, Object> vendorExtensions = new HashMap<String, Object>();
public boolean hasValidation;
Expand Down Expand Up @@ -145,6 +146,7 @@ public CodegenParameter copy() {
output.maximum = this.maximum;
output.minimum = this.minimum;
output.pattern = this.pattern;
output.additionalProperties = this.additionalProperties;

if (this._enum != null) {
output._enum = new ArrayList<String>(this._enum);
Expand Down Expand Up @@ -191,7 +193,7 @@ public CodegenParameter copy() {

@Override
public int hashCode() {
return Objects.hash(isFormParam, isQueryParam, isPathParam, isHeaderParam, isCookieParam, isBodyParam, hasMore, isContainer, secondaryParam, isCollectionFormatMulti, isPrimitiveType, isModel, isExplode, baseName, paramName, dataType, datatypeWithEnum, dataFormat, collectionFormat, description, unescapedDescription, baseType, defaultValue, enumName, style, example, jsonSchema, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isFreeFormObject, isAnyType, isArray, isMap, isFile, isEnum, _enum, allowableValues, items, mostInnerItems, vendorExtensions, hasValidation, getMaxProperties(), getMinProperties(), isNullable, required, getMaximum(), getExclusiveMaximum(), getMinimum(), getExclusiveMinimum(), getMaxLength(), getMinLength(), getPattern(), getMaxItems(), getMinItems(), getUniqueItems(), contentType, multipleOf);
return Objects.hash(isFormParam, isQueryParam, isPathParam, isHeaderParam, isCookieParam, isBodyParam, hasMore, isContainer, secondaryParam, isCollectionFormatMulti, isPrimitiveType, isModel, isExplode, baseName, paramName, dataType, datatypeWithEnum, dataFormat, collectionFormat, description, unescapedDescription, baseType, defaultValue, enumName, style, example, jsonSchema, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isFreeFormObject, isAnyType, isArray, isMap, isFile, isEnum, _enum, allowableValues, items, mostInnerItems, additionalProperties, vendorExtensions, hasValidation, getMaxProperties(), getMinProperties(), isNullable, required, getMaximum(), getExclusiveMaximum(), getMinimum(), getExclusiveMinimum(), getMaxLength(), getMinLength(), getPattern(), getMaxItems(), getMinItems(), getUniqueItems(), contentType, multipleOf);
}

@Override
Expand Down Expand Up @@ -256,6 +258,7 @@ public boolean equals(Object o) {
Objects.equals(_enum, that._enum) &&
Objects.equals(allowableValues, that.allowableValues) &&
Objects.equals(items, that.items) &&
Objects.equals(additionalProperties, that.additionalProperties) &&
Objects.equals(mostInnerItems, that.mostInnerItems) &&
Objects.equals(vendorExtensions, that.vendorExtensions) &&
Objects.equals(getMaxProperties(), that.getMaxProperties()) &&
Expand Down Expand Up @@ -326,6 +329,7 @@ public String toString() {
sb.append(", allowableValues=").append(allowableValues);
sb.append(", items=").append(items);
sb.append(", mostInnerItems=").append(mostInnerItems);
sb.append(", additionalProperties=").append(additionalProperties);
sb.append(", vendorExtensions=").append(vendorExtensions);
sb.append(", hasValidation=").append(hasValidation);
sb.append(", maxProperties=").append(maxProperties);
Expand Down Expand Up @@ -527,5 +531,13 @@ public void setIsMap(boolean isMap) {
public void setIsArray(boolean isArray) {
this.isArray = isArray;
}

@Override
public CodegenProperty getAdditionalProperties() { return additionalProperties; }

@Override
public void setAdditionalProperties(CodegenProperty additionalProperties) {
this.additionalProperties = additionalProperties;
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti
// If 'additionalProperties' is set to a type or refers to a type, 'items' provides the type information for
// the undeclared properties.
public CodegenProperty items;
public CodegenProperty additionalProperties;
public CodegenProperty mostInnerItems;
public Map<String, Object> vendorExtensions = new HashMap<String, Object>();
public boolean hasValidation; // true if pattern, maximum, etc are set (only used in the mustache template)
Expand Down Expand Up @@ -461,6 +462,14 @@ public void setItems(CodegenProperty items) {
this.items = items;
}

@Override
public CodegenProperty getAdditionalProperties() { return additionalProperties; }

@Override
public void setAdditionalProperties(CodegenProperty additionalProperties) {
this.additionalProperties = additionalProperties;
}

@Override
public boolean getIsModel() { return isModel; }

Expand Down Expand Up @@ -594,6 +603,9 @@ public CodegenProperty clone() {
if (this.items != null) {
cp.items = this.items;
}
if (this.additionalProperties != null) {
cp.additionalProperties = this.additionalProperties;
}
if (this.mostInnerItems != null) {
cp.mostInnerItems = this.mostInnerItems;
}
Expand Down Expand Up @@ -712,6 +724,7 @@ public String toString() {
sb.append(", _enum=").append(_enum);
sb.append(", allowableValues=").append(allowableValues);
sb.append(", items=").append(items);
sb.append(", additionalProperties=").append(additionalProperties);
sb.append(", mostInnerItems=").append(mostInnerItems);
sb.append(", vendorExtensions=").append(vendorExtensions);
sb.append(", hasValidation=").append(hasValidation);
Expand Down Expand Up @@ -808,6 +821,7 @@ public boolean equals(Object o) {
Objects.equals(_enum, that._enum) &&
Objects.equals(allowableValues, that.allowableValues) &&
Objects.equals(items, that.items) &&
Objects.equals(additionalProperties, that.additionalProperties) &&
Objects.equals(mostInnerItems, that.mostInnerItems) &&
Objects.equals(vendorExtensions, that.vendorExtensions) &&
Objects.equals(discriminatorValue, that.discriminatorValue) &&
Expand All @@ -834,7 +848,8 @@ public int hashCode() {
isInteger, isLong, isNumber, isFloat, isDouble, isByteArray, isBinary, isFile,
isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isFreeFormObject,
isArray, isMap, isEnum, isReadOnly, isWriteOnly, isNullable,
isSelfReference, isCircularReference, isDiscriminator, _enum, allowableValues, items, mostInnerItems,
isSelfReference, isCircularReference, isDiscriminator, _enum, allowableValues,
items, mostInnerItems, additionalProperties,
vendorExtensions, hasValidation, isInherited, discriminatorValue, nameInCamelCase,
nameInSnakeCase, enumName, maxItems, minItems, isXmlAttribute, xmlPrefix, xmlName,
xmlNamespace, isXmlWrapped);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,14 @@ public class CodegenResponse implements IJsonSchemaValidationProperties {
public String pattern;
public Number multipleOf;
public CodegenProperty items;
public CodegenProperty additionalProperties;

@Override
public int hashCode() {
return Objects.hash(headers, code, message, hasMore, examples, dataType, baseType, containerType, hasHeaders,
isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isByteArray, isBoolean, isDate,
isDateTime, isUuid, isEmail, isModel, isFreeFormObject, isAnyType, isDefault, simpleType, primitiveType,
isMap, isArray, isBinary, isFile, schema, jsonSchema, vendorExtensions, items,
isMap, isArray, isBinary, isFile, schema, jsonSchema, vendorExtensions, items, additionalProperties,
getMaxProperties(), getMinProperties(), uniqueItems, getMaxItems(), getMinItems(), getMaxLength(),
getMinLength(), exclusiveMinimum, exclusiveMaximum, getMinimum(), getMaximum(), getPattern());
}
Expand Down Expand Up @@ -116,6 +117,7 @@ public boolean equals(Object o) {
isBinary == that.isBinary &&
isFile == that.isFile &&
items == that.items &&
additionalProperties == that.additionalProperties &&
Objects.equals(headers, that.headers) &&
Objects.equals(code, that.code) &&
Objects.equals(message, that.message) &&
Expand Down Expand Up @@ -322,6 +324,14 @@ public void setIsMap(boolean isMap) {
this.isMap = isMap;
}

@Override
public CodegenProperty getAdditionalProperties() { return additionalProperties; }

@Override
public void setAdditionalProperties(CodegenProperty additionalProperties) {
this.additionalProperties = additionalProperties;
}

@Override
public String toString() {
final StringBuilder sb = new StringBuilder("CodegenResponse{");
Expand Down Expand Up @@ -374,6 +384,7 @@ public String toString() {
sb.append(", pattern='").append(pattern).append('\'');
sb.append(", multipleOf='").append(multipleOf).append('\'');
sb.append(", items='").append(items).append('\'');
sb.append(", additionalProperties='").append(additionalProperties).append('\'');
sb.append('}');
return sb.toString();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2598,15 +2598,21 @@ public int compare(CodegenProperty one, CodegenProperty another) {
m.isAdditionalPropertiesTrue = false;
} else {
m.isAdditionalPropertiesTrue = true;
CodegenProperty cp = fromProperty("", new Schema());
m.setAdditionalProperties(cp);
}
} else if (schema.getAdditionalProperties() instanceof Boolean) {
if (Boolean.TRUE.equals(schema.getAdditionalProperties())) {
m.isAdditionalPropertiesTrue = true;
CodegenProperty cp = fromProperty("", new Schema());
m.setAdditionalProperties(cp);
} else {
m.isAdditionalPropertiesTrue = false;
}
} else {
m.isAdditionalPropertiesTrue = false;
CodegenProperty cp = fromProperty("", (Schema) schema.getAdditionalProperties());
m.setAdditionalProperties(cp);
}

// post process model properties
Expand Down Expand Up @@ -3366,6 +3372,24 @@ public CodegenProperty fromProperty(String name, Schema p) {
property.isModel = (ModelUtils.isComposedSchema(refOrCurrent) || ModelUtils.isObjectSchema(refOrCurrent)) && ModelUtils.isModel(refOrCurrent);
}

// process 'additionalProperties'
if ("object".equals(p.getType())) {
if (p.getAdditionalProperties() == null) {
if (!disallowAdditionalPropertiesIfNotPresent) {
CodegenProperty cp = fromProperty("", new Schema());
property.setAdditionalProperties(cp);
}
} else if (p.getAdditionalProperties() instanceof Boolean) {
if (Boolean.TRUE.equals(p.getAdditionalProperties())) {
CodegenProperty cp = fromProperty("", new Schema());
property.setAdditionalProperties(cp);
}
} else {
CodegenProperty cp = fromProperty("", (Schema) p.getAdditionalProperties());
property.setAdditionalProperties(cp);
}
}

LOGGER.debug("debugging from property return: " + property);
schemaCodegenPropertyCache.put(ns, property);
return property;
Expand Down Expand Up @@ -4090,6 +4114,24 @@ public CodegenResponse fromResponse(String responseCode, ApiResponse response) {
}

r.primitiveType = (r.baseType == null || languageSpecificPrimitives().contains(r.baseType));

// process 'additionalProperties'
if ("object".equals(responseSchema.getType())) {
if (responseSchema.getAdditionalProperties() == null) {
if (!disallowAdditionalPropertiesIfNotPresent) {
CodegenProperty addPropProp = fromProperty("", new Schema());
r.setAdditionalProperties(addPropProp);
}
} else if (responseSchema.getAdditionalProperties() instanceof Boolean) {
if (Boolean.TRUE.equals(responseSchema.getAdditionalProperties())) {
CodegenProperty addPropProp = fromProperty("", new Schema());
r.setAdditionalProperties(addPropProp);
}
} else {
CodegenProperty addPropProp = fromProperty("", (Schema) responseSchema.getAdditionalProperties());
r.setAdditionalProperties(addPropProp);
}
}
}

if (r.baseType == null) {
Expand Down Expand Up @@ -4379,6 +4421,24 @@ public CodegenParameter fromParameter(Parameter parameter, Set<String> imports)
codegenParameter.hasValidation = true;
}

// process 'additionalProperties'
if ("object".equals(parameterSchema.getType())) {
if (parameterSchema.getAdditionalProperties() == null) {
if (!disallowAdditionalPropertiesIfNotPresent) {
CodegenProperty cp = fromProperty("", new Schema());
codegenParameter.setAdditionalProperties(cp);
}
} else if (parameterSchema.getAdditionalProperties() instanceof Boolean) {
if (Boolean.TRUE.equals(parameterSchema.getAdditionalProperties())) {
CodegenProperty cp = fromProperty("", new Schema());
codegenParameter.setAdditionalProperties(cp);
}
} else {
CodegenProperty cp = fromProperty("", (Schema) parameterSchema.getAdditionalProperties());
codegenParameter.setAdditionalProperties(cp);
}
}

} else {
LOGGER.error("ERROR! Not handling " + parameter + " as Body Parameter at the moment");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,8 @@ public interface IJsonSchemaValidationProperties {
boolean getIsArray();

void setIsArray(boolean isArray);

CodegenProperty getAdditionalProperties();

void setAdditionalProperties(CodegenProperty additionalProperties);
}
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,10 @@ public String toApiFilename(String name) {
@Override
public String toVarName(String name) {
String paramName = name.replaceAll("[^a-zA-Z0-9_]", "");
paramName = Character.toLowerCase(paramName.charAt(0)) + paramName.substring(1);
if (name.length() > 0 ) {
// additionalProperties name is "" so name.length() == 0
paramName = Character.toLowerCase(paramName.charAt(0)) + paramName.substring(1);
}
if (isReservedWord(paramName)) {
return escapeReservedWord(paramName);
}
Expand Down
Loading