Adds missing items property to Java classes which store Schema info (#7621)

* Adds items getter and setter in IJsonSchemaValidationProperties

* Adds isModel interface

* Reverts file

* Fixes issue_7613.yaml schema for /array_with_validations_in_items/{items} response body

* Adds isModel to CodegenModel hash and print and comparison

* Updates CodegenResponse hash and comparison and print
This commit is contained in:
Justin Black 2020-10-08 08:45:20 -07:00 committed by GitHub
parent 3d36d491df
commit d5002f4beb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 242 additions and 6 deletions

View File

@ -149,6 +149,8 @@ public class CodegenModel implements IJsonSchemaValidationProperties {
private String maximum; private String maximum;
private String pattern; private String pattern;
private Number multipleOf; private Number multipleOf;
private CodegenProperty items;
private boolean isModel;
public String getAdditionalPropertiesType() { public String getAdditionalPropertiesType() {
return additionalPropertiesType; return additionalPropertiesType;
@ -550,6 +552,24 @@ public class CodegenModel implements IJsonSchemaValidationProperties {
this.multipleOf = multipleOf; this.multipleOf = multipleOf;
} }
@Override
public CodegenProperty getItems() {
return items;
}
@Override
public void setItems(CodegenProperty items) {
this.items = items;
}
@Override
public boolean getIsModel() { return isModel; }
@Override
public void setIsModel(boolean isModel) {
this.isModel = isModel;
}
// indicates if the model component has validation on the root level schema // indicates if the model component has validation on the root level schema
// this will be true when minItems or minProperties is set // this will be true when minItems or minProperties is set
public boolean hasValidation() { public boolean hasValidation() {
@ -714,8 +734,9 @@ public class CodegenModel implements IJsonSchemaValidationProperties {
Objects.equals(getMinimum(), that.getMinimum()) && Objects.equals(getMinimum(), that.getMinimum()) &&
Objects.equals(getMaximum(), that.getMaximum()) && Objects.equals(getMaximum(), that.getMaximum()) &&
Objects.equals(getPattern(), that.getPattern()) && Objects.equals(getPattern(), that.getPattern()) &&
Objects.equals(getItems(), that.getItems()) &&
Objects.equals(getIsModel(), that.getIsModel()) &&
Objects.equals(getMultipleOf(), that.getMultipleOf()); Objects.equals(getMultipleOf(), that.getMultipleOf());
} }
@Override @Override
@ -731,7 +752,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties {
hasChildren, isMapModel, isDeprecated, hasOnlyReadOnly, getExternalDocumentation(), getVendorExtensions(), hasChildren, isMapModel, isDeprecated, hasOnlyReadOnly, getExternalDocumentation(), getVendorExtensions(),
getAdditionalPropertiesType(), getMaxProperties(), getMinProperties(), getUniqueItems(), getMaxItems(), getAdditionalPropertiesType(), getMaxProperties(), getMinProperties(), getUniqueItems(), getMaxItems(),
getMinItems(), getMaxLength(), getMinLength(), getExclusiveMinimum(), getExclusiveMaximum(), getMinimum(), getMinItems(), getMaxLength(), getMinLength(), getExclusiveMinimum(), getExclusiveMaximum(), getMinimum(),
getMaximum(), getPattern(), getMultipleOf()); getMaximum(), getPattern(), getMultipleOf(), getItems(), getIsModel());
} }
@Override @Override
@ -810,6 +831,8 @@ public class CodegenModel implements IJsonSchemaValidationProperties {
sb.append(", maximum='").append(maximum).append('\''); sb.append(", maximum='").append(maximum).append('\'');
sb.append(", pattern='").append(pattern).append('\''); sb.append(", pattern='").append(pattern).append('\'');
sb.append(", multipleOf='").append(multipleOf).append('\''); sb.append(", multipleOf='").append(multipleOf).append('\'');
sb.append(", items='").append(items).append('\'');
sb.append(", isModel='").append(isModel).append('\'');
sb.append('}'); sb.append('}');
return sb.toString(); return sb.toString();
} }

View File

@ -478,5 +478,22 @@ public class CodegenParameter implements IJsonSchemaValidationProperties {
this.multipleOf = multipleOf; this.multipleOf = multipleOf;
} }
@Override
public CodegenProperty getItems() {
return items;
}
@Override
public void setItems(CodegenProperty items) {
this.items = items;
}
@Override
public boolean getIsModel() { return isModel; }
@Override
public void setIsModel(boolean isModel) {
this.isModel = isModel;
}
} }

View File

