Skip to content

Commit e0a92f4

Browse files
committed
Apply PR comments, update example parsing logic, add missing sample
1 parent a6c3c0c commit e0a92f4

6 files changed

Lines changed: 29 additions & 35 deletions

File tree

‎modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java‎

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2553,11 +2553,7 @@ public void setParameterEncodingValues(CodegenParameter codegenParameter, MediaT
25532553
* @return string presentation of the example value of the property
25542554
*/
25552555
public String toExampleValue(Schema schema) {
2556-
if (schema.getExample() != null) {
2557-
return schema.getExample().toString();
2558-
}
2559-
2560-
return "null";
2556+
return getExampleValueToString(schema.getExample());
25612557
}
25622558

25632559
/**
@@ -2573,22 +2569,21 @@ public List<String> toExampleValues(Schema schema) {
25732569
if (schemaExamples == null || schemaExamples.isEmpty()) {
25742570
return null;
25752571
}
2576-
List<String> examples = schemaExamples.stream()
2577-
.map(this::getExampleValueString)
2578-
.collect(Collectors.toList());
2579-
2580-
return examples.isEmpty() ? null : examples;
2572+
return schemaExamples.stream()
2573+
.map(this::getExampleValueToString)
2574+
.collect(Collectors.toList());
25812575
}
25822576

25832577
/**
25842578
* Return the string presentation of a single example value.
25852579
* <p>
2580+
* This method should be overridden in the generator to meet its requirement.
25862581
* For value nodes, {@link JsonNode#asText()} is used to get the string without duplicated quotes.
25872582
*
25882583
* @param example the raw example value coming from the parsed schema
25892584
* @return string presentation of the example value
25902585
*/
2591-
protected String getExampleValueString(Object example) {
2586+
protected String getExampleValueToString(Object example) {
25922587
if (example == null) {
25932588
return "null";
25942589
}
@@ -4332,7 +4327,7 @@ public CodegenProperty fromProperty(String name, Schema p, boolean required, boo
43324327
List<String> examples = new ArrayList<>();
43334328
for (Object example : p.getExamples()) {
43344329
try {
4335-
examples.add(getExampleValueString(example));
4330+
examples.add(getExampleValueToString(example));
43364331
} catch (Exception e) {
43374332
examples.add(handleExampleException(property.baseName, e));
43384333
}
@@ -4582,8 +4577,8 @@ public CodegenProperty fromProperty(String name, Schema p, boolean required, boo
45824577
}
45834578

45844579
private String handleExampleException(String propertyName, Exception e) {
4585-
LOGGER.error("Error in generating `example` for the property {}. Default to ERROR_TO_EXAMPLE_VALUE. Enable debugging for more info.", propertyName);
4586-
LOGGER.debug("Exception from toExampleValue: {}", e.getMessage());
4580+
LOGGER.error("Error in generating example for the property {}. Default to ERROR_TO_EXAMPLE_VALUE. Enable debugging for more info.", propertyName);
4581+
LOGGER.debug("Exception from example handling: {}", e.getMessage());
45874582
return "ERROR_TO_EXAMPLE_VALUE";
45884583
}
45894584

‎modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java‎

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1965,16 +1965,15 @@ private String escapeStringLiteral(String input) {
19651965
}
19661966

19671967
@Override
1968-
public String toExampleValue(Schema p) {
1969-
if (p.getExample() != null) {
1970-
if (p.getExample() instanceof Date) {
1971-
Date date = (Date) p.getExample();
1972-
return DateTimeFormatter.ISO_LOCAL_DATE.format(ZonedDateTime.ofInstant(date.toInstant(), UTC));
1973-
}
1974-
return escapeText(p.getExample().toString());
1975-
} else {
1968+
protected String getExampleValueToString(Object example) {
1969+
if (example == null) {
19761970
return null;
19771971
}
1972+
if (example instanceof Date) {
1973+
Date date = (Date) example;
1974+
return DateTimeFormatter.ISO_LOCAL_DATE.format(ZonedDateTime.ofInstant(date.toInstant(), UTC));
1975+
}
1976+
return escapeText(super.getExampleValueToString(example));
19781977
}
19791978

19801979
@Override

‎modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2305,12 +2305,12 @@ public void testOas31SchemaExamplesHandling() {
23052305
final Map properties = openAPI.getComponents().getSchemas().get("Pet").getProperties();
23062306

23072307
assertThat(codegen.fromProperty("name", (Schema) properties.get("name")).examples)
2308-
.containsExactly("Fluffy", "Rex");
2308+
.containsExactly("Fluffy-\\s;]\"a", "Rex");
23092309
assertThat(codegen.fromProperty("age", (Schema) properties.get("age")).examples)
23102310
.containsExactly("3");
23112311
assertThat(codegen.fromProperty("tags", (Schema) properties.get("tags")).examples)
2312-
.containsExactly("[\"a\",\"b\"]");
2313-
assertNull(codegen.fromProperty("height", (Schema) properties.get("height")).examples);
2312+
.containsExactly("[\"a\\\"c\",\"b\"]");
2313+
assertThat(codegen.fromProperty("height", (Schema) properties.get("height")).examples).isNullOrEmpty();
23142314
}
23152315

23162316
@Test

‎modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10210,10 +10210,10 @@ public void shouldRenderOas31SchemaExamples() throws IOException {
1021010210

1021110211
JavaFileAssert.assertThat(files.get("Pet.java"))
1021210212
.fileContains(
10213-
"example = \"Fluffy\"",
10214-
"examples = { \"Fluffy\", \"Rex\" }",
10213+
"example = \"Fluffy-\\\\s;]\\\"a\"",
10214+
"examples = { \"Fluffy-\\\\s;]\\\"a\", \"Rex\" }",
1021510215
"examples = { \"3\" }",
10216-
"examples = { \"[a, b]\" }"
10217-
).fileDoesNotContain("examples = {}");
10216+
"examples = { \"[a\\\"c, b]\" }"
10217+
).fileDoesNotContain("examples = { }");
1021810218
}
1021910219
}

‎modules/openapi-generator/src/test/resources/3_1/issue_24755.yaml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ components:
2222
properties:
2323
name:
2424
type: string
25-
example: 'Fluffy'
25+
example: 'Fluffy-\s;]"a'
2626
examples:
27-
- 'Fluffy'
27+
- 'Fluffy-\s;]"a'
2828
- 'Rex'
2929
age:
3030
type: integer
@@ -38,4 +38,4 @@ components:
3838
items:
3939
type: string
4040
examples:
41-
- ['a', 'b']
41+
- ['a"c', 'b']

‎samples/server/petstore/java-undertow/src/main/java/org/openapitools/handler/PathHandlerInterface.java‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -574,13 +574,13 @@ public interface PathHandlerInterface {
574574
* </p>
575575
* </li>
576576
* </ul>
577-
* <p><b>Response headers</b>: [CodegenProperty{openApiType='string', baseName='Set-Cookie', complexType='null', getter='getSetCookie', setter='setSetCookie', description='Cookie authentication key for use with the `api_key` apiKey authentication.', dataType='String', datatypeWithEnum='String', dataFormat='null', name='setCookie', min='null', max='null', defaultValue='null', defaultValueWithParam=' = data.Set-Cookie;', baseType='String', containerType='null', containerTypeMapped='null', title='null', unescapedDescription='Cookie authentication key for use with the `api_key` apiKey authentication.', maxLength=null, minLength=null, pattern='null', example='AUTH_KEY=abcde12345; Path=/; HttpOnly', jsonSchema='{
577+
* <p><b>Response headers</b>: [CodegenProperty{openApiType='string', baseName='Set-Cookie', complexType='null', getter='getSetCookie', setter='setSetCookie', description='Cookie authentication key for use with the `api_key` apiKey authentication.', dataType='String', datatypeWithEnum='String', dataFormat='null', name='setCookie', min='null', max='null', defaultValue='null', defaultValueWithParam=' = data.Set-Cookie;', baseType='String', containerType='null', containerTypeMapped='null', title='null', unescapedDescription='Cookie authentication key for use with the `api_key` apiKey authentication.', maxLength=null, minLength=null, pattern='null', example='AUTH_KEY=abcde12345; Path=/; HttpOnly', examples=null, jsonSchema='{
578578
"example" : "AUTH_KEY=abcde12345; Path=/; HttpOnly",
579579
"type" : "string"
580-
}', minimum='null', maximum='null', exclusiveMinimum=false, exclusiveMaximum=false, required=false, deprecated=false, isPrimitiveType=true, isModel=false, isContainer=false, isString=true, isNumeric=false, isInteger=false, isShort=false, isLong=false, isUnboundedInteger=false, isNumber=false, isFloat=false, isDouble=false, isDecimal=false, isByteArray=false, isBinary=false, isFile=false, isBoolean=false, isDate=false, isDateTime=false, isUuid=false, isUri=false, isEmail=false, isPassword=false, isFreeFormObject=false, isArray=false, isMap=false, isOptional=false, isEnum=false, isInnerEnum=false, isEnumRef=false, isAnyType=false, isReadOnly=false, isWriteOnly=false, isNullable=false, isSelfReference=false, isCircularReference=false, isDiscriminator=false, isNew=false, isOverridden=null, _enum=null, allowableValues=null, items=null, additionalProperties=null, vars=[], requiredVars=[], mostInnerItems=null, vendorExtensions={}, hasValidation=false, isInherited=false, discriminatorValue='null', nameInCamelCase='setCookie', nameInPascalCase='SetCookie', nameInSnakeCase='SET_COOKIE', enumName='null', maxItems=null, minItems=null, maxProperties=null, minProperties=null, uniqueItems=false, uniqueItemsBoolean=null, multipleOf=null, isXmlAttribute=false, xmlPrefix='null', xmlName='null', xmlNamespace='null', isXmlWrapped=false, isNull=false, isVoid=false, getAdditionalPropertiesIsAnyType=false, getHasVars=false, getHasRequired=false, getHasDiscriminatorWithNonEmptyMapping=false, composedSchemas=null, hasMultipleTypes=false, hasSanitizedName=true, requiredVarsMap=null, ref=null, schemaIsFromAdditionalProperties=false, isBooleanSchemaTrue=false, isBooleanSchemaFalse=false, format=null, dependentRequired=null, contains=null}, CodegenProperty{openApiType='integer', baseName='X-Rate-Limit', complexType='null', getter='getxRateLimit', setter='setxRateLimit', description='calls per hour allowed by the user', dataType='Integer', datatypeWithEnum='Integer', dataFormat='int32', name='xRateLimit', min='null', max='null', defaultValue='null', defaultValueWithParam=' = data.X-Rate-Limit;', baseType='Integer', containerType='null', containerTypeMapped='null', title='null', unescapedDescription='calls per hour allowed by the user', maxLength=null, minLength=null, pattern='null', example='null', jsonSchema='{
580+
}', minimum='null', maximum='null', exclusiveMinimum=false, exclusiveMaximum=false, required=false, deprecated=false, isPrimitiveType=true, isModel=false, isContainer=false, isString=true, isNumeric=false, isInteger=false, isShort=false, isLong=false, isUnboundedInteger=false, isNumber=false, isFloat=false, isDouble=false, isDecimal=false, isByteArray=false, isBinary=false, isFile=false, isBoolean=false, isDate=false, isDateTime=false, isUuid=false, isUri=false, isEmail=false, isPassword=false, isFreeFormObject=false, isArray=false, isMap=false, isOptional=false, isEnum=false, isInnerEnum=false, isEnumRef=false, isAnyType=false, isReadOnly=false, isWriteOnly=false, isNullable=false, isSelfReference=false, isCircularReference=false, isDiscriminator=false, isNew=false, isOverridden=null, _enum=null, allowableValues=null, items=null, additionalProperties=null, vars=[], requiredVars=[], mostInnerItems=null, vendorExtensions={}, hasValidation=false, isInherited=false, discriminatorValue='null', nameInCamelCase='setCookie', nameInPascalCase='SetCookie', nameInSnakeCase='SET_COOKIE', enumName='null', maxItems=null, minItems=null, maxProperties=null, minProperties=null, uniqueItems=false, uniqueItemsBoolean=null, multipleOf=null, isXmlAttribute=false, xmlPrefix='null', xmlName='null', xmlNamespace='null', isXmlWrapped=false, isNull=false, isVoid=false, getAdditionalPropertiesIsAnyType=false, getHasVars=false, getHasRequired=false, getHasDiscriminatorWithNonEmptyMapping=false, composedSchemas=null, hasMultipleTypes=false, hasSanitizedName=true, requiredVarsMap=null, ref=null, schemaIsFromAdditionalProperties=false, isBooleanSchemaTrue=false, isBooleanSchemaFalse=false, format=null, dependentRequired=null, contains=null}, CodegenProperty{openApiType='integer', baseName='X-Rate-Limit', complexType='null', getter='getxRateLimit', setter='setxRateLimit', description='calls per hour allowed by the user', dataType='Integer', datatypeWithEnum='Integer', dataFormat='int32', name='xRateLimit', min='null', max='null', defaultValue='null', defaultValueWithParam=' = data.X-Rate-Limit;', baseType='Integer', containerType='null', containerTypeMapped='null', title='null', unescapedDescription='calls per hour allowed by the user', maxLength=null, minLength=null, pattern='null', example='null', examples=null, jsonSchema='{
581581
"format" : "int32",
582582
"type" : "integer"
583-
}', minimum='null', maximum='null', exclusiveMinimum=false, exclusiveMaximum=false, required=false, deprecated=false, isPrimitiveType=true, isModel=false, isContainer=false, isString=false, isNumeric=true, isInteger=true, isShort=true, isLong=false, isUnboundedInteger=false, isNumber=false, isFloat=false, isDouble=false, isDecimal=false, isByteArray=false, isBinary=false, isFile=false, isBoolean=false, isDate=false, isDateTime=false, isUuid=false, isUri=false, isEmail=false, isPassword=false, isFreeFormObject=false, isArray=false, isMap=false, isOptional=false, isEnum=false, isInnerEnum=false, isEnumRef=false, isAnyType=false, isReadOnly=false, isWriteOnly=false, isNullable=false, isSelfReference=false, isCircularReference=false, isDiscriminator=false, isNew=false, isOverridden=null, _enum=null, allowableValues=null, items=null, additionalProperties=null, vars=[], requiredVars=[], mostInnerItems=null, vendorExtensions={}, hasValidation=false, isInherited=false, discriminatorValue='null', nameInCamelCase='xRateLimit', nameInPascalCase='XRateLimit', nameInSnakeCase='X_RATE_LIMIT', enumName='null', maxItems=null, minItems=null, maxProperties=null, minProperties=null, uniqueItems=false, uniqueItemsBoolean=null, multipleOf=null, isXmlAttribute=false, xmlPrefix='null', xmlName='null', xmlNamespace='null', isXmlWrapped=false, isNull=false, isVoid=false, getAdditionalPropertiesIsAnyType=false, getHasVars=false, getHasRequired=false, getHasDiscriminatorWithNonEmptyMapping=false, composedSchemas=null, hasMultipleTypes=false, hasSanitizedName=true, requiredVarsMap=null, ref=null, schemaIsFromAdditionalProperties=false, isBooleanSchemaTrue=false, isBooleanSchemaFalse=false, format=int32, dependentRequired=null, contains=null}, CodegenProperty{openApiType='string', baseName='X-Expires-After', complexType='Date', getter='getxExpiresAfter', setter='setxExpiresAfter', description='date in UTC when token expires', dataType='Date', datatypeWithEnum='Date', dataFormat='date-time', name='xExpiresAfter', min='null', max='null', defaultValue='null', defaultValueWithParam=' = data.X-Expires-After;', baseType='Date', containerType='null', containerTypeMapped='null', title='null', unescapedDescription='date in UTC when token expires', maxLength=null, minLength=null, pattern='null', example='null', jsonSchema='{
583+
}', minimum='null', maximum='null', exclusiveMinimum=false, exclusiveMaximum=false, required=false, deprecated=false, isPrimitiveType=true, isModel=false, isContainer=false, isString=false, isNumeric=true, isInteger=true, isShort=true, isLong=false, isUnboundedInteger=false, isNumber=false, isFloat=false, isDouble=false, isDecimal=false, isByteArray=false, isBinary=false, isFile=false, isBoolean=false, isDate=false, isDateTime=false, isUuid=false, isUri=false, isEmail=false, isPassword=false, isFreeFormObject=false, isArray=false, isMap=false, isOptional=false, isEnum=false, isInnerEnum=false, isEnumRef=false, isAnyType=false, isReadOnly=false, isWriteOnly=false, isNullable=false, isSelfReference=false, isCircularReference=false, isDiscriminator=false, isNew=false, isOverridden=null, _enum=null, allowableValues=null, items=null, additionalProperties=null, vars=[], requiredVars=[], mostInnerItems=null, vendorExtensions={}, hasValidation=false, isInherited=false, discriminatorValue='null', nameInCamelCase='xRateLimit', nameInPascalCase='XRateLimit', nameInSnakeCase='X_RATE_LIMIT', enumName='null', maxItems=null, minItems=null, maxProperties=null, minProperties=null, uniqueItems=false, uniqueItemsBoolean=null, multipleOf=null, isXmlAttribute=false, xmlPrefix='null', xmlName='null', xmlNamespace='null', isXmlWrapped=false, isNull=false, isVoid=false, getAdditionalPropertiesIsAnyType=false, getHasVars=false, getHasRequired=false, getHasDiscriminatorWithNonEmptyMapping=false, composedSchemas=null, hasMultipleTypes=false, hasSanitizedName=true, requiredVarsMap=null, ref=null, schemaIsFromAdditionalProperties=false, isBooleanSchemaTrue=false, isBooleanSchemaFalse=false, format=int32, dependentRequired=null, contains=null}, CodegenProperty{openApiType='string', baseName='X-Expires-After', complexType='Date', getter='getxExpiresAfter', setter='setxExpiresAfter', description='date in UTC when token expires', dataType='Date', datatypeWithEnum='Date', dataFormat='date-time', name='xExpiresAfter', min='null', max='null', defaultValue='null', defaultValueWithParam=' = data.X-Expires-After;', baseType='Date', containerType='null', containerTypeMapped='null', title='null', unescapedDescription='date in UTC when token expires', maxLength=null, minLength=null, pattern='null', example='null', examples=null, jsonSchema='{
584584
"format" : "date-time",
585585
"type" : "string"
586586
}', minimum='null', maximum='null', exclusiveMinimum=false, exclusiveMaximum=false, required=false, deprecated=false, isPrimitiveType=false, isModel=false, isContainer=false, isString=false, isNumeric=false, isInteger=false, isShort=false, isLong=false, isUnboundedInteger=false, isNumber=false, isFloat=false, isDouble=false, isDecimal=false, isByteArray=false, isBinary=false, isFile=false, isBoolean=false, isDate=false, isDateTime=true, isUuid=false, isUri=false, isEmail=false, isPassword=false, isFreeFormObject=false, isArray=false, isMap=false, isOptional=false, isEnum=false, isInnerEnum=false, isEnumRef=false, isAnyType=false, isReadOnly=false, isWriteOnly=false, isNullable=false, isSelfReference=false, isCircularReference=false, isDiscriminator=false, isNew=false, isOverridden=null, _enum=null, allowableValues=null, items=null, additionalProperties=null, vars=[], requiredVars=[], mostInnerItems=null, vendorExtensions={}, hasValidation=false, isInherited=false, discriminatorValue='null', nameInCamelCase='xExpiresAfter', nameInPascalCase='XExpiresAfter', nameInSnakeCase='X_EXPIRES_AFTER', enumName='null', maxItems=null, minItems=null, maxProperties=null, minProperties=null, uniqueItems=false, uniqueItemsBoolean=null, multipleOf=null, isXmlAttribute=false, xmlPrefix='null', xmlName='null', xmlNamespace='null', isXmlWrapped=false, isNull=false, isVoid=false, getAdditionalPropertiesIsAnyType=false, getHasVars=false, getHasRequired=false, getHasDiscriminatorWithNonEmptyMapping=false, composedSchemas=null, hasMultipleTypes=false, hasSanitizedName=true, requiredVarsMap=null, ref=null, schemaIsFromAdditionalProperties=false, isBooleanSchemaTrue=false, isBooleanSchemaFalse=false, format=date-time, dependentRequired=null, contains=null}]</p>

0 commit comments

Comments
 (0)