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 c15590b11d29..4ef8bb23e664 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 a008f4a5ee04..bc4f08d7f553 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 @@ -502,6 +502,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); @@ -521,12 +525,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(); - 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()); + m.parent = parentRef; + addImport(m, parentRef); + 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) + 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 && allDefinitions != null) { + final String childRef = ((RefModel) child).getSimpleRef(); + child = allDefinitions.get(childRef); + } + if (child != null && child instanceof ModelImpl) { + final ModelImpl _child = (ModelImpl) child; + 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) { 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 dd55c35bf9b1..6289757d80f1 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 @@ -123,7 +123,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)); @@ -475,14 +475,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));