diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/v3/DefaultGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/v3/DefaultGenerator.java index 0e7eb938ab4..6ffb7c55348 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/v3/DefaultGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/v3/DefaultGenerator.java @@ -350,6 +350,30 @@ public int compare(String o1, String o2) { models.put("classname", config.toModelName(name)); models.putAll(config.additionalProperties()); allProcessedModels.put(name, models); + + final List modelList = (List) models.get("models"); + + if (modelList == null || modelList.isEmpty()) { + continue; + } + + for (Object object : modelList) { + Map modelMap = (Map) object; + CodegenModel codegenModel = null; + if (modelMap.containsKey("oneOf-model")) { + codegenModel = (CodegenModel) modelMap.get("oneOf-model"); + } + if (modelMap.containsKey("anyOf-model")) { + codegenModel = (CodegenModel) modelMap.get("anyOf-model"); + } + if (codegenModel != null) { + models = processModel(codegenModel, config, schemas); + models.put("classname", config.toModelName(codegenModel.name)); + models.putAll(config.additionalProperties()); + allProcessedModels.put(codegenModel.name, models); + break; + } + } } catch (Exception e) { throw new RuntimeException("Could not process model '" + name + "'" + ".Please make sure that your schema is correct!", e); } @@ -965,6 +989,14 @@ private Map processModels(CodegenConfig config, Map mo = new HashMap<>(); mo.put("model", cm); mo.put("importPath", config.toModelImport(cm.classname)); + if (cm.vendorExtensions.containsKey("oneOf-model")) { + CodegenModel oneOfModel = (CodegenModel) cm.vendorExtensions.get("oneOf-model"); + mo.put("oneOf-model", oneOfModel); + } + if (cm.vendorExtensions.containsKey("anyOf-model")) { + CodegenModel anyOfModel = (CodegenModel) cm.vendorExtensions.get("anyOf-model"); + mo.put("anyOf-model", anyOfModel); + } models.add(mo); allImports.addAll(cm.imports); @@ -996,6 +1028,50 @@ private Map processModels(CodegenConfig config, Map processModel(CodegenModel codegenModel, CodegenConfig config, Map allDefinitions) { + Map objs = new HashMap<>(); + objs.put("package", config.modelPackage()); + List models = new ArrayList<>(); + + if (codegenModel.vendorExtensions.containsKey("x-is-composed-model")) { + objs.put("x-is-composed-model", codegenModel.vendorExtensions.get("x-is-composed-model")); + } + + Map modelObject = new HashMap<>(); + modelObject.put("model", codegenModel); + modelObject.put("importPath", config.toModelImport(codegenModel.classname)); + + Set allImports = new LinkedHashSet<>(); + allImports.addAll(codegenModel.imports); + models.add(modelObject); + + objs.put("models", models); + Set importSet = new TreeSet<>(); + for (String nextImport : allImports) { + String mapping = config.importMapping().get(nextImport); + if (mapping == null) { + mapping = config.toModelImport(nextImport); + } + if (mapping != null && !config.defaultIncludes().contains(mapping)) { + importSet.add(mapping); + } + // add instantiation types + mapping = config.instantiationTypes().get(nextImport); + if (mapping != null && !config.defaultIncludes().contains(mapping)) { + importSet.add(mapping); + } + } + List> imports = new ArrayList<>(); + for(String s: importSet) { + Map item = new HashMap<>(); + item.put("import", s); + imports.add(item); + } + objs.put("imports", imports); + config.postProcessModels(objs); + return objs; + } + private Map getAuthMethods(List securities, Map securitySchemes) { if (securities == null || (securitySchemes == null || securitySchemes.isEmpty())) { return null;