From b61a400d9161a982691c19ea9405f0fbf60e02ce Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 2 Jul 2015 17:48:58 +0800 Subject: [PATCH] Copy properties of parent model to model with allOf Also fix #936 --- .../io/swagger/codegen/CodegenConfig.java | 2 ++ .../io/swagger/codegen/DefaultCodegen.java | 28 +++++++++++++++---- .../io/swagger/codegen/DefaultGenerator.java | 6 ++-- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfig.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfig.java index 6f96bd82b5d..da040b20781 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfig.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfig.java @@ -65,6 +65,8 @@ public interface CodegenConfig { CodegenModel fromModel(String name, Model model); + CodegenModel fromModel(String name, Model model, Map allDefinitions); + CodegenOperation fromOperation(String resourcePath, String httpMethod, Operation operation, Map definitions); List fromSecurity(Map schemes); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 71b6295c9be..44eac098216 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -506,6 +506,10 @@ public class DefaultCodegen { } public CodegenModel fromModel(String name, Model model) { + return fromModel(name, model, null); + } + + public CodegenModel fromModel(String name, Model model, Map allDefinitions) { CodegenModel m = CodegenModelFactory.newInstance(CodegenModelType.MODEL); if (reservedWords.contains(name)) { m.name = escapeReservedWord(name); @@ -526,11 +530,25 @@ public class DefaultCodegen { } else if (model instanceof ComposedModel) { final ComposedModel composed = (ComposedModel) model; final RefModel parent = (RefModel) composed.getParent(); - final String parentModel = toModelName(parent.getSimpleRef()); - m.parent = parentModel; - addImport(m, parentModel); - final ModelImpl child = (ModelImpl) composed.getChild(); - addVars(m, child.getProperties(), child.getRequired()); + if (parent != null) { + final String parentRef = toModelName(parent.getSimpleRef()); + final Model parentModel = allDefinitions.get(parentRef); + if (parentModel instanceof ModelImpl) { + final ModelImpl _parent = (ModelImpl) parentModel; + m.parent = parentRef; + addImport(m, parentRef); + addVars(m, _parent.getProperties(), _parent.getRequired()); + } + } + Model child = composed.getChild(); + if (child != null && child instanceof RefModel) { + final String childRef = ((RefModel) child).getSimpleRef(); + child = allDefinitions.get(childRef); + } + if (child != null && child instanceof ModelImpl) { + final ModelImpl _child = (ModelImpl) child; + addVars(m, _child.getProperties(), _child.getRequired()); + } } else { ModelImpl impl = (ModelImpl) model; if (impl.getAdditionalProperties() != null) { diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java index 0ad05b0762b..d2fa17025df 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java @@ -122,7 +122,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { Model model = definitions.get(name); Map modelMap = new HashMap(); modelMap.put(name, model); - Map models = processModels(config, modelMap); + Map models = processModels(config, modelMap, definitions); models.putAll(config.additionalProperties()); allModels.add(((List) models.get("models")).get(0)); @@ -442,14 +442,14 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { return operations; } - public Map processModels(CodegenConfig config, Map definitions) { + public Map processModels(CodegenConfig config, Map definitions, Map allDefinitions) { Map objs = new HashMap(); objs.put("package", config.modelPackage()); List models = new ArrayList(); Set allImports = new LinkedHashSet(); for (String key : definitions.keySet()) { Model mm = definitions.get(key); - CodegenModel cm = config.fromModel(key, mm); + CodegenModel cm = config.fromModel(key, mm, allDefinitions); Map mo = new HashMap(); mo.put("model", cm); mo.put("importPath", config.toModelImport(key));