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 6289757d80f..d48238c2489 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 @@ -2,6 +2,8 @@ package io.swagger.codegen; import com.samskivert.mustache.Mustache; import com.samskivert.mustache.Template; + +import io.swagger.models.ComposedModel; import io.swagger.models.Contact; import io.swagger.models.Info; import io.swagger.models.License; @@ -12,6 +14,7 @@ import io.swagger.models.Swagger; import io.swagger.models.auth.OAuth2Definition; import io.swagger.models.auth.SecuritySchemeDefinition; import io.swagger.util.Json; + import org.apache.commons.io.IOUtils; import java.io.File; @@ -21,6 +24,8 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -119,7 +124,9 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { // models Map definitions = swagger.getDefinitions(); if (definitions != null) { - for (String name : definitions.keySet()) { + List sortedModelKeys = sortModelsByInheritance(definitions); + + for (String name : sortedModelKeys) { Model model = definitions.get(name); Map modelMap = new HashMap(); modelMap.put(name, model); @@ -326,6 +333,52 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { operation.put(flagFieldName, true); } } + + private List sortModelsByInheritance(final Map definitions) { + List sortedModelKeys = new ArrayList(definitions.keySet()); + Comparator cmp = new Comparator() { + @Override + public int compare(String o1, String o2) { + Model model1 = definitions.get(o1); + Model model2 = definitions.get(o2); + + int model1InheritanceDepth = getInheritanceDepth(model1); + int model2InheritanceDepth = getInheritanceDepth(model2); + + if (model1InheritanceDepth == model2InheritanceDepth) { + return 0; + } else if (model1InheritanceDepth > model2InheritanceDepth) { + return 1; + } else { + return -1; + } + } + + private int getInheritanceDepth(Model model) { + int inheritanceDepth = 0; + Model parent = getParent(model); + + while (parent != null) { + inheritanceDepth++; + parent = getParent(parent); + } + + return inheritanceDepth; + } + + private Model getParent(Model model) { + if (model instanceof ComposedModel) { + return definitions.get(((ComposedModel) model).getParent().getReference()); + } + + return null; + } + }; + + Collections.sort(sortedModelKeys, cmp); + + return sortedModelKeys; + } public Map> processPaths(Map paths) { Map> ops = new HashMap>();