From b61a400d9161a982691c19ea9405f0fbf60e02ce Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 2 Jul 2015 17:48:58 +0800 Subject: [PATCH 1/3] 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 6f96bd82b5d9..da040b20781c 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 71b6295c9bee..44eac0982161 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 0ad05b0762bc..d2fa17025dfb 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)); From 0bf4163389765da33ace33e003619c6f3dd961c8 Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 2 Jul 2015 22:04:09 +0800 Subject: [PATCH 2/3] Copy properties of intermediate (interface) models --- .../java/io/swagger/codegen/DefaultCodegen.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) 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 44eac0982161..d94a87405627 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 @@ -529,17 +529,28 @@ public class DefaultCodegen { // TODO } else if (model instanceof ComposedModel) { final ComposedModel composed = (ComposedModel) model; + // parent model final RefModel parent = (RefModel) composed.getParent(); if (parent != null) { final String parentRef = toModelName(parent.getSimpleRef()); + m.parent = parentRef; + addImport(m, parentRef); 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()); } } + // interfaces (intermediate models) + for (RefModel _interface : composed.getInterfaces()) { + final String interfaceRef = toModelName(_interface.getSimpleRef()); + final Model interfaceModel = allDefinitions.get(interfaceRef); + if (interfaceModel instanceof ModelImpl) { + final ModelImpl _interfaceModel = (ModelImpl) interfaceModel; + addVars(m, _interfaceModel.getProperties(), _interfaceModel.getRequired()); + } + } + // child model (properties owned by the model itself) Model child = composed.getChild(); if (child != null && child instanceof RefModel) { final String childRef = ((RefModel) child).getSimpleRef(); From bf32777b679266c6f9c8be8b904fc96dd4c8f5a5 Mon Sep 17 00:00:00 2001 From: xhh Date: Fri, 3 Jul 2015 18:07:34 +0800 Subject: [PATCH 3/3] Fix NullPointerException in tests, improve usage to addVars --- .../io/swagger/codegen/DefaultCodegen.java | 46 ++++++++++++++----- 1 file changed, 34 insertions(+), 12 deletions(-) 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 d94a87405627..ecb6bd5852f9 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 @@ -529,37 +529,59 @@ public class DefaultCodegen { // TODO } else if (model instanceof ComposedModel) { final ComposedModel composed = (ComposedModel) model; + Map properties = new HashMap(); + List required = new ArrayList(); // parent model final RefModel parent = (RefModel) composed.getParent(); if (parent != null) { final String parentRef = toModelName(parent.getSimpleRef()); m.parent = parentRef; addImport(m, parentRef); - final Model parentModel = allDefinitions.get(parentRef); - if (parentModel instanceof ModelImpl) { - final ModelImpl _parent = (ModelImpl) parentModel; - addVars(m, _parent.getProperties(), _parent.getRequired()); + if (allDefinitions != null) { + final Model parentModel = allDefinitions.get(parentRef); + if (parentModel instanceof ModelImpl) { + final ModelImpl _parent = (ModelImpl) parentModel; + if (_parent.getProperties() != null) { + properties.putAll(_parent.getProperties()); + } + if (_parent.getRequired() != null) { + required.addAll(_parent.getRequired()); + } + } } } // interfaces (intermediate models) - for (RefModel _interface : composed.getInterfaces()) { - final String interfaceRef = toModelName(_interface.getSimpleRef()); - final Model interfaceModel = allDefinitions.get(interfaceRef); - if (interfaceModel instanceof ModelImpl) { - final ModelImpl _interfaceModel = (ModelImpl) interfaceModel; - addVars(m, _interfaceModel.getProperties(), _interfaceModel.getRequired()); + if (allDefinitions != null) { + for (RefModel _interface : composed.getInterfaces()) { + final String interfaceRef = toModelName(_interface.getSimpleRef()); + final Model interfaceModel = allDefinitions.get(interfaceRef); + if (interfaceModel instanceof ModelImpl) { + final ModelImpl _interfaceModel = (ModelImpl) interfaceModel; + if (_interfaceModel.getProperties() != null) { + properties.putAll(_interfaceModel.getProperties()); + } + if (_interfaceModel.getRequired() != null) { + required.addAll(_interfaceModel.getRequired()); + } + } } } // child model (properties owned by the model itself) Model child = composed.getChild(); - if (child != null && child instanceof RefModel) { + if (child != null && child instanceof RefModel && allDefinitions != null) { 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()); + if (_child.getProperties() != null) { + properties.putAll(_child.getProperties()); + } + if (_child.getRequired() != null) { + required.addAll(_child.getRequired()); + } } + addVars(m, properties, required); } else { ModelImpl impl = (ModelImpl) model; if (impl.getAdditionalProperties() != null) {