Skip to content

Commit 8e932d1

Browse files
Fix so that the oneOfAnyOf normalizer retains the read/write only attribute
1 parent aacbdf8 commit 8e932d1

4 files changed

Lines changed: 27 additions & 13 deletions

File tree

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,11 @@
3333
import org.slf4j.LoggerFactory;
3434

3535
import java.lang.reflect.Constructor;
36-
import java.lang.reflect.InvocationTargetException;
3736
import java.util.*;
3837
import java.util.function.Function;
3938
import java.util.stream.Collectors;
4039

41-
import static org.openapitools.codegen.utils.ModelUtils.simplyOneOfAnyOfWithOnlyOneNonNullSubSchema;
40+
import static org.openapitools.codegen.utils.ModelUtils.simplifyOneOfAnyOfWithOnlyOneNonNullSubSchema;
4241
import static org.openapitools.codegen.utils.StringUtils.getUniqueString;
4342

4443
public class OpenAPINormalizer {
@@ -1318,7 +1317,7 @@ protected Schema processSimplifyOneOf(Schema schema) {
13181317
}
13191318
}
13201319

1321-
schema = simplyOneOfAnyOfWithOnlyOneNonNullSubSchema(openAPI, schema, oneOfSchemas);
1320+
schema = simplifyOneOfAnyOfWithOnlyOneNonNullSubSchema(openAPI, schema, oneOfSchemas);
13221321

13231322
if (ModelUtils.isIntegerSchema(schema) || ModelUtils.isNumberSchema(schema) || ModelUtils.isStringSchema(schema)) {
13241323
// TODO convert oneOf const to enum
@@ -1445,7 +1444,7 @@ protected Schema processSimplifyAnyOf(Schema schema) {
14451444
}
14461445
}
14471446

1448-
schema = simplyOneOfAnyOfWithOnlyOneNonNullSubSchema(openAPI, schema, anyOfSchemas);
1447+
schema = simplifyOneOfAnyOfWithOnlyOneNonNullSubSchema(openAPI, schema, anyOfSchemas);
14491448
}
14501449

14511450
return schema;

modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2227,17 +2227,24 @@ public static Schema cloneSchema(Schema schema, boolean openapi31) {
22272227
* @param subSchemas The oneOf or AnyOf schemas
22282228
* @return The simplified schema
22292229
*/
2230-
public static Schema simplyOneOfAnyOfWithOnlyOneNonNullSubSchema(OpenAPI openAPI, Schema schema, List<Schema> subSchemas) {
2230+
public static Schema simplifyOneOfAnyOfWithOnlyOneNonNullSubSchema(OpenAPI openAPI, Schema schema, List<Schema> subSchemas) {
22312231
if (subSchemas.removeIf(subSchema -> isNullTypeSchema(openAPI, subSchema))) {
22322232
schema.setNullable(true);
22332233
}
22342234

22352235
// if only one element left, simplify to just the element (schema)
22362236
if (subSchemas.size() == 1) {
2237+
Schema<?> subSchema = subSchemas.get(0);
22372238
if (Boolean.TRUE.equals(schema.getNullable())) { // retain nullable setting
2238-
subSchemas.get(0).setNullable(true);
2239+
subSchema.setNullable(true);
22392240
}
2240-
return subSchemas.get(0);
2241+
if (Boolean.TRUE.equals(schema.getReadOnly())) {
2242+
subSchema.setReadOnly(true);
2243+
}
2244+
if (Boolean.TRUE.equals(schema.getWriteOnly())) {
2245+
subSchema.setWriteOnly(true);
2246+
}
2247+
return subSchema;
22412248
}
22422249

22432250
return schema;

modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/ModelUtilsTest.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -476,46 +476,52 @@ public void testGetSchemaItemsWith31Spec() {
476476
}
477477

478478
@Test
479-
public void simplyOneOfAnyOfWithOnlyOneNonNullSubSchema() {
479+
public void simplifyOneOfAnyOfWithOnlyOneNonNullSubSchema() {
480480
OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/simplifyOneOfAnyOf_test.yaml");
481481
Schema schema;
482482
List<Schema> subSchemas;
483483

484484
Schema anyOfWithSeveralSubSchemasButSingleNonNull = ModelUtils.getSchema(openAPI, "AnyOfTest");
485485
subSchemas = anyOfWithSeveralSubSchemasButSingleNonNull.getAnyOf();
486-
schema = ModelUtils.simplyOneOfAnyOfWithOnlyOneNonNullSubSchema(openAPI, anyOfWithSeveralSubSchemasButSingleNonNull, subSchemas);
486+
schema = ModelUtils.simplifyOneOfAnyOfWithOnlyOneNonNullSubSchema(openAPI, anyOfWithSeveralSubSchemasButSingleNonNull, subSchemas);
487487
assertNull(schema.getOneOf());
488488
assertNull(schema.getAnyOf());
489489
assertTrue(schema.getNullable());
490+
assertTrue(schema.getReadOnly());
491+
assertNull(schema.getWriteOnly());
490492
assertEquals("string", schema.getType());
491493

492494
Schema anyOfWithSingleNonNullSubSchema = ModelUtils.getSchema(openAPI, "Parent");
493495
subSchemas = ((Schema) anyOfWithSingleNonNullSubSchema.getProperties().get("number")).getAnyOf();
494-
schema = ModelUtils.simplyOneOfAnyOfWithOnlyOneNonNullSubSchema(openAPI, anyOfWithSingleNonNullSubSchema, subSchemas);
496+
schema = ModelUtils.simplifyOneOfAnyOfWithOnlyOneNonNullSubSchema(openAPI, anyOfWithSingleNonNullSubSchema, subSchemas);
495497
assertNull(schema.getOneOf());
496498
assertNull(schema.getAnyOf());
497499
assertNull(schema.getNullable());
500+
assertNull(schema.getReadOnly());
501+
assertNull(schema.getWriteOnly());
498502
assertEquals(schema.get$ref(), "#/components/schemas/Number");
499503

500504
Schema oneOfWithSeveralSubSchemasButSingleNonNull = ModelUtils.getSchema(openAPI, "OneOfTest");
501505
subSchemas = oneOfWithSeveralSubSchemasButSingleNonNull.getOneOf();
502-
schema = ModelUtils.simplyOneOfAnyOfWithOnlyOneNonNullSubSchema(openAPI, oneOfWithSeveralSubSchemasButSingleNonNull, subSchemas);
506+
schema = ModelUtils.simplifyOneOfAnyOfWithOnlyOneNonNullSubSchema(openAPI, oneOfWithSeveralSubSchemasButSingleNonNull, subSchemas);
503507
assertNull(schema.getOneOf());
504508
assertNull(schema.getAnyOf());
505509
assertTrue(schema.getNullable());
510+
assertNull(schema.getReadOnly());
511+
assertTrue(schema.getWriteOnly());
506512
assertEquals("integer", schema.getType());
507513

508514
Schema oneOfWithSingleNonNullSubSchema = ModelUtils.getSchema(openAPI, "ParentWithOneOfProperty");
509515
subSchemas = ((Schema) oneOfWithSingleNonNullSubSchema.getProperties().get("number")).getOneOf();
510-
schema = ModelUtils.simplyOneOfAnyOfWithOnlyOneNonNullSubSchema(openAPI, oneOfWithSingleNonNullSubSchema, subSchemas);
516+
schema = ModelUtils.simplifyOneOfAnyOfWithOnlyOneNonNullSubSchema(openAPI, oneOfWithSingleNonNullSubSchema, subSchemas);
511517
assertNull(schema.getOneOf());
512518
assertNull(schema.getAnyOf());
513519
assertNull(schema.getNullable());
514520
assertEquals(schema.get$ref(), "#/components/schemas/Number");
515521

516522
Schema oneOfWithSeveralSubSchemas = ModelUtils.getSchema(openAPI, "ParentWithPluralOneOfProperty");
517523
subSchemas = ((Schema) oneOfWithSeveralSubSchemas.getProperties().get("number")).getOneOf();
518-
schema = ModelUtils.simplyOneOfAnyOfWithOnlyOneNonNullSubSchema(openAPI, oneOfWithSeveralSubSchemas, subSchemas);
524+
schema = ModelUtils.simplifyOneOfAnyOfWithOnlyOneNonNullSubSchema(openAPI, oneOfWithSeveralSubSchemas, subSchemas);
519525
assertNull(schema.getOneOf());
520526
assertNotNull(oneOfWithSeveralSubSchemas.getProperties().get("number"));
521527
assertNull(schema.getAnyOf());

modules/openapi-generator/src/test/resources/3_0/simplifyOneOfAnyOf_test.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,15 @@ components:
3333
- type: 'null'
3434
- type: null
3535
- $ref: null
36+
readOnly: true
3637
OneOfTest:
3738
description: to test oneOf
3839
oneOf:
3940
- type: integer
4041
- type: 'null'
4142
- type: null
4243
- $ref: null
44+
writeOnly: true
4345
OneOfTest2:
4446
description: to test oneOf
4547
oneOf:

0 commit comments

Comments
 (0)