diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java index b22c33a73f14..3abcd28f4559 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java @@ -38,6 +38,8 @@ public class OpenAPINormalizer { private Map inputRules = new HashMap<>(); private Map rules = new HashMap<>(); + private TreeSet anyTypeTreeSet = new TreeSet<>(); + final Logger LOGGER = LoggerFactory.getLogger(OpenAPINormalizer.class); Set ruleNames = new TreeSet<>(); @@ -149,6 +151,14 @@ public OpenAPINormalizer(OpenAPI openAPI, Map inputRules) { rules.put(SIMPLIFY_BOOLEAN_ENUM, true); processRules(inputRules); + + // represent any type in tree set + anyTypeTreeSet.add("string"); + anyTypeTreeSet.add("number"); + anyTypeTreeSet.add("integer"); + anyTypeTreeSet.add("boolean"); + anyTypeTreeSet.add("object"); + anyTypeTreeSet.add("array"); } /** @@ -882,6 +892,27 @@ private Schema processSimplifyOneOf(Schema schema) { List oneOfSchemas = schema.getOneOf(); if (oneOfSchemas != null) { + // simplify any type with 6 sub-schemas (string, integer, etc) in oneOf + if (oneOfSchemas.size() == 6) { + TreeSet ts = new TreeSet<>(); + for (Schema s: oneOfSchemas) { + ts.add(s.getType()); + } + + if (ts.equals(anyTypeTreeSet)) { + Schema anyType = new Schema(); + anyType.setDescription(schema.getDescription()); + anyType.setNullable(schema.getNullable()); + anyType.setExtensions(schema.getExtensions()); + anyType.setTitle(schema.getTitle()); + anyType.setExample(schema.getExample()); + anyType.setExamples(schema.getExamples()); + anyType.setDefault(schema.getDefault()); + anyType.setDeprecated(schema.getDeprecated()); + return anyType; + } + } + if (oneOfSchemas.removeIf(oneOf -> isNullTypeSchema(oneOf))) { schema.setNullable(true); @@ -966,6 +997,27 @@ private Schema processSimplifyAnyOf(Schema schema) { List anyOfSchemas = schema.getAnyOf(); if (anyOfSchemas != null) { + // simplify any type with 6 sub-schemas (string, integer, etc) in anyOf + if (anyOfSchemas.size() == 6) { + TreeSet ts = new TreeSet<>(); + for (Schema s: anyOfSchemas) { + ts.add(s.getType()); + } + + if (ts.equals(anyTypeTreeSet)) { + Schema anyType = new Schema(); + anyType.setDescription(schema.getDescription()); + anyType.setNullable(schema.getNullable()); + anyType.setExtensions(schema.getExtensions()); + anyType.setTitle(schema.getTitle()); + anyType.setExample(schema.getExample()); + anyType.setExamples(schema.getExamples()); + anyType.setDefault(schema.getDefault()); + anyType.setDeprecated(schema.getDeprecated()); + return anyType; + } + } + if (anyOfSchemas.removeIf(anyOf -> isNullTypeSchema(anyOf))) { schema.setNullable(true); } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java index d2a86d205e43..b82db0f58927 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java @@ -168,6 +168,12 @@ public void testOpenAPINormalizerSimplifyOneOfAnyOf() { Schema schema9 = openAPI.getComponents().getSchemas().get("AnyOfStringArrayOfString"); assertEquals(schema9.getAnyOf().size(), 2); + Schema schema11 = openAPI.getComponents().getSchemas().get("AnyOfAnyType"); + assertEquals(schema11.getAnyOf().size(), 6); + + Schema schema13 = openAPI.getComponents().getSchemas().get("OneOfAnyType"); + assertEquals(schema13.getOneOf().size(), 6); + Map options = new HashMap<>(); options.put("SIMPLIFY_ONEOF_ANYOF", "true"); OpenAPINormalizer openAPINormalizer = new OpenAPINormalizer(openAPI, options); @@ -192,6 +198,15 @@ public void testOpenAPINormalizerSimplifyOneOfAnyOf() { Schema schema10 = openAPI.getComponents().getSchemas().get("AnyOfStringArrayOfString"); assertEquals(schema10.getAnyOf().size(), 2); + + Schema schema12 = openAPI.getComponents().getSchemas().get("AnyOfAnyType"); + assertEquals(schema12.getAnyOf(), null); + assertEquals(schema12.getType(), null); + + Schema schema14 = openAPI.getComponents().getSchemas().get("OneOfAnyType"); + assertEquals(schema14.getOneOf(), null); + assertEquals(schema14.getType(), null); + } @Test diff --git a/modules/openapi-generator/src/test/resources/3_0/simplifyOneOfAnyOf_test.yaml b/modules/openapi-generator/src/test/resources/3_0/simplifyOneOfAnyOf_test.yaml index 23530a5fd96f..6487740be512 100644 --- a/modules/openapi-generator/src/test/resources/3_0/simplifyOneOfAnyOf_test.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/simplifyOneOfAnyOf_test.yaml @@ -88,4 +88,22 @@ components: - type: string - type: array items: - type: string \ No newline at end of file + type: string + AnyOfAnyType: + anyOf: + - type: boolean + - type: array + items: {} + - type: object + - type: string + - type: number + - type: integer + OneOfAnyType: + oneOf: + - type: object + - type: boolean + - type: number + - type: string + - type: integer + - type: array + items: {} \ No newline at end of file