From 201f173b17a5cdb8f90be6482b7819f1c9a7d207 Mon Sep 17 00:00:00 2001
From: William Cheng <wing328hk@gmail.com>
Date: Wed, 26 Dec 2018 10:34:49 +0800
Subject: [PATCH] better handling of allOf (composition)

---
 .../openapitools/codegen/DefaultCodegen.java  | 58 ++++++++-----------
 1 file changed, 23 insertions(+), 35 deletions(-)

diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java
index d4728dea6d3..fd8502931ce 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java
@@ -1371,56 +1371,44 @@ public class DefaultCodegen implements CodegenConfig {
             ComposedSchema cs = (ComposedSchema) schema;
             List<Schema> schemas = ModelUtils.getInterfaces(cs);
             if (cs.getAllOf() != null) {
-                for (Schema s : cs.getAllOf()) {
-                    if (s != null) {
-                        //schema = s;
-                    }
-                    //LOGGER.info("ALL OF SCHEMA: {}", s);
+                List<String> names = new ArrayList<>();
+                for (Schema s : schemas) {
+                    names.add(getSingleSchemaType(s));
                 }
 
-                LOGGER.info("Composed schema not yet supported: {}", cs);
-                // get the model (allOf)
-                return getAlias("UNKNOWN_COMPOSED_SCHMEA");
+                if (names.size() == 0) {
+                    LOGGER.error("allOf has no member defined: {}. Default to ERROR_ALLOF_SCHEMA", cs);
+                    return "ERROR_ALLOF_SCHEMA";
+                } else if (names.size() == 1) {
+                    return names.get(0);
+                } else {
+                    LOGGER.warn("allOf with multiple schemas defined. Using only the first one: {}. To fully utilize allOf, please use $ref instead of inline schema definition", names.get(0));
+                    return names.get(0);
+                }
             } else if (cs.getAnyOf() != null) { // anyOf
-                List<String> names = new ArrayList<String>();
+                List<String> names = new ArrayList<>();
                 for (Schema s : schemas) {
-                    if (StringUtils.isNotBlank(s.get$ref())) { // reference to another definition/schema
-                        String schemaName = ModelUtils.getSimpleRef(s.get$ref());
-                        if (StringUtils.isNotEmpty(schemaName)) {
-                            names.add(getAlias(schemaName));
-                        } else {
-                            LOGGER.warn("Error obtaining the datatype from ref:" + schema.get$ref() + ". Default to 'object'");
-                            return "object";
-                        }
-                    } else {
-                        // primitive type or model
-                        names.add(getAlias(getPrimitiveType(s)));
-                    }
-                    return "anyOf<" + String.join(",", names) + ">";
+                    names.add(getSingleSchemaType(s));
                 }
+                return "anyOf<" + String.join(",", names) + ">";
             } else if (cs.getOneOf() != null) { // oneOf
-                List<String> names = new ArrayList<String>();
+                List<String> names = new ArrayList<>();
                 for (Schema s : schemas) {
-                    if (StringUtils.isNotBlank(s.get$ref())) { // reference to another definition/schema
-                        String schemaName = ModelUtils.getSimpleRef(s.get$ref());
-                        if (StringUtils.isNotEmpty(schemaName)) {
-                            names.add(getAlias(schemaName));
-                        } else {
-                            LOGGER.warn("Error obtaining the datatype from ref:" + schema.get$ref() + ". Default to 'object'");
-                            return "object";
-                        }
-                    } else {
-                        // primitive type or model
-                        names.add(getAlias(getPrimitiveType(s)));
-                    }
+                    names.add(getSingleSchemaType(s));
                 }
                 return "oneOf<" + String.join(",", names) + ">";
             }
         }
 
+        return getSingleSchemaType(schema);
+
+    }
+
+    private String getSingleSchemaType(Schema schema) {
         if (StringUtils.isNotBlank(schema.get$ref())) { // reference to another definition/schema
             // get the schema/model name from $ref
             String schemaName = ModelUtils.getSimpleRef(schema.get$ref());
+
             if (StringUtils.isNotEmpty(schemaName)) {
                 return getAlias(schemaName);
             } else {
-- 
GitLab