@ -451,14 +451,24 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti
this.allowableValues = allowableValues; this.allowableValues = allowableValues;
} }
@Override
public CodegenProperty getItems() { public CodegenProperty getItems() {
return items; return items;
} }
@Override
public void setItems(CodegenProperty items) { public void setItems(CodegenProperty items) {
this.items = items; this.items = items;
} }
@Override
public boolean getIsModel() { return isModel; }
@Override
public void setIsModel(boolean isModel) {
this.isModel = isModel;
}
public Map<String, Object> getVendorExtensions() { public Map<String, Object> getVendorExtensions() {
return vendorExtensions; return vendorExtensions;
} }

View File

@ -73,13 +73,14 @@ public class CodegenResponse implements IJsonSchemaValidationProperties {
private String maximum; private String maximum;
public String pattern; public String pattern;
public Number multipleOf; public Number multipleOf;
public CodegenProperty items;
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(headers, code, message, hasMore, examples, dataType, baseType, containerType, hasHeaders, return Objects.hash(headers, code, message, hasMore, examples, dataType, baseType, containerType, hasHeaders,
isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isByteArray, isBoolean, isDate, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isByteArray, isBoolean, isDate,
isDateTime, isUuid, isEmail, isModel, isFreeFormObject, isAnyType, isDefault, simpleType, primitiveType, isDateTime, isUuid, isEmail, isModel, isFreeFormObject, isAnyType, isDefault, simpleType, primitiveType,
isMapContainer, isListContainer, isBinary, isFile, schema, jsonSchema, vendorExtensions, isMapContainer, isListContainer, isBinary, isFile, schema, jsonSchema, vendorExtensions, items,
getMaxProperties(), getMinProperties(), uniqueItems, getMaxItems(), getMinItems(), getMaxLength(), getMaxProperties(), getMinProperties(), uniqueItems, getMaxItems(), getMinItems(), getMaxLength(),
getMinLength(), exclusiveMinimum, exclusiveMaximum, getMinimum(), getMaximum(), getPattern()); getMinLength(), exclusiveMinimum, exclusiveMaximum, getMinimum(), getMaximum(), getPattern());
} }
@ -114,6 +115,7 @@ public class CodegenResponse implements IJsonSchemaValidationProperties {
isListContainer == that.isListContainer && isListContainer == that.isListContainer &&
isBinary == that.isBinary && isBinary == that.isBinary &&
isFile == that.isFile && isFile == that.isFile &&
items == that.items &&
Objects.equals(headers, that.headers) && Objects.equals(headers, that.headers) &&
Objects.equals(code, that.code) && Objects.equals(code, that.code) &&
Objects.equals(message, that.message) && Objects.equals(message, that.message) &&
@ -270,6 +272,24 @@ public class CodegenResponse implements IJsonSchemaValidationProperties {
this.multipleOf = multipleOf; this.multipleOf = multipleOf;
} }
@Override
public CodegenProperty getItems() {
return items;
}
@Override
public void setItems(CodegenProperty items) {
this.items = items;
}
@Override
public boolean getIsModel() { return isModel; }
@Override
public void setIsModel(boolean isModel) {
this.isModel = isModel;
}
@Override @Override
public String toString() { public String toString() {
final StringBuilder sb = new StringBuilder("CodegenResponse{"); final StringBuilder sb = new StringBuilder("CodegenResponse{");
@ -321,6 +341,7 @@ public class CodegenResponse implements IJsonSchemaValidationProperties {
sb.append(", maximum='").append(maximum).append('\''); sb.append(", maximum='").append(maximum).append('\'');
sb.append(", pattern='").append(pattern).append('\''); sb.append(", pattern='").append(pattern).append('\'');
sb.append(", multipleOf='").append(multipleOf).append('\''); sb.append(", multipleOf='").append(multipleOf).append('\'');
sb.append(", items='").append(items).append('\'');
sb.append('}'); sb.append('}');
return sb.toString(); return sb.toString();
} }

View File

@ -2314,7 +2314,9 @@ public class DefaultCodegen implements CodegenConfig {
} }
if (ModelUtils.isArraySchema(schema)) { if (ModelUtils.isArraySchema(schema)) {
m.isArrayModel = true; m.isArrayModel = true;
m.arrayModelType = fromProperty(name, schema).complexType; CodegenProperty arrayProperty = fromProperty(name, schema);
m.setItems(arrayProperty.items);
m.arrayModelType = arrayProperty.complexType;
addParentContainer(m, name, schema); addParentContainer(m, name, schema);
ModelUtils.syncValidationProperties(schema, m); ModelUtils.syncValidationProperties(schema, m);
} else if (schema instanceof ComposedSchema) { } else if (schema instanceof ComposedSchema) {
@ -4002,8 +4004,10 @@ public class DefaultCodegen implements CodegenConfig {
if (ModelUtils.isArraySchema(responseSchema)) { if (ModelUtils.isArraySchema(responseSchema)) {
ArraySchema as = (ArraySchema) responseSchema; ArraySchema as = (ArraySchema) responseSchema;
CodegenProperty innerProperty = fromProperty("response", getSchemaItems(as)); CodegenProperty items = fromProperty("response", getSchemaItems(as));
CodegenProperty innerCp = innerProperty; r.setItems(items);
CodegenProperty innerCp = items;
while (innerCp != null) { while (innerCp != null) {
r.baseType = innerCp.baseType; r.baseType = innerCp.baseType;
innerCp = innerCp.items; innerCp = innerCp.items;

View File

@ -52,4 +52,12 @@ public interface IJsonSchemaValidationProperties {
Number getMultipleOf(); Number getMultipleOf();
void setMultipleOf(Number multipleOf); void setMultipleOf(Number multipleOf);
CodegenProperty getItems();
void setItems(CodegenProperty items);
boolean getIsModel();
void setIsModel(boolean isModel);
} }

View File

@ -2301,4 +2301,44 @@ public class DefaultCodegenTest {
final List<String> flows = securities.stream().map(c -> c.flow).collect(Collectors.toList()); final List<String> flows = securities.stream().map(c -> c.flow).collect(Collectors.toList());
assertTrue(flows.containsAll(Arrays.asList("password", "application"))); assertTrue(flows.containsAll(Arrays.asList("password", "application")));
} }
@Test
public void testItemsPresent() {
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/issue_7613.yaml");
final DefaultCodegen codegen = new DefaultCodegen();
codegen.setOpenAPI(openAPI);
String modelName;
Schema sc;
CodegenModel cm;
modelName = "ArrayWithValidationsInItems";
sc = openAPI.getComponents().getSchemas().get(modelName);
cm = codegen.fromModel(modelName, sc);
assertEquals(cm.getItems().getMaximum(), "7");
modelName = "ObjectWithValidationsInArrayPropItems";
sc = openAPI.getComponents().getSchemas().get(modelName);
cm = codegen.fromModel(modelName, sc);
assertEquals(cm.getVars().get(0).getItems().getMaximum(), "7");
String path;
Operation operation;
CodegenOperation co;
path = "/ref_array_with_validations_in_items/{items}";
operation = openAPI.getPaths().get(path).getPost();
co = codegen.fromOperation(path, "POST", operation, null);
assertEquals(co.pathParams.get(0).getItems().getMaximum(), "7");
assertEquals(co.bodyParams.get(0).getItems().getMaximum(), "7");
assertEquals(co.responses.get(0).getItems().getMaximum(), "7");
path = "/array_with_validations_in_items/{items}";
operation = openAPI.getPaths().get(path).getPost();
co = codegen.fromOperation(path, "POST", operation, null);
assertEquals(co.pathParams.get(0).getItems().getMaximum(), "7");
assertEquals(co.bodyParams.get(0).getItems().getMaximum(), "7");
assertEquals(co.responses.get(0).getItems().getMaximum(), "7");
}
} }

View File

@ -0,0 +1,113 @@
openapi: 3.0.1
info:
title: OpenAPI Petstore
description: "sample spec"
license:
name: Apache-2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
version: 1.0.0
servers:
- url: http://petstore.swagger.io:80/v2
tags:
- name: items
description: Everything about your Pets
paths:
/ref_array_with_validations_in_items/{items}:
post:
tags:
- items
operationId: refArrayWithValidationsInItems
parameters:
- name: items
in: path
required: true
schema:
$ref: '#/components/schemas/ArrayWithValidationsInItems'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ArrayWithValidationsInItems'
required: true
responses:
200:
description: success
content:
application/json:
schema:
$ref: '#/components/schemas/ArrayWithValidationsInItems'
/array_with_validations_in_items/{items}:
post:
tags:
- items
operationId: arrayWithValidationsInItems
parameters:
- name: items
in: path
required: true
schema:
type: array
items:
type: integer
format: int64
maximum: 7
requestBody:
content:
application/json:
schema:
type: array
items:
type: integer
format: int64
maximum: 7
required: true
responses:
200:
description: success
content:
application/json:
schema:
type: array
items:
type: integer
format: int64
maximum: 7
components:
schemas:
ArrayWithValidationsInItems:
type: array
items:
type: integer
format: int64
maximum: 7
ObjectWithValidationsInArrayPropItems:
type: object
properties:
arrayProp:
type: array
items:
type: integer
format: int64
maximum: 7
ObjectWithValidationsInAdditionalProperties:
type: object
additionalProperties:
type: integer
format: int64
maximum: 7
ComposedOneOfInlineValidation:
oneOf:
- type: integer
format: int64
maximum: 7
ComposedAnyOfInlineValidation:
anyOf:
- type: integer
format: int64
maximum: 7
ComposedAllOfInlineValidation:
allOf:
- type: integer
format: int64
maximum: 7
securitySchemes: {}